Genesis 실행

Cloud_ Ghost·2025년 1월 6일

Genesis

목록 보기
1/5

이제 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

실행하고 나면 아래와 같이 힘 없는 로봇이 생성되는 모습을 볼 수 있습니다.

그럼 공식 홈페이지의 설명을 통해 각 코드가 무엇을 나타내는지 확인해보도록 하겠습니다.


1. Genesis 초기화

gs.init(backend=gs.cpu)
  • 목적: gs.init() 함수는 우리의 요구 사항에 맞는 특정 설정으로 Genesis 환경을 구성할 수 있습니다.

매개변수와 기능

Genesis 초기화 시 설정할 수 있는 다양한 사용자 정의 옵션은 아래와 같이 여러가지가 존재합니다.

1. backend

  • 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을 선택합니다.)

2. precision

  • 계산에 사용되는 수치 정밀도를 설정합니다.
  • 기본값은 32로 설정되나, 더 높은 정밀도(64 또는 f64)를 지정할 수 있습니다.

3. logging_level

  • 터미널에 출력되는 로그의 자세한 정도를 결정합니다.
  • 선택 옵션:
    • 'info': 기본값, 자세한 정보 제공.
    • 'warning': 경고 및 오류 로그만 표시.

4. theme

  • 터미널에 표시되는 로그의 색상 테마를 설정할 수 있습니다.
  • 선택 옵션:
    • 'dark': 어두운 테마 터미널에 최적화 (기본값).
    • 'light': 밝은 테마 터미널에 최적화.
    • 'dumb': 최소한의 단색 출력(흑백 스타일 선호 시).

5. seed

  • 난수 생성에 고정된 시드를 설정하여 재현 가능한 결과를 제공하도록 돕습니다.
    일반적으로 사용하는 난수생성을 생각하면 됩니다.
  • 기본값: None (랜덤 동작).

6. debug

  • 디버깅 출력을 활성화하는 플래그.
  • 기본값: False.

7. eps

8. logger_verbose_time

  • 로그 메시지에 타임스탬프를 추가할지 여부를 설정합니다.
  • 기본값: 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() 호출 시:

  1. 로그 정보:

    • 사용 가능한 디바이스와 선택된 백엔드를 포함한 시스템 정보를 표시합니다.
    • Genesis 버전 및 사용 중인 설정을 나타냅니다.
  2. 디바이스 및 백엔드 초기화:

    • 선택한 백엔드(e.g., CPU, CUDA 등)가 초기화되고 계산을 준비합니다.

정리하자면?

gs.init() 함수는 Genesis의 초기화 루틴으로 아래와 같은 여러가지 기능을 제공합니다.

  • 크로스 플랫폼 지원(CPU, GPU, Vulkan, Metal).
  • 수치 계산의 정밀도 구성.
  • 사용자 맞춤형 로그 및 색상 테마 설정.

먼저 여기까지가 gs.init()을 활용할 수 있는 코드들에 대한 공식 홈페이지 설명을 기반으로 한 설명이었습니다.

다음으로 Scene에 대해 보겠습니다.

위 코드는 Genesis 라이브러리에서 Scene(장면)을 생성하고 설정하는 과정을 설명합니다. Scene은 Genesis에서 물리 시뮬레이션과 시각화를 수행하는 기본 단위입니다. 이 코드가 무엇을 설명하고 있는지 자세히 풀어보겠습니다.


Scene(장면)의 역할

Genesis의 Scene 객체는 다음 두 가지 주요 요소를 포함합니다:

  1. Simulator (시뮬레이터):

    • 물리적 시뮬레이션을 수행하는 엔진입니다.
    • 중력, 시간 간격, 충돌 등 물리 계산과 관련된 모든 작업을 처리합니다.
  2. Visualizer (시각화 도구):

    • 장면에 있는 모든 객체를 시각적으로 표현하는 엔진입니다.
    • 카메라 위치, 보기 각도, 시야(Field of View, FOV) 등과 관련된 설정을 담당합니다.

1. 간단한 Scene 생성

scene = gs.Scene()
  • 설명:
    • gs.Scene()은 기본 Scene 객체를 생성합니다.
    • 기본 설정으로 물리 시뮬레이터와 시각화 도구가 포함된 빈 장면을 생성합니다.
    • 이후에 로봇, 카메라, 객체 등을 추가하여 원하는 시뮬레이션 환경을 구성할 수 있습니다.

