이 글은 ROS 좌표 프레임 개념 및 사용 방법에 대해 간략히 정리한다.
머리말
로봇 시스템은 다양한 로컬 좌표계 프레임으로 구성된다. 다음 그림과 같이 로봇의 각 파트가 움직일 때 하위 부분은 같이 움직어야 한다. 이들의 위치나 방향을 각각 계산하면 매우 복잡할 것이다. 그러므로, 상위 파트가 움직이면, 해당되는 좌표 그래프부터 부속된 하위 노드까지 좌표변환행렬을 계산 및 전파한다. 이를 scene graph라 한다.
scene graph
씬 그래프는 컴퓨터 그래픽에서 고전적인 솔류션이다.
다중 좌표 프레임(ROS)
ROS는 분산 처리 방식이라 메시지를 퍼블리쉬하는 방식으로 좀 복잡하게 처리된다.
좌표계 프레임 정의
다음 그림은 로봇이 거친 표면을 이동할 때, 로봇 플렛폼의 좌표계와 roll, pitch 모션 등을 보여준다.
맵, odom, base_link 프레임은 Coordinate Frames for Mobile Platforms ROS (REP 0120)문서에 기술되어 있다. 다음은 프레임 각 구성요소 설명이다.
- map: world fixed frame(세계 고정 좌표 프레임)이다. Z축은 위를 향한다. 모바일 플랫폼 위치는 map 프레임에서 상대적이고, 시간에 따라 이동하지 말아야 한다. map 프레임은 연속적이지 않고, 맵 프레임 내 모바일 플랫폼 위치는 변화될 수 있다. 일반적 설정에서, 맵 프레임에서 센서 관찰 지점 기반 로봇 위치는 재계산된다. 맵 프레임은 장기간 전역 참조로써 유용하다. 맵 프레임의 z위치는 해발 고도와 동일하다.
- odom: odom은 world fixed frame이다. odom 프레임에서 모바일 플랫폼 위치는 시간에 따라 이동될 수 있다. odom 프레임 안에서 로봇 위치는 연속적이다. 일반적 설정에서 odom 프레임은 odometry(주행계) 소스를 기반으로 계산된다. 소스의 예는 휠 주행계(wheel odometry), 비쥬얼 오도메트리(visual odometry), IMU(inertial measurement unit) 센서 등이 된다. odom 프레임은 단기적 지역 참조에 유용하다.
- base_footprint: base_footprint는 바닥에 대한 로봇 위치를 나타낸다. 바닥은 보통 다리를 지지한느 수평 지반을 말한다. 프레임 변환 요소는
- base_link: base_link는 모바일 로봇 베이스에 부착된다. base_link는 임의 위치 및 방향을 가진다. 모든 로봇 하드웨어는 서로 다른 base_link를 가진다. odom 프레임에 상대적이며, 롤 및 피치 각도는 0이고, yaw 각도는 base_link yaw각도와 일치한다. 이 좌표계는 인간형 로봇 이동시 안정적인 평면 정보를 제공한다.
- gaze: head 위치 및 방향을 정의한 좌표 프레임이다. 카메라같은 센서와 관련해 보는 방향을 정의한다.
- earth: ECEF의 원점이다. 이 프레임은 서로 다른 맵 프레임에서 여러 로봇의 상호 작용을 허용하도록 설계되었다.
지구 같은 전역 참조와 관련해 좌표 프레임을 정의할 때, x축은 동쪽, y축은 북쪽, z축은 위로 정렬된다. 건물 실내와 같이 구조화된 환경에서는 건물 레이아웃 지도와 좌표계를 정렬하는 것이 좋다. 여러 층에서 작업하는 경우, 각 층에 좌표 프레임이 있는 것이 합리적일 수 있다.
각 프레임요소는 다음과 같은 연결관계를 가진다. 참고로, 드론과 같은 로봇은 pressure_altitude 를 추가해 고도 좌표 프레임을 삽입할 수 있다.
다음 프레임 그래프는 earth에 기반한 다중 로봇의 좌표계 그래프를 보여준다.
참고로, 로봇이 원거리 이동하는 경우, map 을 전환해야 할 수도 있다.
이 SLAM에서는 odom, base_link 두 프레임을 사용한다. base_footprint는 높이 정보는 없으며, 2D pose 정보만 제공한다(position, orientation), base_stabilized는 로봇 높이에 대한 추가 정보를 제공한다. 로봇에 대한 AHRS, INS에서 얻은 로봇 자세(attitude. roll/pitch)를 추정하여 사용할 수 있다(hector_imu_attitute_to_tf 노드). base_link에서 laser_link로 변환은 static transform publisher와 robot state publisher에서 제공한다.
ROS TF(Tranformation) 정의
hector_mapping와 같은 SLAM에서 tf는 스캔 데이터 변환을 위해 사용한다. tf는 다중 좌표 프레임을 유지하기위한 역할을 한다. tf는 특정 시점에서 두 좌표 프레임간의 점, 벡터 등을 계산한다. tf2는 tf를 개선한 것이다. 로봇 시스템은 월드 프레임, 기본 프레임 등과 같이 시간이 지만에 따라 변경되는 3차원 좌표 프레임이 있다. tf는 시간 경과에 따라 이런 모든 프레임을 추적하여 다음과 같은 계산을 할 수 있다.
- Where was the head frame relative to the world frame, 5 seconds ago?
- What is the pose of the object in my gripper relative to my base?
- What is the current pose of the base frame in the map frame?
tf는 분산 시스템에서 작동할 수 있어, 각 로봇 파트가 개별 컴퓨터에서 네트웍을 통해 통합된 좌표 변환 기반 동작을 수행할 수 있다(참고. tf 데모).
좌표 프레임 설정 예
좌표 프레임은 odom을 사용하지 않는다면, 다음과 같이 설정된다.
<param name="pub_map_odom_transform" value="true"/>
<param name="map_frame" value="map" />
<param name="base_frame" value="base_frame" />
<param name="odom_frame" value="base_frame" />
이 경우, 퍼블리쉬 설정을 다음과 같이 처리한다.
<param name="pub_map_odom_transform" value="false"/>
마무리
이 글에서는 ROS 다중 좌표 프레임에 대해 간략히 정리해 보았다.
댓글 없음:
댓글 쓰기