2021. 4. 8. 10:09ㆍSLAM
0. 머리말
모바일 로봇 분야에서 로봇의 위치를 파악하는 것은 아주 중요하고 핵심적인 일이다. 그래서 우리는 로봇의 위치를 정확히 나타내기 위해서 기준이 되는 좌표계(Coordinate)를 사용하며, 로봇 분야에서는 이에 해당하는 좌표계 개념이 존재하여 일반적으로 통용된다. 이렇게 보편적으로 약속된 좌표계 개념을 통해 우리는 로봇이 정확히 어디에 위치해있는지 효율적으로 파악할 수 있다. 하지만 이러한 기준 없이 개인마다 다른 좌표계 축(Coordinate Frame)을 사용했다면, 로봇의 위치을 추정하는 코드를 검토하거나 결과를 분석할 때 많은 혼동을 야기했을 것이다. 개인적으로는 여러 좌표계 축의 의미를 정확히 이해하여, 동료와 소통할 때 혼동없이 같은 생각을 공유하는 것이 중요하다고 느꼈었다. 그래서 오늘 좌표계 개념에 대한 정확한 이해를 위해, map, odom, base_link 좌표계 축의 자세히 설명해보려고 한다. 개인적인 견해가 많이 섞여 있으니, 정확하지 않은 표현이 있다면 지적해주길 바란다.
1. map, odom, base_link
- map : 지도의 좌표계
- 시간이 지나도 변하지 않고 고정되어있는 축이다.
- 특징을 설명하자면, 로봇의 위치를 전역적으로 나타내기 때문에 global frame으로 불린다. 또한, 로봇이 사용하고자 하는 지도를 바꾸게 되면, 새롭게 바뀐 지도의 좌표계 축을 기준으로 로봇의 위치를 나타내게 된다.
- 일반적으로 지도를 작성할 때, 지도 작성을 시작한 위치를 원점( position = {0,0,0}, orientation = {0,0,0,1} )으로 설정하여 지도를 만들기 때문에 지도 작성의 시작 위치가 map 축의 원점으로 설정된다.
- odom : 지도 위의 어떤 고정된 위치가 원점인 좌표계
- 보통, 로봇의 시작점이 odom 좌표계의 원점이 되는 경우가 많다. 시간에 따라 변하지 않는다.
- 하지만 사용자가 어떻게 사용하냐에 따라 시간에 따라 변하기도 하는 좌표계이다.
- 특별히 사용자가 odom 좌표계 축을 업데이트하는 경우가 아니라면, 시간에 따라 변하지 않는 고정된 축으로 말할 수 있다. 사용자가 중간중간 절대적인 측정값을 이용해서 odom을 업데이트해준다면, 시작점을 주기적으로 설정해준다고 생각하면 된다.
- SLAM, 즉 지도를 그리면서 위치 추정도 함께 하는 경우에는, 로봇의 시작점과 지도가 작성되기 시작한 지점이 같으므로 odom축과 map 축이 같다.
- 하지만, 이미 지도가 있는 상태에서 위치 추정을 하는 상황이라면, 로봇의 초기 위치가 지도의 원점(지도를 그리기 시작했던 지점)과 다를 수 있다. 이러한 경우에는 보통 로봇의 초기 위치를 odom 축으로 하고, 로봇의 초기 위치가 map 좌표계에서 어디에 위치하고 있는지 파악한다. 그러고 나서, map과 odom 사이의 tf(transformation)를 이용하여 로봇의 map 좌표계에서의 위치를 나타내게 된다.
- base_link : 로봇의 중심이 원점인 좌표계
- 로봇이 움직이면 함께 움직이는 축이다.
- 지도 상에서 로봇의 위치를 추정한다는 것은 map 축에 대한 base_link 축의 위치를 계산하는 것을 의미한다. 여기서 map 축에 대한 base_link 축의 위치는 4x4 matrix transformation으로 나타낼 수 있기에, 보통 map - base_link의 transformation을 구한다고 얘기한다.
- 시간에 따라 로봇이 움직이면 global static frame인 map 축을 기준으로 보았을 때 base_link 축이 변화한다고 볼 수 있고, 이렇기 때문에 시간에 따라 변화하는 축이라고 말한다.
- 2D 지도에서 로봇의 위치를 나타내는 경우에는, 로봇의 입체적인 모양이나 기울어짐과 같은 3차원 상에서의 자세를 고려하지 않기 때문에 base_link만 사용해도 무방하다. 하지만, 필요에 따라 로봇의 위치를 다르게 표현할 수 있는 또 다른 좌표계 축을 활용하기도 한다. 예를 들면, 3차원 공간에서 로봇의 위치를 2차원으로 나타내는 경우, 필요에 따라 3차원 공간에 존재하는 base_link 축을 2차원 평면으로 투영한 base_footprint 좌표계 축을 사용하기도 한다. (아래의 사진 참고)
- 일반적으로 로봇에서 센서를 사용하는 경우에, 센서는 로봇에 고정되어있으므로 센서의 위치를 base_link 축을 기준으로 나타내어 사용하게 된다. 아래의 사진을 예로 들면, laser 센서의 중심이 원점인 laser_link 축이 base_link 축에 대해 고정된 transformation으로 나타낼 수 있음을 알 수 있다. 그래서, 현실에서는 3D LiDAR 센서에서 관측한 Scan을 base_link 축을 기준으로 변환하여 변환된 Scan이 로봇의 중심에서 관측된 것처럼 사용하곤 한다.
2. ROS에서 볼 수 있는 map, odom, base_link
위에서 이해한 내용을 바탕으로, 로봇이 지도의 어느 좌표에 위치해있는지 나타낸다고 생각해보자. 결과적으로 우리가 계산해야할 값은 map 축에 대한 base_link 축의 위치이다. 그리고 이는 4x4 matrix transformation(tf) 또는 pose(= position + orientation)으로 나타낼 수 있다. 다시 말하면, 궁극적으로 map-base_link의 tf를 구하는 것이 로봇의 위치를 추정하는 것이다.
일반적인 경우에는, map-odom의 tf, odom-base_link의 tf를 각각 구하고 곱해서, map-base_link의 tf를 구하게 된다. 하지만, 앞서 말한 것과 같이 지도를 작성하는 경우에는 map과 odom 축이 같아 map-odom의 tf가 identity matrix가 되버린다. 따라서 odom-base_link만 나타내면 로봇의 위치를 추정할 수 있다. 이와 상반되게, 지도가 이미 있는 상황에서 로봇의 위치를 추정하는 경우에는 map-odom의 tf와 odom-base_link의 tf가 필요하게 된다. ROS에서는 여러 좌표계 축 사이의 변환(tf)을 다양한 방법으로 사용할 수 있는 기능들이 존재한다. 예를 들면, 우리는 특정한 tf를 publish할 수 있고, publish된 tf들의 관계가 tree 형태로 시각화할 수 있다. 아래의 사진은 rqt_tf_tree를 이용해서 tf 사이의 관계를 시각화한 예시이다.
3. Reference
[1] www.ros.org/reps/rep-0105.html
[2] library.isr.ist.utl.pt/docs/roswiki/hector_slam(2f)Tutorials(2f)SettingUpForYourRobot.html
'SLAM' 카테고리의 다른 글
[ SLAM ] Graph SLAM (0) | 2021.03.23 |
---|---|
[ SLAM ] Ceres Solver를 이용한 Graph Optimization (0) | 2021.03.23 |