import genesis as gs
# -> 1. Initialization
gs.init(backend=gs.cpu)
# -> 2. Create a scene
scene = gs.Scene(show_viewer=True)
# -> 3. Load objects into the scene
plane = scene.add_entity(gs.morphs.Plane())
franka = scene.add_entity(
gs.morphs.MJCF(file='xml/franka_emika_panda/panda.xml'),
)
# -> 4. Build the scene and start simulating
scene.build()
for i in range(1000):
scene.step()
Backend device: Genesis는 cross-platform으로 설계되어, 다양한 백엔드 장치를 지원합니다. gs.cpu를 선언함으로써, cpu를 사용할 수 있습니다. GPU 가속 병렬 시뮬레이션이 필요한 경우 gs.cuda, gs.vulkan 또는 gs.metal과 같은 다른 백엔드로 전환할 수 있습니다.
Precision level: 기본적으로 genesis는 f32 정밀도를 사용합니다. 더 높은 정밀도 수준을 원하면 precision='64'로 설정하여 f64로 변경할 수 있습니다.
2. Create a scene
genesis 화면에서 genesis의 모든 객체, 로봇, 카메라등을 배치할 수 있습니다.
scene = gs.Scene()
Scene에서 모든 기본 물리 법칙을 처리하는 '시뮬레이터 객체'와 시각화 관련 개념을 관리하는 '시각화 객체'가 wrapping 됩니다.
Scene을 생성할 때, 구성할 수 있는 다양한 물리 법칙 매개변수들을 조정할 수 있습니다. 예를 들면 아래와 같습니다.
genesis에서 모든 사물과 로봇은 Entity로 나타냅니다. genesis는 완전히 객체 지향적으로 설계되었으므로 핸들이나 해당 Entity에 할당된 전역 ID를 사용하는 대신, Entity 객체의 메서드를 통해 직접 Entity 객체와 상호작용할 수 있습니다.
add_entity의 첫 번째 매개변수는 morph입니다. genesis의 morph는 Entity의 기하학 정보와 포즈 정보를 모두 포함하는 하이브리드 개념입니다. 다양한 형태를 사용하면 모양 기본형, 메시, URDF, MJCF, 지형 또는 소프트 로봇 설명 파일에서 생성 Entity를 인스턴스화 할 수 있습니다.
morph를 생성할 때 위치, 방향, 크기 등을 추가로 지정할 수 있습니다.
방향(orientation)의 경우, morph는 Euler(scipy extrinsic x-y-z convention) 또는 Quat(w-x-y-z convention)를 허용합니다
아래 예제를 살펴봅시다.
franka = scene.add_entity(
gs.morphs.MJCF(
file = 'xml/franka_emika_panda/panda.xml',
pos = (0, 0, 0),
euler = (0, 0, 90), # we follow scipy's extrinsic x-y-z rotation convention, in degrees,
# quat = (1.0, 0.0, 0.0, 0.0), # we use w-x-y-z convention for quaternions,
scale = 1.0,
),
)
현재 아래 예제를 포함한 다양한 유형의 지형 지물 기본 요소를 지원합니다.
gs.morphs.Plane
gs.morphs.Box
gs.morphs.Cylinder
gs.morphs.Sphere
또한, 이동 작업 훈련을 위해 다양한 유형의 지형은 물론 사용자가 제공한 높이 맵에서 gs.morphs.Terrain을 통해 초기화된 지형도 지원합니다.
외부 파일에서 로드할 때는 file 매개변수를 사용하여 파일 위치를 지정해야 합니다. 이를 파싱할 때는 절대 경로 또는 상대 경로를 모두 지원합니다. 우리 예제의 경우 genesis/assets/xml/franka_emika_panda/panda.xml 에서 franka 모델을 검색하여 사용합니다.
외부 URDF 파일을 사용하여, Franka 팔을 로드하려면 간단하게 morph를 gs.morphs.URDF(file='urdf/panda_bullet/panda.urdf', fixed=True) 로 변경하면 됩니다.
4. Build the scene and start simulating
scene.build()
for i in range(1000):
scene.step()
이제 모든 것이 추가되었으므로 시뮬레이션을 시작할 수 있습니다. 이제 scene.build()를 호출하여 먼저 장면을 빌드해야 합니다.
이는 genesis가 각 실행에 대해 GPU 커널을 즉시 컴파일하기 위해 just-in-time(JIT) 기술을 사용하므로, 이 프로세스를 시작하기 위한 명시적 단계가 필요하기 때문에 모든 것을 올려 놓고, 장치 메모리를 할당하고, 시뮬레이션을 위한 기본 데이터 필드를 만듭니다.
장면이 구축되면 대화형 뷰어가 나타나 장면을 시각화합니다. 뷰어에는 '비디오 녹화', '스크린샷', 다양한 '시각화 모드간 전환' 등을 위한 다양한 키보드 단축키가 제공됩니다.