2. 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,
    ),
)

(1) sim_options: 물리 시뮬레이션 설정

  • gs.options.SimOptions를 통해 물리 엔진의 동작 방식을 설정합니다.

    • dt=0.01:

      • 시뮬레이션의 시간 간격(Time Step)을 설정합니다.
      • 0.01초마다 물리 계산을 수행하며, 더 작은 값은 정밀도를 높이지만 계산 비용이 증가합니다. (계산비용의 증가는 곧, 수행시간의 증가로 이어지게 됩니다.)
    • gravity=(0, 0, -10.0):

      • 중력 벡터를 설정합니다.
      • (x, y, z) 형태로 지정되며, 위 값은 z 방향으로 -10.0의 중력을 적용합니다.
      • 이는 실제 지구 중력 가속도(9.8m/s²)와 유사한 값입니다.

(2) show_viewer: 시각화 도구 활성화

  • show_viewer=True:
    • Genesis의 기본 시각화 도구(Viewer)를 활성화합니다.
    • 활성화된 상태에서는 시뮬레이션 장면을 실시간으로 확인할 수 있습니다.
    • 직접 저희에게 보여주도록 만들어준다고 볼 수 있습니다.

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

      • 카메라의 시야(Field of View, FOV)를 설정합니다.
      • 숫자가 작을수록 좁고 집중된 시야를 제공하며, 숫자가 클수록 넓은 시야를 제공합니다.

(이 부분의 경우 어느정도 게임을 만져보신 분들이라면 쉽게 감을 잡으실거 같습니다.)


4. 정리하자면?

  1. Scene 객체의 역할:

    • 물리 엔진(시뮬레이터)과 시각화 엔진(Visualizer)을 포함하는 환경을 생성합니다.
    • 여기에 로봇, 객체 등을 추가하여 시뮬레이션을 설계합니다.
  2. 설정 가능한 옵션:

    • 시뮬레이션 옵션 (sim_options):
      • 시간 간격, 중력 등 물리 엔진의 동작 방식을 설정.
    • 시각화 옵션 (viewer_options):
      • 카메라 위치, 시야각 등 시각적 표현을 설정.
  3. 시뮬레이션과 시각화의 통합:

    • 위 코드는 시뮬레이션의 물리적 정확도를 제어하면서도 Viewer를 통해 실시간으로 결과를 확인할 수 있는 환경을 구성합니다.

이제 Scene에 대해 알아봤습니다. 우리에게 보이도록 만들어줌과 물리 시뮬레이션의 결정이 가능하다는 것을 알 수 있었습니다. 다음으로 Genesis는 모든 객체와 로봇을 Entity라는 객체로 관리하며, 각 Entity는 객체의 모양(geometry), 위치, 크기, 방향과 같은 속성을 정의하는 Morph를 기반으로 생성됩니다.


Entity / 장면(Scene)에 객체 추가하기

코드 예제

plane = scene.add_entity(gs.morphs.Plane())
franka = scene.add_entity(
    gs.morphs.MJCF(file='xml/franka_emika_panda/panda.xml'),
)

각 코드에 대한 설명:

  • scene.add_entity:

    • Scene에 객체(Entity)를 추가하는 메서드입니다.
    • add_entity의 첫 번째 매개변수는 Morph 객체로, 추가하려는 Entity의 형태와 속성을 정의합니다.
  • gs.morphs.Plane:

    • 평면 객체를 생성하는 기본 Morph입니다.
    • 시뮬레이션에서 바닥(ground plane) 역할을 하며, 위치와 방향을 따로 설정하지 않으면 기본값으로 생성됩니다.
  • gs.morphs.MJCF:

    • MuJoCo XML 형식(.xml)의 로봇 구성 파일을 불러오는 Morph입니다.
    • 이 예제에서는 Franka Emika Panda라는 로봇 팔을 불러옵니다. / 여기에서 다른 매개변수를 불러오면 새로운 형태의 물체를 불러올 수 있습니다.
    • file 매개변수에 로봇 구성 파일의 경로를 지정해야 하며, 상대 경로나 절대 경로를 사용할 수 있습니다.

1. Morph의 역할

