πΈ ΠΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³
ΠΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ΅Π½Ρ Genesis ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ visualizer ΡΡΠ΅Π½Ρ (ΡΠΎ Π΅ΡΡΡ scene.visualizer). Π‘ΡΠ΅Π½Ρ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π΄Π²ΡΠΌΡ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ: 1) Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΡΠΈΠΊΠ°, ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅Π³ΠΎ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅; 2) Π²ΡΡΡΠ½ΡΡ Π΄ΠΎΠ±Π°Π²Π»ΡΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π² ΡΡΠ΅Π½Ρ ΠΈ ΠΏΠΎΠ»ΡΡΠ°Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ΅ΡΠ΅Π· ΠΊΠ°ΠΌΠ΅ΡΡ.
ΠΡΠΎΡΠΌΠΎΡΡΡΠΈΠΊ
ΠΡΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΡΠ½ ΠΌΠΎΠ½ΠΈΡΠΎΡ, Π΄Π»Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ΅Π½Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΠΉ ΠΏΡΠΎΡΠΌΠΎΡΡΡΠΈΠΊ. Genesis ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ°Π·Π½ΡΠ΅ Π³ΡΡΠΏΠΏΡ options Π΄Π»Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠ°Π·Π½ΡΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΡΡΠ΅Π½Ρ. Π§ΡΠΎΠ±Ρ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΏΡΠΎΡΠΌΠΎΡΡΡΠΈΠΊ, ΠΌΠ΅Π½ΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² 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(), # ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΎΡ Π΄Π»Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° ΠΊΠ°ΠΌΠ΅Ρ
)
ΠΠ΄Π΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°ΡΡ ΠΏΠΎΠ·Ρ ΠΊΠ°ΠΌΠ΅ΡΡ ΠΏΡΠΎΡΠΌΠΎΡΡΡΠΈΠΊΠ° ΠΈ ΡΠ³ΠΎΠ» ΠΎΠ±Π·ΠΎΡΠ°. ΠΡΠ»ΠΈ max_FPS ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π² None, ΠΏΡΠΎΡΠΌΠΎΡΡΡΠΈΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ°ΠΊ Π±ΡΡΡΡΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ. ΠΡΠ»ΠΈ res ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π² None, Genesis Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠΊΠ½ΠΎ Ρ ΡΠΎΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠΎΡΠΎΠ½ 4:3 ΠΈ Π²ΡΡΠΎΡΠΎΠΉ, ΡΠ°Π²Π½ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅ Π²ΡΡΠΎΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠ°. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π²ΡΡΠ΅ Π΄Π»Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° ΠΊΠ°ΠΌΠ΅Ρ Π²ΡΠ±ΡΠ°Π½ ΡΠ°ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΎΡ. Genesis ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄Π²Π° Π±ΡΠΊΠ΅Π½Π΄Π° ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π°: gs.renderers.Rasterizer() ΠΈ gs.renderers.RayTracer(). ΠΡΠΎΡΠΌΠΎΡΡΡΠΈΠΊ Π²ΡΠ΅Π³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ°ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΎΡ; ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ°ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΈ ΠΊΠ°ΠΌΠ΅ΡΡ.
ΠΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΡΠ΅Π½Ρ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΡΠΎΡΠΌΠΎΡΡΡΠΈΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΡΠ΅ΡΠ΅Π· scene.visualizer.viewer ΠΈΠ»ΠΈ ΠΊΠΎΡΠΎΡΠΊΡΡ Π·Π°ΠΏΠΈΡΡ scene.viewer. ΠΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΠΎΡΠΈΡΡ ΠΈΠ»ΠΈ Π·Π°Π΄Π°ΡΡ ΠΏΠΎΠ·Ρ ΠΊΠ°ΠΌΠ΅ΡΡ ΠΏΡΠΎΡΠΌΠΎΡΡΡΠΈΠΊΠ°:
cam_pose = scene.viewer.camera_pose()
scene.viewer.set_camera_pose(cam_pose)
ΠΠ°ΠΌΠ΅ΡΡ ΠΈ Π±Π΅Π·Π³ΠΎΠ»ΠΎΠ²ΡΠΉ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³
Π’Π΅ΠΏΠ΅ΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΡΡΠ΅Π½Ρ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π²ΡΡΡΠ½ΡΡ. ΠΠ°ΠΌΠ΅ΡΠ° Π½Π΅ ΡΠ²ΡΠ·Π°Π½Π° Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΡΠΈΠΊΠΎΠΌ ΠΈΠ»ΠΈ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΎΠΌ: ΠΎΠ½Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΡΡΠ΅Π½Π΄Π΅ΡΠ΅Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ. ΠΠΎΡΡΠΎΠΌΡ ΠΊΠ°ΠΌΠ΅ΡΠ° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈ Π² Π±Π΅Π·Π³ΠΎΠ»ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ (headless).
cam = scene.add_camera(
res = (1280, 960),
pos = (3.5, 0.0, 2.5),
lookat = (0, 0, 0.5),
fov = 30,
GUI = False
)
ΠΡΠ»ΠΈ GUI=True, ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΊΠ°ΠΌΠ΅ΡΠ° ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠΊΠ½ΠΎ OpenCV, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΎΡΡΠ΅Π½Π΄Π΅ΡΠ΅Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΡΡΠΎ Π½Π΅ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ GUI ΠΏΡΠΎΡΠΌΠΎΡΡΡΠΈΠΊΠ°.
ΠΠΎΡΠ»Π΅ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΡΡΠ΅Π½Ρ ΠΊΠ°ΠΌΠ΅ΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ. ΠΠ°ΡΠΈ ΠΊΠ°ΠΌΠ΅ΡΡ ΡΠΌΠ΅ΡΡ Π²ΡΠ΄Π°Π²Π°ΡΡ RGB-ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΊΠ°ΡΡΡ Π³Π»ΡΠ±ΠΈΠ½Ρ, ΠΌΠ°ΡΠΊΠΈ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈ Π½ΠΎΡΠΌΠ°Π»ΠΈ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΠ΅ΠΉ. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ΅Π½Π΄Π΅ΡΠΈΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ RGB; ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠ΅ΠΆΠΈΠΌΡ Π²ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ camera.render():
scene.build()
# Π Π΅Π½Π΄Π΅ΡΠΈΠ½Π³ RGB, ΠΊΠ°ΡΡΡ Π³Π»ΡΠ±ΠΈΠ½Ρ, ΠΌΠ°ΡΠΊΠΈ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈ ΠΊΠ°ΡΡΡ Π½ΠΎΡΠΌΠ°Π»Π΅ΠΉ
rgb, depth, segmentation, normal = cam.render(depth=True, segmentation=True, normal=True)
ΠΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ GUI=True ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΡΠ½ ΠΌΠΎΠ½ΠΈΡΠΎΡ, ΡΠ΅ΠΏΠ΅ΡΡ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π²ΠΈΠ΄Π½ΠΎ ΡΠ΅ΡΡΡΠ΅ ΠΎΠΊΠ½Π°. (ΠΠ½ΠΎΠ³Π΄Π° ΠΎΠΊΠ½Π° OpenCV ΠΎΡΡΡΠ°ΡΡ; Π΅ΡΠ»ΠΈ ΠΎΠΊΠ½ΠΎ ΡΡΡΠ½ΠΎΠ΅, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·Π²Π°ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ cv2.waitKey(1) ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ ΡΠ½ΠΎΠ²Π° Π²ΡΠ·Π²Π°ΡΡ render(), ΡΡΠΎΠ±Ρ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΠΎΠΊΠ½ΠΎ.)
ΠΠ°ΠΏΠΈΡΡ Π²ΠΈΠ΄Π΅ΠΎ Ρ ΠΊΠ°ΠΌΠ΅ΡΡ
Π’Π΅ΠΏΠ΅ΡΡ ΠΎΡΡΠ΅Π½Π΄Π΅ΡΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ RGB-ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΠΌ ΠΊΠ°ΠΌΠ΅ΡΡ ΠΈ Π·Π°ΠΏΠΈΡΠ΅ΠΌ Π²ΠΈΠ΄Π΅ΠΎ. ΠΠ»Ρ Π·Π°ΠΏΠΈΡΠΈ Genesis ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ:
# ΠΠ°ΡΠ°ΡΡ Π·Π°ΠΏΠΈΡΡ Ρ ΠΊΠ°ΠΌΠ΅ΡΡ. ΠΡΠ΅ ΠΎΡΡΠ΅Π½Π΄Π΅ΡΠ΅Π½Π½ΡΠ΅ RGB-ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π±ΡΠ΄ΡΡ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π²Π½ΡΡΡΠΈ
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()
# ΠΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π·Π°ΠΏΠΈΡΡ ΠΈ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ Π²ΠΈΠ΄Π΅ΠΎ. ΠΡΠ»ΠΈ `filename` Π½Π΅ Π·Π°Π΄Π°Π½, ΠΈΠΌΡ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π°
cam.stop_recording(save_to_filename='video.mp4', fps=60)
ΠΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ Π²ΠΈΠ΄Π΅ΠΎ Π² video.mp4:
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)
Π ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ΅ Π·Π΄Π΅ΡΡ Π±ΡΠ» Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ Π²ΠΈΠ΄Π΅ΠΎΠΏΠ»Π΅Π΅Ρ Ρ Π·Π°ΠΏΠΈΡΡΡ ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°; Π² ΡΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Π΅Π³ΠΎ Π½Π΅Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π·Π°ΠΏΠΈΡΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΊΠΎΠ΄Π°.
ΠΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½Π°Ρ ΡΠΈΠΌΡΠ»ΡΡΠΈΡ
import torch
import genesis as gs
gs.init(backend=gs.gpu)
scene = gs.Scene(
show_viewer = False,
rigid_options = gs.options.RigidOptions(
dt = 0.01,
),
)
plane = scene.add_entity(
gs.morphs.Plane(),
)
franka = scene.add_entity(
gs.morphs.MJCF(file='xml/franka_emika_panda/panda.xml'),
)
scene.build(n_envs=30000)
# Π£ΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ Π²ΡΠ΅ΠΌΠΈ ΡΠΎΠ±ΠΎΡΠ°ΠΌΠΈ ΡΡΠ°Π·Ρ
franka.control_dofs_position(
torch.tile(
torch.tensor([0, 0, 0, -1.0, 0, 0, 0, 0.02, 0.02], device=gs.device), (30000, 1)
),
)
for i in range(1000):
scene.step()
Π’Π΅ΡΡΠΎΠ²ΡΠΉ ΡΠΊΡΠΈΠΏΡ Ρ Π±ΡΡΡΠ»ΠΊΠΎΠΉ: test_genesis_bottle.py
import argparse
import time
import genesis as gs
import numpy as np
import torch
parser = argparse.ArgumentParser()
parser.add_argument("-B", type=int, default=1) # Π Π°Π·ΠΌΠ΅Ρ Π±Π°ΡΡΠ°
parser.add_argument("-v", action="store_true", default=False) # ΠΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ
parser.add_argument("-r", action="store_true", default=False) # Π‘Π»ΡΡΠ°ΠΉΠ½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ
args = parser.parse_args()
########################## init ##########################
gs.init(backend=gs.gpu)
########################## create a scene ##########################
scene = gs.Scene(
show_viewer=args.v,
rigid_options=gs.options.RigidOptions(
dt=0.01,
constraint_solver=gs.constraint_solver.Newton,
enable_self_collision=True,
),
)
########################## entities ##########################
plane = scene.add_entity(
gs.morphs.Plane(),
)
obj = scene.add_entity(
morph=gs.morphs.URDF(
file="../assets/urdf/bottle/bottle.urdf",
scale=0.09,
pos=(0.65, 0.0, 0.036),
euler=(0, 90, 0),
),
)
franka = scene.add_entity(
gs.morphs.MJCF(file="../assets/xml/franka_emika_panda/panda.xml")
)
########################## build ##########################
n_envs = args.B
scene.build(n_envs=n_envs)
# ΠΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ (ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· MuJoCo XML Franka)
franka.set_dofs_kp(
np.array([4500, 4500, 3500, 3500, 2000, 2000, 2000, 100, 100]),
)
franka.set_dofs_kv(
np.array([450, 450, 350, 350, 200, 200, 200, 10, 10]),
)
franka.set_dofs_force_range(
np.array([-87, -87, -87, -87, -12, -12, -12, -100, -100]),
np.array([87, 87, 87, 87, 12, 12, 12, 100, 100]),
)
motors_dof = np.arange(7)
fingers_dof = np.arange(7, 9)
grasp_qpos = np.array([-0.9937, 1.4588, 1.3058, -1.6924, -1.4882, 1.8461, 1.4577, 0.04, 0.04])
lift_qpos = np.array([-1.0411, 1.2861, 1.5200, -1.7065, -1.2946, 1.6572, 1.4315, 0.04, 0.04])
franka.set_dofs_position(grasp_qpos)
# ΠΠ°Ρ
Π²Π°Ρ
franka.control_dofs_position(grasp_qpos[:-2], motors_dof)
franka.control_dofs_force(np.array([-4, -4]), fingers_dof)
for i in range(100):
scene.step()
# ΠΠΎΠ΄ΡΡΠΌ
franka.control_dofs_position(lift_qpos[:-2], motors_dof)
for i in range(50):
scene.step()
ref_pos = torch.tile(torch.tensor(lift_qpos[:7]), [n_envs, 1]).cuda()
t0 = time.perf_counter()
for i in range(500):
if args.r and i % 2 == 0: # Π‘ΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ Ρ ΡΠ°ΡΡΠΎΡΠΎΠΉ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ManiSkill 50 ΠΡ
# Π‘ΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ ΡΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌΠΈ ManiSkill
franka.control_dofs_position(ref_pos + torch.rand((n_envs, 7), device='cuda')*0.05 - 0.025, motors_dof)
scene.step()
t1 = time.perf_counter()
print(f'per env: {500 / (t1 - t0):,.2f} FPS')
print(f'total : {500 / (t1 - t0) * n_envs:,.2f} FPS')
03test_genesis_cube.py
import argparse
import time
import genesis as gs
import numpy as np
import torch
parser = argparse.ArgumentParser()
parser.add_argument("-B", type=int, default=1) # Π Π°Π·ΠΌΠ΅Ρ Π±Π°ΡΡΠ°
parser.add_argument("-v", action="store_true", default=False) # ΠΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ
parser.add_argument("-r", action="store_true", default=False) # Π‘Π»ΡΡΠ°ΠΉΠ½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ
parser.add_argument("-m", action="store_true", default=False) # ΠΠ²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΡΠ°Π΅ΠΊΡΠΎΡΠΈΠΈ
parser.add_argument("--mjcf", action="store_true", default=False) # ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ MJCF
args = parser.parse_args()
########################## init ##########################
gs.init(backend=gs.gpu)
########################## create a scene ##########################
scene = gs.Scene(
show_viewer=args.v,
rigid_options=gs.options.RigidOptions(
dt=0.01,
constraint_solver=gs.constraint_solver.Newton,
enable_self_collision=True,
),
)
########################## entities ##########################
plane = scene.add_entity(
gs.morphs.Plane(),
)
cube = scene.add_entity(
gs.morphs.Box(
size=(0.04, 0.04, 0.04),
pos=(0.65, 0.0, 0.02),
),
)
franka = scene.add_entity(
gs.morphs.MJCF(file="../assets/xml/franka_emika_panda/panda.xml") if args.mjcf else gs.morphs.URDF(file="../assets/urdf/franka_description/robots/franka_panda.urdf", fixed=True),
)
########################## build ##########################
n_envs = args.B
scene.build(n_envs=n_envs)
# ΠΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ (ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· MuJoCo XML Franka)
franka.set_dofs_kp(
np.array([4500, 4500, 3500, 3500, 2000, 2000, 2000, 100, 100]),
)
franka.set_dofs_kv(
np.array([450, 450, 350, 350, 200, 200, 200, 10, 10]),
)
franka.set_dofs_force_range(
np.array([-87, -87, -87, -87, -12, -12, -12, -100, -100]),
np.array([87, 87, 87, 87, 12, 12, 12, 100, 100]),
)
motors_dof = np.arange(7)
fingers_dof = np.arange(7, 9)
grasp_qpos = np.array([-1.0104, 1.5623, 1.3601, -1.6840, -1.5863, 1.7810, 1.4598, 0.0400, 0.0400])
lift_qpos = np.array([-1.0426, 1.4028, 1.5634, -1.7114, -1.4055, 1.6015, 1.4510, 0., 0.])
franka.set_dofs_position(grasp_qpos)
# ΠΠ°Ρ
Π²Π°Ρ
franka.control_dofs_position(grasp_qpos[:-2], motors_dof)
franka.control_dofs_force(np.array([-0.5, -0.5]), fingers_dof)
for i in range(100):
scene.step()
# ΠΠΎΠ΄ΡΡΠΌ
franka.control_dofs_position(lift_qpos[:-2], motors_dof)
for i in range(50):
scene.step()
ref_pos = torch.tile(torch.tensor(lift_qpos[:7]), [n_envs, 1]).cuda()
t0 = time.perf_counter()
if args.m:
init_qpos = torch.tile(torch.tensor([-1.0426, 1.4028, 1.5634, -1.7114, -1.4055, 1.6015, 1.4510]), [n_envs, 1]).cuda()
target_qpos = torch.tile(torch.tensor([1.0426, -1.4028, 1.5634, -1.7114, -1.4055, 1.6015, 1.4510]), [n_envs, 1]).cuda()
for i in range(500):
if i % 2 == 0: # Π‘ΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ Ρ ΡΠ°ΡΡΠΎΡΠΎΠΉ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ManiSkill 50 ΠΡ
franka.control_dofs_position(init_qpos + (target_qpos - init_qpos) * i / 500, motors_dof)
scene.step()
else:
for i in range(500):
if args.r and i % 2 == 0: # Π‘ΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ Ρ ΡΠ°ΡΡΠΎΡΠΎΠΉ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ManiSkill 50 ΠΡ
# Π‘ΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ ΡΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌΠΈ ManiSkill
franka.control_dofs_position(ref_pos + torch.rand((n_envs, 7), device='cuda')*0.05 - 0.025, motors_dof)
scene.step()
t1 = time.perf_counter()
print(f'per env: {500 / (t1 - t0):,.2f} FPS')
print(f'total : {500 / (t1 - t0) * n_envs:,.2f} FPS')
ΠΠ±ΡΠ°ΡΠ½Π°Ρ ΠΊΠΈΠ½Π΅ΠΌΠ°ΡΠΈΠΊΠ°