
Genesis å ¥é (2) - èŠèŠå ãš ã¬ã³ããªã³ã°
ãGenesisãã®èŠèŠåãšã¬ã³ããªã³ã°ã«ã€ããŠãŸãšããŸããã
åå
1. èŠèŠåãšã¬ã³ããªã³ã°
ãGenesisãã®èŠèŠåã·ã¹ãã ã¯ãã·ãŒã³ã®ãvisualizerã (scene.visualizer)ã§ç®¡çããŸãã
ã·ãŒã³ãèŠèŠåããæ¹æ³ã¯ã次ã®2ã€ããããŸãã
(1) ã€ã³ã¿ã©ã¯ãã£ããã¥ãŒã¢ã䜿çš
(2) ã·ãŒã³ã«ã«ã¡ã©ã远å ããŠç»åãã¬ã³ããªã³ã°
2. ã€ã³ã¿ã©ã¯ãã£ããã¥ãŒã¢
ãã£ã¹ãã¬ã€ã«æ¥ç¶ããŠããå Žåã¯ããã€ã³ã¿ã©ã¯ãã£ããã¥ãŒã¢ãã§ã·ãŒã³ãèŠèŠåã§ããŸãã
ã·ãŒã³ã®äœææã«ããã¥ãŒã¢ãªãã·ã§ã³ã (viewer_options) ãšãèŠèŠåãªãã·ã§ã³ã (vis_options) ãæå®ããŸãã
scene = gs.Scene(
show_viewer = True,
# ãã¥ãŒã¢ãªãã·ã§ã³
viewer_options = gs.options.ViewerOptions(
res = (1280, 960),
camera_pos = (3.5, 0.0, 2.5),
camera_lookat = (0.0, 0.0, 0.5),
camera_fov = 40,
max_FPS = 60,
),
# èŠèŠåãªãã·ã§ã³
vis_options = gs.options.VisOptions(
show_world_frame = True, # world ã®åº§æšãã¬ãŒã ãåç¹ã§èŠèŠå
world_frame_size = 1.0, # ã¯ãŒã«ããã¬ãŒã ã®é·ã (ã¡ãŒãã«)
show_link_frame = False, # ãšã³ãã£ãã£ãªã³ã¯ã®åº§æšãã¬ãŒã ãèŠèŠåããªã
show_cameras = False, # 远å ãããã«ã¡ã©ã®ã¡ãã·ã¥ãšéå°ãèŠèŠåããªã
plane_reflection = True, # å¹³é¢åå°ããªã³
ambient_light = (0.1, 0.1, 0.1), # åšå²å
ã®èšå®
),
renderer = gs.renderers.Rasterizer(), # ã«ã¡ã©ã¬ã³ããªã³ã°ã«ã©ã¹ã¿ã©ã€ã¶ã䜿çš
)ããã¥ãŒã¢ãªãã·ã§ã³ãã§ã¯ãã«ã¡ã©ã®ããŒãº (pose) ãšèŠé (fov) ãæå®ããŸããmax_FPS ã None ã®å Žåããã¥ãŒã¢ã¯å¯èœãªéãé«éã«å®è¡ãããŸããres ã None ã®å Žåã4:3 ãŠã£ã³ããŠãäœæããé«ãã¯ãã£ã¹ãã¬ã€ã®é«ãã®ååã«èšå®ãããŸãããŸããäžèšã®èšå®ã§ã¯ãã«ã¡ã©ã®ã¬ã³ããªã³ã°ã«gs.renderers.Rasterizer() ã䜿çšããããã«èšå®ããŠããŸãã
ãGenesisãã¯ãgs.renderers.Rasterizer() ãš gs.renderers.RayTracer() ã®2ã€ã®ã¬ã³ããªã³ã°ããã¯ãšã³ããæäŸããŸãããã¥ãŒã¢ã¯åžžã«Rasterizerã䜿çšããŸããã«ã¡ã©ãããã©ã«ãã§ã¯Rasterizerã䜿çšããŸãã
ã·ãŒã³ãäœæããããšãscene.visualizer.viewer ãŸãã¯ã·ã§ãŒãã«ãããšã㊠scene.viewer ãä»ããŠãã¥ãŒã¢ã«ã¢ã¯ã»ã¹ã§ããŸãã
# ã«ã¡ã©ããŒãºã®ååŸ
cam_pose = scene.viewer.camera_pose()
# ã«ã¡ã©ããŒãºã®æå®
scene.viewer.set_camera_pose(cam_pose)3. ã«ã¡ã©
3-1. ã«ã¡ã©
ã«ã¡ã©ãæåã§ã·ãŒã³ã«è¿œå ããŸããã«ã¡ã©ã¯ãå¿ èŠãªãšãã«ã®ã¿ã¬ã³ããªã³ã°ç»åãè¿ããŸãããã®ããããããã¬ã¹ã¢ãŒãã§åäœããŸãã
cam = scene.add_camera(
res = (1280, 960),
pos = (3.5, 0.0, 2.5),
lookat = (0, 0, 0.5),
fov = 30,
GUI = False
)ãã©ã¡ãŒã¿ã¯ã次ã®ãšããã§ãã
ã»visualizer (genesis.Visualizer)
ã«ã¡ã©ãé¢é£ä»ããããŠããvisualizerã
ã»idx (int)
ã«ã¡ã©ã®ã€ã³ããã¯ã¹ã
ã»model (str)
ã«ã¡ã©ã¢ãã« ('pinhole'/'thinlens')ã
ã»res (tuple of int, shape (2,))
ã«ã¡ã©ã®è§£å床ã (å¹ , é«ã) ã®ã¿ãã«ã§æå®ã
ã»pos (tuple of float, shape (3,))
ã·ãŒã³å ã§ã®ã«ã¡ã©ã®äœçœ®ã (x, y, z) ã®åœ¢åŒã§æå®ã
ã»lookat (tuple of float, shape (3,))
ã«ã¡ã©ã泚èŠããŠããã·ãŒã³å ã®ãã€ã³ãã (x, y, z) ã®åœ¢åŒã§æå®ã
ã»up (tuple of float, shape (3,))
ã«ã¡ã©ã®ãäžæ¹åããå®çŸ©ãããã¯ãã«ã (x, y, z) ã®åœ¢åŒã§æå®ã
ã»fov (float)
ã«ã¡ã©ã®åçŽèŠéè§ã床åäœã§æå®ã
ã»aperture (float)
ã«ã¡ã©ã®çµããµã€ãºãæå®ã被åçæ·±åºŠãå¶åŸ¡ã
ã»focus_dist (float | None)
ã«ã¡ã©ã®çŠç¹è·é¢ãæå®ãNoneã®å Žåãpos ãš lookat ã§èªåèšç®ã
ã»GUI (bool)
ã«ã¡ã©ã®ã¬ã³ããªã³ã°ç»åãå¥ã®GUIãŠã£ã³ããŠã§è¡šç€ºã
ã»spp (int, optional)
ãã¯ã»ã«ãããã®ãµã³ãã«æ° (ããã©ã«ã:256)ã
ã»denoise (bool)
ã«ã¡ã©ã®ã¬ã³ããªã³ã°ç»åããã€ãºé€å»ãããã©ããã
ã»near (float)
ã«ã¡ã©ã®è¿æ¥å¹³é¢ã
ã»far (float)
ã«ã¡ã©ã®é æ¹å¹³é¢ã
ã»transform (np.ndarray, shape (4, 4), optional)
ã«ã¡ã©ã®å€æè¡åã
ã¡ãœããã¯ã次ã®ãšããã§ãã
ã»render() : ã«ã¡ã©ãã¥ãŒã®ã¬ã³ããªã³ã°ã
ã»set_pose() : ã«ã¡ã©ããŒãºã®æå®ã
ã»set_params() : ãã©ã¡ãŒã¿ã®æå®ã
ã»start_recording() : ã«ã¡ã©é²ç»ã®éå§ã
ã»pause_recording() : ã«ã¡ã©é²ç»ã®äžæåæ¢ã
ã»stop_recording() : ã«ã¡ã©é²ç»ã®åæ¢ã
GUI=True ã®å Žåãã«ã¡ã©ã¯ã¬ã³ããªã³ã°ãããç»åãåçã«è¡šç€ºãã OpenCV ãŠã£ã³ããŠãäœæããŸããããã¯ãã¥ãŒã¢ GUI ãšã¯ç°ãªããŸãã
ã·ãŒã³ãæ§ç¯ããããã«ã¡ã©ã§ç»åãã¬ã³ããªã³ã°ã§ããŸããã«ã¡ã©ã¯ããRGBããæ·±åºŠããã»ã°ã¡ã³ããŒã·ã§ã³ãã¹ã¯ããè¡šé¢æ³ç·ãã®ã¬ã³ããªã³ã°ããµããŒãããŸããããã©ã«ãã§ã¯ãRGBãã®ã¿ãã¬ã³ããªã³ã°ãããŸãããcamera.render() ãåŒã³åºããšãã«ãã©ã¡ãŒã¿ãèšå®ããããšã§ãä»ã®ã¢ãŒããæå¹åã§ããŸãã
scene.build()
# RGBã»æ·±åºŠã»ã»ã°ã¡ã³ããŒã·ã§ã³ãã¹ã¯ã»æ³ç·ããããã¬ã³ããªã³ã°
rgb, depth, segmentation, normal = cam.render(depth=True, segmentation=True, normal=True)4ã€ã®ãŠã£ã³ããŠã衚瀺ãããŸã (opencv ãŠã£ã³ããŠã«ã¯è¿œå ã®é å»¶ãçºçããããšãããããããŠã£ã³ããŠãé»ãå Žå㯠cv2.waitKey(1) ã远å ã§åŒã³åºãããrender() ãå床åŒã³åºããŠãŠã£ã³ããŠãæŽæ°ããŸã)ã

