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가지가 필수적으로 필요함
- Robot 위치 계측/추정 기능
- 벽, 물체 등 장애물 계측 기능
- 기하학적(geometry. geo- : 토지, metry- : 측정)정보가 포함된 지도 -> SLAM을 통해 얻음
- 최적 경로를 계산하고 주행하는 기능
- 이동거리 : 보폭 -> 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 : 이동한 위치의 근사값
- θ : 회전 각도
- 좌/우측 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 값
- 목표 지점에 대해 위치가 아닌 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
- 위 post 참고
- Turtlebot3 Model을 불러온 후 gmapping을 통해 SLAM을 진행
- Rviz상에 로봇 model을 올려놓은 후 teleop를 통해 mapping 진행
2.1.3 Map File 관련 (pgm, yaml)
- 흰색 : 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(원인)가 발생하였을 확률
- 점유확률 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의 형태로 저장하고 사용함
- 또한 yaml(구성 file 작성에 사용되는 data 직렬화 언어) file을 함께 포함하여 map data를 기재
- 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은 올바른 License를 사용하고 있지는 않음 (창작물에 일반적으로 사용되는 License. Source code에서는 일반적으로 사용하지 않아 상업용으로 사용하기는 어려움)
- 또한 Gmapping은 개발이 멈춰있음 (강의 시점인 2016년 기준)
- Cartographer는 상업용으로도 사용 가능한 License를 사용함
- Gmapping은 2D만 사용 가능하지만 Cartographer는 3D도 사용 가능
- https://youngseong.tistory.com/145
- Cartographer 사용 관련 게시글
- sensor node : Sensor raw data를 보냄 (sensor_msgs/LaserScan)
- turtlebot3_teleop node : Keyboard 입력을 받아 Linear/Angular Velocity 값을 보냄
- 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값을 알고자 함
- slam_gmapping node : Sensor가 측정한 거리값인 scan 정보와 위칫값인 tf 정보를 기반으로 mapping 진행
- 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의 추정 위치와 자세를 나타내는 임의의 작은 입자이다)
- Initialization : Global Localization면에서 처음에는 robot의 위치와 자세를 알 수 없으므로 N개의 particle을 임의로 뿌린다
- $$ ^{particle}i = pose(^{x}i, ^{y}i, ^{\Theta}i), weight(i = 1,...,N) $$
- Rviz에서 '2D Pose Estimate'를 통해 Robot의 예측 위치를 지정하면 위의 과정을 진행한다
- Prediction : Robot의 움직임을 기술한 system model에 기초하여 robot의 이동량에 noise를 포함하여 각 particle들을 이동시킨다
- teleop node를 통해 robot을 천천히 이동시키면 위의 과정을 진행한다
- 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를 거쳐 새로운 상태가 된다
- Pose Estimation : N개의 모든 각 particle의 위치 및 자세인 x, y, θ와 weight를 곱하여 Robot의 추정 위치를 계산
- 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 과정
- Sensing : Robot이 Map 상에서 Encoder, IMU등의 sensor를 통해 odometry 정보를 갱신하며 Lidar(거리 센서)가 장착된 위치부터 장애물과의 거리를 계측
- Localization / Pose Estimation : Encoder, IMU, Lidar로부터 장애물과의 거리 정보 등을 기반으로 기존에 작성한 map상에 현재 robot의 위치를 추정한다
- 이 강의에서는 Particle Filter Localization인 AMCL을 이용한다
- 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를 사용한다
- Move/Collision Avoidance : 위의 motion planning 과정에서 작성된 Trajectory를 따라서 Robot에 속도 명령을 내려 Robot이 해당 궤적에 따라 목적지까지 이동한다
- 이동 중에도 1~3번의 과정을 계속 수행하며 중간에 나타나는 장애물은 DWA Algorithm을 통해 회피하며 이동한다
2.3.1Navigation 필요 정보
- 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번의 각 영역으로 나눠 로봇이 이동 가능한 영역을 계산한다
- Robot 위치
- Sensor 위치
- 장애물 위치 정보
- SLAM을 통해 얻은 Occupancy Grid Map을 Static Map으로 불러와 Occupied Area, Free Area, Unknown Area에 대한 정보
- Costmap은 Navigation의 종류에 따라 2가지로 분리된다
- 사용 목적만 다를 뿐 지도 표현 방식은 동일
- Global Costmap : Global Path Planner가 Static Map의 전체 영역을 대상으로 Path Planning을 진행하여 얻은 출력물
- 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
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
$ 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 진행
$ 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
http://wiki.ros.org/dwa_local_planner
https://saint-swithins-day.tistory.com/83
'Study_ROS > [ROBOTIS ROS Courses]' 카테고리의 다른 글
[ROBOTIS ROS Courses] Ch8. 로봇, 센서, 모터 ~ Ch10. 모바일 로봇 (0) | 2023.01.24 |
---|---|
[ROBOTIS ROS Courses] Ch7. ROS 기본 프로그래밍 (0) | 2022.09.17 |
[ROBOTIS ROS Courses] Ch6. ROS 도구(RViz, rqt, Gazebo) (0) | 2022.09.17 |
[ROBOTIS ROS Courses] Ch5. ROS 명령어 + 용어 정리 (0) | 2022.09.10 |
[ROBOTIS ROS Courses] Ch3. ROS 개발환경 구축 ~ Ch4. ROS의 중요 컨셉 (0) | 2022.09.10 |