본문 바로가기

Study_ROS/[ROBOTIS ROS Courses]

[ROBOTIS ROS Courses] Ch11. SLAM과 Navigation

728x90

1. 개념 설명

1.1 SLAM

  • SLAM (Simultaneous Localization And Mapping) : 동시적 위치 추정 및 지도 작성
    • Robot이 미지의 임의 공간을 이동하며 주변을 감지하며 현재 위치를 추정하는 동시에 지도를 작성하는 방법
    • 위치 추정에 사용되는 sensor로는 Encoder, IMU가 있다
    • 위치 추정은 sensor 관측 정보가 불확실하다는 점과 실제 환경에서 동작하기 위해서는 실시간성을 확보해야 한다는 점 등의 문제점이 존재한다
    • 이러한 오차를 개선하기 위해 Kalman Filter, Particle Filter등을 사용할 수 있다

1.2 Navigation

  • Navigation : 주어진 환경에서 Robot이 현재 위치로부터 지정한 목적지까지 이동하는 것
  • Robot에 이를 구현하기 위해선 아래의 4가지가 필수적으로 필요함
    1. Robot 위치 계측/추정 기능
    2. 벽, 물체 등 장애물 계측 기능
    3. 기하학적(geometry. geo- : 토지, metry- : 측정)정보가 포함된 지도  -> SLAM을 통해 얻음
    4. 최적 경로를 계산하고 주행하는 기능
  • 이동거리 : 보폭 -> Motor의 Encoder
  • 회전 : 달팽이관 -> IMU
  • 어두운 환경에서 벽을 더듬으며 길 찾기 : 거리 Sensor

1.2.1 Robot 위치 계측/추정 기능 (위치)

  • GPS(Global Positioning System)은 실외에서만 사용 가능. 실외에서도 오차가 커 보통 m단위로 거리를 표시
  • 대부분의 service robot은 실내에서 구동

  • 차량에서 사용하는 GPS는 지도상에 차량의 위치를 끼워맞춰 정확한 것처럼 보이게 함
  • 또한 날씨의 영향을 많이 받고, 고층 빌딩 사이에서는 난반사가 일어나 오차가 크게 발생
  • 위와 같은 GPS의 한계로 인해, 실내에서 사용 가능한 Indoor Positioniing Sensor를 개발함
    • Landmark (Color, IR Camera) : Robot 윗부분에 StarGazer를 달아서 천장의 Landmark를 인식. IR Camera는 3D상에서의 Robot의 위치, 자세를 나타내줌
    • Indoor GPS : 특정 신호를 내는 장비를 실내에 장착해서 마치 위성처럼 신호를 받아 현재 위치를 추정
    • Wifi SLAM : 실내에 있는 수많은 Wifi를 비교하여 현재 위치 추정. 각 Wifi의 위치를 정확히 알아야 하며 사람이 지나가면 신호가 일그러지는 단점 존재
    • Beacon
  • 모두 활용하기에는 고가이고 어려움
  • 따라서 추측 항법(Dead Reckoning)을 사용함
    • 양 바퀴 축의 회전 값을(보통 2바퀴 사용) 통해 이동 거리와 회전값을 계산하여 위치 측정
    • GPS는 절대적 위치를 알려주는 반면 이는 출발위치로부터의 상대적인 위치를 알려줌
    • 양 바퀴 축의 Encoder값 E, 바퀴 간 거리 D, 바퀴 반지름 r 필요

  • 고전적이며 저비용이고 오랫동안 연구된 방법

 

  • 2nd order Runge-Kutta integration 공식 이용
    • x, y : 이동한 위치의 근사값
    • θ : 회전 각도

Dead Reckoning 계산 과정

  • 좌/우측 motor의 encoder값을 통해 아래의 변환과정을 거치고, 

  • 5~6번째줄의 계산을 통해 Robot의 Translation Velocity Vk, Angular Velocity Wk를 구한다

 

  • 그리고 최종적으로 Runge-Kutta 공식을 통해 이동한 위치, 각도의 근삿값을 구할 수 있다
  • x,y theta값을 냄

 

  • 추정 위치, 상대적 좌표라는 한계점 존재
  • 바닥 슬립, 기계적, 누적 오차 발생 -> IMU등의 관성 센서와 Kalman Filter 등의 필터로 위치 정보의 오차를 보상

