이제 Genesis를 시작해보도록 하겠습니다.
먼저 말씀 드리고자 하는 내용은 전 아나콘다 환경에서는 동작을 하지 않았습니다.
어떤 문제로 인해 충돌이 생겨서 동작을 하지 않는것 같은데 정확한 문제의 원인을 파악하지 못 하여 아나콘다 환경이 아닌 파이썬 가상환경 속에서 동작하도록 구현하였습니다.
python3 -m venv gen_env
source gen_env/bin/activate
를 통해서 일단 파이썬 가상환경을 만들어주겠습니다.
이 때, 파이썬 가상환경의 경우 왠만하면 3.10이나 3.11을 추천드립니다.
3.12의 경우 코드가 동작은 하나, open3d의 경우 3.12를 지원하지 않기 때문에 제대로 동작을 하지 않는 불상사가 생길 수 있습니다...
(참고 : https://velog.io/@scuderia/open3d-python3.12)
이후 가상환경이 동작된 상태에서
pip install genesis-world # Requires Python >=3.9;를 진행했습니다.
그 다음 아마 파이토치를 설치하지 않아 동작하지 않을텐데, 설치된 Cuda의 버전에 맞는 파이토치를 환경에 설치해줍니다.

저같은 경우에는 cuda 12.1이 설치되어 있어
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
를 통해 설치를 진행했습니다.
nvcc -V를 통해서 cuda 버전을 확인 후 그에 맞는 파이토치를 설치하도록 합니다.
그 다음 nano tt.py를 통해 파이썬 파일을 생성 후 아래의 코드를 붙여넣습니다.
(가장 처음 시작할 때 튜토리얼 코드 입니다.)
import genesis as gs gs.init(backend=gs.cpu) scene = gs.Scene(show_viewer=True) plane = scene.add_entity(gs.morphs.Plane()) franka = scene.add_entity( gs.morphs.MJCF(file='xml/franka_emika_panda/panda.xml'), ) scene.build() for i in range(1000): scene.step()
출처 :https://genesis-world.readthedocs.io/en/latest/user_guide/getting_started/hello_genesis.html
Ctrl+O -> Enter -> Ctrl+X를 통해 파일을 저장 후
가상환경에서 파이썬을 실행합니다.
python tt.py

실행하고 나면 아래와 같이 힘 없는 로봇이 생성되는 모습을 볼 수 있습니다.
그럼 공식 홈페이지의 설명을 통해 각 코드가 무엇을 나타내는지 확인해보도록 하겠습니다.
gs.init(backend=gs.cpu)
gs.init() 함수는 우리의 요구 사항에 맞는 특정 설정으로 Genesis 환경을 구성할 수 있습니다.Genesis 초기화 시 설정할 수 있는 다양한 사용자 정의 옵션은 아래와 같이 여러가지가 존재합니다.
gs.cpu: CPU에서 계산 실행 (기본값)gs.cuda: NVIDIA GPU 가속을 위한 CUDA / 저는 cuda를 사용할 예정입니다.gs.vulkan: Vulkan 기반 GPU 계산gs.metal: Apple Silicon GPU(macOS/iOS 플랫폼용)gs.gpu: 사용 가능한 가장 적합한 GPU 백엔드를 자동으로 선택하는 단축키 (예: CUDA가 있으면 gs.cuda로, Apple Silicon이면 gs.metal을 선택합니다.)'info': 기본값, 자세한 정보 제공.'warning': 경고 및 오류 로그만 표시.'dark': 어두운 테마 터미널에 최적화 (기본값).'light': 밝은 테마 터미널에 최적화.'dumb': 최소한의 단색 출력(흑백 스타일 선호 시).None (랜덤 동작).False.1e-12.False.gs.init(
seed = None, # 고정된 난수 시드 없음.
precision = '32', # 단정밀도 부동 소수점 사용.
debug = False, # 디버깅 출력 비활성화.
eps = 1e-12, # 머신 엡실론 설정.
logging_level = None, # 기본 로그 세부정보.
backend = gs_backend.gpu, # GPU 백엔드 선택 (GPU가 설치되어 있다면 추천!).
theme = 'dark', # 어두운 테마 사용.
logger_verbose_time = False # 타임스탬프 로그 비활성화.
)
gs.init() 호출 시:
로그 정보:
디바이스 및 백엔드 초기화:
CPU, CUDA 등)가 초기화되고 계산을 준비합니다.gs.init() 함수는 Genesis의 초기화 루틴으로 아래와 같은 여러가지 기능을 제공합니다.
- 크로스 플랫폼 지원(CPU, GPU, Vulkan, Metal).
- 수치 계산의 정밀도 구성.
- 사용자 맞춤형 로그 및 색상 테마 설정.
먼저 여기까지가 gs.init()을 활용할 수 있는 코드들에 대한 공식 홈페이지 설명을 기반으로 한 설명이었습니다.
다음으로 Scene에 대해 보겠습니다.
위 코드는 Genesis 라이브러리에서 Scene(장면)을 생성하고 설정하는 과정을 설명합니다. Scene은 Genesis에서 물리 시뮬레이션과 시각화를 수행하는 기본 단위입니다. 이 코드가 무엇을 설명하고 있는지 자세히 풀어보겠습니다.
Genesis의 Scene 객체는 다음 두 가지 주요 요소를 포함합니다:
Simulator (시뮬레이터):
Visualizer (시각화 도구):
scene = gs.Scene()
gs.Scene()은 기본 Scene 객체를 생성합니다.출처 : https://genesis-world.readthedocs.io/en/latest/user_guide/getting_started/hello_genesis.html
(Genesis 공식홈페이지 참고)
scene = gs.Scene(
sim_options=gs.options.SimOptions(
dt=0.01,
gravity=(0, 0, -10.0),
),
show_viewer=True,
viewer_options=gs.options.ViewerOptions(
camera_pos=(3.5, 0.0, 2.5),
camera_lookat=(0.0, 0.0, 0.5),
camera_fov=40,
),
)
sim_options: 물리 시뮬레이션 설정gs.options.SimOptions를 통해 물리 엔진의 동작 방식을 설정합니다.
dt=0.01:
gravity=(0, 0, -10.0):
(x, y, z) 형태로 지정되며, 위 값은 z 방향으로 -10.0의 중력을 적용합니다.9.8m/s²)와 유사한 값입니다.show_viewer: 시각화 도구 활성화show_viewer=True:viewer_options: 시각화 설정gs.options.ViewerOptions를 통해 Viewer의 초기 설정을 정의합니다.
camera_pos=(3.5, 0.0, 2.5):
(x, y, z) 좌표로 지정되며, 위 값은 카메라가 (3.5, 0.0, 2.5) 위치에 배치됩니다.camera_lookat=(0.0, 0.0, 0.5):
(x, y, z) 좌표로 지정되며, 위 값은 (0.0, 0.0, 0.5) 방향을 향하도록 설정됩니다.camera_fov=40:
(이 부분의 경우 어느정도 게임을 만져보신 분들이라면 쉽게 감을 잡으실거 같습니다.)
Scene 객체의 역할:
설정 가능한 옵션:
sim_options):viewer_options):시뮬레이션과 시각화의 통합:
이제 Scene에 대해 알아봤습니다. 우리에게 보이도록 만들어줌과 물리 시뮬레이션의 결정이 가능하다는 것을 알 수 있었습니다. 다음으로 Genesis는 모든 객체와 로봇을 Entity라는 객체로 관리하며, 각 Entity는 객체의 모양(geometry), 위치, 크기, 방향과 같은 속성을 정의하는 Morph를 기반으로 생성됩니다.
plane = scene.add_entity(gs.morphs.Plane())
franka = scene.add_entity(
gs.morphs.MJCF(file='xml/franka_emika_panda/panda.xml'),
)
scene.add_entity:
add_entity의 첫 번째 매개변수는 Morph 객체로, 추가하려는 Entity의 형태와 속성을 정의합니다.gs.morphs.Plane:
gs.morphs.MJCF:
.xml)의 로봇 구성 파일을 불러오는 Morph입니다.file 매개변수에 로봇 구성 파일의 경로를 지정해야 하며, 상대 경로나 절대 경로를 사용할 수 있습니다.Genesis에서 Morph는 객체(Entity)의 형태(geometry)와 위치(position), 방향(orientation) 등의 정보를 캡슐화한 개념입니다.
Morph를 사용하여 다음과 같은 객체를 생성할 수 있습니다:
기본 형상(Shape Primitives)
외부 파일을 불러온 로봇 및 객체
다음은 더 복잡한 Morph 생성 예제입니다:
franka = scene.add_entity(
gs.morphs.MJCF(
file = 'xml/franka_emika_panda/panda.xml',
pos = (0, 0, 0),
euler = (0, 0, 90), # Euler 회전 (scipy의 x-y-z 기준, 단위: 도)
# quat = (1.0, 0.0, 0.0, 0.0), # Quaternion 회전 (w-x-y-z 기준)
scale = 1.0, # 크기 조정
),
)
file:
panda.xml은 Genesis의 내부 디렉터리에서 제공되는 파일입니다.pos:
(x, y, z) 좌표로 설정되며, 기본값은 (0, 0, 0)입니다.euler:
(0, 0, 90)은 Z축을 기준으로 90도 회전합니다.quat:
(w, x, y, z) 형식으로 지정됩니다.scale:
1.0이며, 값을 조정하면 객체의 크기가 비율에 따라 변합니다.MJCF (MuJoCo XML):
URDF (Unified Robot Description Format):
fixed=True 옵션을 명시하여 베이스 링크를 고정시켜야 합니다.franka = scene.add_entity(
gs.morphs.URDF(
file='urdf/panda_bullet/panda.urdf',
fixed=True, # URDF 파일은 기본적으로 연결되지 않으므로 고정 필요
)
)
Genesis는 다양한 파일 형식과 시뮬레이션 요소를 지원합니다:
Terrain (지형):
gs.morphs.Terrain을 사용하여 기본 제공되는 지형이나 사용자 정의 높이 맵을 기반으로 지형을 생성할 수 있습니다.Mesh (메시):
.obj, .ply, .stl, .glb, .gltf 등입니다.scene.add_entity 메서드로 Plane, 로봇, 메시 등을 추가할 수 있습니다.fixed=True와 같은 설정이 필요합니다.pos, euler, quat 등을 사용하여 초기 위치와 방향을 설정할 수 있습니다.다음의 내용은 Genesis 라이브러리로 시뮬레이션을 실행하는 과정에 대한 설명입니다. 이 과정에서는 Scene을 준비(build)하고, 시뮬레이션을 실행하는 주요 단계를 다루고 있습니다.
scene.build() # 장면 준비
for i in range(1000): # 1000번의 시뮬레이션 단계 실행
scene.step()
scene.build():
scene.step():
Genesis는 GPU 가속을 최대한 활용하기 위해 JIT 컴파일 기술을 사용합니다. 이는 다음과 같은 이유로 중요합니다:
GPU 커널 생성:
메모리 할당:
시뮬레이션 데이터 초기화:
Genesis는 Scene 빌드 후, 시뮬레이션 결과를 시각적으로 확인할 수 있도록 인터랙티브 뷰어(Interactive Viewer)를 제공합니다.
JIT 컴파일의 특징:
- 새로운 Scene 구성(예: 로봇 종류 변경, 물체 개수 변경 등)이 발생하면 GPU 커널을 다시 컴파일해야 합니다.
- 컴파일 단계는 시간이 걸리지만, 이후에는 최적화된 커널을 사용하여 빠른 실행이 가능합니다.
캐싱 기능:
- Genesis는 이전에 컴파일된 커널을 자동으로 캐싱합니다!! / 특히 이 부분에서 놀랐습니다. 굉장히 시간을 단축시킬 수 있었던 이유 중 하나가 아닐까 생각들었습니다.
- 동일한 Scene 구성을 사용할 경우:
- 첫 실행 시 컴파일된 커널을 재사용하여 속도를 크게 향상시킵니다.
- 단, 정상적으로 종료되거나
Ctrl + C로 종료되어야 캐싱이 가능합니다. (Ctrl + \로 강제 종료 시 캐싱이 불가)
최적화 노력:
- 병렬 컴파일 기술 및 커널 직렬화(Serialization) 속도를 개선하고 있어, 향후 버전에서 빌드 시간이 더욱 단축될 예정이라고 합니다.
Scene 빌드 (scene.build()):
시뮬레이션 단계 (scene.step()):
인터랙티브 뷰어:
캐싱 및 최적화:
이 코드는 Genesis를 활용하여 시뮬레이션 환경을 효과적으로 생성하고 실행하는 기본적인 워크플로를 보여줍니다.