센서를 단다
로봇이 세상을 보려면 센서가 필요합니다. Isaac Sim에서 센서는 씬의 prim으로 생성되고, OmniGraph 그래프를 통해 ROS2 토픽으로 흘러나갑니다. 그런데 같은 LiDAR라도 두 가지 방식이 있고, 이 차이를 모르면 헤맵니다.
두 종류의 LiDAR — PhysX vs RTX
도식 렌더링 중…
- PhysX LiDAR — 순수 기하학적 광선 투사로 거리를 잽니다. 가볍고 빠릅니다.
- RTX LiDAR — RTX 렌더 파이프라인을 거쳐, 재질 반사율에 따른 약한 반사·drop-out, 다중 경로(유령 물체) 같은 실제 센서의 결함까지 재현합니다. 그 대신 렌더가 필요합니다.
RTX LiDAR는 렌더 결과를 annotator(주석기)로 읽어 점군(point cloud)으로 변환합니다. 사실성이 필요하면 RTX, 단순 거리면 PhysX — 용도에 맞게 고릅니다.
카메라·IMU·접촉
다른 센서들도 같은 패턴입니다.
- 카메라 — 렌더 결과물(render product)을 받아 영상 토픽으로 발행.
- IMU — 강체의 가속도·각속도를 읽어 관성 토픽으로.
- Contact — 접촉 센서로 충돌/접지 여부를.
💡 센서는 로봇 USD에 따라다닌다 — 센서 prim과 그 발행 그래프를 로봇 USD에 붙여 두면, 그 로봇을 어떤 환경에 스폰하든 센서가 그대로 따라옵니다. 매니페스트 한 장으로 로봇 추가라는 철학과 같은 맥락입니다.
선언한 센서가 곧 붙은 센서는 아니다
센서는 매니페스트에 이름·타입·장착 위치를 적어 선언합니다. 그런데 선언과 부착 사이에는 런타임이 그 타입 이름을 아는가라는 관문이 하나 있습니다. 저희 Husky 매니페스트로 돌린 런의 실제 기록입니다.
[RdpManifestLoader] Loaded manifest ... 3 sensors, drive_type=differential
[Isaac] Created RTX LiDAR: config=OS1, pos=[0.0, 0.0, 0.35], rate_hz=10.0
[Isaac] IMUSensor created+initialized: /World/Robots/HO_A/base_link/imu_sensor
[Isaac] WARNING: Unknown sensor type 'gps' ... — skipped.
Supported: lidar, lidar_3d, camera_rgb, camera_depth, imu, gnss, gnss_rtk, radar, thermal
[Isaac] Configured 2 sensors for ROBOT_CLEARPATH_HUSKY_A200: HO_A
매니페스트에 3종을 선언했는데 런타임에 붙은 것은 2종이다. gps 는 런타임이 아는 이름이 gnss 라 경고 한 줄을 남기고 건너뛴다. 런은 실패하지 않고 정상 완료된다 — LiDAR 240 스캔, 총 11,805,070 점을 보고하면서.
무서운 쪽은 실패가 아니라 성공입니다. 런은 끝까지 돌고, 판정도 나오고, 리포트도 발행됩니다. 다만 그 판정에 GPS 가 들어 있지 않을 뿐입니다. 「센서를 달았는데 데이터가 안 나온다」보다 「센서가 없는 줄 모르고 정상이라 읽었다」가 훨씬 비쌉니다.
⚠️ 센서는 선언 수가 아니라 부착 수로 세십시오 — 매니페스트 3종을 근거로 「3종 계측」이라 적으면 안 됩니다. 로그의
Configured N sensors가 실제 값이고, 둘이 다르면 그 사이에 건너뛴 것이 있습니다.
함정 — RTX 센서는 헤드리스여도 렌더가 필요
⚠️ "헤드리스니까 렌더 끄면 되겠지"가 틀리는 지점 — RTX LiDAR, depth/semantic annotator는 화면이 없어도(headless) 렌더 결과를 쓰기 때문에 렌더가 켜져 있어야 합니다. "headless = no-render"가 아니라는 이 함정은 별도 글에서 더 다룹니다.
한 줄 정리
📌 센서는 씬의 prim으로 생성되며, PhysX LiDAR(빠른 거리) 와 RTX LiDAR(사실적, annotator로 점군) 가 근본적으로 다르다. 카메라·IMU·접촉도 같은 패턴이고, RTX 센서는 헤드리스여도 렌더가 필요하다.
