일정: 2023.12.13(수)
수업 내용:
- Robot Operating System (ROS)
- ROS 개발환경 구축
목표:
로봇 소프트웨어 플랫폼
(하드웨어 추상화, 하위디바이스 제어, 로보틱스 센싱, 인식, 위치추정, 지도 작성 , 내비게이션 등) 중심의 기술과
로봇 소프트웨어 플랫 폼(ROS)이 가져올 미래 가치와 기술 선점을 위한 교육을 바탕으로
다양한 영상과 라이다 기반의 로봇 자율주행 기술 교육을 통해 학생들의 첨단 기술습득을 목표로 함.
7. Navigation & SLAM (Simultaneous Localization and Mapping)
7-2. SLAM (Simultaneous Localization and Mapping) & Navigation
(1) tf(transform)
: SLAM에 사용되는 정보는 거리 값과 그 거리 값을 계측한 위치가 어느 곳인지 판단
- 거리 값은 센서 node로부터 해당 정보 값을 받을 수 있고,
- 그 거리 값을 계측한 위치는 해당 센서가 어디에 있는지? 센서는 로봇의 어디에 부착되어 있는지?
- robot은 원격 조종 명령(turtlebot3_teleop_key.launch)에 따라 움직임
: robot과 sensor는 물리적으로 고정되어 있고 로봇의 움직임에 따라 상대적으로 sensor의 자세(위치+방향)가 변함
→ 이것을 상대 좌표 변환이라고 하며, ROS는 그 과정을 tf(transform)이라 함
→ robot의 움직임에 따른
상대 좌표 base_footprint(로봇의 최상단점), base_link(로봇의 중심점), base_scan(센서의 위치)를 구하고,
이 값을 tf message gmapping node에 전달
: tf tool 사용
SLAM시 작은 초록색 화살표 라고 부르기도 함
ⓐ SLAM을 위한 공간 준비
ⓑ SLAM gmapping으로 map 파일 만들기(PPT61장 참고)
: $ ifconfig RemotePC(Ubuntu)와 SBC(Raspberry Pi, Turtlebot3) id 확인
ⓒ turtlebot 전원을 끄지 말고 바닥에 내려놓기
ⓓ turtlebot3_teleop_key.launch 실행하여 아래 그림과 같이 turtlebot 동작시켜 map 생성. 이때 Rviz 화면 확인
R 새 터미널 열고 $ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
ⓔ 맵 구현이 완료되면 아래와 같이 저장함
R 새 터미널 열고 $ rosrun map_server map_saver -f ~/map
ⓕ Rviz 닫고, Navigation 실행 가기, 실행하면 Rviz 화면이 다시 열림(map 파일 불러옴)
R 새 터미널 열고 $ roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml
ⓖ Rviz 닫고, Navigation 실행 가기, 실행하면 Rviz 화면이 다시 열림(map 파일 불러옴)
ⓗ 이때 map과 일치가 잘되지 않을 경우에는 turtlebot3_teleop_key.launch 실행하여 turtlebot 동작시켜(회전) map 일치시킴
R 새 터미널 열고 $ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
Map과 일치되면 반드시, turtlebot3_teleop_key.launch를 CTL + C 중단 후 터미널을 닫아야 함
: turtlebot3_teleop_key.launc 실행되면 turtlebot은 기본적으로 정지상태
ⓘ map 일치되면,
Rviz 화면에서, 2D Nav Goal 누르고, Turtlebot 정면을 click화면 큰 화살표(초록색)가 생기며, 목표하는 곳으로 drag하면 초록 화살표가 형성되고, mouse에서 손을 띄면 빨간색 화살표 생기며 turtlebot 자동으로 이동하게 됨. 반복하여 구동 가능
(1) SLAM을 위한 공간 만들기
: ROS 종속 Package 설치, Ubuntu 환경, SLAM 종류(gmapping, cartographer, hector mapping)에 따라서
SLAM후 Navigation 진행 시 rviz costmap에서 “No map received”라는 warn과 함께 navigation 진행이 되지 않음
→ 해결방법1. ROS 종속 package 재 설치후, build
→ 해결방법2. 실험 map size(위 그림처럼) 확장 … 근본적 해결책이 아님
→ 해결방법3. inflation radius 값 변경(작게) 수정
home/catkin_ws/src/turtlebot3/turtlebot3_navigation/param/costmap_common_param_burger.yaml
→ 해결방법4. SLAM gmapping 문제발생 경우 SLAM hector mapping로 변경
→ 해결방법. 실험 map size(위 그림처럼) 확장 … 근본적 해결책이 아님
SLAM후 Navigation 진행 시 rviz costmap에서 “No map received”라는 warn과 함께 navigation 진행이 되지 않음
→ rviz, 2d nav Goal 이 동작하지 않는 원인은 robot_status를 제대로 불러오지 못했거나, path 설정을 실패 등 원인.
→ 해결방법. inflation radius 값 변경(작게) 수정
home/catkin_ws/src/turtlebot3/turtlebot3_navigation/param/costmap_common_param_burger.yaml
: parameter에서 장애물 inflation radius(팽창 영역) 설정.
: path plan 설정시 inflation radius을 가로 지를 수 없음 (robot이 움직일 때 충돌 방지를 위함)
→ 해결방법. inflation radius 값 변경(작게) 수정
home/catkin_ws/src/turtlebot3/turtlebot3_navigation/param/costmap_common_param_burger.yaml
: ROS 파일 시스템은 설치 폴더와 사용자 작업 폴더로 구분
- ROS 설치 폴더는 ROS를 설치하면 /opt 폴더에 ros 폴더 생성
→ ROS 설치 폴더 경로 /opt/ros/kinetic
→ ros 폴더에 roscore를 포함한 핵심 유틸리티와 rqt, Rviz, 로봇 관련 라이브러리, 시뮬레이션, 내비게이션 등 설치
- 사용자 작업 폴더 는 사용자 폴더인 ~/catkin_ws 사용
7-4. SLAM 위치 추정(Localization) 알고리즘
(1) 위치 추정
추측 항법(dead reckoning)
- 양 바퀴 축의 회전 값을 이용(encoder: wheel의 회전 량 측정)
- 이동 거리와 회전 값을 계산, 위치 측정
(2) Kalman filter
- NASA의 아폴로 project에 사용된 Rudolf E.Kalman 박사가 개발
- Noise(Gaussian Noise)가 포함된 선형 시스템(linear system)에서 object의 상태를 추적하는 재귀 필터(recursive filter)
- 수식 유도 과정 (http://jinyongjeong.github.io/2017/02/14/lec03_kalman_filter_and_EKF/)
- Object를 선형시스템으로 가정하고 선형 운동으로 최적의 parameter를 찾아가는 해석적 방법
- Kalman filter는 선형 시스템(linear system)에만 적용
→ Linear system과 Gaussian Noise 적용된 시스템에서만 정확도 보장
- 로봇과 센서는 대부분 비선형 시스템
→ Kalman filter는 정확도가 보장되지 않음
→ Kalman filter를 수정 확장한 EKF(Extended Kalman Filter) 사용
: motion model(target이 어떻게 움직일지 예측, path planning)
: observation model을 비선형 함수로 확장한 것
→ EKF의 정확성 보완한 무향 칼만 필터 UKF(Unscented Kalman Filter)
→ 속도 개선한 Fast Kalman filter
(3) Particle Filter
- 물체 추정에 최근 가장 많이 사용되는 알고리즘
: Noise가 있는 환경에서 측정된 data를 filter로 사용해 실제 위치를 추정하는 방법
- 시행착오(try and error)법에 기반한 simulation을 통한 예측 기술
: 여러가지 방법을 실험해, 결과들의 인과관계를 추론하여 문제를 해결하는 방식
- 대상 시스템에 확률 분포로 임의 생성된 추정 값을 particle(입자) 형태로 나타내어 Particle Filter 라고 함
→ SMC(Sequential Monte Carlo) 또는 Monte Carlo Localization 방법이라 함
- 연속해서 들어오는 정보 중에 오차가 포함되었다고 가정하고 object의 위치를 추정
→ SLAM에서 robot의 odometry 값과 LDS를 활용, 관측 값으로 사용되어 robot의 현재 위치 추정
- 위치 불확실성을 sample이라 부르는 Particle(입자)로 묘사
: 그림의 검은 점들(크기는 weight의 크고 작음)
- Particle을 로봇의 motion model과 확률에 근거하여
새로운 추정 위치와 방향으로 이동
- 실제 계측 값에 따라 각 입자에 가중치(weight)를 주며
- 점차적으로 정확한 위치로 잡음을 줄이며 추정해나가는 과정
- 각 Particle(입자)을 particle=pose(x, y, i), weight 로 나타냄
: 각 Particle(입자)은 로봇의 추정 위치와 방향을 나타내는 임의의 작은 Particle로,
로봇의 x, y, i 그리고 각 Particle의 가중치(weight)로 표현
- Particle Filter의 estimation cycle
① 초기화(initialization)
: 초기 robot의 pose(위치, 방향)를 전혀 알 수 없음
→ n개의 Particle로 자세(pose)를 구할 수 있는 범위 내에서 무작위 배치
→ n개의 Particle weight는 1/n로, 합은 1 (n은 경험적으로 결정하고, 일반적으로 수백 개)
: 초기 robot의 pose가 알려진 경우에 그 근처로 Particle 재배치
② 예측(prediction)
: robot의 움직임을 system model에 기초하여
: robot Odometry 정보 등을 통해 관측된 이동량에 noise을 포함하여 각 Particle들을 이동시킴
③ 보정(update)
: 계측된 센서 정보들을 기반으로 각 Particle 존재할 확률 계산하고, 이를 반영하여 각 Particle 가중치(weight) 갱신
④ 자세 추정(pose estimation = localization)
: 모든 Particle의 위치, 방향, 가중치를 이용하여
→ 가중치 평균, 중앙값, 최대 가중치를 갖는 Particle 값 등으로 robot의 추정 자세 계산
⑤ 재추출(Resampling)
: 새로운 Particle를 생성하는 단계
: 가중치가 작은 Particle를 제거하고 가중치가 높은 Particle를 중심으로
기존 Particle 특성인 자세 정보를 갖는 새로운 Particle를 추가로 생성 (Particle 수 n은 유지)
7-6. Costmap
(1) Navigation processing 이해
① 위치: 로봇의 위치 계측/추정하는 기능 Localization, pose estimation 라 부름
② 센싱: 벽, 물체 등의 장애물의 계측하는 기능 sensing
③ 지도: 길과 장애물 정보가 담긴 지도(map 생성)
④ 경로: 목적지까지 최적 경로를 계산하고 주행하는 기능
→ motion planning(path planning)라고 부름
- 현재 위치부터 지도상에 지정 받은 목표지점까지 이동 궤적(trajectory) 생성
- 지도 전체의 전역 이동 경로 계획(global path planning)과
- robot 중심의 일부 지역으로 국부 이동 경로 계획(local path planning)으로 구분하여 이동 경로 생성
⑤ 장애물 회피(collision avoidance)
: 이동 궤적에 따라 목적지까지 이동중 갑자기 나타난 장애물 회피
→ Dynamic Window Approach(DWA) 알고리즘 사용
(2) Definition
① Encoder, 관성 센서(IMU)로부터 얻은 Odometry 정보를 기반으로 robot 위치를 추정
② Robot에 장착된 LDS(거리 센서)로 robot과 obstacles(장애물)과의 거리 계산
③ Navigation은 robot pose, sensor 자세, obstacles 정보, SLAM의 결과로 얻은 Occupancy Grid Map(점유격자지도)를
고정 지도(static map)로 호출하여, 점유 영역(occupied area), 자유 영역(free area), 미지 영역(unknown area) 정보를 표시
robot pose(위치), sensor 자세, obstacles 정보, SLAM의 결과로 얻은 Occupancy Grid Map
장애물 영역, 장애물과 충돌이 예상되는 영역, robot이 이동 가능한 영역을 계산하며 이것을 “costmap” 라고 함
(3) costmap 종류
① costmap : global_costmap, local_costmap 2종류
② global_costmap
: 전역 이동 경로 계획에서 고정 지도의 전체 영역을 대상으로 이동 계획 수립을 위한 지도
③ local_costmap
: 국부 이동 경로 계획에서 robot을 중심으로 한정된 영역에 대해 이동 계획할 때나 장애물 회피 때 사용되는 지도
(4) 장애물과의 거리와 costmap 값의 관계도
cell cost 값 :
- 255 : 로봇 이동 불가능한 점유 영역
(occupied area)
- 253~254 : 충돌 영역
- 128~252 : 충돌 가능성이 높은 영역
- 001~127 : 충돌 가능성이 낮은 영역
- 000 : 로봇 자유롭게 이동 가능한 자유 영역 (free area)
(4) 장애물과의 거리와 costmap 값의 관계도
(5) costmap 설정 parameters
: 장애물 영역, 장애물과 충돌이 예상되는 영역, robot이 이동 가능한 영역 계산 parameters
: http://wiki.ros.org/dwa_local_planner
→ costmap_common_params_burger.yaml : 공통 parameters
→ global_costmap_params.yaml : 전역 영역 모션 계획에 필요한 parameters
→ local_costmap_params.yaml : 국부 영역 모션 계획에 필요한 parameters