メむンコンテンツぞスキップ
芋出し画像

Genesis 入門 (2) - 芖芚化 ず レンダリング

    「Genesis」の芖芚化ずレンダリングに぀いおたずめたした。

    ・Visualization & Rendering

    前回

    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()

    次回



     
     

    npaka

     
     
    プログラマヌ。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ロボット / ガゞェット。幎2冊ペヌスで技術曞を執筆。アニ゜ン / カラオケ / ギタヌ / 猫 twitter : @npaka123

    あなたぞのおすすめ