좌표 변환

로봇이 본 점을 지도 위에 찍으려면 무엇을 알아야 할까?

변환

두 프레임 사이는 이동 + 회전

한 프레임에서 다른 프레임으로 가려면 두 가지만 알면 됩니다. 원점이 얼마나 떨어져 있는지(이동, translation), 축이 얼마나 돌아가 있는지(회전, rotation)입니다. 이 둘을 묶어 변환(transform)이라고 합니다.

3차원에서는 이동 x, y, z와 회전 roll, pitch, yaw, 모두 여섯 값입니다.

부모와 자식

부모 기준으로 자식을 적습니다

TF는 변환을 geometry_msgs/msg/TransformStamped 메시지에 담습니다. header.frame_id가 부모, child_frame_id가 자식입니다. 내용은 "부모 기준으로 자식의 원점은 여기, 축은 이만큼 돌아 있다"입니다.

계산

돌리고 나서 옮깁니다

로봇이 map의 (2, 1)에서 위(90°)를 보고 있습니다. 로봇 기준 (1, 0), 곧 정면 1m의 점은 map 기준으로 어디일까요? 로봇이 돈 만큼 돌리고, 로봇이 있는 만큼 옮기면 (2, 2)입니다.

이 계산은 TF2가 대신 해 줍니다. 원리만 알아 두면 됩니다.

회전 적기

회전은 쿼터니언으로 적습니다

변환 메시지는 회전을 각도 셋이 아니라 쿼터니언(quaternion) x, y, z, w 넷으로 적습니다(4강 6편). 바닥에서 z축으로만 도는 로봇이라면 z와 w 둘만 바뀝니다. 돌지 않았으면 (0, 0, 0, 1)입니다.

사람은 roll·pitch·yaw로 생각하고, 코드에서 쿼터니언으로 바꿔 넣습니다(7편).

이어 붙이기

변환은 이어 붙일 수 있습니다

map→base_link와 base_link→base_scan을 알면, 둘을 이어 붙여 map→base_scan도 구할 수 있습니다. 그래서 프레임마다 이웃 하나와의 관계만 알려 두면 됩니다. 길을 따라 이어 붙이는 일은 TF2가 합니다.

프레임 위치는 설명을 위해 벌려 그렸습니다.

따라 하기

두 프레임 사이를 직접 물어봅니다

1편의 데모를 띄운 채 ros2 run tf2_ros tf2_echo turtle2 turtle1을 실행합니다. 첫째 프레임(turtle2) 기준으로 둘째 프레임(turtle1)이 어디 있는지 계속 찍어 줍니다. turtle1이 turtle2의 앞 2.157m, 왼쪽 0.901m에 있다는 뜻입니다.

공식 튜토리얼의 출력 예시이고, 일부만 보였습니다. 회전은 쿼터니언과 RPY로 함께 나옵니다.

다음 편

이어 붙일 길을 찾으려면 프레임들이 어떤 모양으로 이어져 있어야 할까요?

4편변환은 나무 모양 12강 목록