본문 바로가기

FOSCAR-(Autonomous Driving)/ROS 스터디

[2025 ROS 스터디] 이승찬 #4주차 - SLAM & NAVIGATION

반응형

SLAM ?

포스카 지원할 때쯤 자율주행을 얕게 공부하며 배웠던 단어였는데 이렇게 다시 만나서 오묘했다.

일단 Simultaneous Localization And Mapping 의 약어이고 직역하자면 '동시적 위치추정 및 지도작성' 이다.

 

그럼 이게 왜 중요할까? 배워볼거다~


길 찾기에 필요한 것

1. 위치 : 로봇의 위치를 계측, 측정하는 기능

2. 센싱 : 벽, 물체 등의 장애물을 계측하는 기능

3. 지도 : 길과 장애물 정보가 담긴 지도

4. 경로 : 목적지까지 최적 경로를 계산하고 주행하는 기능

 

1. 위치

  • GPS (Globlal Positioning System)
    • 오차 
    • 날씨
    • 실외
  • Indoor Positioning Sensor
    • Landmark (Color, IR Camera)
    • Indoor GPS (IPS)
    • WiFi SLAM
    • Beacon
  • 추측 항법 (dead reckoning)
    • 양 바퀴 축의 회전 값을 이용
    • 이동 거리와 회전 값을 계산, 위치 측정
    • 바닥 슬립, 기계정, 누적 오차 발생
    • IMU  등의 관성 센서, 필터로 위치 보상
    • 칼만필터 시리즈
  • 필요한 정보
    • 양 바퀴 축의 엔코더 값 E
    • 바퀴 간 거리 D
    • 바퀴 반지름 r

  • 한계점 : 어디까지나 추정위치, 상대위치일 뿐이다

2. 센싱

  • 거리센서
    • LRF, 초음파 센서, 적외선 거리센서 (PSD)
  • 비전센서
    • 스테레오 카메라, 모노 카메라, 전 방향 옴니 카메라
  • Depth camera
    • SwissRanger, Kinect-2
    • RealSense, Kinect, Xtion, Carmine(PrimeSense), Astra

3. 지도

  • 길을 찾기 위해 지도가 필요!
  • 도로와 같은 기반 시설의 경우 디지털 지도 OK!
  • 병원, 카페, 회사, 가정집의 지도 - privacy 문제

지도가 없다? 만들자 - SLAM


4. 경로

  • 내비게이션 (Navigation)
  • 위치 추정 (Localization / Pose estimate)
  • 경로 탐색 / 계획 (Path search and planning)

 

  • DWA
  • A Star
  • Potential Field
  • Particle Filter
  • Graph

SLAM & Navigation


Gmapping

  • OpenSLAM에 공개된 SLAM의 한 종류, ROS에서 패키지로 제공
  • 특징 : Rao-Blackwellized 파티클 필터, 파티클 수 감소, 그리드 맵

 

  • 하드웨어 제약 사항
    • X,Y, Theta( θ ) 속도 이동 명령
      • 차동 구동형 모바일 로봇
      • 전 방향 이동 로봇
    • 주행기록계 (Odometry)
    • 계측 센서 : 2차 평면 계측 가능 센서 (LRF, LiDAR, Kinect, Xtion)
    • 직사각형 및 원형의 로봇

지도작성 : Gmapping + TurtleBot3

실제 로봇이 있다면 위 코드를 통해 아래와 같이 구현 가능

 

 

 

2차원 점유 격자 지도

(Occupancy Grid Map)

 

 

  • 흰색 = 로봇이 이동 가능한 자유 영역 (free area)
  • 흑색 = 로봇이 이동 불가능한 점유 영역 (occupied area)
  • 회색 = 확인되지 않은 미지 영역 (unknown area)

 


robot 구동 - ① sensor node 실행 - ④ gmappingsensor_msgs/LaserScan (평면 상 거리 정보) 전달

② turtlebot3_teleop 실행 - ③ turtlebot3_corevelocity 값이 담긴 msgs 보냄

robot 구동하며 odom, base_... 알아냄 - ④ tf 형태gmapping센서위치 전달

