NVIDIA Isaac Sim Extensions (1)
Update
2024-04-22 (1st update)- 2024-05-08 (2nd update)
Isaac Sim Extension Introduction
오늘은 NVIDIA Isaac Sim뿐만 아니라, Omniverse 플랫폼 자체에서 제공하고 있는 Extension이라는 개념을 살펴보고 예제 코드를 통해 나만의 UI을 Isaac Sim에서 만들어 볼까 한다.
UI를 짜기 전에 우선 Extension이 무엇이고, Extension을 이용해 어떤 것들을 할 수 있는지 보자.
What is Isaac Extension?
공식 문서에서 Omniverse Extensions는 Omniverse Kit 기반 앱의 핵심 빌딩 블록이라고 한다. Omniverse Extensions는 USD Explorer, USD Composer, USD Presenter 및 기타 앱에서 사용하는 개별 도구를 구성하는 것이다. Kit 기반 앱은 확장 기능으로 구성되어 있으므로 새로운 확장 기능을 생성하거나 기존 확장 기능을 편집 또는 활성화하여 필요에 맞게 사용하는 앱의 기능을 확장할 수 있다고 한다.
Extension Category
Omniverse에는 작업 흐름을 사용자 정의하는 데 사용할 수 있는 다양한 확장 기능이 있다.
ex) 시뮬레이션 카테고리에는 물리부터 파괴 시뮬레이션까지 모든 것이 포함되어 있고, 애니메이션 카테고리에는 캐릭터 애니메이션부터 타입라인 및 곡선 조작까지 모든 것이 포함되어 있다고 한다.
이 확장 목록은 아직은 완성이 되지 않았으며, Kit developer documentation에서 확인할 수 있다고 한다.
Build your own Extensions
Document에서는 나만의 Extensions를 개발할 수 있도록 친절하게 Extension 개발 가이드도 지원하고 있다.
만약 이 블로그를 참조해서 만들기 싫다면 아래의 순서대로 참조하면 된다.
자 그럼 이제 나만의 Extension을 만들어보자. 어디서 보고 들은건 있어서 내가 최종적으로 만들고자 하는 프로토 타입을 살짝 그려보았다. 일단 기본적으로 나의 UI baseline은 Omniverse Isaac Gym을 모티브로 만들려고 한다. 그런데 나만의 스타일을 곁들인… 그래서 나만의 1번째 UI의 최종 프로토타입은 아래와 같이 생겼다.
나는 강화학습 에이전트를 훈련시키려고 생각하고 있으며 내가 만든 프로토타입에 대해서 설명해주겠다.
Information: 이 UI에 대한 정보를 나타낸다. UI에 대한 설명이 들어갈 예정이다.Import Robot: 로봇을 불러오는 UI이다. 내가 넣고 싶은 로봇의 경우 Clearpath사의 **Husky Robot**, Wego Robotics의 **WeCAR2.0**, **Franka Research 3**, **Franka Resarch 3 + Husky** 로봇으로 총 4개이다.다음으로
Number of Agents인자는 훈련을 수행하기 위해 몇명의 에이전트를 불러와서 학습을 수행할 것인지에 대해서 설정할 수 있는 UI이다. agent가 많으면 많을수록 학습은 빠르겠지만 그만큼 하드웨어의 성능이 받쳐주어야 학습이 가능할 것이다. 하드웨어가 좋지 않지만 agent 수를 최대로 한다면 컴퓨터가 빵…하고 터져버릴 수도 있다.다음으로
LOAD버튼을 눌러 환경과 agent를 load할 수 있는 버튼이다.Rendering Mode의 경우 Full render, headless가 있으며, Full render의 경우 학습과정을 우리 눈으로 볼 수 있도록 rendering 하는 것이고, headless의 경우 GUI (Graphic User Interface)를 띄우지 않고 CLI (Command Line Interface)를 통해 학습 과정을 확인할 수 있는 방법이다.Configure Training의 경우 우리가 학습을 시키면 학습 모델 저장을 하게 될 것이다. 이러한 학습 모델 중간에 이어 학습을 재개하기 위해 resume from checkpoint라는 버튼을 만들어 놓았다. 그리고 학습에 대한 훈련이 된다면 test가 필요할 것인데, test를 할 수 있도록 버튼을 만들어 놓았다. 마지막으로, 훈련된 agent가 task를 잘 수행하는지 확인하기 위한 evaluate과정을 확인하려면 evaluate 버튼을 클릭하면 된다.Train/Test의 경우, 훈련을 시작할 것인지 멈출것인지에 대한 내용이므로 설명이 필요하지 않으리라 생각이 되어 생략하겠다.Evaluation SetupUI는 우리가 훈련을 완료하고 Evaluation을 수행할 때 필요한 UI이다.Import Environment의 경우 환경, asset 등을 불러와서 배치할 수 있도록 만든 버튼이다.Translate, Orientation, Scale버튼은 X, Y, Z 축으로 위치를 옮기거나 크기를 변경할 수 있다.Reset Position의 경우 asset들을 불러온 것을 초기화하고 싶은 경우 클릭할 수 있도록 만든 버튼이다.학습을 수행한 에이전트를 평가하려면 다양한 환경에서도 잘 할 수 있어야 한다. 예를 들어, 로봇이 navigation task를 수행하는 경우 정적 또는 동적의 장애물이 어느 위치, 방향으로 있던 task를 잘 수행해야한다. 그렇기 때문에 현재로써는 Gaussian, Uniform distribution을 기준으로 물체의 위치를 randomize할 수 있도록 만든 버튼이다.
Step 01. Generate Extension Template
처음으로 우리가 작업할 extension 폴더를 원하는 위치에 만들어준다.
1
2
$ cd /home/{path}
$ mkdir {Extension Name}
다음으로 extension template를 생성하기 위해 isaac sim에 접속해준다. 접속해서 Isaac Utils - Generate Extension Templates순서로 클릭한다. 클릭하게 된다면 아래의 화면을 마주할 수 있을 것이다.
Template를 생성하기 위해 빨간색으로 표시되어 있는 윗부분인
Extension Path를 클릭해서 우리가 방금전에 생성한 파일로 들어가서 똑같은 이름의 파일을 만들어준다.그 다음으로 Extension Title을 만들어줘야하는데 이것은 Extension에 비춰지는 Title이름이다.
이 두개를 완료하였다면 Generate Extension을 클릭해서 Template를 만들어주자.
템플릿을 만들었다면 아래의 파일 구조를 확인할 수 있을 것이다.
{Extension_name}_pythonconfigdatadocs
여기서 {Extension name}_python이라는 파일이 있는데 여길 클릭해서 들어가면 아래의 파일들을 확인할 수 있을 것이다.
global_variables.py: 여기서는 title 및 description과 같은 extension template generator에서 extension을 생성할 때 사용자가 지정한 전역 변수를 저장하는 스크립트이다.extension.py: 사용자 확장을 툴바에 표시하는 데 필요한 표준 상용구가 포함된 클래스이다. 이 클래스는 수정 없이 대부분의 UES 사례를 충족하기 위한 것이라고 한다,Extension.py에는 사용자가builder.py에서 완료할 수 있는 유용한 표준 콜백 함수가 생성된다고 한다.ui_builder.py: 이 파일은 템플릿에 대한 기본 진입점이고, 사용자는 자신을 위해 설정된 유용한 콜백 함수를 볼 수 있고 사용자 정의 콜백 함수에 연결된 UI 요소를 만들 수도 있다. 이 파일 자체는 문서화가 잘 되어 있으므로 전체를 바꾸고 싶은 경우 반드시 읽고 나서 바꾸길 바란다.
일반적인 기능을 수정하고자 하는 사람의 경우 ui_builder.py 파일만 수정하면 된다.
자 그럼 이제부터 ui_builder.py 파일에 대해서 리뷰해보자.
ui_builder.py
파일은 크게 6가지로 보면 된다.
on_menu_callback(): 이 함수는 확장 프로그램이 열릴 때 호출된다.
1
2
3
4
5
def on_menu_callback(self):
"""Callback for when the UI is opened from the toolbar.
This is called directly after build_ui().
"""
pass
Template 파일을 열어보면 아무것도 적혀있지 않음을 볼 수 있다.
on_timeline_event(): 타임라인이 중지, 일시정지 또는 재생될 때 호출됩니다.
1
2
3
4
5
6
7
def on_timeline_event(self, event):
"""Callback for Timeline events (Play, Pause, Stop)
Args:
event (omni.timeline.TimelineEventType): Event Type
"""
pass
이 함수를 보면 또한 아무것도 적혀있지 않다. 나중에 사용할 때 자세하게 살펴보자.
on_physics_step(): 모든 물리 단계에서 호출됩니다. 물리 단계는 타임라인이 재생되는 동안에만 발생합니다.
1
2
3
4
5
6
7
8
def on_physics_step(self, step):
"""Callback for Physics Step.
Physics steps only occur when the timeline is playing
Args:
step (float): Size of physics step
"""
pass
on_stage_event(): 스테이지가 열리거나 닫힐 때 호출됩니다.
1
2
3
4
5
6
7
def on_stage_event(self, event):
"""Callback for Stage Events
Args:
event (omni.usd.StageEventType): Event Type
"""
pass
cleanup(): 확장 프로그램이 닫히기 때문에 물리 구독과 같은 리소스를 정리해야 할 때 호출됩니다.
1
2
3
4
5
6
7
8
9
10
def cleanup(self):
"""
Called when the stage is closed or the extension is hot reloaded.
Perform any necessary cleanup such as removing active callback functions
Buttons imported from omni.isaac.ui.element_wrappers implement a cleanup function that should be called
"""
# None of the UI elements in this template actually have any internal state that needs to be cleaned up.
# But it is best practice to call cleanup() on all wrapped UI elements to simplify development.
for ui_elem in self.wrapped_ui_elements:
ui_elem.cleanup()
build_ui(): 원하는 UI를 생성하는 사용자 함수입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def build_ui(self):
"""
Build a custom UI tool to run your extension.
This function will be called any time the UI window is closed and reopened.
"""
# Create a UI frame that prints the latest UI event.
self._create_status_report_frame()
# Create a UI frame demonstrating simple UI elements for user input
self._create_simple_editable_fields_frame()
# Create a UI frame with different button types
self._create_buttons_frame()
# Create a UI frame with different selection widgets
self._create_selection_widgets_frame()
# Create a UI frame with different plotting tools
self._create_plotting_frame()
UI 생성
현재 UI 생성물에 대해서 공유하겠다.
현재까지 계획한 UI 중 어떤 사항들을 완료했는지 확인해보도록 하겠다.
- Robot Importer
- Evaluation Setup
앞으로 추가할 UI
Robot Importer에 대해서 말을 해보자면 내가 원하는 로봇을 불러온 다음 그걸 python스크립트로 불러올 수 있도록 해야하는데