본문으로 건너뛰기
버전: v26.01b

SLAM

로봇의 상태 표현

TF

TF 예시 이미지

ROS에서 빠질 수 없는 개념인 TF는 Transformation(변환)의 줄임말로, 로봇의 위치나 방향과 같은 형상 정보를 나타내기 위해 사용됩니다. TF는 서로 다른 좌표계(Frame) 간의 관계를 정의하고, 이를 바탕으로 좌표 변환을 쉽게 수행할 수 있도록 도와줍니다.

예를 들어, 로봇의 특정 위치에 부착된 LiDAR 센서의 측정값을 로봇의 중심 좌표계(base_link 등)를 기준으로 변환하거나, RViz에서 시각화할 때 TF를 사용하여 각 부위의 상대 위치를 정확히 표시할 수 있습니다.

Frame

ROS에서 Frame은 하나의 좌표계를 의미하며, 로봇의 특정 부위나 센서 위치를 기준으로 정의됩니다. 예를 들어, LiDAR는 base_scan이라는 프레임을 통해 위치가 표현되고, 카메라는 camera_link, IMU는 imu_link라는 프레임을 사용합니다.

이러한 프레임 정보는 센서 데이터의 헤더(header)에 포함된 frame_id 필드를 통해 지정됩니다.

이전 시간에 Rviz를 사용하여 LiDAR 데이터를 시각화해 보았습니다. 이때, Fixed Frame은 시각화의 기준이 되는 고정 좌표계를 의미합니다. 예를 들어, Fixed Framebase_link로 설정하면 로봇의 중심 좌표계를 기준으로 다른 센서들의 데이터가 시각화됩니다.

Rviz Fixed Frame 예시

📢 실습

  1. 선박의 TF 토픽을 수신하려고 한다. bringup을 실행한 후 토픽 리스트에서 TF 토픽을 찾으시오.
  2. echo 명령어를 사용해 2가지 종류의 TF 토픽을 각각 수신하여 차이점을 찾으시오.

robot_state_publisher

robot_state_publisher는 로봇의 형상 정보, 즉 tf 데이터를 출력하는 데 사용됩니다. 이때 사용되는 형상 정보는 URDF 파일을 통해 전달되며, URDF에는 로봇을 구성하는 각 요소의 형태, 위치, 연결 관계, 물성 정보 등의 내용이 담겨있습니다.

비슷한 역할을 하는 포맷으로는 시뮬레이션 프로그램(Gazebo 등)에서 주로 사용하는 SDF 파일이 있습니다. SDF 파일 역시 URDF 파일처럼 로봇의 구성 요소와 속성 정보를 포함하지만, 물리 엔진을 위한 상세 설정(마찰, 질량, 관성 등)도 함께 정의할 수 있다는 차이점이 있습니다.

최근에는 SDF 파일을 URDF로 자동 변환하는 기능이 제공되므로, 중복 작성을 줄이고 유지 관리를 용이하게 하기 위해 로봇 모델은 SDF로 작성하고, URDF 형식의 파일이 필요한 경우에는 SDF 파일을 변환하여 사용하는 방식을 권장합니다.

로봇 형상 정보 예시

SDF는 보다 세부적인 내용을 담을 수 있지만, 기본 구조는 URDF와 마찬가지로 Base, Link, Joint로 이루어져 있습니다. 쉽게 설명하자면 Link는 뼈, Joint는 관절, Base는 로봇이 놓이는 바닥에 비유할 수 있습니다.

joint_state_publisher

joint_state_publisher는 로봇의 조인트(Joint) 상태 정보를 출력하는 데 사용됩니다. 예를 들어, camera_joint나 gps_joint와 같이 Fixed 타입으로 설정된 Joint는 항상 같은 위치에 고정되어 있으므로, 별도로 상태를 출력할 필요가 없습니다.

