Beispiel #1
0
    def __init__(self, headless, run_sim, filepath, blender_path, port=None):

        self.blender_path = blender_path
        self.filepath = filepath
        if run_sim:
            if port is None:
                self.port = random.randint(10000, 31900)
            else:
                self.port = port
            print("Starting up simu...")
            fp = cutil.findFile("run_sim.py",
                                os.path.dirname(os.path.realpath(__file__)))
            cmd = [blender_path]
            if headless:
                cmd.append("--background")
            cmd.append("--python")
            cmd.append(fp)
            cmd.append("--")
            if not headless:
                cmd.append("--threaded")
            cmd.append("--port")
            cmd.append(str(self.port))
            print("Starting blender with the following command:")
            print(' '.join(cmd))
            self.p = subprocess.Popen(cmd)

            print("Sim running.")
        else:
            self.p = None
            self.port = settings.TCP_PORT

        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connected = False
        start = cutil.get_time_ms()
        while True:
            try:
                self.s.connect((settings.TCP_IP, self.port))
                self.connected = True
                break
            except socket.error:
                time.sleep(0.1)


#            if cutil.get_time_ms() - start > 5000:
#                raise Exception("Timed out trying to connect to simulator. Are you sure it's running?")
        print("Took " + str(cutil.get_time_ms() - start) +
              "ms to connect to the simulator.")
        self.s.settimeout(settings.CMD_RESPONSE_TIMEOUT)

        if filepath is not None:
            self.loadScene(filepath)
        else:
            self.unlinkObject("Cube")
            self.unlinkObject("Lamp")
Beispiel #2
0
def construct_job(render):
    job = {}
    job['code_dir'] = os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                   'simulator')
    job['exec'] = 'simulate_pouring.py'
    job['args'] = [x.strip() for x in render[1].split()]
    job['dep_dirs'] = [
        cutil.findFile("fluid_sim_deps",
                       cutil.file_dirnames(os.path.abspath(__file__))[-2]),
        cutil.__path__[0]
    ]
    job['dep_env_vars'] = ['PYTHONPATH', 'BLENDERPATH']
    job['input_dir'] = os.path.join(INPUT_DATA_DIR, render[0].split('/')[0])
    job['output_dir'] = os.path.join(OUTPUT_DATA_DIR, render[0])
    return job
Beispiel #3
0
def init():
    ret = Queue.Queue()
    for name, args in JOBS:
        job = {}
        job['code_dir'] = os.path.join(
            os.path.dirname(os.path.abspath(__file__)), 'simulator')
        job['exec'] = 'simulate_pouring.py'
        job['args'] = ['--bake'] + [x.strip() for x in args.split()]
        job['dep_dirs'] = [
            cutil.findFile("fluid_sim_deps",
                           cutil.file_dirnames(os.path.abspath(__file__))[-2]),
            cutil.__path__[0]
        ]
        job['dep_env_vars'] = ['PYTHONPATH', 'BLENDERPATH']
        job['output_dir'] = os.path.join(DATA_DIR, name)
        print("FOUND JOB:" + str(job))
        ret.put(job)
    return ret
def main():
    blend_file = "/media/robolab/arthus/fluid_sim_output/scene18/scene.blend"
    env = TableEnvironment(filepath=blend_file,
                           blender_path=os.path.join(
                               cutil.findFile(
                                   "blender-2.69",
                                   os.path.join(os.path.expanduser("~"),
                                                "proj")), "blender"),
                           pouring_object="bottle")
    #env = AlternateBowlTableEnvironment(blender_path=os.path.join(cutil.findFile("blender-2.69", os.path.expanduser("~")), "blender"), pouring_object="cup", alternate_bowl="cup")

    #env.sim.renderStillImage("/home/robolab/temp/test.png")

    #env.setCameraAngle(-3.0*math.pi/4.0)
    #env.addBackgroundVideo('/home/robolab/temp/oni2avi/test-img.avi', 0.0)

    #env.setDuration(1.0)
    #    env.fillCup(0.6)
    #    t = 0.0
    #    while t <= 3.0:
    #        env.setCupAngle(t/3.0*math.pi, t)
    #        t += 0.1
    #env.setCupAngle(0.0, 0.0)
    #env.setCupAngle(math.pi/2.0, 3.0)
    #env.sim.hideObject("FluidDomain")
    env.replaceCupForRender("bottle", glass=True, surface_subsample=True)
    env.setLighting()
    #env.generateOutput(render_path="/home/robolab/temp/render", bake_path=os.path.join(os.path.dirname(blend_file), "bake_files"), render=True, bake=False, dry_run=False, data_prefix=None)

    #    env.sim.addCube("Inflow", (0,0,TableEnvironment.DOMAIN_HEIGHT - 1), (1,1,1))
    #    env.sim.addAsFluidObj("Inflow")
    #    env.sim.setFluidModType("Inflow", FluidSim.FLUID_FLUID)
    #    env.sim.setVolumeInitialization("Inflow", True, True)
    #    env.sim.bakeFluidAnimations()
    #    #cutil.keyboard()

    env.sim.saveScene('/home/robolab/temp/test.blend')
    args.render_path = "/dev/null"
