작은 잔차를 보기 전에 비교 조건을 맞춘다
영상 위에 예상 점이 잘 겹쳐도 좌표계나 시간이 잘못되면 로봇이 사용할 3차원 위치는 틀릴 수 있다. 따라서 먼저 어떤 점을 어느 프레임의 어떤 시각으로 바꾸었는지 확인한다. TF는 시간에 따라 프레임 사이의 관계를 제공한다. 카메라 optical 프레임의 취득 시각 t에 표현한 점을 base 프레임으로 바꾼다면 source는 optical, target은 base이며 그 시각을 포함하는 변환 경로가 필요하다. 최신 변환을 쓰는 것이 취득 시각의 변환을 쓰는 것과 항상 같지는 않다.
Jazzy tf2 공식 개념에 따라 데이터의 변환 방향과 프레임 자체의 배치 표현을 구별한다. 연결 경로·방향·프레임 이름과 시계/시각 범위를 확인하고, 중복된 발행이나 빠진 관계가 의심되면 값을 먼저 승인하지 않는다. 정적 장착 변환이 알려졌어도 이동하는 base와 세계 사이의 관계까지 정적인 것은 아니다.
재투영은 3차원 점을 카메라 모형으로 다시 영상에 옮기는 계산이다. 대응하는 실제 관측 픽셀과 비교하려면 영상 크기, raw/rectified 여부, 내부 행렬 K와 왜곡 모형, 점의 대응이 같아야 한다. OpenCV의 PnP가 사용하는 object→camera 변환을 반대로 넣거나, resize 전 K를 그대로 쓰면 잔차의 원인이 바뀐다. 잔차를 줄이기 전에 이 계약을 검사한다.
RMS라는 이름에도 분모와 단위를 붙인다
점 i의 관측 픽셀을 (u_i,v_i), 투영 픽셀을 (û_i,v̂_i)라 하자. 이 단위에서는 잔차 r_i=(u_i−û_i,v_i−v̂_i)를 관측−예측으로 정의한다. N은 대응 점 수다. 점당 유클리드 RMS와 좌표 성분당 RMSE를 다음처럼 구분한다.
둘 다 pixel 단위지만 분모가 달라 같은 숫자가 아니다. 관측 두 점 (360,260)/(400,240), 투영 두 점 (361,258)/(397,244)이면 잔차는 (−1,2)/(3,−4) pixel이다. 제곱 거리 5와 25를 더해 30을 얻는다. 점당 RMS는 √(30/2)=약 3.873 pixel, 성분 RMSE는 √(30/4)=약 2.739 pixel이다. 평균 거리나 최대 거리 역시 별도 지표이므로 이름만 RMS라고 적지 않는다.
잔차가 작아도 물리적 m 단위 위치가 정확하다고 결론 내리지는 않는다. 잘못된 물체 크기나 제한된 관측 구성에서도 영상상 맞는 결과가 나올 수 있고, 보정에 사용한 점의 잔차와 독립 자료의 잔차도 다르다. 대응 수·제외 기준/이상치, fit 또는 독립 검증인지와 깊이·각도 범위를 함께 남긴다. 픽셀 오차를 일정 비율로 곱해 모든 거리에서 같은 m 오차로 바꾸는 것도 부적절하다.
시간 편향의 방향을 먼저 계산한다
optical 축의 X는 오른쪽, Z는 전방이라고 하자. 왜곡/회전 없이 깊이 Z=1 m가 일정하고 점의 상대 속도 v_x=0.2 m/s, 가로 초점거리 f_x=400 pixel이다. 같은 시계에서 δt=t_used−t_image를 사용한 상태 시각과 영상 취득 시각의 차이로 정의한다. 그러면 예측 위치 차이 ΔX=v_xδt, 가로 투영 차이 Δu=f_xv_xδt/Z다.
δt=+0.05 s면 ΔX=+0.01 m, Δu=+4 pixel이다. 영상 시각의 X=0.1 m와 c_x=320 pixel이면 u=360이고, 늦은 상태의 X=0.11이면 예측 u=364다. 앞 절의 잔차는 관측−예측이므로, 이 시간 편향만 있는 경우 잔차 가로 성분은 −4다. Δu와 잔차의 정의를 혼동하지 않는다. δt가 음수이면 예측 차이의 부호도 바뀐다.
이미 알려진 50 ms offset은 보정하거나 남은 편향으로 보고한다. 이를 근거 없이 평균 0인 잡음의 표준편차에 섞어 적으면 원인을 숨긴다. 반대로 offset을 고쳤다고 시간 추정의 남은 변동까지 0이 되는 것은 아니다. 다른 시계·노출 시간·rolling shutter·6자유도 운동은 이 간단한 식 밖의 문제다. 기존 4.4 시간 정합의 기록과 연결해 가정을 확인한다.
픽셀과 깊이의 흔들림을 위치 분산으로 옮긴다
역투영 X=Z(u−c_x)/f_x에서 nominal은 계산을 전개하는 기준값이다. u=360 pixel, c_x=320 pixel, f_x=400 pixel, Z=1 m를 기준으로 한다. 작은 오차에 대한 민감도는 J_u=∂X/∂u=Z/f_x=0.0025 m/pixel, J_Z=∂X/∂Z=(u−c_x)/f_x=0.1이다. 첫 값은 픽셀이 조금 변할 때 위치가 얼마나 변하는지, 둘째는 깊이 변화가 X에 얼마나 전달되는지 나타낸다.
σ는 표준편차, σ²는 분산이다. σ_u=1 pixel, σ_Z=0.02 m이고 두 작은 오차가 평균 0이며 독립이라고 가정하자. 여기서는 c_x/f_x와 TF를 정확히 알려진 상수로 두는 부분 예산이다. 1차 근사로 분산을 계산한다.
독립이면 공분산 Cov(u,Z)는 0이므로 (0.0025)²×1²+0.1²×0.02²=0.00000625+0.000004=0.00001025 m²다. 제곱근을 취하면 σ_X≈0.003202 m, 약 3.20 mm다. 표준편차 1 pixel과 0.02 m를 직접 더하지 않고, 민감도로 같은 출력의 분산 단위에 옮기는 이유가 여기에 있다. 상관이 미상인 경우 공분산을 0으로 정할 근거는 없다. 공분산의 단위는 pixel·m이며 교차항도 m²가 된다.
알려진 offset을 보정한 뒤 남은 시간 오차의 σ_t=0.01 s가 두 입력과 독립이라고 추가로 주어지면, 제한 모형의 위치 분산에 v_x²σ_t²=0.000004 m²를 더한다. 합은 0.00001425 m², 표준편차는 약 3.775 mm다. 이는 정해진 모형/포함 항목에 대한 계산이지 TF나 초점거리까지 포함한 전체 정확도 성적표가 아니다.
NIST의 불확실성 전파 설명처럼 민감도는 기준점에서 평가하고 공분산을 고려한다. 큰 비선형 변화나 잘못된 대응/단위·TF는 작은 오차의 1차 근사로 해결하지 못한다. 표준편차를 최대 오차나 보장 범위로 읽지 않으며, 분포/추정 조건 없이 95% 구간이라고도 부르지 않는다. 입력의 σ를 무엇으로 추정했는지 모르면 계산 결과의 신뢰도도 미상으로 남긴다.
수치와 함께 다시 판단할 근거를 남긴다
기록에는 source/target과 변환 방향·취득 시각/시계, K/왜곡·영상 크기와 보정 버전, 대응 자료 ID와 잔차 부호/집계 분모·단위를 적는다. 불확실성에는 기준값·σ 또는 공분산, 변수 순서/프레임·단위와 상관 가정, 추정 방법/표본 근거, 제외한 항목을 적는다. 동일한 3 mm라도 한 값은 반복 관측의 퍼짐이고 다른 값은 위의 부분 전파 계산일 수 있다. 합성 수치인지 실제 관측인지도 구별한다.
미상은 0으로 채우지 않는다. 프레임/시각 계약이 깨지면 큰 σ를 붙여 승인하기보다 입력을 보류하고 원인을 확인한다. 기존 4.3 TF와 선택 투영/시간 개념 모형은 보충 자료다. 위젯은 고정 Z/상대 X속도·같은 시계의 투영만 보여 주며 전체 불확실성이나 Kalman/EKF를 계산하지 않는다. 아래 활동은 위젯 없이 완료한다.