시뮬레이터에 구성된 가상 센서들의 데이터는 ROS 2 브리지를 통해 실시간으로 ROS 토픽에 송출됩니다. 각 센서 종류별로, 데이터 생성부터 ROS 메시지로 변환되어 전달되기까지의 흐름을 살펴보겠습니다.
4.1 LiDAR 센서 데이터 흐름
LiDAR는 레이저 스캔을 통해 주변 물체까지의 거리를 측정하는 센서로, 시뮬레이션에서는 가상의 레이저 주사선(ray)을 발사하여 충돌 지점을 계산함으로써 데이터를 생성합니다. Isaac Sim에서 LiDAR를 사용하려면 로봇 모델(또는 환경)에 LiDAR 센서 프림(prim)을 부착해야 하며, 예컨대 2D 평면 LiDAR의 경우 로봇 섀시(Chassis)에 회전하는 스캐너로 추가합니다. 시뮬레이션이 진행되면 해당 LiDAR 센서는 매 프레임 현재 방위각(angle)에 따른 거리 값 배열을 산출합니다.
ROS 2 브리지를 통해 이 레이저 주사 데이터는 ROS 2 표준 메시지인 sensor_msgs/LaserScan 형태로 변환되어 퍼블리시됩니다
docs.isaacsim.omniverse.nvidia.com
. 이를 담당하는 OmniGraph 노드가 ROS 2 Publish Laser Scan으로, LiDAR 센서의 출력(거리 배열 및 각도 범위 등)을 입력으로 받아 /scan과 같은 토픽으로 LaserScan 메시지를 보냅니다
docs.isaacsim.omniverse.nvidia.com
. 이 메시지에는 각 레이저 빔의 거리 값(ranges 배열)과 센서의 방위각 범위/해상도 정보 등이 담겨 있으며, Frame ID도 시뮬레이터에서 설정한 값(예: "sim_lidar")으로 채워집니다
docs.isaacsim.omniverse.nvidia.com
docs.isaacsim.omniverse.nvidia.com
. 외부 ROS 2 노드는 해당 토픽을 구독하여 실시간으로 가상의 장애물 거리 정보를 활용할 수 있습니다.
시뮬레이션 LiDAR 데이터 흐름의 특징은 고해상도일 경우 데이터량이 많아 성능 부하가 있을 수 있다는 점입니다. 예를 들어 360도 방향에 고정밀로 레이저를 쏘는 3D LiDAR의 경우 포인트 클라우드(point cloud) 방식으로 수만 개의 점을 퍼블리시할 수도 있습니다. 따라서 필요에 따라 해상도나 주기를 조절해야 합니다. 일반적인 2D LiDAR (예: 270도 범위, 0.5도 해상도 등)는 LaserScan 메시지 크기가 비교적 작지만, 여러 센서를 동시에 송신하면 누적 부하가 커질 수 있습니다. 이럴 때는 시뮬레이터에서 레이저 빔 개수를 줄이거나, 퍼블리시 빈도를 낮추는 조정을 고려합니다. (Isaac Sim에서는 LiDAR의 회전 업데이트 속도를 조절하거나, LaserScan 노드에 QoS 설정을 통해 전송율을 제어할 수 있습니다.)
4.2 카메라 센서 데이터 흐름
가상 카메라는 로봇 또는 환경에 장착되어 장면의 영상을 렌더링합니다. Isaac Sim의 물리 기반 렌더링 엔진은 RGB 카메라, Depth 카메라, 세그멘테이션 카메라 등의 다양한 모드를 지원하는데, 여기서는 RGB 카메라를 예로 들겠습니다. 시뮬레이터가 한 프레임을 렌더링하면, 카메라 프림에 대응하는 뷰포트에서 이미지 버퍼를 얻을 수 있습니다. ROS 2 Camera Helper라는 OmniGraph 노드를 사용하면 이 이미지 버퍼를 ROS 2의 sensor_msgs/Image 메시지로 변환하여 지정된 토픽(예: /rgb 또는 /camera/color/image_raw)으로 퍼블리시합니다
docs.isaacsim.omniverse.nvidia.com
. 동시에, 카메라의 내부 파라미터(핵심은 Camera Info로, 해상도와 카메라 행렬 등이 포함)를 sensor_msgs/CameraInfo 메시지로 퍼블리시하는 Camera Info Helper 노드도 함께 구성할 수 있습니다
docs.isaacsim.omniverse.nvidia.com
. 이를 통해 외부 ROS 2 노드는 영상을 구독함과 동시에 그 영상에 대한 캘리브레이션 정보를 얻어, 예컨대 RViz2에서 시뮬레이터 카메라 영상을 왜곡 없이 보여줄 수 있게 됩니다.
시뮬레이션 카메라 데이터는 매 렌더링 프레임마다 발생하기 때문에, 고해상도·고프레임레이트로 그대로 퍼블리시할 경우 대역폭과 처리 부하가 매우 커질 수 있습니다. 예를 들어 기본 설정 (1920×1080 해상도, 60FPS 등)으로 영상을 송출하면 성능 저하를 유발할 수 있으므로, 적절한 조정이 필요합니다. 실습 예시에서는 해상도를 320×320으로 낮추고, frameSkipCount를 3으로 설정하여 4프레임에 한 번씩만 이미지를 퍼블리시하도록 하였습니다. 이처럼 출력 해상도 축소와 프레임 스킵은 시뮬레이션 성능을 유지하면서도 필요한 정보는 전달하도록 균형을 맞추는 방법입니다. 외부 노드에서는 image_proc 패키지 등을 이용해 받는 해상도를 기준으로 처리를 하면 되고, 만약 고해상도가 꼭 필요하다면 그 때는 GPU 자원과 통신 여유를 고려해 설정을 높이면 됩니다. 중요한 것은 시뮬레이터가 ROS 2 이미지 퍼블리셔로 동작하여, 개발자는 마치 실제 카메라 드라이버 노드가 영상을 보내주는 것처럼 데이터를 사용할 수 있다는 점입니다.
4.3 IMU 센서 데이터 흐름
IMU(Inertial Measurement Unit)는 로봇의 선속도, 각속도, 자세(quaternion) 등을 측정하는 관성 센서입니다. 가상 환경에서 IMU는 PhysX 물리 엔진을 통해 로봇의 움직임(가속도, 회전) 정보를 산출하는 형태로 구현됩니다. Isaac Sim에서는 원하는 위치(예: 로봇의 무게중심)에 IMU 센서 프림을 추가하면, 시뮬레이션 중 해당 센서가 매 프레임 로봇의 가속도 및 각속도, 방향(quaternion)을 계산합니다. 이 데이터를 Isaac Read IMU라는 노드로 읽어올 수 있으며, ROS 2 브리지의 ROS 2 Publish Imu 노드를 통해 ROS 2의 sensor_msgs/Imu 메시지로 퍼블리시합니다. IMU 메시지에는 3축 가속도 값(linear acceleration), 3축 각속도 값(angular velocity), 그리고 로봇의 방향을 나타내는 쿼터니언(orientation)이 포함되어 전송됩니다. 기본적으로 시뮬레이터의 좌표계 기준으로 한 값이며, Frame ID는 IMU 센서가 장착된 링크의 좌표 이름을 반영하도록 설정합니다.
외부 ROS 2 노드가 /imu 토픽을 구독하면, 실제 로봇의 IMU를 구독하는 것과 동일하게 가상 로봇의 모션 데이터를 실시간 활용할 수 있습니다. 이를 통해 예를 들어 자세 추정, 가속도 기반 이동 감지 등의 알고리즘을 시뮬레이션 단계에서 테스트할 수 있습니다. IMU 데이터는 노이즈 없이 이상적으로 나오지만, 필요에 따라 Isaac Sim에서 센서 노이즈나 바이어스 파라미터를 조정해 현실감을 높일 수도 있습니다. 또한, 시뮬레이션에서는 물리 엔진의 계산 간격(타임스텝)에 따라 IMU 갱신률이 정해지므로, 일반적으로 카메라보다 높은 주기로 퍼블리시됩니다. ROS 2 측에서는 IMU 데이터의 timestamp를 활용해 동기화하거나 필터링 알고리즘에 입력으로 사용할 수 있습니다.
Isaac Sim에서 ROS 2 연동을 구현할 때 핵심이 되는 것이 OmniGraph/액션 그래프(Action Graph)의 구성입니다. 액션 그래프는 시뮬레이션 엔진 내의 노드 기반 데이터 흐름 시스템으로, 각종 이벤트나 함수 호출을 그래프 형태로 연결하여 일정한 로직을 실행하게 합니다. ROS 2 브리지를 사용할 때, 우리는 ROS 2용 특수 노드들과 센서 노드들을 그래프로 배치하여 원하는 통신을 설정하게 됩니다
docs.isaacsim.omniverse.nvidia.com
docs.isaacsim.omniverse.nvidia.com
.
액션 그래프 구성의 기본 원리는 다음과 같습니다:
ROS 2 컨텍스트(Context) 노드: 그래프 내에 단 하나 배치되며, ROS 2 네트워크 연결 정보를 제공하는 노드입니다. 이 노드의 Domain ID 속성을 우리가 설정한 ROS_DOMAIN_ID 값과 일치하게 넣습니다
docs.isaacsim.omniverse.nvidia.com
. 컨텍스트 노드는 출력 포트로 내부 컨텍스트 핸들을 내보내며, 다른 ROS 2 관련 노드들의 context 입력에 연결됩니다
docs.isaacsim.omniverse.nvidia.com
. 이로써 그래프의 모든 ROS 2 퍼블리셔/서브스크라이버 노드가 동일한 Domain ID와 실행 컨텍스트에서 동작하도록 보장합니다.
센서 읽기 노드: 시뮬레이터의 각 센서 유형에 대응하는 데이터 소스 노드입니다. 예를 들어 Isaac Read IMU Node는 지정된 경로의 IMU 센서 프림으로부터 현재 측정값을 읽어내고, Isaac Read Lidar 노드는 LiDAR 센서의 레이저 거리 배열 데이터를 출력합니다. 카메라의 경우 Isaac Sim에서는 Render Product 노드가 카메라 영상을 제공하므로, 이를 후속 처리 노드로 연결합니다. 이들 센서 노드는 주로 Physics Step이나 Rendering Step에 맞춰 자동 실행되며, 매주기 새로운 데이터를 내놓습니다.
ROS 2 퍼블리시 노드: ROS 2 브리지 확장에서 제공되는 노드들로, 특정 메시지 타입을 ROS 토픽에 퍼블리시합니다. 예를 들어 ROS 2 Publish Image는 입력으로 받은 영상 데이터를 sensor_msgs/Image로 변환해 토픽에 내보내고
docs.isaacsim.omniverse.nvidia.com
, ROS 2 Publish Laser Scan은 입력받은 레이저 스캔 데이터를 LaserScan 메시지로 만들어 퍼블리시합니다
docs.isaacsim.omniverse.nvidia.com
. 이외에도 ROS 2 Publish Imu, ROS 2 Publish Joint State, ROS 2 Publish Odometry 등 다양한 퍼블리셔 노드가 준비되어 있습니다
docs.isaacsim.omniverse.nvidia.com
. 이러한 노드들은 context 입력을 갖고 있는데, 앞서 말한 ROS 2 Context 노드의 출력을 여기에 연결해야 실제 ROS 네트워크로 메시지가 나가게 됩니다
docs.isaacsim.omniverse.nvidia.com
. 또한 토픽 이름, QoS, 프레임 아이디 등의 속성을 노드의 파라미터로 설정할 수 있습니다. 퍼블리셔 노드의 exec 입력(execution port)은 해당 노드의 동작 타이밍을 제어하는데, 이를 센서 노드의 실행 출력이나 시뮬레이션 틱(tick) 이벤트에 연결하면 매 프레임 혹은 지정된 타이밍에 메시지를 보낼 수 있습니다.
ROS 2 구독 노드: 시뮬레이터가 ROS 2 메시지를 받아들여 무언가를 할 때 사용하는 노드입니다. 예를 들어 ROS 2 Subscribe Twist 노드는 /cmd_vel 등의 토픽에서 geometry_msgs/Twist 메시지를 수신하도록 설정할 수 있고
docs.isaacsim.omniverse.nvidia.com
, ROS 2 Subscribe AckermannDrive 노드는 자율주행 차량 조향 명령을 수신할 수 있습니다. 이들 구독 노드는 수신한 데이터를 그래프 내 다른 노드로 전달하는 출력 포트를 가지는데, 그 출력을 Isaac Sim의 로봇 제어 노드에 연결하면 외부 명령으로 로봇을 움직일 수 있습니다. 실제 예시에서 Leatherback 자율주행 로봇의 경우, ROS 2 Subscribe AckermannDrive 노드를 통해 토픽 /ackermann_cmd의 메시지를 받고 이를 내부 Ackermann Controller 노드에 연결함으로써 앞바퀴 조향 및 속도 제어가 이루어지도록 그래프를 구성했습니다
docs.isaacsim.omniverse.nvidia.com
docs.isaacsim.omniverse.nvidia.com
. 이처럼 구독 노드도 context를 ROS 2 Context에 연결하고, 실행 조건을 설정해야 동작합니다. 주로 별도의 실행 트리거가 없어도 ROS 2 측에서 메시지가 올 때마다 콜백처럼 데이터를 내보내지만, 시뮬레이터 초기화 시점에 노드들이 구독을 시작하도록 그래프를 활성화해 두어야 합니다.
기타 제어/보조 노드: 그래프에서는 위 노드들 외에도 시간 동기화를 위한 Clock 퍼블리셔, 프레임 간 토글을 위한 게이트(Gate) 노드, 주기적 트리거를 위한 OnImpulse/OnTick 노드 등을 활용하여 ROS 메시지의 발행 주기를 조절할 수 있습니다
. 예를 들어 “매 N번째 프레임마다 이미지 퍼블리시”와 같은 기능을 할 때, Frame Gate 노드나 frameSkipCount 파라미터를 사용하여 구현합니다. 또한, 여러 센서를 하나의 그래프에서 관리할 경우 병렬 분기로 연결하여 각각의 퍼블리셔가 개별로 실행되도록 구성합니다.
종합하면, ROS 2 액션 그래프는 Isaac Sim 내부에서 시뮬레이션 이벤트→데이터 추출→ROS 메시지 변환→전송 또는 그 역순의 흐름을 시각적으로 나타낸 것입니다. 노드들 간의 연결선은 데이터 흐름(예: 센서 출력 → ROS 퍼블리셔 입력)과 실행 흐름(예: 시뮬레이션 tick → 퍼블리셔 execIn)을 모두 표현하며, 이를 올바르게 구성해야 기대한 시점에 정확한 데이터가 ROS 네트워크로 흘러나갑니다. 그래프 구성 원리를 이해하면, 사용자는 필요한 센서나 기능을 자유롭게 추가하여 ROS 2와 상호작용을 설계할 수 있습니다. 이는 실제 로봇의 하드웨어를 다루는 ROS 시스템을 가상으로 똑같이 꾸며볼 수 있다는 뜻이며, 예컨대 가상 로봇에 카메라·LiDAR·IMU를 모두 달고, ROS Nav2나 SLAM 노드를 실행해서 자율주행을 시뮬레이터 안에서 시험해볼 수 있습니다. 이렇듯 시뮬레이터의 ROS 2 연동은 Physical AI 실험에 강력한 유연성을 부여하여, 현실과 가상을 아우르는 로봇 지능 개발 환경을 구축하게 해줍니다.