같은 position이라도 명령과 상태는 다르다
URDF는 링크와 관절의 모델이다. 관절 이름과 제한이 있다고 모터를 구동하는 구현이 생기는 것은 아니다. 목표를 받고 장치나 물리 엔진에 전달하는 계층, 현재 값을 읽는 계층, 상태를 발행하는 계층의 연결을 따로 정한다. 화면에서 팔이 움직여도 측정값을 강제로 그린 것인지, 물리 drive가 목표를 따라간 것인지 구별해야 한다.
Jazzy ros2_control의 command interface는 목표를 전달하는 쪽, state interface는 읽어 온 상태를 노출하는 쪽이다. 이름이 position으로 같아도 방향과 의미가 다르다. 가상 shoulder/position 명령이 0.5 rad이고 읽은 상태가 0.4 rad라면 목표와 상태의 차이는 0.1 rad다. 상태를 목표로 덮어쓰면 오차가 사라진 것처럼 보일 뿐 추종이 입증되지 않는다. velocity와 effort 명령도 각각 속도와 힘/토크 의미이므로 같은 숫자와 제어기를 무조건 바꿔 끼우지 않는다.
하드웨어 플러그인은 실제 장치 또는 가상 구현과 인터페이스를 연결한다. 선언한 이름·자료형·단위·지원 조합과 실제 구현이 맞아야 한다. joint_state_broadcaster는 상태를 토픽으로 내보내며 자체적으로 운동 목표를 받는 제어기는 아니다. M08.05의 RSP는 그 상태와 모델로 링크 변환을 계산한다. 따라서 ‘URDF→RSP→tf’가 보인다는 증거만으로 ‘명령→구동→피드백’ 경로까지 통과했다고 할 수 없다. Jazzy 인터페이스 설명을 연결의 기준으로 읽는다.
숫자 복사 대신 물리량을 보존한다
이식은 파일 확장자를 바꾸는 작업보다 넓다. 원본의 링크/관절 이름과 축·영점, 길이와 각도, 질량과 관성, 충돌 근사, 고정/이동 베이스, mimic 관계를 대상 표현으로 보존하는지 살핀다. 어떤 기능이 지원되는지와 자동 변환 여부는 importer 및 대상 버전에 따라 확인한다. URDF와 USD 또는 다른 장면 표현의 기능이 완전히 일치한다고 가정하지 않는다.
URDF의 회전 위치/제한은 rad다. 예를 들어 OpenUSD의 UsdPhysicsRevoluteJoint lowerLimit/upperLimit 속성은 degree 단위다. 이것은 그 스키마 속성의 계약이며 모든 시뮬레이터 제어 API가 degree라는 뜻은 아니다. 제어 API가 rad를 받을 수도 있으므로 ‘파일 속성’과 ‘실행 API’의 문서를 각각 확인해야 한다. 각도 θ의 변환은 다음과 같다. π rad=180 degree를 이용하며 기호 θ_rad와 θ_deg는 같은 각도의 서로 다른 수치 표현이다.
관절 제한 [−1,1] rad는 약 [−57.2958,57.2958] degree다. USD 제한 속성에 [−1,1]을 그대로 넣으면 의도한 범위보다 약 57.3배 좁다. 그러나 rad를 받는 제어 API의 목표 0.5에는 이 변환을 또 적용하면 안 된다. 변환의 위치와 횟수를 계약표에 적어 중복 환산을 막는다.
길이도 장면 단위를 확인한다. OpenUSD의 metersPerUnit은 장면 길이 단위 하나가 몇 m인지 나타낸다. 예제는 모든 상위/기하 scale이 1이고 최종 변환된 길이 숫자를 비교한다고 가정한다. metersPerUnit=0.01 m/unit인 장면에서 0.2 m는 20 unit이다. 0.2 unit을 그대로 쓰면 0.002 m여서 100배 작다. 상위 scale이 있으면 raw translate 숫자만 보고 이 계산을 적용하지 말고 전체 변환을 반영한 길이를 확인한다. 메타데이터만 바꾼 것이 기존 모든 자산의 좌표를 의도대로 고쳐 준다고 가정하지 않는다.
단위가 맞아도 축이 뒤집히거나 영점이 다르면 자세가 틀린다. 같은 모델에서 기준 q=0과 작은 양의 q에 대한 점 좌표를 비교하면 방향/영점을 분리할 수 있다. 예를 들어 z축 회전 팔의 길이가 0.2 m라면 q=0에서 끝점은 (0.2,0,0), 허용 범위 안의 q=0.5 rad에서 약 (0.175517,0.095885,0) m다. 대상이 (0.175517,−0.095885,0)이면 길이는 맞아도 방향이나 프레임 해석을 더 확인해야 한다. 모델 좌표를 바꾸는 회전과 관절 명령 부호 반전을 아무 근거 없이 동시에 적용해 오차를 숨기지 않는다.
표시·기구학·물리·제어를 따로 판정한다
이식 보고서는 무엇이 확인됐는지 단계별로 남긴다. 첫째 자산 경로/누락/스케일과 표시, 둘째 링크 트리/관절 종류/축/영점/제한/mimic 및 몇 개 자세의 기구학, 셋째 질량/COM/관성/충돌 형상과 물리 설정, 넷째 명령·상태·구동 방식과 시간 계약이다. 앞 단계가 맞는다고 뒤 단계가 자동 통과하지 않는다. 고정 베이스가 떠다니는 모델로 바뀌거나 collision이 빠졌다면 같은 초기 자세에서도 운동은 달라질 수 있다.
순간 상태 설정은 한 시점의 위치를 직접 바꾸는 방식이고 물리 drive는 힘/토크와 제어 규칙을 통해 목표를 따라가게 하는 방식이다. 둘을 같은 추종 실험으로 비교하면 안 된다. drive 이득/포화/마찰·접촉·시간 간격·solver 설정과 초기 상태에 따라 응답이 달라진다. 같은 메시를 불러왔다는 이유로 같은 접촉력이나 실제 로봇 응답이 재현됐다고 주장하지 않는다. 물리 엔진별 수치 차이와 단순화 모델의 한계도 보고한다.
가상 비교의 허용 오차를 미리 정하면 ‘비슷해 보임’을 줄일 수 있다. 교육용 기구학 길이 오차 허용을 0.001 m로 정하고 기대 길이가 0.200 m, 보고 길이가 0.1995 m라면 절대 오차 0.0005 m로 그 항목은 통과다. 0.002 m라면 오차 0.198 m로 실패다. 이 기준은 이번 가상 길이 비교용이며 실물 정확도나 안전 정격이 아니다. 길이 통과가 관성이나 제어 성능 통과도 아니다.
원본 모델/자산 개정과 해시, exporter/importer와 대상 엔진의 실제 버전, 옵션과 경고, 단위 변환, 초기 조건과 판정 허용치를 기록한다. 경고 없이 열렸다는 사실은 소비자가 읽었다는 증거이며 실물 검증은 아니다. 기존 1.3 USD와 3.6 브리지를 읽을 때도 상태 미러링·물리 구동·실물 재현의 근거를 나누어 연결한다.