3-2. ãããªé²ç»
ãRGBãã®ã¿ãã¬ã³ããªã³ã°ããã«ã¡ã©ãåãããŠãããªãé²ç»ããŸãããGenesisãã«ã¯ããããªãé²ç»ããããã®äŸ¿å©ãªãŠãŒãã£ãªãã£ãæäŸãããŠããŸãã
# ã«ã¡ã©é²ç»ãéå§
cam.start_recording()
import numpy as np
for i in range(120):
scene.step()
# ã«ã¡ã©ã®äœçœ®ã倿Ž
cam.set_pose(
pos = (3.0 * np.sin(i / 60), 3.0 * np.cos(i / 60), 2.5),
lookat = (0, 0, 0.5),
)
cam.render()
# ã«ã¡ã©é²ç»ã忢ããŠãããªãä¿å
cam.stop_recording(save_to_filename='video.mp4', fps=60)ãããªã¯ãvideo.mp4ãã«ä¿åãããŸãã

Genesisã®åäœç¢ºèª (2)https://t.co/Tn6YeLRy5w pic.twitter.com/19DNjxBJn3
â åžçå·è±äž / Hidekazu Furukawa (@npaka123) December 21, 2024
以äžã¯ãå®å šãªã³ãŒãã§ãã
import genesis as gs
# åæå
gs.init(backend=gs.cpu)
# ã·ãŒã³ã®äœæ
scene = gs.Scene(
show_viewer = True,
viewer_options = gs.options.ViewerOptions(
res = (1280, 960),
camera_pos = (3.5, 0.0, 2.5),
camera_lookat = (0.0, 0.0, 0.5),
camera_fov = 40,
max_FPS = 60,
),
vis_options = gs.options.VisOptions(
show_world_frame = True,
world_frame_size = 1.0,
show_link_frame = False,
show_cameras = False,
plane_reflection = True,
ambient_light = (0.1, 0.1, 0.1),
),
renderer=gs.renderers.Rasterizer(),
)
# ã·ãŒã³ã«ãšã³ãã£ãã£ã远å
plane = scene.add_entity(
gs.morphs.Plane(),
)
franka = scene.add_entity(
gs.morphs.MJCF(file='xml/franka_emika_panda/panda.xml'),
)
cam = scene.add_camera(
res = (640, 480),
pos = (3.5, 0.0, 2.5),
lookat = (0, 0, 0.5),
fov = 30,
GUI = False,
)
# ã·ãŒã³ã®ãã«ã
scene.build()
# RGBã»æ·±åºŠã»ã»ã°ã¡ã³ããŒã·ã§ã³ãã¹ã¯ã»æ³ç·ããããã¬ã³ããªã³ã°
# rgb, depth, segmentation, normal = cam.render(rgb=True, depth=True, segmentation=True, normal=True)
# ã«ã¡ã©é²ç»ãéå§
cam.start_recording()
import numpy as np
for i in range(120):
scene.step()
# ã«ã¡ã©ã®äœçœ®ã倿Ž
cam.set_pose(
pos = (3.0 * np.sin(i / 60), 3.0 * np.cos(i / 60), 2.5),
lookat = (0, 0, 0.5),
)
cam.render()
# ã«ã¡ã©é²ç»ã忢ããŠãããªãä¿å
cam.stop_recording(save_to_filename='video.mp4', fps=60)4. ã¬ã€ãã¬ãŒã·ã³ã°ã¬ã³ããªã³ã°
ãGenesisãã¯ããã©ããªã¢ãªã¹ãã£ãã¯ãªã¬ã³ããªã³ã°ã®ããã®RayTracerããã¯ãšã³ããæäŸããŸããã·ãŒã³ãäœæãããšãã« renderer=gs.renderers.RayTracer() ãèšå®ããããšã§ããã®ããã¯ãšã³ãã«åãæ¿ããããšãã§ããŸãããã®ã«ã¡ã©ã§ã¯ãsppããapertureããmodelããªã©ãããå€ãã®ãã©ã¡ãŒã¿èª¿æŽãå¯èœã§ãã
ãããŸãã Macçã®ã³ãŒã
import genesis as gs
import numpy as np
def main():
# åæå
gs.init(backend=gs.cpu)
# ã·ãŒã³ã®äœæ
scene = gs.Scene(
show_viewer = True,
viewer_options = gs.options.ViewerOptions(
res = (1280, 960),
camera_pos = (3.5, 0.0, 2.5),
camera_lookat = (0.0, 0.0, 0.5),
camera_fov = 40,
max_FPS = 60,
),
vis_options = gs.options.VisOptions(
show_world_frame = True,
world_frame_size = 1.0,
show_link_frame = False,
show_cameras = False,
plane_reflection = True,
ambient_light = (0.1, 0.1, 0.1),
),
renderer=gs.renderers.Rasterizer(),
)
# ã·ãŒã³ã«ãšã³ãã£ãã£ã远å
plane = scene.add_entity(
gs.morphs.Plane(),
)
franka = scene.add_entity(
gs.morphs.MJCF(file='xml/franka_emika_panda/panda.xml'),
)
cam = scene.add_camera(
res = (640, 480),
pos = (3.5, 0.0, 2.5),
lookat = (0, 0, 0.5),
fov = 30,
GUI = False,
)
# ã·ãŒã³ã®ãã«ã
scene.build()
# ã¹ã¬ããã®éå§
gs.tools.run_in_another_thread(fn=run_sim, args=(scene, cam))
# ã·ãã¥ã¬ãŒã¿ã®éå§
scene.viewer.start()
def run_sim(scene, cam):
# ã«ã¡ã©é²ç»ãéå§
cam.start_recording()
for i in range(120):
scene.step()
# ã«ã¡ã©ã®äœçœ®ã倿Ž
cam.set_pose(
pos = (3.0 * np.sin(i / 60), 3.0 * np.cos(i / 60), 2.5),
lookat = (0, 0, 0.5),
)
cam.render()
# ã«ã¡ã©é²ç»ã忢ããŠãããªãä¿å
cam.stop_recording(save_to_filename='video.mp4', fps=60)
# ã·ãã¥ã¬ãŒã¿ã®åæ¢
scene.viewer.stop()
if __name__ == "__main__":
main()