← BlogAMR 내비게이션 입문· 11/12

Nav2가 Isaac Sim과 ROS2로 연결되는 방식 — TF, cmd_vel, 그리고 namespace

시뮬레이터(Isaac PhysX)와 Nav2 사이의 ROS2 토픽·TF 다리, 멀티 로봇 namespace 격리, 그리고 시뮬 물리의 odom 지연이 Nav2 폐루프에 미치는 영향.

약 2분
Nav2Isaac-SimROS2TFnamespace

Nav2가 Isaac Sim과 ROS2로 연결되는 방식

지금까지 Nav2의 안쪽을 봤습니다. 그런데 Nav2는 진짜 로봇이 없어도 시뮬레이터 안의 로봇을 똑같이 움직일 수 있습니다. 시뮬레이터(Isaac Sim)와 Nav2가 ROS2 토픽과 TF로 연결되기 때문입니다. 그 다리를 들여다봅니다.

실제 시뮬레이션 — Isaac Sim 안의 Nova Carter AMR이 Nav2 웨이포인트를 따라 야지를 주행한다. 파란 선이 전역 경로, 상단 배너가 웨이포인트 진행, 하단이 실시간 속도·방위·위치 텔레메트리.

데이터가 흐르는 한 바퀴

연결의 핵심은 센서는 시뮬에서 Nav2로, 명령은 Nav2에서 시뮬로 흐르는 폐루프입니다.

도식 렌더링 중…
  • 시뮬 → Nav2: LiDAR가 /{robot}/scan, 주행계가 /odom을 발행 (OmniGraph 브리지로).
  • Nav2 → 시뮬: 컨트롤러가 만든 cmd_vel이 velocity_smoother를 거쳐 /{robot}/cmd_vel로, DriveAPI가 받아 바퀴를 굴림.
  • 그 움직임이 다시 odom으로 측정돼 Nav2로 돌아오는 폐루프.

좌표의 뼈대 — TF

이 모든 게 같은 좌표계 위에서 일어나야 합니다. ROS의 표준(REP 105)대로 map → odom → base_link로 이어지는 TF 트리가 있어야, costmap·planner·controller가 "로봇이 지금 어디인지"를 압니다. 시뮬레이터는 로봇의 base_link 위치를 TF로 발행해 이 뼈대를 완성합니다.

⚠️ TF가 늦으면 전부 멈춘다map→odom→base_link가 준비되기 전에 costmap이 깨어나면 자기 위치를 몰라 멎습니다. 시뮬 부팅과 TF 준비, costmap 활성화의 순서가 맞물려야 합니다.

멀티 로봇 — namespace로 격리

로봇이 여러 대면, 토픽이 섞이면 안 됩니다. 각 로봇을 namespace로 격리/{robot_id}/scan, /{robot_id}/cmd_vel처럼 분리합니다.

💡 namespace 격리 — 로봇별로 Nav2 스택을 namespace 아래에 두면, 같은 토픽 이름이라도 /carter_1/..., /carter_2/...로 갈려 서로 간섭하지 않습니다. 멀티 로봇 시뮬의 기본기입니다.

시뮬만의 함정 — odom 지연

마지막으로, 시뮬레이터이기에 생기는 미묘한 차이가 있습니다. PhysX 물리의 odom은 한 틱 지연될 수 있고, 이게 Nav2의 폐루프 컨트롤러에 영향을 줍니다 — 앞서 본 RPP 회전이 0.05에 갇힌 버그가 바로 이 odom 지연이 만든 사건이었습니다. 시뮬과 실로봇의 거동 차이를 이해하려면 이 폐루프의 지연을 기억해야 합니다.

한 줄 정리

📌 Nav2와 Isaac Sim은 센서(/scan·/odom)는 시뮬→Nav2, 명령(/cmd_vel)은 Nav2→시뮬로 흐르는 ROS2 폐루프로 연결되며, map→odom→base_link TF가 뼈대다. 멀티 로봇은 namespace로 격리하고, 시뮬 odom 지연이 폐루프 컨트롤러에 영향을 준다.