Point·Quaternion·Pose
로봇이 어디에 있고 어디를 보는지, 숫자 몇 개면 될까?
위치
위치는 Point의 x, y, z
geometry_msgs/msg/Point는 float64 세 칸 x, y, z로 한 점의 자리를 적습니다. 단위는 미터입니다. Point에는 기준 프레임이 없습니다. 기준까지 적으려면 Header가 붙은 PointStamped를 씁니다(4편).
5편의 Vector3도 칸은 같지만, 그것은 자리가 아니라 방향과 크기를 뜻합니다.
평면의 방향
평면에서는 각도 하나면 됩니다
거북이처럼 바닥을 다니는 로봇은 자리 x, y와 바라보는 각도 하나면 충분합니다. 그래서 turtlesim/msg/Pose는 x, y, theta를 씁니다.
theta는 라디안이고, x축에서 반시계 방향이 +입니다. 60°는 약 1.05 rad입니다.
3차원 방향
3차원 방향은 쿼터니언 네 숫자
드론이나 로봇 팔은 기울기까지 있어 각도 하나로 모자랍니다. ROS는 3차원 방향을 쿼터니언(quaternion) x, y, z, w 네 숫자로 적습니다.
정의 파일에 기본값이 적혀 있어, 아무것도 넣지 않으면 (0, 0, 0, 1), 곧 "회전 없음"입니다.
네 숫자 하나하나를 각도로 읽으면 안 됩니다.
평면 각도로 바꾸면
z축으로만 돌면 z와 w만 바뀝니다
바닥 위에서 θ만큼 돌아 있으면 쿼터니언은 x = 0, y = 0, z = sin(θ/2), w = cos(θ/2)입니다. 직접 계산하기보다 변환 함수를 쓰는 일이 많습니다(12강).
따라 하기
Pose = Point + Quaternion
ros2 interface show geometry_msgs/msg/Pose를 쳐 보세요. Pose는 자리 position과 방향 orientation을 한데 묶은 "자세"입니다.
기본값이 있는 칸은 정의 파일처럼 끝에 값이 함께 보입니다.
어디에 쓰나
목표 지점은 PoseStamped로 보냅니다
RViz의 2D Goal Pose 버튼으로 지도에 목표를 찍으면 /goal_pose 토픽에 PoseStamped가 나갑니다. "지도(map) 기준으로 이 자리, 이 방향"이라는 뜻입니다.
숫자는 예시입니다. 실제로 목표를 보내는 것은 15강 8편에서 합니다.
다음 편