06. ROS2 브릿지
실제 로봇 코드(ROS2 노드)를 그대로 두고 센서 입력만 시뮬레이션으로 바꿔치기하려면 ROS2 브릿지가 필요하다. Isaac Sim은 isaacsim.ros2.bridge 확장을 켜고 OmniGraph 액션 그래프에 ROS2 helper 노드(ROS2CameraHelper, ROS2PublishOdometry 등)를 연결하면 표준 토픽으로 publish/subscribe할 수 있다.
이 기능의 강점
- ROS2 Humble·Iron·Jazzy 호환 — 같은 노드 코드를 실기/시뮬에서 그대로 실행
- OmniGraph 액션 그래프로 카메라/라이다/TF publish 노드를 시각적으로 구성
- QoS / 토픽명 / 프레임 ID 모두 시뮬 측에서 설정 가능
- Nav2, MoveIt2, RVIZ2와 직접 연결되어 sim-to-real 디버깅 가능
구현 방법
enable_extension("isaacsim.ros2.bridge") → 카메라/라이다 prim 생성 → og.Controller.edit로 OnTick → ROS2CameraHelper(topicName=...) 그래프 구축. 외부 ros2 topic echo /isaac/rgb로 수신 확인.
최소 데모
검증 결과
스크립트가 브릿지 확장 8종(bridge/core/examples/nodes/sim_control/tf_viewer/ui/urdf) 가용성 확인 + OmniGraph 노드 2개 생성 후 정상 렌더링.
핵심 코드 발췌
from isaacsim.core.utils.extensions import enable_extension
enable_extension("isaacsim.ros2.bridge")
import omni.graph.core as og
(graph, _, _, _) = og.Controller.edit(
{"graph_path": "/Graphs/CameraPub", "evaluator_name": "execution"},
{
og.Controller.Keys.CREATE_NODES: [
("OnTick", "omni.graph.action.OnPlaybackTick"),
("CamHelper", "isaacsim.ros2.bridge.ROS2CameraHelper"),
],
og.Controller.Keys.CONNECT: [
("OnTick.outputs:tick", "CamHelper.inputs:execIn"),
],
og.Controller.Keys.SET_VALUES: [
("CamHelper.inputs:topicName", "/isaac/rgb"),
("CamHelper.inputs:type", "rgb"),
],
})
코드 다운로드 (zip)
실무 예제 — Franka 시뮬레이션 + ROS2 카메라 publisher 그래프
실제 publish를 위해 ROS_DISTRO=jazzy + RMW_IMPLEMENTATION=rmw_fastrtps_cpp 환경변수를 설정한 후 OmniGraph로 OnPlaybackTick → ROS2CameraHelper를 연결. 토픽 /isaac/rgb로 RGB 이미지가 publish됨.
_status.txt: ros2_bridge_enabled=True / ros_distro=jazzy / rmw=rmw_fastrtps_cpp / graph_nodes=['/Graphs/CameraPub/OnTick', '/Graphs/CameraPub/CamHelper']. 외부 ROS2 환경에서 ros2 topic list를 실행하면 /isaac/rgb가 나타남.
실무 데모 코드
import os
os.environ["ROS_DISTRO"] = "jazzy"
os.environ["RMW_IMPLEMENTATION"] = "rmw_fastrtps_cpp"
from isaacsim.core.utils.extensions import enable_extension
enable_extension("isaacsim.ros2.bridge")
# (OmniGraph 그래프는 위와 동일)
실무 데모 코드 zip