else:
    args.load = True
    args.blend_file = os.path.join(input_dir, 'scene.blend')
    args.bake_path = os.path.join(input_dir, 'bake_files')
    args.render_path = output_dir
    #TODO hack
    args.render = True

BLENDERPATHS = [os.path.expanduser('~')]
if 'BLENDERPATH' in os.environ:
    BLENDERPATHS += os.environ['BLENDERPATH'].split(':')
for path in BLENDERPATHS:
    if not os.path.exists(path):
        continue
    bp = cutil.findFile("blender-2.69", path)
    if bp is not None:
        blender_path = os.path.join(bp, "blender")
        break

if blender_path is None:
    raise Exception("Can't find blender executable!")

env_args = {'blender_path':blender_path, 'pouring_object':args.pouring_object, 'bowl_object':args.bowl_object}
if args.alternate_bowl is not None:
    env_args['alternate_bowl'] = args.alternate_bowl
    constructor = AlternateBowlTableEnvironment
else:
    constructor = TableEnvironment

if args.dry_run:
    def generateOutput(self,
                       render_path,
                       bake_path,
                       render=True,
                       bake=True,
                       dry_run=False,
                       data_prefix="data",
                       gt_prefix="ground_truth",
                       composite_video_plane=False,
                       render_water=True):
        if bake:
            if not dry_run:
                self.sim.setFluidResolution(TableEnvironment.FLUID_RESOLUTION)
                print("Baking fluid simulation, this may take awhile...")
                self.sim.bakeFluidAnimations(filepath=bake_path)
                self.sim.smoothObject('FluidDomain')
                self.sim.subsurfObject('FluidDomain')
            else:
                fp = open(os.path.join(bake_path, "bake_file.txt"), "w")
                fp.write("test")
                fp.close()

        if render:
            if not dry_run:
                self.sim.setCameraResolution(self.RENDER_RES)
                self.sim.setFluidCachePath(filepath=bake_path)

                render_data = data_prefix is not None
                render_gt = gt_prefix is not None

                dirpath = tempfile.mkdtemp()
                self.sim.saveScene(os.path.join(dirpath, "scene.blend"))

                if not render_water:
                    self.sim.unlinkObject("FluidDomain")
                    self.sim.reloadScene()

                try:

                    out = None
                    if render_data:
                        # First render full scene.
                        self.sim.renderAnimation(os.path.join(dirpath, "full"),
                                                 save_images=True,
                                                 make_video=False)
                        out = imageio.get_writer(os.path.join(
                            render_path, "%s.avi" % data_prefix),
                                                 fps=self.FPS)
                        if "VideoPlane" in self.sim.getObjects():
                            fp, offset = self.sim.getVideoTextureSettings(
                                "VideoPlane")
                            vp = imageio.get_reader(
                                cutil.findFile(
                                    fp,
                                    os.path.dirname(
                                        os.path.realpath(__file__))))
                            i = 0
                            while i < offset:
                                vp.get_next_data()
                                i += 1
                        else:
                            vp = None

                    # Now render black/white scene for getting ground truth of water.
                    objs_to_render = [("Cup", 0), ("Bowl", 1), ("Table", None)]
                    if render_water:
                        objs_to_render.append(("FluidDomain", 2))
                    self.sim.enableLights(enable=False)
                    for obj in self.sim.getObjects():
                        self.sim.removeMaterial(obj)
                        self.sim.hideObject(obj, hide=True)

                    self.sim.hideObject("Background", hide=False)
                    for obj, ch in objs_to_render:
                        if ch is None:
                            color = [1.0, 1.0, 1.0]
                        else:
                            color = [0.0, 0.0, 0.0]
                            color[ch] = 1.0
                        self.sim.setMaterial(obj,
                                             diffuse_color=color,
                                             diffuse_intensity=1.0)
                        self.sim.setMaterialEmit(obj, 1.0)
                        self.sim.hideObject(obj, hide=False)

                        # Render only obj
                        self.sim.renderAnimation(os.path.join(
                            dirpath, obj + "_only"),
                                                 save_images=True,
                                                 make_video=False)
                        self.sim.removeMaterial(obj)
                        self.sim.hideObject(obj, hide=True)

                    # Render one more time to figure out the overlap ordering.
                    for obj, ch in objs_to_render:
                        if ch is None:
                            continue
                        color = [0.0, 0.0, 0.0]
                        color[ch] = 1.0
                        self.sim.setMaterial(obj,
                                             diffuse_color=color,
                                             diffuse_intensity=1.0)
                        self.sim.setMaterialEmit(obj, 1.0)
                        self.sim.hideObject(obj, hide=False)
                    self.sim.renderAnimation(os.path.join(
                        dirpath, "overlap_ordering"),
                                             save_images=True,
                                             make_video=False)

                    ii = None
                    # Now combine the color channels.
                    pub = cutil.SingleLineUpdater()
                    ret_all = {}
                    ret_visible = {}
                    for i in range(self.sim.getNumberFrames()):
                        pub.publish("Stitching images %d of %d." %
                                    (i, self.sim.getNumberFrames()))
                        gt = np.zeros((
                            self.RENDER_RES[1],
                            self.RENDER_RES[0],
                            4,
                        ),
                                      dtype=np.float32)
                        sim = np.zeros((
                            self.RENDER_RES[1],
                            self.RENDER_RES[0],
                            3,
                        ),
                                       dtype=np.float32)
                        for obj, ch in objs_to_render:
                            fp = cutil.find_file_by_index(
                                os.path.join(dirpath, obj + "_only%0*d.png"),
                                i)
                            img = imageio.imread(fp)
                            if ch is not None:
                                gt[..., ch] = img[..., ch]
                            sim += img[..., :3]

                        # Use the alpha channel to indicate overlap ordering.
                        fp = cutil.find_file_by_index(
                            os.path.join(dirpath, "overlap_ordering%0*d.png"),
                            i)
                        img = imageio.imread(fp)
                        for obj, ch in objs_to_render:
                            if ch is None:
                                continue
                            idxs = np.where(img[..., ch] > 128)
                            gt[idxs +
                               (-1 * np.ones((idxs[0].shape[0], ), dtype=int),
                                )] = 255.0 * ch / 2.0

                        if render_gt:
                            imageio.imwrite(
                                os.path.join(render_path,
                                             "%s%04d.png" % (gt_prefix, i)),
                                gt)
                        if render_data:
                            full_img = imageio.imread(
                                cutil.find_file_by_index(
                                    os.path.join(dirpath, "full%0*d.png"), i))
                            if vp is not None and composite_video_plane:
                                pxls = np.where(np.max(sim, axis=2) < 128)
                                try:
                                    ii = vp.get_next_data()
                                except:
                                    if ii is None:
                                        raise
                                full_img[pxls[0], pxls[1], :ii.shape[-1]] = ii[
                                    pxls[0], pxls[1], :]
                            imageio.imwrite(
                                os.path.join(render_path,
                                             "%s%04d.png" % (data_prefix, i)),
                                full_img)
                            out.append_data(full_img)

                        # Finally, compute the bounding boxes from the gt.
                        computeBoundingBoxesInImage(gt, i, ret_all,
                                                    ret_visible)

                    # Write out bounding box files.
                    BB_FILENAME_ALL = 'bounding_boxes_all.txt'
                    BB_FILENAME_VISIBLE = 'bounding_boxes_visible.txt'
                    fp_all = open(os.path.join(render_path, BB_FILENAME_ALL),
                                  'w')
                    fp_visible = open(
                        os.path.join(render_path, BB_FILENAME_VISIBLE), 'w')
                    for ii in sorted(ret_all.keys()):
                        fp_all.write("(%d, %s)\n" % (ii, str(ret_all[ii])))
                        fp_visible.write("(%d, %s)\n" %
                                         (ii, str(ret_visible[ii])))
                    fp_all.close()
                    fp_visible.close()

                    if vp is not None:
                        vp.close()
                    if out is not None:
                        out.close()
                finally:
                    # Reset scene
                    self.sim.loadScene(os.path.join(dirpath, "scene.blend"))
                    shutil.rmtree(dirpath)
                print("Finished rendering.")
            else:
                fp = open(os.path.join(render_path, "render_file.txt"), "w")
                fp.write("test")
                fp.close()