4.4 멀티레이트 센서 시간 정합
전문 선택 M04.06는 원시 표현/단위·축과 측정/명령 범위, 오류·clock/버전 계약을 합친다. 읽기 실패 때 현재 값을0이나 과거값으로 채우지 않고 last_good의 원본 표본/시각은 별도로 남긴다. 호스트 수신 시각으로 센서 신선도를 덮지 않는다.
전문 선택 M04.05는 호스트 ACK 대기·장치 명령 만료와 clock을 분리한다. 늦은 ACK/heartbeat·중복 응답으로 원본 관측 시각이나 명령 lease를 갱신하지 않고, 접수/논리 상태와 실제 관측 결과를 따로 남긴다.
전문 선택 M04.04는 SPI/I2C의 모드/주소·프레임/바이트 순서·ACK와 센서 값의 유효성을 나누고, EEPROM 설정의 버전/범위·검사/commit을 구분한다. 버스 수신/저장 응답만으로 최신 원본 시각이나 물리 상태를 확정하지 않는다.
전문 선택 M04.03에서는 ADC reference/결과 쌍·변환 완료와 실제 획득 주기/alias를 구분한다. 순차 채널의 시각을 하나로 덮거나 변환 완료 사건을 무조건 새 데이터로 기록하지 않고, 원본 channel/변환 ID·시각/누락을 보존한다. PWM/이상 평균 전압도 실제 모터의 위치/속도/정지 관측과 구별한다.
전문 선택 M04.02는 MCU 타이머 이벤트·ISR 서비스와 UART 선로 전송량을 나눈다. 하드웨어 주기 설정이나 호스트 수신만으로 원본 사건이 빠짐없이 제때 처리됐다고 단정하지 않고, 실제 clock/모드·전송량/누락·측정/서비스/수신 시각을 연결한다.
센서가 MCU 펌웨어를 거친다면 호스트 AI 프로세스와 실행 대상·메모리 예산/레지스터 접근은 별도다. 전문 선택 M04.01에서 타깃 주소/버퍼·공유 접근을 확인한다. 호스트 수신이 성공했다는 사실만으로 펌웨어 관측/버퍼의 유효성이 증명되지는 않으며, 아래 측정·드라이버·수신 시각을 구분한다.
4.4.1 네 개의 시간
하나의 메시지에도 여러 시간이 존재할 수 있다.
- 센서 노출/측정 시각
- 드라이버가 메시지를 만든 시각
- middleware가 수신한 시각
- 애플리케이션이 처리한 시각
동기화에는 가능한 한 측정 시각을 header에 기록한다. 수신 시각을 대신 쓰면 네트워크 jitter가 물리적인 시간 차이처럼 섞인다. 장치 clock을 호스트 clock으로 변환했다면 offset 추정법과 불확실성을 기록한다.
학습 도식. 측정 시각은 물리 현상이 일어난 때를 나타내고, 나머지 시각의 차이는 드라이버·전송·처리 지연을 진단하는 단서다.
4.4.2 ExactTime과 ApproximateTime
서로 다른 센서는 timestamp가 정확히 같지 않으므로 ApproximateTimeSynchronizer가 유용하다. 알고리즘은 queue 안에서 timestamp 차이가 허용 범위(slop) 안인 조합을 찾는다. 이는 공통 시계나 지연을 복원하는 것이 아니라 설정된 조건에 맞는 메시지를 짝짓는 것이다. clock offset·노출/측정 시점·움직임 오차는 따로 검토한다.
30 fps 영상의 프레임 간격은 약 33.3 ms이고, 50 Hz 관절 상태는 20 ms다. 예를 들어 slop 15 ms는 가까운 상태를 찾을 가능성이 높지만, 시스템 jitter가 더 크면 pair가 사라진다. slop을 100 ms로 키우면 짝지을 수 있는 시각 차이 범위는 넓어진다. 실제 pair 수 증가는 queue·도착 순서·표본 소비에 따라 달라 보장하지 않는다. 더 멀리 떨어진 물리 시각을 연결하면 빠른 동작에서 공간 오차가 커질 수 있다.
그림 4-3. 근사 동기화는 허용 시각 차이 안의 표본을 짝짓는다. 모든 상황에서 전역적으로 가장 가까운 짝을 보장한다는 뜻은 아니다. 보간은 가정한 운동 모델로 이미지 시각의 상태를 추정한다.
message_filters의 모든 Subscriber는 호환되는 QoS를 사용해야 한다. sensor-data publisher가 best-effort인데 subscriber만 reliable이면 연결되지 않을 수 있다. queue size는 최대 지연과 rate로 추정하되, 무한히 키워 오래된 데이터를 쌓지 않는다.
4.4.3 선형 보간
이미지 timestamp 를 사이에 두는 관절 상태 , 가 있으면
로 보간한다. 회전 관절이 와 경계를 지날 때는 unwrap 후 보간한다. 쿼터니언은 선형 보간보다 SLERP가 적합하다.
온라인 처리 시 표본이 아직 도착하지 않았다면 기다리는 만큼 지연이 추가된다. 이미 늦게 도착한 이미지에는 양쪽 표본이 버퍼에 있을 수도 있다. 허용 지연·대기 상한과 사용 시점의 실제 가용 정보를 기록한다. 오프라인 데이터셋 정렬에서는 양쪽 표본을 쓸 수 있지만, 학습 입력에 미래 행동이나 미래 관측이 섞이지 않도록 feature timestamp를 엄격히 관리한다.
code/interpolate_joint_state.cpp는 관절 timestamp를 단조 증가로 검사하고 두 표본 사이를 선형 보간하는 독립 C++17 예제다.
잠깐 점검 — 가까운 표본이면 충분할까?
- 오프라인 데이터셋에서는 이미지 시각 양쪽의 관절 표본을 쓸 수 있지만, 실시간 제어에서 같은 보간을 사용하면 어떤 비용이 생기는가?
ApproximateTime의 slop을 크게 하면 허용되는 시각 차이 범위가 넓어진다. callback 수 증가가 보장되지 않는 이유와, 빠른 로봇 동작에서 데이터 품질이 나빠질 수 있는 이유를 구분해 설명하라.
확인 포인트: 아직 도착하지 않은 양쪽 표본을 기다리면 지연(latency)이 추가되지만, 이미 버퍼에 양쪽 표본이 있으면 그 대기가 반드시 필요한 것은 아니다. 큰 slop은 허용 범위를 넓힐 뿐 실제 짝 수의 단조 증가를 보장하지 않는다. 서로 다른 물리 시각을 연결하면 공간 정합 오차를 숨길 수 있다.
4.4.4 품질 지표
에피소드마다 다음을 계산한다.
- 예상 프레임 대비 실제 프레임 수와 drop rate
- timestamp 차이 의 p50/p95/max
- timestamp 역전 수
- 관절별 속도·가속도·jerk의 이상치
- TF lookup 실패율
- 영상 decode 실패와 해상도 변화
- 명령과 관측의 지연 분포
단순히 “파일이 열린다”는 데이터 품질 검사가 아니다.
4.4.5 차량 통신·계측에서 이어 읽기
전문 선택 M28.01는 차량 CAN의 물리 구성·중재/프레임과 응용 계약을 나눈다. CAN ACK는 특정 응용의 처리나 물리 동작 완료를 뜻하지 않고, 수신 시각도 원본 표본 시각을 대신하지 않는다. ID/길이·전송 오류 검사만으로 단위/축·버전·생산자/인증·표본 나이를 확정하지 않고 아래 시간 계약과 함께 확인한다.
전문 선택 M28.02에서는 CAN 비트 타이밍/오류·FD 길이와 DBC 신호 해석을 구분한다. DBC로 물리 단위의 숫자를 얻어도 현재 버전·무효값/valid·생산자/축·원본 clock/표본 나이를 확인해야 한다. 최신 수신이나 카운터/재시작만으로 새 유효 관측 또는 실제 고장 해결을 주장하지 않는다.
전문 선택 M28.03은 CAN 프레임·ISO-TP 재조립·UDS 최종 응답과 진단 대기/전송 타이머를 나눈다. ACK/첫 프레임·응답 시작을 전체 메시지/진단 성공이나 원본 측정/물리 결과로 바꾸지 않고, 부분/누락·세션/권한·원본 시각과 미확인을 보존한다.
전문 선택 M28.04에서는 DTC 상태/기록·검사 미완료와 현재 관측을 나눈다. 진단 수신/삭제·기록 설정 off·한 시점의 오류 카운터0을 최신 유효 관측이나 실제 수리/정지로 바꾸지 않고, 원본 사건/표본 시각·형상/마스크·관찰 공백·원인 가설과 재검사 근거를 보존한다.
전문 선택 M28.06은 XCP 폴링/DAQ의 원본·event/수신 시각과 A2L/현재 빌드·페이지를 연결한다. event동기 취득도 물리 센서의 동시 측정/일관 snapshot 조건을 자동 보장하지 않고, 파라미터 readback은 실제 사용 페이지/영속화·기능 관측과 구별한다.
진단 다운로드의 전송/활성화·리셋 후 관측은 M28.05와 기존 6.4 배포 감독기로 이어 읽는다. 위 연결을 기본 시간 정합 설명 뒤에 두어 원본/수신·계층/실제 결과의 차이를 해당 전문화에서 다시 적용한다.