하지만, 키(Key)쓰러스터(Thruster)처럼 실제로 움직이는 조인트의 경우, 현재 각도나 위치 등의 상태를 출력해야 합니다. 이럴 때 joint_state_publisher를 사용하여 해당 조인트들의 상태 정보를 지속해서 ROS 토픽으로 출력할 수 있습니다.

TF 확인하기

앞서 robot_state_publisherjoint_state_publisher를 통해 TF가 어떻게 생성되고 구성되는지를 살펴보았습니다. 이제 이렇게 만들어진 TF 데이터를 실시간으로 확인하고 시각화하는 방법을 알아보겠습니다.

ROS에서는 TF를 확인할 수 있는 여러 도구를 제공하는데, 그중 대표적인 방법은 RViz를 활용하는 방법과 RQT의 TF Tree 플러그인을 사용하는 방법입니다. 이 두 가지 방법 모두 실시간으로 TF 프레임 간의 관계를 시각적으로 파악할 수 있기 때문에, 디버깅이나 구조 이해에 매우 유용하게 사용됩니다.

RViz를 이용한 TF 시각화

RViz는 로봇 센서 데이터와 모델을 3차원으로 시각화해주는 도구입니다. 따라서, 각 프레임의 실제 위치나 방향을 직관적으로 파악하기 위해선 RViz를 사용하는 것이 좋습니다. 아래 과정을 따라서 시각화를 진행해보겠습니다.

  1. 터미널에서 RViz를 실행합니다.

    rviz2
  2. 좌측 하단의 [Add] 버튼을 클릭합니다.

  3. 목록에서 TF를 선택하고 [OK]를 누르면 화면에 각 프레임이 빨간(X), 초록(Y), 파란(Z) 축으로 표시됩니다.

  4. 마우스를 이용하여 화면을 회전하거나 확대/축소하면, 각 프레임 간의 상대적인 위치와 방향을 직관적으로 확인할 수 있습니다.

📢 실습

  1. RViz에서 TF의 모든 Frame 이름이 나타나도록 조작하시오.
  2. TF의 마커 크기를 조절해 보시오.

RQT TF Tree를 이용한 TF 시각화

RViz가 3D 시각화에 강점이 있다면, RQT TF Tree는 프레임 간 연결 구조를 트리 형태로 간결하게 파악할 수 있다는 강점이 있습니다. 복잡한 구조의 로봇에서 프레임들 간의 연결 관계를 확인하고 수정할 때 자주 사용됩니다. 아래 과정을 따라서 시각화를 진행해보겠습니다.

  1. 플러그인을 설치합니다.

    sudo apt install ros-jazzy-tf2-tools ros-jazzy-rqt-tf-tree
  2. 터미널에서 RQT를 실행합니다. (설정 초기화)

    rqt --clear-config
  3. 상단 메뉴에서 [Plugins] → [Visualization] → [TF Tree]를 선택합니다.

  4. 잠시 기다리면 현재 실행 중인 TF 프레임들의 계층 구조가 나무 모양으로 표시됩니다.

📢 실습

  1. RQT에서 TF Tree를 이미지로 저장하시오.

로봇의 위치 표현

Odometry

Odometry 예시

자동차, 선박, 드론처럼 움직일 수 있는 로봇은 이동한 위치와 방향을 하나의 좌표계로 나타내 추적할 수 있습니다. 이때 사용하는 것이 오도메트리입니다. 오도메트리, 줄여서 오돔(Odom)은 GPS처럼 절대적인 위치를 나타내는 것이 아니라, 출발 지점으로부터의 상대적인 위치를 추정하는 개념입니다. 일반적인 자동차 형태의 로봇에서는 바퀴의 회전수를 기반으로 이동 거리를 계산하여 오도메트리를 구성합니다.

하지만 선박은 바퀴가 아닌 쓰러스터(Thruster)로 움직이며, 쓰러스터가 멈춰 있는 상태에서도 물살이나 바람 등의 외부 요인으로 인해 계속 움직일 수 있습니다. 이처럼 주변 환경에 많은 영향을 받는 선박의 특성상, 쓰러스터의 회전수만으로는 선박의 이동 거리나 위치를 계산하기 어렵습니다.