Genesis에서 Morph는 객체(Entity)의 형태(geometry)위치(position), 방향(orientation) 등의 정보를 캡슐화한 개념입니다.
Morph를 사용하여 다음과 같은 객체를 생성할 수 있습니다:

  • 기본 형상(Shape Primitives)

    • Plane: 평면
    • Box: 박스
    • Cylinder: 원기둥
    • Sphere: 구
  • 외부 파일을 불러온 로봇 및 객체

    • MJCF: MuJoCo XML 파일(.xml)
    • URDF: 로봇 설명 파일(.urdf)
    • Mesh: 메시 파일(.obj, .ply, .stl, .glb, .gltf)

2. Morph 생성 시 추가 설정

다음은 더 복잡한 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:

    • 객체의 방향(회전)을 Euler 각도로 설정합니다. Scipy의 x-y-z 기준을 따르며, 각도 단위는 '도'입니다.
    • 예: (0, 0, 90)은 Z축을 기준으로 90도 회전합니다.
  • quat:

    • Quaternion 형식으로 방향을 설정할 수도 있습니다. Quaternion은 (w, x, y, z) 형식으로 지정됩니다.
    • Euler와 Quaternion 중 하나를 선택해서 사용하면 됩니다.
  • scale:

    • 객체의 크기를 설정합니다. 기본값은 1.0이며, 값을 조정하면 객체의 크기가 비율에 따라 변합니다.

3. URDF와 MJCF의 차이

  • MJCF (MuJoCo XML):

    • MuJoCo에서 사용되는 XML 기반의 로봇 구성 파일.
    • 파일 자체에 로봇의 기본 연결 방식(Joint Types)이 정의되어 있습니다.
    • 따라서 별도의 설정 없이 로봇이 자동으로 Scene에 배치됩니다.
  • URDF (Unified Robot Description Format):

    • 로봇 설계에 사용되는 일반적인 파일 형식.
    • 기본적으로 로봇의 베이스 링크(Base Link)가 자유롭게 움직일 수 있는 6-자유도(6-DOF) Joint로 설정됩니다.
    • 따라서 URDF로 로봇을 추가할 때는 fixed=True 옵션을 명시하여 베이스 링크를 고정시켜야 합니다.

URDF를 사용하는 예제:

franka = scene.add_entity(
    gs.morphs.URDF(
        file='urdf/panda_bullet/panda.urdf',
        fixed=True, # URDF 파일은 기본적으로 연결되지 않으므로 고정 필요
    )
)

4. 기타 지원 기능

Genesis는 다양한 파일 형식과 시뮬레이션 요소를 지원합니다:

  • Terrain (지형):

    • gs.morphs.Terrain을 사용하여 기본 제공되는 지형이나 사용자 정의 높이 맵을 기반으로 지형을 생성할 수 있습니다.
  • Mesh (메시):

    • 비-관절(Non-Articulated) 객체의 형상 파일을 불러올 수 있습니다. 지원 파일 형식은 .obj, .ply, .stl, .glb, .gltf 등입니다.

5. 정리하자면?

  • Scene에 객체 추가: scene.add_entity 메서드로 Plane, 로봇, 메시 등을 추가할 수 있습니다.
  • Morph의 역할: 객체의 형태와 속성을 정의하며, 기본 형상이나 외부 파일을 사용하여 생성할 수 있습니다.
  • MJCF vs URDF: MJCF는 로봇의 연결 정보가 포함되어 있지만, URDF는 추가로 fixed=True와 같은 설정이 필요합니다.
  • 객체 위치 및 방향 설정: pos, euler, quat 등을 사용하여 초기 위치와 방향을 설정할 수 있습니다.

다음의 내용은 Genesis 라이브러리로 시뮬레이션을 실행하는 과정에 대한 설명입니다. 이 과정에서는 Scene을 준비(build)하고, 시뮬레이션을 실행하는 주요 단계를 다루고 있습니다.


시뮬레이션 실행

시뮬레이션 실행을 위한 코드

scene.build()  # 장면 준비
for i in range(1000):  # 1000번의 시뮬레이션 단계 실행
    scene.step()

설명:

  1. scene.build():

    • Scene을 빌드하는 단계로, 시뮬레이션을 실행하기 전에 반드시 호출해야 합니다.
    • Genesis는 Just-In-Time (JIT) 컴파일 기술을 사용하여 GPU 커널(코드)을 실행 시점에 컴파일합니다.
      이 단계에서:
      • GPU 또는 CPU 메모리를 할당합니다.
      • 물리 시뮬레이션에 필요한 내부 데이터 구조를 생성합니다.
  2. scene.step():

    • 시뮬레이션의 한 단계를 실행합니다.
    • 위 코드는 총 1000번의 시뮬레이션 단계를 반복 실행합니다.
    • 이 과정에서 물리적 상호작용(예: 중력, 충돌, 로봇의 움직임 등)이 계산되고, Scene에 반영됩니다.