gmapping을 통해 map 제작 - ⑤ map_server 패키지까지 제작

 

위치 추정 (Localization)

  • 칼만 필터 (Kalman filter)
    • 잡음이 포함되어 있는 선형 시스템에서 대상체의 상태를 추적하는 재귀 필터
    • 베이즈 확률 기반
    • 예측 (Prediction)
      • 모델을 상정하고 이 모델을 이용해 이전 상태에서 현재 시점의 상태 예측
    • 보정 (Update)
      • 앞 단계의 예측 값과 외부 계측기로 얻은 실제 측정 값 간의 오차를 이용해 더욱 정밀한 값을 추정하는 보정
  • 파티클 필터 (Particle filter)
    • 시행 착오법 (try-and-error)을 기반으로한 시뮬레이션을 통해 예측하는 기술
    • 대상 시스템에 확률 분포로 임의로 생성된 추정값을 파티클 형태로 나타냄

   (1) 초기화   (2) 예측   (3) 보정   (4) 위치 추정   (5) 재추출


내비게이션 : Navigation + TurtleBot3

SLAM과 달리 Navigation을 이용한 지도 작성

내비게이션

  • Dynamic Window Approach (DWA) : local plan에서 주로 사용
  • 로봇의 속도 탐색 영역 (velocity search space)에서 로봇과 충돌 가능한 장애물을 회피하며 목표점까지 빠르게 다다를 수 있는 속도를 선택하는 방법

DWA : 위치 영역이 아니라 속도 영역으로 바꿔 진행

결국 여기서 필요한 건 병진속도(v), 회전속도(w) 이고 이를 통해 Goal에 맞는 속도를 찾아가는 거다!


TurtleBot3 시뮬레이션 개발환경 준비 - 패키지 설치

$ sudo apt install ros-kinetic-joy ros-kinetic-teleop-twist-joy
ros-kinetic-teleop-twist-keyboard ros-kineticlaser-proc
ros-kinetic-rgbd-launch ros-kinetic-depthimage-to-laserscan
ros-kinetic-rosserial-arduino roskinetic-rosserial-python
ros-kinetic-rosserial-server ros-kinetic-rosserial-client
ros-kinetic-rosserial-msgs roskinetic-amcl ros-kinetic-map-server
ros-kinetic-move-base ros-kinetic-urdf ros-kinetic-xacro
ros-kineticcompressed-image-transport ros-kinetic-rqt-image-view
ros-kinetic-gmapping ros-kinetic-navigation
$ cd ~/catkin_ws/src/
$ git clone https://github.com/ROBOTIS-GIT/turtlebot3.git
$ git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
$ git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git
$ cd ~/catkin_ws && catkin_make
  • 3차원 시뮬레이터 Gazebo 상에 가상의 로봇 구동
    • TurtleBot3_teleop_key 노드를 통해 로봇 이동 가능
    • Rviz를 통해 Gazebo 상의 로봇에 장착된 센서 값 확인 가능
export TURTLEBOT3_MODEL=waffle_pi

# 첫번째 터미널에 Gazebo 실행
source /opt/ros/noetic/setup.bash
export TURTLEBOT3_MODEL=waffle_pi  # 로봇 모델 설정 (burger, waffle, waffle_pi 등)
roslaunch turtlebot3_gazebo turtlebot3_world.launch

# 두번째 터미널에 Teleop 실행
source /opt/ros/noetic/setup.bash
export TURTLEBOT3_MODEL=burger  # 로봇 모델 설정 (첫 번째 터미널에서와 동일)
roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

# 세번째 터미널에 rviz 실행
source /opt/ros/noetic/setup.bash
export TURTLEBOT3_MODEL=burger  # 로봇 모델 설정 (필요한 경우)
roslaunch turtlebot3_gazebo turtlebot3_gazebo_rviz.launch

teleop을 사용해 로봇을 움직이며 rviz에서 띄울 수 있다~

SLAM까지 띄울 수 있고 이를 통해 robot을 움직이며 Mapping할 수 있다.


+ 추가적으로 참고할 만한 책 : '칼만 필터는 어렵자 않아' , '확률론적 로보틱스'

 

반응형