따라서 선박에서는 IMU, LiDAR, GPS와 같은 다양한 센서를 활용하여 주변 환경의 변화를 분석하고, 이를 기반으로 오도메트리를 계산합니다. 센서마다 측정할 수 있는 정보나 특징이 다르기 때문에 하나의 센서에 의존하기보다는 여러 센서를 적절히 조합하여 사용하는 것이 더욱 정확한 위치 추정에 도움이 됩니다.

base_footprint

base_link는 로봇 모델의 중심 좌표계를 나타내며, 보통 로봇 본체의 중심에 위치합니다. URDF에서 정의된 센서와 링크들은 대부분 base_link를 기준으로 연결됩니다. 반면에 base_footprint는 로봇이 지면에 닿는 평면상의 중심 좌표계로, 로봇이 실제로 차지하는 바닥면의 기준점입니다.

즉, base_link는 보통 로봇의 몸통 높이 중간에 위치하고, base_footprint는 그보다 아래, 바닥 쪽에 평평하게 위치한 좌표계라고 볼 수 있습니다.

Odometry 출력하기

Lidar Odometry

2D LiDAR(평면 레이저 스캔) 기반의 2D 오도메트리를 계산해 주는 패키지입니다. 앞서 언급한 대로, 바퀴의 회전수만으로 오도메트리를 계산할 수 없는 이동형 로봇에 사용됩니다.

라이다로 측정된 모든 거리 데이터로 이동 속도에 대한 방정식을 사용하여 움직임 추정값을 구합니다. 비교적 낮은 계산 비용(단일 CPU 코어에서 0.9밀리초)과 높은 정밀도 덕분에 평면 거리 측정이 필요한 로봇에 널리 활용될 수 있습니다.

알고리즘에 대한 더 자세한 설명은 아래 링크에서 설명하고 있습니다.

https://mapir.uma.es/papersrepo/2016/2016_Jaimez_ICRA_RF2O.pdf

Extended Kalman Filter

EKF, 즉 확장 칼만 필터는 기본적인 칼만 필터(Kalman Filter)를 비선형 시스템에 적용할 수 있도록 확장한 필터입니다.

여러 센서로부터 들어오는 데이터에는 각기 다른 노이즈가 포함되어 있는데, EKF는 이러한 센서 데이터를 통합 및 보정하여 로봇의 위치, 속도, 자세 등의 상태를 추정하는 데 사용됩니다.

EKF를 구현하기 위해선 다소 복잡한 계산 과정을 거쳐야 하지만, ROS에서는 robot_localization 패키지를 통해 파라미터 설정만으로 간단하게 활용할 수 있습니다.

아래 과정을 따라서 EKF를 활용해 계산한 오도메트리를 확인해 보겠습니다.

  1. 터미널에서 EKF 패키지를 실행합니다.

    ros2 launch mechaship_slam ekf.launch.py
  2. 새로운 터미널을 열고 RViz를 실행합니다.

    rviz2

📢 실습

  1. RViz에서 EKF로 통합된 오도메트리를 수신하여 실제 이동 경로와 비교하시오.
  2. EKF의 파라미터값을 조정하여 보다 정확한 결과가 출력되도록 보정을 진행하시오.

SLAM

SLAM은 Simultaneous Localization And Mapping의 약자로, 동시적 위치 추정 및 지도 작성을 의미합니다. 쉽게 말해, 자율주행 기능이 탑재된 로봇이 센서나 카메라를 활용해 주변 지도를 실시간으로 작성하고, 그 지도에서 자신의 현재 위치를 추정하는 기술입니다.

이러한 기술 덕분에 로봇이 처음 가보는 장소에서도 스스로 경로를 만들고 주행할 수 있습니다.

라인트레이서 예시

