REP 105, 누가 어느 변환을 내나
로봇 위치를 적는 기준이 왜 map과 odom, 둘이나 있을까?
몸에 붙은 프레임
base_link는 로봇과 함께 갑니다
로봇 프레임의 이름과 관계는 REP 105라는 ROS 약속 문서가 정해 둡니다. base_link는 로봇 몸통에 단단히 붙은 프레임이라 로봇이 가면 같이 갑니다. 반면 odom과 map은 바닥에 고정된 프레임입니다.
바퀴로 센 위치
odom: 끊김 없지만 오차가 쌓임
odom 기준 위치는 바퀴가 몇 바퀴 돌았는지로 센 값, 곧 오도메트리(odometry)입니다. 값이 매끄럽게 이어져 잠깐 동안은 아주 정확합니다. 하지만 바퀴가 조금씩 미끄러진 만큼 오차가 쌓여, 오래 가면 실제 위치와 벌어집니다.
전체 지도 기준
map: 정확하지만 값이 튈 수 있음
map 기준 위치는 라이다로 본 벽을 지도와 맞춰 보며 다시 잡은 값입니다. 오차가 쌓이지 않아 오래 가도 정확합니다. 대신 새로 맞출 때마다 값이 툭 바뀝니다. 그래서 먼 길은 map으로, 순간순간의 움직임은 odom으로 따집니다.
누가 내나
변환마다 내는 쪽이 다릅니다
map → odom은 지도와 위치를 함께 잡는 SLAM이나, 지도 위 위치를 잡는 AMCL이 냅니다. odom → base_link는 바퀴 오도메트리를 계산하는 쪽이, 몸통에서 센서까지는 robot_state_publisher가 냅니다.
SLAM·AMCL은 15강, robot_state_publisher는 13강 5편에서 다룹니다.
왜 map→odom
map은 base_link가 아니라 odom에 붙습니다
위치를 잡는 노드는 map 기준 로봇 위치를 구합니다. 하지만 base_link의 부모는 이미 odom이라, 부모를 하나 더 둘 수 없습니다(4편). 그래서 "odom이 map에서 얼마나 어긋났나", 곧 보정값을 map→odom으로 냅니다.
AMCL과 SLAM을 동시에 띄우면 map→odom을 둘이 내게 되니 함께 쓰지 않습니다.
TurtleBot3
바닥에 base_footprint를 하나 더
TurtleBot3의 트리는 odom → base_footprint → base_link → base_scan입니다. base_footprint는 로봇 바로 아래 바닥에 찍은 프레임으로, 높이가 늘 0이라 바닥 위에서 길을 계산하기 좋습니다.
바퀴·IMU 프레임도 base_link 아래에 달려 있습니다. 지도를 만들기 시작하면 맨 위에 map이 붙습니다(15강).
다음 편