1. 시뮬레이션 시 JIT 컴파일의 중요성

Genesis는 GPU 가속을 최대한 활용하기 위해 JIT 컴파일 기술을 사용합니다. 이는 다음과 같은 이유로 중요합니다:

왜 Scene을 빌드해야 할까?

  • GPU 커널 생성:

    • JIT 기술은 각 시뮬레이션 구성에 맞는 GPU 커널을 즉시 생성합니다.
    • 예를 들어, 로봇의 개수, 물체의 종류, 물리적 속성 등이 바뀌면 새로운 커널이 필요합니다.
  • 메모리 할당:

    • 장면의 객체와 로봇 정보에 따라 GPU 또는 CPU 메모리를 동적으로 할당합니다.
  • 시뮬레이션 데이터 초기화:

    • 충돌 탐지, 중력 계산, 위치/속도 등의 데이터를 초기화합니다.

2. 시뮬레이션 실행 중 시각화

Genesis는 Scene 빌드 후, 시뮬레이션 결과를 시각적으로 확인할 수 있도록 인터랙티브 뷰어(Interactive Viewer)를 제공합니다.

뷰어의 주요 기능:

  • 시뮬레이션 모니터링:
    • 로봇과 물체가 시뮬레이션에서 어떻게 움직이는지 실시간으로 확인할 수 있습니다.
  • 단축키 지원:
    • 비디오 녹화, 스크린샷 저장, 시각화 모드 전환 등이 가능합니다.
    • 이후 튜토리얼에서 더 자세히 다룰 예정입니다.

3. JIT 컴파일과 캐싱

JIT 컴파일의 특징:

  • 새로운 Scene 구성(예: 로봇 종류 변경, 물체 개수 변경 등)이 발생하면 GPU 커널을 다시 컴파일해야 합니다.
  • 컴파일 단계는 시간이 걸리지만, 이후에는 최적화된 커널을 사용하여 빠른 실행이 가능합니다.

캐싱 기능:

  • Genesis는 이전에 컴파일된 커널을 자동으로 캐싱합니다!! / 특히 이 부분에서 놀랐습니다. 굉장히 시간을 단축시킬 수 있었던 이유 중 하나가 아닐까 생각들었습니다.
  • 동일한 Scene 구성을 사용할 경우:
    • 첫 실행 시 컴파일된 커널을 재사용하여 속도를 크게 향상시킵니다.
    • 단, 정상적으로 종료되거나 Ctrl + C로 종료되어야 캐싱이 가능합니다. (Ctrl + \로 강제 종료 시 캐싱이 불가)

최적화 노력:

  • 병렬 컴파일 기술 및 커널 직렬화(Serialization) 속도를 개선하고 있어, 향후 버전에서 빌드 시간이 더욱 단축될 예정이라고 합니다.

4. 전체 프로세스 요약

  1. Scene 빌드 (scene.build()):

    • JIT 기술로 GPU 커널 생성.
    • 장면 구성 요소 초기화 및 메모리 할당.
  2. 시뮬레이션 단계 (scene.step()):

    • 한 번의 호출마다 시뮬레이션 시간의 한 스텝이 계산되고 Scene에 반영.
    • 중력, 충돌, 로봇 움직임 등의 물리 연산 수행.
  3. 인터랙티브 뷰어:

    • 시뮬레이션 실행 중 장면 시각화.
    • 녹화, 스크린샷 등의 다양한 기능 제공.
  4. 캐싱 및 최적화:

    • 첫 실행 이후 동일한 Scene 구성 시 컴파일된 커널을 재사용.
    • 향후 버전에서 빌드 속도 향상 예정.

Genesis의 장점

  • GPU 가속 최적화: JIT 기술을 활용해 효율적으로 물리 시뮬레이션 수행.
  • 시각적 피드백 제공: 인터랙티브 뷰어로 실시간 확인 가능.
  • 확장성: 커널 캐싱 및 병렬 컴파일로 실행 속도 최적화.

이 코드는 Genesis를 활용하여 시뮬레이션 환경을 효과적으로 생성하고 실행하는 기본적인 워크플로를 보여줍니다.

profile
행복합시다~

0개의 댓글