Custom Extension 작성

C:\\users\\(사용자)\\appdata\\local\\ov\\pkg\\isaac_sim-2022.1.1\\exts\\omni.isaac.demos\\omni\\isaac\\demos

에 파일 작성

ex) ****“sk_building.py”

C:\\users\\사용자\\appdata\\local\\ov\\pkg\\isaac_sim-2022.1.1\\exts\\omni.isaac.demos\\config\\ extension.toml 에 아래 내용 추가

[[python.module]]
name = "omni.isaac.demos.sk_building"

⇒ api위치.파일 이름

omni.ext.IExt 상속 기반 Extension

sk_building.py

from pxr import Gf
import carb
import omni.usd
import omni.ext
import omni.ui as ui
import omni.physx as _physx
from omni.kit.menu.utils import add_menu_items, remove_menu_items, MenuItemDescription
from pxr import UsdGeom
import math
EXTENSION_NAME = "Robot Simulation in SK”

class Extension(omni.ext.IExt):
    def on_startup(self, ext_id: str):
        """Initialize extension and UI elements"""

        self._ext_id = ext_id

        self._timeline = omni.timeline.get_timeline_interface()
        self._viewport = omni.kit.viewport_legacy.get_default_viewport_window()
        self._usd_context = omni.usd.get_context()
        self._stage = self._usd_context.get_stage()

        self._window = None
        # self._window = ui.Window(EXTENSION_NAME, width=500, height=175, visible=False)
        # self._window.set_visibility_changed_fn(self._on_window)

        menu_items = [
            MenuItemDescription(name=EXTENSION_NAME, onclick_fn=lambda a=weakref.proxy(self): a._menu_callback())
        ]
        self._menu_items = [MenuItemDescription(name="Custom", sub_menu=menu_items)]
        add_menu_items(self._menu_items, "Isaac Examples")
        self._dc = _dynamic_control.acquire_dynamic_control_interface()
        self._build_ui()

        self._setup_done = False
        self._rc = None

⇒ 다음과 같이 코드를 작성하여 Isaac Examples - Custom - Robot Simulation in SK에서 열 수 있게 됨

event

	def _menu_callback(self):
        self._window.visible = not self._window.visible

  def _on_window(self, visible):
        if self._window.visible:
            self._sub_stage_event = self._usd_context.get_stage_event_stream().create_subscription_to_pop(
                self._on_stage_event
            )
        else:
            self._sub_stage_event = None

	async def _play(self, task):
        done, pending = await asyncio.wait({task})
        if task in done:
            self._timeline.play()
            await asyncio.sleep(1)

  async def _on_setup_fn(self, task):
        done, pending = await asyncio.wait({task})
        if task in done:
            self._stage = self._usd_context.get_stage()
            # setup robot controller
            self._rc = RobotController(
                self._stage,
                # self._timeline,
                self._dc,
                self._robot_prim_path,
                self._robot_chassis,
                self._robot_wheels,
                self._robot_wheels_speed,
                [0.2, 0.5],
                self._wheelbase_Length,
                self._wheel_radius,
            )
            self._rc.control_setup()
            # start stepping
            self._editor_event_subscription = _physx.get_physx_interface().subscribe_physics_step_events(
                self._rc.update
            )
            self._debug_draw_subs = (
                omni.kit.app.get_app().get_update_event_stream().create_subscription_to_pop(self._rc.draw_path)
            )

    def _on_environment_setup(self):
        # wait for new stage before creating robot
        task = asyncio.ensure_future(omni.usd.get_context().new_stage_async())
        task1 = asyncio.ensure_future(self._create_robot(task))
        # set editor to play before setting up robot controller
        task2 = asyncio.ensure_future(self._play(task1))
        asyncio.ensure_future(self._on_setup_fn(task2))

        # self._load_btn.enabled=False
        self._move_btn.enabled = True
        self._rotate_btn_1.enabled = True
        self._rotate_btn_2.enabled = True
        self._navigate_btn.enabled = True
        self._stop_btn.enabled = True
        self._follow_target_btn.enabled = True
        self._setup_done = True

        
    def on_shutdown(self):
        self._rc = None
        self._timeline.stop()
        self._editor_event_subscription = None
        remove_menu_items(self._menu_items, "Isaac Examples")
        self._window = None
        gc.collect()

Extension ui

Untitled