[로봇]---(레이저)---[벽]
| ↑
|<---거리 측정----|
RTX Lidar는 '물자체(Ding an sich)'를 인식할 수 없습니다. 대신, 인식 가능한 형식(현상)으로 가공된 데이터를 제공합니다. 즉, RTX Lidar는 현실을 있는 그대로 보는 것이 아니라 우리가 만든 틀(파라미터, Annotator, Writer) 안에서 세계를 '이해 가능한 형태'로 재구성하는 도구입니다.
RTX Lidar 시스템은 4가지 핵심 파일 타입으로 구성됩니다
[1. Asset USD 파일] ←--→ [2. USDA 파라미터 파일]
↓ ↓
[3. 등록된 Config] ←--→ [4. JSON 템플릿]
↓ ↓
[LidarRtx 검증] ←--→ [런타임 변환]
↓ ↓
[USD 속성 통합]
↓
[RTX 엔진 시뮬레이션]
전체 데이터 흐름 개요
→ LidarRtx가 이들을 통합하여 RTX 엔진에서 실시간 시뮬레이션
3.1 Asset USD 파일 (3D 모델 + Variant 정의)
역할: 라이다 센서의 시각적 표현 + 여러 설정 옵션을 하나의 파일에 통합




구조:
OS0.usd
├── [3D Mesh] 라이다 센서 시각적 모델
├── [Material] 텍스처, 재질 정보
└── [Variant Set] 여러 설정 옵션
├── "OS0_REV6_128ch10hz512res" # 512 해상도
├── "OS0_REV6_128ch10hz1024res" # 1024 해상도
├── "OS0_REV6_128ch10hz2048res" # 2048 해상도
└── ... (더 많은 variant)
핵심 특징:
3.2 USDA 파라미터 파일 (정밀한 센서 스펙)
역할: 각 variant별 정확한 물리적 센서 파라미터를 USD 형식으로 정의
#usda 1.0
(
defaultPrim = "OS0_REV6_128_10hz_512_resolution"
doc = "Generated from OS0_REV6_128ch10hz512res.json"
)
def OmniLidar "OS0_REV6_128_10hz_512_resolution" (
prepend apiSchemas = ["OmniSensorGenericLidarCoreAPI"]
)
{
# 기본 센서 속성
float omni:sensor:Core:avgPowerW = 0.002
float omni:sensor:Core:nearRangeM = 0.3
float omni:sensor:Core:farRangeM = 50
uint omni:sensor:Core:numberOfChannels = 128
uint omni:sensor:Core:scanRateBaseHz = 10
# 빔 각도 정의 (128개 채널)
float[] omni:sensor:Core:emitterState:s001:azimuthDeg = [
4.23, 1.41, -1.4, -4.21, 4.22, 1.42, -1.41, -4.22,
4.23, 1.41, -1.42, -4.21, 4.23, 1.42, -1.4, -4.2,
# ... 총 128개 값
]
float[] omni:sensor:Core:emitterState:s001:elevationDeg = [
44.5, 43.8, 43.1, 42.4, 41.7, 41, 40.3, 39.59,
38.89, 38.19, 37.49, 36.79, 36.09, 35.39, 34.69,
# ... 총 128개 값
]
# 타이밍 정보
uint[] omni:sensor:Core:emitterState:s001:fireTimeNs = [
762, 2287, 3812, 5337, 6862, 8387, 9912, 11437,
# ... 총 128개 값
]
# 채널 ID 매핑
uint[] omni:sensor:Core:emitterState:s001:channelId = [
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
# ... 총 128개 값
]
# 오차 모델
float omni:sensor:Core:azimuthErrorMean = 0
float omni:sensor:Core:azimuthErrorStd = 0.01
float omni:sensor:Core:elevationErrorMean = 0
float omni:sensor:Core:elevationErrorStd = 0.01
# 기타 속성들...
float omni:sensor:Core:rangeAccuracyM = 0.03
float omni:sensor:Core:rangeResolutionM = 0.001
token omni:sensor:Core:rayType = "IDEALIZED"
uint omni:sensor:Core:reportRateBaseHz = 5120
token omni:sensor:Core:rotationDirection = "CW"
token omni:sensor:Core:scanType = "ROTARY"
string omni:sensor:modelName = "OS0_REV6_128_10hz_512_resolution"
float omni:sensor:tickRate = 10
}
파라미터 분류:
| 파라미터 그룹 | 예시 | 설명 |
|---|---|---|
| 기본 센서 속성 | avgPowerW, nearRangeM, farRangeM | 센서의 물리적 특성 |
| 스캔 설정 | scanRateBaseHz, numberOfChannels | 스캔 속도, 채널 수 |
| 빔 배치 | azimuthDeg[], elevationDeg[] | 각 빔의 정확한 각도 |
| 타이밍 | fireTimeNs[] | 각 빔의 발사 타이밍 |
| 채널 매핑 | channelId[] | 빔과 채널의 매핑 |
| 오차 모델 | azimuthErrorStd, elevationErrorStd | 각도 측정 오차 |
핵심 특징:
3.3 등록된 라이다 Config 파일 (지원 모델 목록)
역할: RTX Lidar에서 공식 지원하는 모든 모델과 variant 목록을 정의
파일 위치: source/extensions/isaacsim.sensors.rtx/python/impl/supported_lidar_configs.py
핵심 특징:
공식 지원 Lidar 모델 및 Variant 예시
제조사별 지원 모델:
| 제조사 | 모델 | 지원 Variant 수 | 주요 특징 |
|---|---|---|---|
| HESAI | XT32_SD10 | - | 고해상도 멀티빔 |
| NVIDIA | Debug_Rotary | - | 개발/디버깅용 |
| NVIDIA | Example_Rotary | - | 회전식 라이다 예시 |
| NVIDIA | Example_Solid_State | - | 고체 라이다 예시 |
| Ouster | OS0 | 10가지 | 단거리 고해상도 |
| Ouster | OS1 | 15가지 | 중거리 범용 |
| Ouster | OS2 | 10가지 | 장거리 고성능 |
| SICK | microScan3 | 5가지 | 산업용 소형 |
| SICK | picoScan150 | 10가지 | 초소형 모델 |
| Slamtec | RPLIDAR_S2E | - | 경제형 SLAM용 |
| ZVISION | ML30S, MLXS | - | 차량용 솔리드 스테이트 |
주요 제조사별 특징:
| 제조사 | 특징 | variant 예시 |
|---|---|---|
| Ouster | 고해상도 3D 라이다 | OS0_REV6_128ch10hz1024res |
| SICK | 산업용 라이다 | Normal_1, Normal_2 |
| NVIDIA | 교육/프로토타이핑용 | variant 없음 (단일 설정) |
| SLAMTEC | 2D 라이다 | variant 없음 |
Variant 명명 규칙:
{모델}_{리비전}_{채널수}ch{주파수}hz{해상도}resNormal_{번호} 또는 Extended_{번호}전체 configs 코드:
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
"""Configuration definitions for supported Lidar sensors in Isaac Sim.
This module defines the supported Lidar sensor configurations and their variants
that can be used with the RTX sensor system. It includes configurations for various
manufacturers.
"""
# Expected name of Lidar prim variant sets
SUPPORTED_LIDAR_VARIANT_SET_NAME = "sensor"
# Map supported Lidar asset paths to their variants
SUPPORTED_LIDAR_CONFIGS = {
"/Isaac/Sensors/HESAI/XT32_SD10/HESAI_XT32_SD10.usd": set(),
"/Isaac/Sensors/NVIDIA/Debug_Rotary.usda": set(),
"/Isaac/Sensors/NVIDIA/Example_Rotary_2D.usda": set(),
"/Isaac/Sensors/NVIDIA/Example_Rotary.usda": set(),
"/Isaac/Sensors/NVIDIA/Example_Solid_State.usda": set(),
"/Isaac/Sensors/NVIDIA/Simple_Example_Solid_State.usda": set(),
"/Isaac/Sensors/Ouster/OS0/OS0.usd": {
"OS0_REV6_128ch10hz1024res",
"OS0_REV6_128ch10hz2048res",
"OS0_REV6_128ch10hz512res",
"OS0_REV6_128ch20hz1024res",
"OS0_REV6_128ch20hz512res",
"OS0_REV7_128ch10hz1024res",
"OS0_REV7_128ch10hz2048res",
"OS0_REV7_128ch10hz512res",
"OS0_REV7_128ch20hz1024res",
"OS0_REV7_128ch20hz512res",
},
"/Isaac/Sensors/Ouster/OS1/OS1.usd": {
"OS1_REV6_128ch10hz1024res",
"OS1_REV6_128ch10hz2048res",
"OS1_REV6_128ch10hz512res",
"OS1_REV6_128ch20hz1024res",
"OS1_REV6_128ch20hz512res",
"OS1_REV6_32ch10hz1024res",
"OS1_REV6_32ch10hz2048res",
"OS1_REV6_32ch10hz512res",
"OS1_REV6_32ch20hz1024res",
"OS1_REV6_32ch20hz512res",
"OS1_REV7_128ch10hz1024res",
"OS1_REV7_128ch10hz2048res",
"OS1_REV7_128ch10hz512res",
"OS1_REV7_128ch20hz1024res",
"OS1_REV7_128ch20hz512res",
},
"/Isaac/Sensors/Ouster/OS2/OS2.usd": {
"OS2_REV6_128ch10hz1024res",
"OS2_REV6_128ch10hz2048res",
"OS2_REV6_128ch10hz512res",
"OS2_REV6_128ch20hz1024res",
"OS2_REV6_128ch20hz512res",
"OS2_REV7_128ch10hz1024res",
"OS2_REV7_128ch10hz2048res",
"OS2_REV7_128ch10hz512res",
"OS2_REV7_128ch20hz1024res",
"OS2_REV7_128ch20hz512res",
},
"/Isaac/Sensors/Ouster/VLS_128/Ouster_VLS_128.usd": set(),
"/Isaac/Sensors/SICK/microScan3/SICK_microScan3.usd": {
"Normal_1",
"Normal_2",
"Normal_4",
"Normal_5",
"Normal_6",
},
"/Isaac/Sensors/SICK/multiScan136/SICK_multiScan136.usd": set(),
"/Isaac/Sensors/SICK/multiScan165/SICK_multiScan165.usd": set(),
"/Isaac/Sensors/SICK/nanoScan3/SICK_nanoScan3.usd": {
"CAAZ30AN1",
},
"/Isaac/Sensors/SICK/picoScan150/SICK_picoScan150.usd": {
"Normal_1",
"Normal_2",
"Normal_3",
"Normal_4",
"Normal_6",
"Normal_7",
"Normal_8",
"Normal_9",
"Normal_10",
"Normal_11",
},
"/Isaac/Sensors/SICK/TIM781/SICK_TIM781.usd": set(),
"/Isaac/Sensors/Slamtec/RPLIDAR_S2E/Slamtec_RPLIDAR_S2E.usd": set(),
"/Isaac/Sensors/ZVISION/ZVISION_ML30S.usda": set(),
"/Isaac/Sensors/ZVISION/ZVISION_MLXS.usda": set(),
}
3.4 JSON 템플릿 (사용자 친화적 설정)
파일 위치: source/extensions/isaacsim.sensors.rtx/data/lidar_configs/NVIDIA/Simple_Example_Solid_State.json
역할: 사용자 친화적 형태 + 외부 도구 호환성을 위한 설정 파일
전체 JSON 템플릿 코드:
{
"class": "sensor",
"type": "lidar",
"name": "Simple Solid State",
"driveWorksId": "GENERIC",
"profile":
{
"scanType": "solidState",
"intensityProcessing": "normalization",
"rotationDirection": "CW",
"rayType": "IDEALIZED",
"nearRangeM": 1.0,
"farRangeM": 200.0,
"effectiveApertureSize": 0.0145,
"focusDistM": 0.16,
"rangeResolutionM": 0.004,
"rangeAccuracyM": 0.025,
"avgPowerW": 0.002,
"minReflectance": 0.1,
"minReflectanceRange": 270.0,
"wavelengthNm": 1550.0,
"pulseTimeNs": 6,
"maxReturns": 2,
"scanRateBaseHz": 30.0,
"reportRateBaseHz": 30,
"numberOfEmitters": 12,
"numberOfChannels": 12,
"rangeCount": 1,
"ranges": [
{"min": 0.5, "max": 300}
],
"azimuthErrorMean": 0.0,
"azimuthErrorStd": 0.025,
"elevationErrorMean": 0.0,
"elevationErrorStd": 0.025,
"stateResolutionStep": 1,
"numLines": 3,
"numRaysPerLine": [4, 4, 4],
"emitterStateCount": 1,
"emitterStates": [
{
"azimuthDeg": [
-2, -1, 1, 2,
-1.5, -0.5, 0.5, 1.5,
-2.4, -1.4, 1.4, 2.4
], "_commentOnAzimuth": "Flat Scan is expecting equal angles between each emitter in the line it uses",
"elevationDeg": [
-8, -8, -8, -8,
0, 0, 0, 0,
8, 8, 8, 8
], "_commentOnElevation": "Flat Scan use the line with elevation nearest 0 as it's first line entry",
"fireTimeNs": [
0,3300000,6600000,9900000,
13300000,16600000,19900000,23300000,
26600000,29900000,31500000,33300000],
"channelId": [
0,1,2,3,
4,5,6,7,
8,9,10,11],
"rangeId": [
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0
],
"bank": [
11, 10, 9, 8,
7, 6, 5, 4,
3, 2, 1, 0
]
}
],
"intensityMappingType": "LINEAR"
}
}
파라미터 상세 설명
| 파라미터 이름 | 의미(영문) | 한글 설명 |
|---|---|---|
| class | Sensor class | 센서 종류(항상 sensor) |
| type | Sensor type | 센서 타입(여기선 lidar) |
| name | Sensor name | 센서 이름 |
| driveWorksId | DriveWorks ID | DriveWorks용 센서 ID |
| scanType | Scan type | 스캔 방식(예: solidState) |
| intensityProcessing | Intensity processing | 강도 데이터 처리 방식 |
| rotationDirection | Rotation direction | 회전 방향(CW/CCW) |
| rayType | Ray type | 레이 타입(IDEALIZED 등) |
| nearRangeM | Near range (meters) | 최소 측정 거리 |
| farRangeM | Far range (meters) | 최대 측정 거리 |
| effectiveApertureSize | Effective aperture size (meters) | 유효 조리개 크기 |
| focusDistM | Focus distance (meters) | 초점 거리 |
| rangeResolutionM | Range resolution (meters) | 거리 해상도 |
| rangeAccuracyM | Range accuracy (meters) | 거리 측정 정확도 |
| avgPowerW | Average power (watts) | 평균 출력(레이저 파워) |
| minReflectance | Minimum reflectance | 최소 반사율 |
| minReflectanceRange | Minimum reflectance range (deg) | 최소 반사율 적용 각도 |
| wavelengthNm | Wavelength (nm) | 레이저 파장 |
| pulseTimeNs | Pulse time (ns) | 펄스 지속 시간 |
| maxReturns | Maximum returns | 최대 리턴 수 |
| scanRateBaseHz | Scan rate (Hz) | 라이다 스캔 속도(Hz) |
| reportRateBaseHz | Report rate (Hz) | 데이터 리포트 속도(Hz) |
| numberOfEmitters | Number of emitters | 레이저 발사기(채널) 개수 |
| numberOfChannels | Number of channels | 채널 개수 |
| rangeCount | Range count | range(거리) 구간 개수 |
| ranges | Ranges | 각 range 구간의 min/max |
| azimuthErrorMean | Azimuth error mean | 방위각 오차 평균 |
| azimuthErrorStd | Azimuth error std | 방위각 오차 표준편차 |
| elevationErrorMean | Elevation error mean | 고도각 오차 평균 |
| elevationErrorStd | Elevation error std | 고도각 오차 표준편차 |
| stateResolutionStep | State resolution step | 상태 해상도 스텝 |
| numLines | Number of lines | 라인(스캔 라인) 개수 |
| numRaysPerLine | Number of rays per line | 각 라인별 레이 개수 |
| emitterStateCount | Emitter state count | 발사기 상태 개수 |
| emitterStates | Emitter states | 발사기 상태(각종 각도, 타이밍 등 배열) |
| azimuthDeg | Azimuth degrees | 각 발사기의 방위각 배열 |
| elevationDeg | Elevation degrees | 각 발사기의 고도각 배열 |
| fireTimeNs | Fire time (ns) | 각 발사기별 발사 타이밍(ns) |
| channelId | Channel ID | 각 발사기별 채널 ID |
| rangeId | Range ID | 각 발사기별 range ID |
| bank | Bank | 각 발사기별 뱅크(그룹) |
| intensityMappingType | Intensity mapping type | 강도 매핑 방식 |
| _commentOnAzimuth | Comment on azimuth | 방위각 배열에 대한 주석(설명) |
| _commentOnElevation | Comment on elevation | 고도각 배열에 대한 주석(설명) |
파라미터 그룹별 분류:
| 파라미터 그룹 | 주요 파라미터 | 설명 |
|---|---|---|
| 기본 정보 | class, type, name, driveWorksId | 센서 식별 및 외부 연동 정보 |
| 물리적 특성 | nearRangeM, farRangeM, avgPowerW, wavelengthNm | 하드웨어 물리적 속성 |
| 스캔 설정 | scanType, scanRateBaseHz, numberOfEmitters, numberOfChannels | 스캔 방식, 속도, 채널 구성 |
| 정확도/해상도 | rangeResolutionM, rangeAccuracyM, effectiveApertureSize | 측정 정밀도 관련 |
| 오차 모델 | azimuthErrorStd, elevationErrorStd, azimuthErrorMean | 센서 오차 시뮬레이션 |
| 빔 기하학 | azimuthDeg[], elevationDeg[], numLines, numRaysPerLine[] | 각 빔의 공간적 배치 |
| 타이밍 | fireTimeNs[], pulseTimeNs, reportRateBaseHz | 시간 관련 설정 |
| 데이터 처리 | intensityProcessing, intensityMappingType, maxReturns | 출력 데이터 처리 방식 |
4.1 파일 간 관계도
[1. Asset USD] ←--→ [2. USDA 파라미터]
↓ ↓
[3. 등록된 Config] ←--→ [4. JSON 템플릿]
↓ ↓
[LidarRtx 검증] ←--→ [런타임 변환]
↓ ↓
[USD 속성 통합]
↓
[RTX 엔진 시뮬레이션]
4.2 실제 데이터 흐름
시나리오 1: USD Asset 사용
1. 사용자: LidarRtx(config="/Isaac/Sensors/Ouster/OS0/OS0.usd", variant="OS0_REV6_128ch10hz512res")
2. 검증: supported_lidar_configs.py에서 지원 여부 확인
3. 로드: Asset USD에서 해당 variant의 USDA 파라미터 직접 로드
4. 적용: USD 속성이 RTX 엔진에 바로 적용
5. 시뮬레이션: RTX 레이 트레이싱 수행
시나리오 2: JSON 템플릿 사용
1. 사용자: LidarRtx(config="Simple_Example_Solid_State")
2. 검색: data/lidar_configs/ 디렉토리에서 JSON 파일 탐색
3. 변환: JSON → USD 속성 변환 (SensorNodeUtils.cpp)
4. 적용: 변환된 USD 속성이 RTX 엔진에 적용
5. 시뮬레이션: RTX 레이 트레이싱 수행
4.3 우선순위 및 선택 기준
처리 우선순위:
사용 시나리오별 권장:
| 목적 | 권장 파일 타입 | 이유 |
|---|---|---|
| 실제 하드웨어 시뮬레이션 | USD Asset + Variant | 제조사 정확 데이터 |
| 빠른 프로토타이핑 | JSON 템플릿 | 수정 용이 |
| 교육/학습 | JSON 템플릿 | 가독성 높음 |
| ROS/DriveWorks 연동 | JSON 템플릿 | 외부 호환성 |
| 고정밀 연구 | USD Asset + Variant | 최고 정확도 |
RTX Lidar는 4가지 핵심 구조가 유기적으로 연결된 시스템입니다:
LidarRtx 클래스가 이들을 통합하여 RTX 엔진에서 실시간 레이 트레이싱 기반 라이다 시뮬레이션을 제공합니다. 사용자는 목적에 따라 정확한 하드웨어 시뮬레이션(USD)부터 빠른 프로토타이핑(JSON)까지 유연하게 선택할 수 있습니다.
5.1 Prim (OmniLidar Prim)
실제 코드 예시 (Prim 생성)
# LidarRtx 생성 시 prim_path로 지정
# 위치: exts/isaacsim.sensors.rtx/isaacsim/sensors/rtx/impl/lidar_rtx.py
lidar = LidarRtx(prim_path="/World/lidar", ...)
# 위치: exts/isaacsim.sensors.rtx/isaacsim/sensors/rtx/impl/lidar_rtx.py
if is_prim_path_valid(prim_path):
...
else:
_, sensor = omni.kit.commands.execute(
"IsaacSensorCreateRtxLidar",
translation=Gf.Vec3d(...),
orientation=Gf.Quatd(...),
path=prim_path,
...)
5.2 LidarRtx 클래스
실제 코드 예시 (클래스 선언 및 주요 메서드)
# 위치: exts/isaacsim.sensors.rtx/isaacsim/sensors/rtx/impl/lidar_rtx.py
class LidarRtx(BaseSensor):
...
def __init__(self, prim_path: str, name: str = "lidar_rtx", ...):
...
def initialize(self, ...):
...
def attach_annotator(self, annotator_name: str):
...
def attach_writer(self, writer_name: str):
...
def get_current_frame(self) -> dict:
...
# 위치: exts/isaacsim.sensors.rtx/docs/rtx_lidar.md (사용 예시)
lidar = LidarRtx(prim_path="/World/lidar", position=[0,0,1], name="lidar")
lidar.initialize()
5.3 Annotator (데이터 생성기)
실제 코드 예시 (Annotator 부착)
# 위치: exts/isaacsim.sensors.rtx/isaacsim/sensors/rtx/impl/lidar_rtx.py
lidar.attach_annotator("GenericModelOutputLidarPointAccumulator") # 3D 포인트 클라우드
lidar.attach_annotator("IsaacComputeRTXLidarFlatScan") # 2D Flat Scan (2D 라이다 전용)
exts/isaacsim.sensors.rtx/isaacsim/sensors/rtx/impl/lidar_rtx.py (attach_annotator)5.4 Writer (시각화/저장기)
실제 코드 예시 (Writer 부착)
# 위치: exts/isaacsim.sensors.rtx/isaacsim/sensors/rtx/impl/lidar_rtx.py
lidar.attach_writer("RtxLidarDebugDrawPointCloud") # 포인트 클라우드 시각화
exts/isaacsim.sensors.rtx/isaacsim/sensors/rtx/impl/lidar_rtx.py (attach_writer)5.5 전체 데이터 흐름 예시
# 위치: exts/isaacsim.sensors.rtx/docs/rtx_lidar.md (사용 예시)
from isaacsim.sensors.rtx import LidarRtx
lidar = LidarRtx(prim_path="/World/lidar", position=[0,0,1], name="lidar")
lidar.initialize()
lidar.attach_annotator("GenericModelOutputLidarPointAccumulator")
lidar.attach_writer("RtxLidarDebugDrawPointCloud")
frame = lidar.get_current_frame()
print(frame["pointCloud"]) # Annotator가 생성한 3D 점 데이터
exts/isaacsim.sensors.rtx/isaacsim/sensors/rtx/impl/lidar_rtx.py에 위치합니다.이 글 공유하기: