잘 그려진 장면도 다른 시점의 로봇일 수 있다
관제에 로봇 외형이 매끄럽게 움직인다고 실제 위치를 정확하게 보여 준다고 할 수는 없다. 위치는 1000ms, 관절은 900ms, 지도는 이전 개정인데 한 화면에서 합쳤을 수 있다. 화면의 초당 갱신 횟수는 높아도 관측의 시간·좌표·버전은 서로 어긋날 수 있다. 먼저 어느 대상의 어느 시점·어느 계약을 그린 것인가에 답해야 한다.
여기서 장면(scene)은 모델·지도 자산과 로봇 상태를 함께 표시한 결과다. 정합은 그림을 눈대중으로 맞추는 일이 아니라 같은 물리적 의미로 조합할 조건을 확인하는 것이다. 실제로 검증된 물리 세계의 복제본이라는 뜻은 아니다. 이번 실습의 자료는 전부 합성 기록이다.
M34.01에서는 필드마다 관측 시각을 확인했다. 이번에는 여러 필드를 합칠 때 프레임·시각·버전까지 함께 맞춘다. 행렬 방향이 낯설면 M06.01, 다른 시계의 숫자 비교가 어렵다면 M14.03로 돌아간다.
프레임과 단위가 먼저 정해져야 한다
프레임은 원점과 축의 방향을 정한 좌표계다. map은 지도 기준, base는 로봇 몸체 기준이라고 하자. 같은 점의 base 좌표와 map 좌표는 다를 수 있다. 이번에는 길이 m, 오른손 좌표, 열벡터를 쓴다. T_map_base는 base 좌표를 map 좌표로 바꾸는 변환이며 반대 방향은 역변환이다.
회전 R_map_base와 map에서 표현한 base 원점 t_map_base가 있을 때 같은 점은 다음과 같다. 회전과 이동 모두 해당 시각에 맞아야 한다.
1000ms에 p_base=(1,0,0)m, z축 양의90도 회전, t_map_base=(2,1,0)m라고 하자. 회전하면 (0,1,0)m, 이동을 더하면 p_map=(2,2,0)m다. 이동만 더한 (3,1,0)m는 base축과 map축이 같다고 잘못 가정한 결과다. 역변환을 그대로 대입하는 것도 방향 오류다.
REP103은 ROS의 기본 단위와 오른손 좌표·몸체 x앞/y왼쪽/z위, 카메라 광학 z앞/x오른쪽/y아래를 설명한다. 렌더 엔진의 축·단위는 이 계약과 다를 수 있다. 표시용 어댑터에서 축/단위를 한 번 명시적으로 변환하고 모델·카메라·표시 점에 같은 계약을 적용한다. 엔진이 z위인지 y위인지 이름만으로 추측하지 않는다. 원본이 cm인데 m로 읽으면 길이가100배가 된다.
보기 좋게 회전/이동시킨 장면 루트는 물리 센서 보정을 새로 수행한 근거가 아니다. 시각화축 변환, 지도 원점 개정, 센서 교정은 별도 변경이다. 두 번 축을 바꾸거나 외형만 이동해 오차를 숨기지 않는다.
‘최신 변환’보다 ‘관측 시각의 변환’이 필요하다
ROS2 Jazzy tf2 개념은 시간에 따른 프레임 관계를 추적하고 원하는 시각의 좌표 변환을 다룬다. tf2를 쓴다는 사실만으로 지도/모델의 자체 버전 계약이나 시계 일치까지 자동 보장되지는 않는다. 아래는 API 호출 실습이 아니라 기록을 해석하는 교육용 계약이다.
그림 M34.02-1. 각 칸은 서로 다른 역할/근거다. 아래 방향은 자료/처리의 연결이며 실제 성공을 자동으로 보장하지 않는다. 직접 제작한 개념도이며 본문의 조건과 함께 읽는다.
모든 시간은 동일 ClockA의 ms이고 대상 r1/bootA, map-v7, model-v3, calibration-c2를 공유한다고 하자. 첫 두 행의 점은 같은1000ms 관측이다. 원점은1200ms에 (3,1,0)m가 되었으며 회전은 같은90도다.
| 자료/조합 | 점과 변환 | 계산/판정 |
|---|---|---|
| A: 동일시각 | 점@1000 + 변환@1000 | (2,2,0)m, 해당시각 표현 가능 |
| B: 최신 변환 혼합 | 점@1000 + 변환@1200 | 숫자는(3,2,0)m,1000ms 위치로 보고 불가 |
| C: 시계 불명 | 점 RobotClock@1000 + 변환 ClockA@1000 | 숫자가 같아도 시간 정합 미확인 |
| D: 지도 개정 혼합 | map-v7 상태 + map-v8 장면 | 원점/관계 변경 확인 전 현재 장면 조합 보류 |
B는 A와1m 차이지만 이것을 그 사이의 실제 점 이동량이라고 단정할 수 없다. 같은 관측에 서로 다른 시각의 변환을 적용한 결과이기 때문이다. 단순히 모든 필드에서 가장 큰 stamp만 골라 조합하는 규칙은 틀린 장면을 만들 수 있다.
화면 평가시점1100ms에서 A의 나이는100ms다. 이번 표시용 TTL은200ms를 포함하므로 A를1000ms의 관측 장면으로 표시할 수 있다. 관측이100ms 오래됐다는 표시 지연과 조합 자료의 시각 불일치는 다르다. A는 과거의 정합 장면이고 B는 서로 다른 시각을 섞은 장면이다. 이 TTL은 교육용 표시 기준이며 실제 제어·안전 기준이 아니다.
보간과 예측을 측정으로 바꾸어 부르지 않는다
필요 시각을 양쪽 표본이 감싸고 버전·대상·시계가 같으며 모델 가정을 만족하면 보간을 검토할 수 있다. 예를 들어 원점이1100ms에(2.5,1,0)m,1200ms에(3,1,0)m이고 그 구간 정속 직선 이동을 가정하면1150ms의 추정 원점은(2.75,1,0)m다. 이 값은 실제1150ms 측정값이 아니다. 사용한 두 표본·가정·추정 표시를 함께 남긴다.
1200ms 이후 자료가 없는데1300ms를 구하는 것은 이 구간의 보간이 아니라 외삽/예측이다. 허용 정책/불확실성을 정하지 않았다면 현재 위치를 추정해 확정 표시하지 않는다. 서로 다른 지도 개정이나 재시작 세대를 사이에 두고 보간하지도 않는다. 회전·관절에는 표현/연속성·관절 제한 등 별도 조건이 필요하므로 위 위치의 선형 보간을 그대로 일반화하지 않는다.
버전은 파일 이름만이 아니라 조합의 계약이다
장면에는 지도 원점, 모델 링크·관절 이름/순서, 센서 교정, 단위/축 어댑터가 함께 들어간다. 지도 v8에서 원점이 바뀌었는데 v7 위치를 그대로 사용하면 숫자가 정상 범위여도 다른 위치를 뜻한다. model-v4에서 관절 순서가 달라졌는데 이름 확인 없이 배열만 넘기면 다른 링크가 움직일 수 있다. 구체적 변경을 확인하고 호환 또는 명시적 이행을 증명해야 한다.
여기서 원자적 스냅샷은 필요한 자산/상태/계약의 한 묶음을 완전하게 확인한 뒤 표시 기준을 함께 전환하는 규칙이다. 여러 수신을 실제로 동시에 만들었다는 뜻은 아니다. 대기 중인 새 자산 하나만 먼저 적용해 기존 상태와 섞지 않는다. 정합되지 않은 새 개정은 보류하고 마지막 정합 장면의 시각/버전을 표시한다. 현재가 미확인임도 따로 적어 과거 그림을 현재처럼 보이지 않게 한다.
최소 기록은 대상ID/재시작세대, map/model/calibration/표시어댑터 개정, 원본 프레임/단위/시계/시각, 사용한 변환의 방향/시각, 수신/렌더시각, 측정/추정 구분과 표시 판정이다. 모든 필드가 같은 stamp를 갖도록 덮어쓰는 것은 정합이 아니다. 부품별 원본 출처를 보존해야 원인을 추적할 수 있다.
지연과 재시작 뒤에는 기준 묶음을 다시 확인한다
늦게 도착한 이전 개정의 상태는 이력으로 남길 수 있지만 현재 장면을 되돌리면 안 된다. bootB/seq1은 bootA/seq99보다 작다는 이유로 버릴 자료가 아니라 새 세대의 기준을 확인할 자료다. 새 지도/모델과 기준 snapshot·변환을 다시 확인한 뒤 현재 표시를 재개한다. 필요한 변환 경로가 없거나 시각 범위 밖이면 변환 실패/미확인을 보여 준다. 0위치나 마지막 정상 색으로 대신하지 않는다.
이 단원에서 확인한 것은 합성 기록의 정합 판단이다. 렌더가 성공했다는 이유로 실제 충돌/정지·명령 성공·안전이 검증된 것은 아니다. 다음 M34.03에서는 이 관측 화면에서 요청·승인·실제 실행을 어떻게 분리할지 다룬다. 기존 6.6 평가 설계의 동일조건 비교에서도 장면/로그의 좌표·시각·버전을 함께 남긴다.