1.2.2 벽, 물체 등 장애물 계측 기능 (센싱)

  • 위와 같은 sensor들을 통해 장애물을 계측함

1.2.3 지도 (SLAM)

  • Robot이 길을 찾기 위해선 지도가 필요
  • SLAM을 통해 지도를 만들어 냄 (Robot의 현재 위치 파악 + Mapping)
    • Robot이 미지의 임의 공간을 이동하며 주변을 감지하며 현재 위치를 추정하는 동시에 지도를 작성하는 방법
  • scan(거릿값), tf(위치 정보)를 기반으로 SLAM을 진행함

1.2.4 최적 경로를 계산하고 주행하는 기능 (Navigation)

  • Navigation + Localization / Pose Estimation + Path search and Planning

 

  • A Star : 현재 위치로부터 목적지사이에 있는 각 칸에 점수를 매겨 합산 점수가 가장 높은 경로로 이동
  • 주로 게임에서 자주 사용

 

  • Potential Field : Goal은 인력, 장애물은 척력으로 두고 계산

DWA(Dynamic Window Approach)

  • Local plan에서 주로 사용하며, 이동체의 속도, 방향 및 센서 정보로부터 얻는 장애물과의 거리를 토대로 최적의 선속도와 각속도를 도출하여 장애물을 회피하고 목적지에 도달하는 방법
  • 즉 로봇의 속도 탐색 영역(velocity search space)에서 로봇과 충돌 가능한 장애물을 회피하면서 목표점까지 빠르게 다다를 수 있는 속도를 선택하는 방법
  • 기존에는 Trajectory Planner를 많이 사용했으나 DWA가 성능이 뛰어나 많이 대체됨
  • Fourier Transform (시간 영역을 주파수 영역으로 바꿔 새로운 분석을 진행함)과 유사
  • Robot을 특정 목적지로 보내기 위해 x, y로 얼만큼 이동시킨 후에 왼쪽으로 몇도 정도 더 틀어서 이동시켜야겠다 -> 위치 기반
  • DWA는 Map(위치 기반)을 Velocity Search Space(속도 탐색 영역)으로 변환함
  • 변환한 공간에서 장애물을 회피하며 목표지점까지 다다를 수 있는 최적의 속도를 선정함

  • x축이 Angular Velocity, y축이 Angular Velocity 값

 

DWA의 실제 동작 과정

  • 목표 지점에 대해 위치가 아닌 Linear / Augular Velocity를 계산하여 적정 Velocity값을 찾아냄

 

  • Particle Filter : 초반에 Robot이 있을 위치를 부여하고, 그 주변에 Robot이 존재할 위치와 방향을 임의로 생성하는 다수의 화살표로 나타냄. 그리고 점점 이동하며 지도와의 matching을 통해 위치를 수렴시킴

 

  • SLAM, Navigation을 위해선 위와 같은 요소들이 필요하다
  • 위의 위치, 센싱, 지도는, 경로는 모두 ROS의 message임

2. 상세 설명

2.1 SLAM 관련

2.1.1 Gmapping (Melodic version 이후로는 개발되지 않음. 대신 Google cartographer 추천)

  • OpenSLAM에 공개된 SLAM 의 한 종류, ROS에서 패키지로 제공
  • Rao-Blackwellized 파티클 필터, 파티클 수 감소, 그리드 맵 제공
  • Hardware 제약사항
    • 좌 / 우측 바퀴가 따로 구동 가능한 Differential Drive Mobile Robot 또는 3개 이상의 구동축을 가지고 있는 Omni-Wheel Robot(전 방향 이동 로봇)과 같이 x, y축 Translation Velocity와 Angular Velocity (혹은 Theta) 명령어로 동작할 수 있어야 함
    • Odometry 정보를 얻을 수 있어야 함. 즉 자신이 이동한 거리, 회전량을 Dead Reckoning으로 계산할 수 있거나 IMU 센서 등의 관성 정보를 이용하여 위치 보상, 혹은 IMU 센서 단독으로 Translation Velocity와 Angular Velocity를 측정하여 Robot 스스로 자신의 위치를 계측 / 추정할 수 있어야 한다
    • 2D 평면 계측 센서 필요 (3D 정보도 2D 정보로 변환하여 사용)
    • 직사각형 및 원형 모양의 로봇 필요