예를 들어, 라인트레이서와 같은 단순한 로봇은 정해진 경로만 따라가기 때문에 순간적인 환경 변화에 유연하게 대응하거나 예측하기 어렵습니다.

SLAM 예시

반면, SLAM이 적용된 로봇은 실시간으로 주변 환경을 인식하고 순간적인 변화를 반영할 수 있기 때문에 훨씬 유연하고 효율적으로 움직일 수 있습니다.

즉, SLAM은 로봇에게 눈과 귀의 역할을 해주는 핵심 기술입니다.

SLAM은 어디에 있는가?주변은 어떻게 생겼는가?를 동시에 해결해주는 기술입니다. 자율주행 로봇에서는 SLAM이 감각 기관처럼 작용하고, 경로 계획 알고리즘은 뇌처럼 작동합니다. SLAM만으로는 어떻게 갈 것인가?를 판단할 수 없으며, 두 기술이 서로 보완되며 함께 동작해야 로봇이 자율적으로 움직일 수 있습니다.

SLAM의 종류

SLAM은 입력 데이터에 따라 여러 종류로 나뉩니다. 대표적으로 카메라 기반의 Visual SLAM과 LiDAR 기반의 LiDAR SLAM이 널리 사용됩니다.

Visual SLAM

카메라로 촬영한 영상을 분석하여 지도와 위치를 추정합니다.

  • 장점: 색상 정보 활용, 구조/장애물 인식 용이, 다양한 환경에 활용 가능
  • 단점: 조명 변화에 민감, 이미지 처리 연산량이 큼, 가려지면 취약

Tesla 공식 홈페이지 자료

Tesla 공식 홈페이지 자료

이러한 Visual SLAM을 사용한 대표적인 예시가 Tesla 자동차의 자율주행 시스템입니다. 8개의 카메라를 사용해 이미지를 수집하고 인공지능을 통해 지도를 만들어 주행합니다.

LiDAR SLAM

LiDAR 센서로부터 360도 거리 데이터를 수집하여 지도를 생성하고 위치를 추정합니다.

  • 장점: 360도 거리 인식, 이미지보다 단순한 처리, 정밀한 거리 측정
  • 단점: 수명이 짧고 고가, 강한 햇빛 아래에서 인식 성능 저하

삼성 공식 홈페이지 자료

삼성 공식 홈페이지 자료

LiDAR SLAM은 로봇 청소기의 경로 시스템에도 자주 사용됩니다. 360도의 거리 정보를 수집해 장애물을 판별하고 지도를 그립니다.

이처럼 Visual SLAM과 LiDAR SLAM은 각기 장단점이 뚜렷하며, 용도에 맞게 선택해야 합니다.

SLAM Toolbox

gmapping, cartographer, karto, hector 등의 다양한 SLAM 패키지들을 대체하기 위해 고안된 ROS 패키지입니다. 추정 속도가 빠르고 세부 조정 없이도 준수한 성능을 보일 뿐더러 다른 패키지와 함께 사용하기 좋아 인기 있는 패키지 입니다.

Cartographer는 최대의 성능을 발휘하기 위해 세부적인 조정이 많이 필요한 편입니다. 기본 설정으로 출력된 결과와 정밀하게 조정된 설정으로 출력된 결과의 편차가 심한 편입니다. 따라서 자세한 조정이 어렵다면 SLAM Toolbox를 사용하는 것이 오히려 더 좋은 결과를 보여줄 수 있습니다.

SLAM Toolbox에 대해 보다 자세한 내용이 궁금하다면 아래 링크를 참고하시기 바랍니다.

https://wiki.ros.org/slam_toolbox

의존성 설치하기

패키지를 설치합니다.

sudo apt install ros-jazzy-slam-toolbox

실행하기

# 로봇에서 실행합니다.
ros2 launch mechaship_bringup mechaship_bringup.launch.py
# Ubuntu PC에서 실행합니다.
ros2 launch mechaship_slam slam_toolbox.launch.py

SLAM 실행 예시