좌표는 물체에 붙어 있는 유일한 숫자가 아니다
프레임(frame)은 원점과 방향이 정해진 좌표축의 묶음이다. 같은 점도 어떤 프레임으로 표현하느냐에 따라 좌표가 달라진다. 카메라 앞 물체가 움직이지 않아도 베이스와 카메라에서 적은 숫자는 다를 수 있다. 좌표를 바꿔 표현하는 것과 물체를 실제로 움직이는 것은 다른 연산이다. 같은 행렬이 두 용도로 쓰일 수 있어 계산의 의미를 먼저 문장으로 적는다. 이 단위의 변환은 모두 같은 물리적 점을 다른 프레임에서 표현하는 용도다.
그림 M06.01-1. 프레임은 원점과 축의 묶음이다. 같은 점 P의 좌표를 B에서 A로 바꾸는 것과 점을 실제로 이동시키는 것은 다르다. +z 쪽에서 xy 평면을 본 개념도이며 수치 예제와는 별개다. 직접 제작.
ROS의 일반적인 몸체 축은 x 앞·y 왼쪽·z 위이며 오른손 규약을 따른다. x축에서 y축으로 오른손 손가락을 감으면 엄지가 +z를 가리킨다. +z 방향에서 원점을 내려다볼 때 양의 z 회전은 반시계 방향이다. 길이는 m, 계산의 각도는 rad를 기본으로 적는다. 90도는 π/2 rad다. 센서의 광학 프레임은 흔히 z 앞·x 오른쪽·y 아래라는 별도 규약을 사용한다. 둘 다 오른손 좌표이며 ‘z가 앞이니 잘못된 센서’라고 판정하지 않는다. 실제 장치의 문서와 변환이 어떤 규약을 연결하는지 확인한다.
로봇 모델에서는 world·base·관절·센서·도구 프레임을 구분한다. 링크의 원점이 무게중심이나 외형의 중앙이라고 자동 가정하지 않는다. 도구의 끝점도 마지막 관절 원점과 다를 수 있다. 원점과 축을 어느 지점에 놓았는지, 오프셋이 어느 좌표계로 표현됐는지가 모델의 일부다. 기존 3.2의 변환 사슬을 읽을 때 관절 이름뿐 아니라 이 연결 계약을 추적한다.
열벡터와 변환 방향을 고정한다
점 P의 B 좌표를 열벡터 p_B, A 좌표를 p_A라고 쓰자. T_AB는 B의 좌표를 A로 바꾸는 4×4 동차변환이다. R_AB는 3×3 회전행렬이며 각 열은 B의 축을 A로 표현한 값이다. t_AB는 B 원점의 위치를 A로 표현한 3차원 이동 벡터다. 같은 점은 다음 관계를 만족한다.
동차 좌표에서는 점 뒤에 1을 붙인다. I는 단위행렬이며 아래의 0은 길이 3의 영행이다.
B와 C도 연결되어 있다면 T_AC=T_AB T_BC다. 오른쪽 C→B를 먼저 적용하고 B→A로 간다. 곱의 가운데 B가 이어지는지 읽는 것이 방향을 확인하는 첫 점검이다. 곱을 반대로 놓아도 4×4끼리라 숫자 계산은 가능하지만 이 프레임 계약을 만족하지 않을 수 있다. 실제 합성에서는 회전뿐 아니라 이동도 앞쪽 프레임으로 바뀐다.
오프셋 t_BC를 그대로 t_AB에 더하면 안 되는 이유가 이 식에 있다. 전자는 B의 축, 후자는 A의 축으로 적힌 값이다. 축을 맞춘 뒤 더한다. 순수 방향 벡터 v에는 원점 이동을 더하지 않고 v_A=R_AB v_B만 적용한다. 점과 방향을 같은 방식으로 처리하면 속도 방향이나 센서 광선에 불필요한 위치 오프셋을 섞게 된다.
회전된 베이스의 센서 오프셋을 계산한다
합성 예제는 평면 운동을 3차원 좌표에 넣는다. A는 world, B는 base, C는 camera다. B는 A에서 z축으로 +90도 돌아 있고 원점은 (1,0,0) m다. C는 B와 축 방향이 같고 B에서 (0.2,0,0) m에 있다. 모든 값은 같은 시각의 합성 자료다. 회전 R_AB는 (x,y,z)를 (−y,x,z)로 바꾼다. C의 점 (0.3,0.1,0) m를 먼저 B로 옮기면 (0.5,0.1,0) m다. 이어 회전하면 (−0.1,0.5,0), A에서의 원점 이동을 더하면 (0.9,0.5,0) m다.
카메라 원점도 A에서 (1,0.2,0) m이므로, 점에 R_AB를 적용한 (−0.1,0.3,0)에 이를 더해 같은 답을 얻는다. 반면 카메라 오프셋 (0.2,0,0)을 world의 x방향으로 그대로 더하면 (1.1,0.3,0) m가 나온다. 두 좌표의 차이는 (0.2,−0.2,0) m다. 이 차이는 센서 잡음이 아니라 오프셋의 표현 프레임을 잘못 읽은 결과다. 같은 시각과 정확한 입력을 가정한 비교이므로 원인을 구체적으로 지적할 수 있다.
역변환은 회전의 전치와 회전된 음의 이동을 사용한다. 전치 R_AB의 의미와 회전행렬의 역 관계는 M02.02에서 연결한다.
A 점에서 먼저 (1,0,0)을 빼면 (−0.1,0.5,0), 역회전하면 (0.5,0.1,0), 센서 오프셋을 빼면 C의 (0.3,0.1,0)으로 복원된다. 이동의 부호만 바꾸고 회전을 생략하면 복원되지 않는다. 방향 (1,0,0)은 A에서 (0,1,0)이며 원점 이동은 붙이지 않는다.
검증은 원점·각 축 방향·알려진 점의 왕복 변환을 함께 본다. 왕복 복원만으로 실제 보정이 정확하다고 결론 내리지는 않는다. 잘못된 변환과 그 역도 서로 복원될 수 있기 때문이다. 독립적으로 알려진 장착 위치나 기준점, 버전이 고정된 모델과 시간 기록을 대조해야 한다. 기존 모델의 코드가 계산하는 말단과 실제 도구 끝점이 같은 프레임인지도 확인한다. 이 단위에서는 종이 자료를 점검하며 실제 팔을 움직여 확인하지 않는다.