2.1.2 Turtlebot3 활용 예제

https://youngseong.tistory.com/73

 

[KUSMO] 8/13 ~ 15 (Ubuntu 20.04 듀얼부팅, SLAM, Navigation, Simulation)

8/13 Ubuntu Releases(https://releases.ubuntu.com/20.04/)에서 Ubuntu 20.04 LTS(64bit) 설치 $ sudo apt update $ sudo apt upgrade $ wget https://raw.githubusercontent.com/ROBOTIS-GIT/robotis_tools/master/install_ros_noetic.sh $ chmod 755 ./install_ros_noe

youngseong.tistory.com

  • 위 post 참고
  • Turtlebot3 Model을 불러온 후 gmapping을 통해 SLAM을 진행
  • Rviz상에 로봇 model을 올려놓은 후 teleop를 통해 mapping 진행

 

Gmapping을 통한 SLAM

2.1.3 Map File 관련 (pgm, yaml)

완성된 2D Occupancy Grid Map

  • 흰색 : Robot이 이동 가능한 Free Area
  • 흑색 : Robot 이동이 불가능한 Occupided Area
  • 회색 : 확인되지 않은 Unknown Area
  • 위의 영역들은 0~255 사이의 값으로 표현하는 Gray Scale값으로 나타내진다
    • Gray Scale : 흰색에서 검은색을 단계를 나눠 중간색인 회색(Gray)로 나타내는 것
    • 알고리즘에 따라 위 영역을 더 세분화 하여 Layer를 나눌 수도 있음
  • Gray Scale의 값은 Occupancy State를 표현한 Occupancy Probability(OCC)를 Bayes Theorem의 사후확률을 통해 구한다
    • Bayes Theorem : 확률론과 통계학에서 두 확률변수의 사전확률과 사후확률사이의 관계를 나타내는 Theorem
    • 사전확률과 우도확률을 통해 사후확률을 구한다
    • 사전확률(prior probaility) : 결과가 나타나기 전에 결정되어 있는 A(원인)의 확률
    • 우도확률(likelihood probaility) : A(원인)가 발생하였다는 조건 하에서 B(결과)가 발생할 확률
    • 사후확률(posterior probaility) : B(결과)가 발생하였다는 조건 하에서 A(원인)가 발생하였을 확률

Bayes Theorem 공식

  • 점유확률 OCC는 OCC = (255-color_avg) / 255.0으로 표현되며, 1에 가까울수록 점유되었을 확률이 높아진다
    • 만약 이미지가 24bits라면 color_avg = (한 셀의 gray scale 값 / 0xFFFFFF * 255) 이다
  • ROS의 message (nav_msgs/Occupancy Grid)로 발행될 때는 이를 다시 재정의하여 점유도를 정수 [0 100]까지로 표현
    • 0에 가까울수록 Free Area, 100에 가까울수록 Occupied Area, -1은 Unknown Area

 

  • ROS에서는 map data를 pgm(Portable Graymap Format) file의 형태로 저장하고 사용함

앞서 만든 gazebo_map의 pgm file

 

  • 또한 yaml(구성 file 작성에 사용되는 data 직렬화 언어) file을 함께 포함하여 map data를 기재

gazebo_map의 yaml file

  • resolution : Map의 각 pixel이 5cm임을 의미 (meters/pixel)
  • origin : Map의 원점. 각각 순서대로 x, y, yaw를 의미. 지도의 왼쪽 아래가 x = -10m, y = -10m
  • negate : 흑백 반전
  • occupied_thresh : 각 pixel의 OCC 한계값으로, 이 값을 넘으면 검은색인 occupied area로 표현
  • free_thresh : 각 pixel의 OCC값이 이 값보다 작으면 흰색인 free area로 표현

 

 

Gmapping vs Cartographer

  • Gmapping은 올바른 License를 사용하고 있지는 않음 (창작물에 일반적으로 사용되는 License. Source code에서는 일반적으로 사용하지 않아 상업용으로 사용하기는 어려움)
  • 또한 Gmapping은 개발이 멈춰있음 (강의 시점인 2016년 기준)
  • Cartographer는 상업용으로도 사용 가능한 License를 사용함
  • Gmapping은 2D만 사용 가능하지만 Cartographer는 3D도 사용 가능
  • https://youngseong.tistory.com/145
 

ROS Noetic Cartographer 사용법

- 전제 조건 ROS Noetic 설치(Ubuntu 20.04에서 진행. 다른 version의 경우 해당 ubuntu version에 맞는 ROS 설치) http://wiki.ros.org/noetic/Installation/Ubuntu noetic/Installation/Ubuntu - ROS Wiki If you rely on these packages, please sup

youngseong.tistory.com

  • Cartographer 사용 관련 게시글

 

 

SLAM 관련 node들의 처리 과정

  1. sensor node : Sensor raw data를 보냄 (sensor_msgs/LaserScan)
  2. turtlebot3_teleop node : Keyboard 입력을 받아 Linear/Angular Velocity 값을 보냄
  3. Robot 부분 : 자신의 위치를 계측/측정하기 위한 위치 정보인 odom 정보를 전송하는 동시에 같은 이름으로 odom의 위치 변환 정보를 tf로 내보내며 이와 연결된 로봇 중앙 부분의 base_footprint 위치도 tf로 보냄
    • Motor를 제어 하고 Encoder 값을 받아와 Robot의 현재 위치를 알아내고 IMU를 통해 위치 보정을 함. 이 정보들을 취합하여 odometry 정보를 얻음 (출발 위치로부터 상대적으로 얼마나 이동했는가)
    • tf는 센서의 위치인 base_scan을 tf의 형태로 SLAM node에 넘기기 위해 odom -> base_footprint -> base_link -> base_scan로 변환을 거쳐 내보낸다
    • base_footprint : 바닥에 대한 Robot의 위치
    • base_link : Hardware적으로 중심점
    • base_scan : Sensor의 위치를 나타냄. Sensor로부터의 Sensing값을 알고자 함
  4. slam_gmapping node : Sensor가 측정한 거리값인 scan 정보와 위칫값인 tf 정보를 기반으로 mapping 진행
  5. map_server node : map message를 저장해서 map 관련 file(pgm, yaml file)을 만들어냄
    • pgm file은 Grid Map을 의미

2.2 Localization(위치 추정) 관련 Keyword

2.2.1 Kalman Filter

  • Noise가 포함되어 있는 측정 data를 바탕으로 linear system에서 대상체의 상태를 추적하는 재귀 필터
  • Bayes 확률 기반
  • Prediction(예측), Update(보정)를 반복하며 현재 위치를 추종함
    • Prediction : Model을 상정하고 그 model을 이용하여 이전 상태로부터 현재 시점의 상태를 예측
    • Update : Prediction을 통해 얻은 예측값과 외부 계측기로 얻은 실제 측정 값 사이의 오차를 이용하여 더욱 정확한 상태의 상태값을 추정하는 보정
  • 즉 과거의 측정 data를 기반으로 현재 상태 변수의 결합 분포를 추정하는 위의 두 과정을 재귀적으로 반복하여 정확도를 높여간다

위 과정에 대한 설명

  • 단 위의 Kalman Filter는 linear system에만 적용된다
    • Linear System과 Gaussian Noise가 있는 system에는 정확도가 보장되나 그렇지 못한 system은 보장되지 않는다
  • 그런데 보통 우리가 사용하는 robot과 sensor는 대부분 nonlinear system인 경우가 많아, Kalman Filter를 수정한 EKF(Extended Kalman Filter)를 가장 많이 사용

2.2.2 Particle Filter

  • 물체 추적에 사용되는 algorithm으로, 대표적으로 Particle Filter를 이용한 Monte Carlo Localization이 있다
  • 대상 system에 확률 분포로 임의로 생성된 추정값을 patricle (입자) 형태로 나타내서 particle filter라는 이름이 붙음
  • 이는 SMC(Sequential Monte Carlo)또는 Monte Carlo 방법이라고 부른다
    • MCL : 주어진 환경에서 Robot의 위치를 추정하는 algorithm
    • 이를 위해 map상의 x, y, theta 좌표를 얻어야 하고, MCL은 robot이 위치하고 있을 가능성을 확률로 계산하여 나타냄
  • Monte Carlo Localization algorithm에서 적은 수의 sample을 사용하여 수행 시간을 줄여 실시간성을 높인 algorithm이 AMCL(Adaptive MCL)

 

  • 앞서 설명한 Kalman Filter는 Linear System에만 적용되나, 대부분의 system은 Nonlinear System이다
  • Robot과 Sensor도 마찬가지여서 위치 추정에 Particle Filter를 많이 사용한다
    • Kalman Filter는 대상체를 Linear System으로 가정하고 선형 운동으로 parameter를 찾아가는 해석적 방법
    • Particle Filter는 Try-and Error(시행 착오)를 기반으로 한 simulation을 통해 예측하는 기술이다
  • Particle Filter는 다른 localization algorithm과 마찬가지로 연속적으로 들어오는 data 중 오차가 포함되어 있다 가정하고 대상체의 위치를 추정한다
  • SLAM에서 사용할 때도 Robot의 Odometry 값과 거리 센서(Lidar 등)를 이용한 환경계측값 등이 관측값으로 사용되어 robot의 localization을 진행한다
  • 위치 불확실성을 sample이라 불리는 particle의 무리로 묘사하고, 그 particle을 robot의 운동 model과 확률에 근거하여 새로운 추정 위치와 자세로 이동해가며 실제 계측값에 따라 각 particle에 weight를 부여하며 점점 정확한 위치로 noise를 줄이며 추정해나간다
  • Mobile Robot의 경우 각 particle을 particle=pose(x, y, θ), weight와 같이 나타내며 이는 robot의 추정 위치와 자세를 나타낸다 (각 patricle은 robot의 추정 위치와 자세를 나타내는 임의의 작은 입자이다)

  1. Initialization : Global Localization면에서 처음에는 robot의 위치와 자세를 알 수 없으므로 N개의 particle을 임의로 뿌린다
    • $$ ^{particle}i = pose(^{x}i, ^{y}i, ^{\Theta}i), weight(i = 1,...,N) $$
    • Rviz에서 '2D Pose Estimate'를 통해 Robot의 예측 위치를 지정하면 위의 과정을 진행한다
  2. Prediction : Robot의 움직임을 기술한 system model에 기초하여 robot의 이동량에 noise를 포함하여 각 particle들을 이동시킨다
    • teleop node를 통해 robot을 천천히 이동시키면 위의 과정을 진행한다
  3. Update : 계측된 sensor data를 기반으로 각 particle이 존재할 확률을 계산하고 이를 반영하여 각 particle의 weight가 1이 되도록 weight값을 갱신한다. 이 갱신 후의 particle 값은 initialization에서 주어졌던 $$ ^{particle}i = pose(^{x}i, ^{y}i, ^{\Theta}i), weight(i = 1,...,N) $$ 이 Prediction과 Update를 거쳐 새로운 상태가 된다
  4. Pose Estimation : N개의 모든 각 particle의 위치 및 자세인 x, y, θ와 weight를 곱하여 Robot의 추정 위치를 계산
  5. Resampling : 새로운 particle을 생성하는 단계로 weight가 적은 particle들을 없애고 높은 particle을 중심으로 기존 particle의 특성인 particle의 위치 정보를 물려받은 새로운 particle을 추가로 생성. 이 때 입자 수 N은 그대로 유지해야 함
    • Particle Filter는 sample의 개수가 충분하다면 Kalman Filter를 개선한 EKF보다 위치 추정이 정확하지만, 그 개수가 충분하지 않으면 정확하지 않을 수 있다
    • 이러한 부분을 개선하기 위한 접근법으로 Kalman Filter와 Particle Filter를 동시에 사용하는 방법인 RBPF(Rao-Blackwellized Particle Filter)기반의 SLAM도 일반적으로 사용되고 있다
  • 1번을 제외하고 2~5번 과정을 반복적으로 수행하며 Robot의 위칫값을 추정한다
  • 즉 XY좌표 평면상에 Robot의 위치를 확률로 나타낸 Particle의 분포를 계측값을 기반으로 갱신해 나아가며 Robot의 위치를 추측한다

 

  • 필자의 프로젝트에선 Odometry Data (Encoder + IMU)값을 보정하는데 EKF를 사용하고 Particle Filter를 통해 localization을 수행한다

2.3 Navigation 과정

  1. Sensing : Robot이 Map 상에서 Encoder, IMU등의 sensor를 통해 odometry 정보를 갱신하며 Lidar(거리 센서)가 장착된 위치부터 장애물과의 거리를 계측
  2. Localization / Pose Estimation : Encoder, IMU, Lidar로부터 장애물과의 거리 정보 등을 기반으로 기존에 작성한 map상에 현재 robot의 위치를 추정한다
    • 이 강의에서는 Particle Filter Localization인 AMCL을 이용한다
  3. Motion Planning : Path Planning (이동 경로 계획)으로도 불리며 현재 위치로부터 map상의 목적지까지의 Trajectory (이동 궤적)을 생성한다.
    • Map 전체상의 Global Path Planning과 Robot 중심의 일부 지역을 대상으로 하는 Local Path Planning으로 나뉘어 Robot의 Trajectory를 생성한다
    • 이 강의에서는 장애물 회피 알고리즘인 DWA를 기초로 하는 ROS의 move_base와 nav_core 등의 Path Planning Package를 사용한다
  4. Move/Collision Avoidance : 위의 motion planning 과정에서 작성된 Trajectory를 따라서 Robot에 속도 명령을 내려 Robot이 해당 궤적에 따라 목적지까지 이동한다
    • 이동 중에도 1~3번의 과정을 계속 수행하며 중간에 나타나는 장애물은 DWA Algorithm을 통해 회피하며 이동한다

2.3.1Navigation 필요 정보

Navigation Stack 설정에 관한 각 필수 node와 topic의 관계도

  • Odometry('odom', nav_msgs/Odometry) : Robot의 odometry 정보는 Local Path Planning에서 사용하며, Robot의 현재 속도 등의 정보를 받아 Local Path Plan을 생성하거나 장애물 회피 등에 사용된다
  • Transform('/tf', tf/tfMessage) : Robot의 sensor는 hardware적 구성에 따라 위치가 상대적으로 바뀌므로 ROS에서는 tf라는 상대 위치 변환을 사용한다.
    • 이는 단순히 odometry로 robot의 위치를 알게 되는데 이 때 해당 로봇의 위치로부터 x, y, z 좌표상 sensor가 얼마나 떨어져 있는지를 나타내준다
    • 예를 들어 odom -> base_linkfootprint -> base_link -> base_scan의 변환을 거쳐 topic으로 publish하게 되며, 이를 move_base에서 받아 robot의 현재 위치와 sensor의 위치를 통해 Path Planning을 수행한다
  • Distance Sensor(sensor topics, sensor_msgs/LaserScan or sensor_msgs/PointCloud) : Sensor로부터 측정된 거리값을 의미하며, 거리 센서는 로봇 위치 추정 방법인 AMCL을 이용하여 Robot의 위치 추정, motion palnning에 사용된다
    • 위의 센서값은 'scan'이라는 topic 이름으로 publish 될 예정이다
  • Map('/map', nav_msgs/GetMap) : Navigation에서는 Occupancy Grid Map을 사용한다. 이 강의에서는 SLAM을 통해 생성하는 'map.pgm', 'pam.yaml'을 'map_server' package를 통해 publish한다
  • Goal Coordinate('move_base_simple/goal', geometry_msgs/PoseStamped) : Goal Coordinate(목표 좌표)는 사용자가 RViz에서 '2D Nav Goal' 버튼을 통해 2D상의 x, y좌표를 직접 명령할 수 있다
  • Velocity Command('cmd_vel', geometry_msgs/Twist) : 최종적으로 계획된 Trajectory에 따라 Robot을 움직이는 Velocity Command를 publish하면 Robot이 목적지까지 이동하게 된다
    • 이 velocity command는 '/mobile_base/commands/velocity'라는 topic 이름으로 publish 될 예정이다

 

  • 위 사진은 진행중인 프로젝트의 TF Tree이다
  • Navigation에 필요한 정보인 /odom(위에선 ekf를 적용시킨 /odom_data_quat), /tf, /scan, /map이라는 topic 명으로 publish/subscribe되고 있으며, move_base/goal은 RViz에서 목표 좌표를 지정할 경우 publish된다
    • /moblie_base/commands/velocity 부재 (교재 p.325 TF Tree 참고)

 

 

- Turtlebot3의 Navigation Package 설명

  • /launch/turtlebot3_navigation.launch : 이 launch file 하나로 모든 navigation 관련 package가 실행됨
  • /launch/amcl.launch : AMCL의 각종 parameter 설정값을 담은 file로 위의 launch file과 함께 사용된다
  • /param/move_base_params.yaml : Motion Planning을 총괄하는 move_base의 parameter 설정 file
  • 아래는 costmap 설정 parameter들이 들어있는 files
    • Occupancy Grid Map을 기반으로 Robot의 위치와 sensor로부터 얻은 주변 정보를 통해 각 pixel을 장애물, 이동 불가 영역, 이동 가능 영역으로 계산하는데, 이때 사용되는 개념이 costmap
  • /param/costmap_common_params.yaml : Global/Local에서 공통으로 사용하는 parameter 구성
  • /param/global_costmap_params.yaml : Global Path Planning에 필요한 parameter 구성
  • /param/local_costmap_params.yaml : Local Path Planning에 필요한 parameter 구성
  • /param/dwa_local_planner_params.yaml : dwa_local_planner는 최종적으로 이동 속도 명령을 Robot에 넘기는 package인데, 이에 대한 parameter를 설정하는 file
  • move_base : Motion Planning에 필요한 costmap, velocity command를 robot에 넘기는 dwa_local_planner, 그리고 motion planning을 총괄하는 move_base 각각의 parameter들을 설정

 

turtlebot3_slam/config/gmapping_params.yaml

turtlebot3_navigation/launch/amcl.launch

turtlebot3_navigation/param/move_base_params.yaml

turtlebot3_navigation/param/costmap_common...

turtlebot3_navigation/param/global_costmap_params.yaml

turtlebot3_navigation/param/local_costmap_params.yaml

rviz 파일 정의 필요

2.3.2 Costmap

  • Encoder + IMU로부터 얻은 odometry 정보를 기반으로 robot의 위치를 추정한다
  • 그리고 robot에 장착된 거리 센서(Lidar)로 robot과 장애물과의 거리를 계산한다
  • 이 때 Navigation은 아래의 정보들을 기반으로 costmap을 그려 4번의 각 영역으로 나눠 로봇이 이동 가능한 영역을 계산한다
    1. Robot 위치
    2. Sensor 위치
    3. 장애물 위치 정보
    4. SLAM을 통해 얻은 Occupancy Grid Map을 Static Map으로 불러와 Occupied Area, Free Area, Unknown Area에 대한 정보
  • Costmap은 Navigation의 종류에 따라 2가지로 분리된다
  • 사용 목적만 다를 뿐 지도 표현 방식은 동일
    1. Global Costmap : Global Path Planner가 Static Map의 전체 영역을 대상으로 Path Planning을 진행하여 얻은 출력물
    2. Local Costmap : Local Path Planner가 Robot을 중심으로 일부 한정된 영역에 대해 Motion Planning이나 장애물 회피시 사용되는 지도
  • Costmap은 아래와 같이 0~255의 값으로 표현된다
    • 0 : Robot이 자유롭게 이동 가능한 Free Area
    • 1~127 : 출동하지 않는 Area
    • 128~252 충돌 가능성이 있는 Area
    • 253~254 : 충돌 Area
    • 255 : Robot이 이동할 수 없는 Occupied Area

장애물의 거리와 costamp 값의 관계도

 

2.3.3 SLAM / Navigation 실습

- Gazebo 환경에서의 SLAM / Navigation Simulation

sudo apt-get install ros-noetic-joy ros-noetic-teleop-twist-joy \
  ros-noetic-teleop-twist-keyboard ros-noetic-laser-proc \
  ros-noetic-rgbd-launch ros-noetic-rosserial-arduino \
  ros-noetic-rosserial-python ros-noetic-rosserial-client \
  ros-noetic-rosserial-msgs ros-noetic-amcl ros-noetic-map-server \
  ros-noetic-move-base ros-noetic-urdf ros-noetic-xacro \
  ros-noetic-compressed-image-transport ros-noetic-rqt* ros-noetic-rviz \
  ros-noetic-gmapping ros-noetic-navigation ros-noetic-interactive-markers
  • Dependency들 설치

 

$ sudo apt install ros-noetic-turtlebot3-msgs
$ sudo apt install ros-noetic-turtlebot3
$ cd ~/catkin_ws/src
$ git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git
$ cd ..
$ catkin_make
  • Debian Package들을 통해 Turtlebot3 설치
  • catkin workspace의 src folder에 turtlebot3 simulation package 설치 후 catkin build 진행

 

$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_gazebo turtlebot3_world.launch
  • Turtlebot3의 model을 불러온 후 turtlebot3 world상에서의 simulation 진행
  • Model export 후 아래 명령어를 통해 turtlebot3_world 대신 다른 world를 선택할 수도 있음
$ roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch
$ roslaunch turtlebot3_gazebo turtlebot3_house.launch

 

turtlebot3_world

 

$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping
  • 위의 worlds중 하나를 불러온 후 SLAM node를 launch
  • Gmapping SLAM이 default로 설정되어 있어 맨 위의 slam_methods:=gampping은 없어도 됨

 

$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
  • Teleoperation node를 launch시키고 map을 돌아다니며 mapping 진행

 

SLAM 진행 화면. TF를 통해 각 좌표계를 확인

 

 

$ rosrun map_server map_saver -f ~/gazebo_map
  • home directory에 gazebo_map이라는 이름으로 map 저장
  • gazebo_map.pgm과 gazebo_map.yaml 파일이 생성됨

 

$ export TURTLRBOT3_MDOEL=waffle_pi
$ roslaunch turtlebot3_gazebo turtlebot3_world.launch
  • 위의 모든 node들 종료 후 gazebo world를 다시 불러옴

 

$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/gazebo_map.yaml
  • Navigation node launch

 

 

 

$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/gazebo_map.yaml
  • Navigation node 실행 후 '2D Pose Estimate'를 통해 로봇의 위치를 추종
  • 이후 teleop node를 통해 로봇을 천천히 이동시켜 추종 위치의 확률을 수렴시킴
  • 수렴이 어느정도 완료되면 teleop node를 종료시키고 '2D Nav Goal'을 통해 Robot에 목적지를 부여하여 이동시킴
  • Navigation Package에서 Publish하는 로봇의 Linear/Angular Velocity와 teleop의 Linear/Angular Velocity Message가 섞일 수 있기 때문

 

  • 벽 부분의 녹색은 laser sensor값, 핑크색은 장애물, 빨간색은 로봇의 중심이 이 지점을 지나면 충돌 위험이 높음을 표시

 

 

  • Navigation 진행 시의 TF Tree와 Node Graph

 

 

 

 

 

 

 

 


https://www.youtube.com/watch?v=067HSmDvXdE 

https://navigation.ros.org/configuration/packages/configuring-amcl.html

 

AMCL — Navigation 2 1.0.0 documentation

AMCL Source code on Github. AMCL implements the server for taking a static map and localizing the robot within it using an Adaptive Monte-Carlo Localizer. Parameters alpha1 DescriptionExpected process noise in odometry’s rotation estimate from rotation.

navigation.ros.org

http://wiki.ros.org/dwa_local_planner

 

dwa_local_planner - ROS Wiki

New in navigation ROS Diamondback, navigation_experimental ROS CTurtle melodic noetic   Show EOL distros:  EOL distros:   electric fuerte groovy hydro indigo jade kinetic lunar diamondback: Only showing information from the released package extracted

wiki.ros.org

https://saint-swithins-day.tistory.com/83

 

OPEN Source SLAM : 1 일차 SLAM의 종류 알아보기

OPEN Source SLAM : 1 일차 SLAM의 종류 알아보기 Several Open-Source SLAM algorithms : day 1 sort of SLAM SLAM이란? SLAM(Simultaneous localization and mapping), 동시적 위치추정 및 지도작성은 로봇공학 등에서 사용하는 개념

saint-swithins-day.tistory.com