본문 바로가기

FOSCAR-(Autonomous Driving)/ROS 스터디

[2023 ROS 스터디] 정혁제 #4주차 - SLAM / 네비게이션

반응형

들어가며..

모니터는 반품해버렸다. 너무많은 시간을 투자했지만 결국 해답은 찾지 못했다..

그냥 적응하며 살아갈 생각이다.

 

CHAPTER 11-1 기본개념

길 찾기에 필요 한 것들은 무엇이 있을까??

1. 위치 : 로봇의 위치 계측/추정하는 기능

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

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

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

 

총 4가지가 있다. 하나하나씩 알아보자.

 

1. 위치 : 로봇의 위치 계측/추정하는 기능

GPS(Global Positioning System) -오차,날씨,실외

Indoor Positioning Sensor - Landmark (Color. IR Camera) , Indoor GPS , WiFi SLAM , Beacon

추측 항법(dead reckoning, 데드레커닝)

: 아주 고전이며, 쓸만하다. 비용도 굉장히 싸다. 단점으로는 출발점으로부터 상대위치를 알수 있다는 것이다.(절대위치 x)

- 양 바퀴 축의 회전 값을 이용

- 이동 거리와 회전 값을 계산, 위치 측정

- 바닥 slip, 기계적, 누적 오차 발생

- IMU 등의 관성 센서, 필터로 위치 보상 (칼만필터 같은 방법으로 !)

필요한 정보

- 양 바퀴 축의 엔코더 값 E (모터 축인 경우 기어비로 재계산)

- 바퀴 간 거리 D

- 바퀴 반지름 r

데드레커닝 계산

- 선속도(linear velocity: v)

- 각속도(angular velocity: w)

Runge-Kutta 공식 이용

- 이동한 위치의 근사 값 x, y

- 회전 각도 θ

!!문제는 어디까지나 추정이고, 상대 위치라는 점이다!!

 

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

거리센서

- LRF, 초음파센서, 적외선 거리센서(PSD)

비전센서

- 스테레오 카메라, 모노 카메라, 전 방향 옴니 카메라

Depth camera

- SwissRanger, Kinect-2

- RealSense, Kinect, Xtion, Carmine(PrimeSense), Astra

 

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

로봇은 길을 찾아가기 위해 지도가 필요하다!

지도

- 도로와 같은 기반 시설의 경우 디지털 지도 OK!

- 병원, 카페, 회사, 가정집의 지도?

- 탐사, 붕괴된 위험지역의 지도?

지도? 없으면 만들자!

SLAM (Simultaneous Localization And Mapping)

                   같이          여긴 어디?        지도 만들자

 

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

• 내비게이션(Navigation)

• 위치 추정 (Localization / Pose estimation)

• 경로 탐색/계획 (Path search and planning)

• Dynamic Window Approach (DWA)

• A* 알고리즘 (A Star)

• 포텐셜 장(Potential Field)

• 파티클 필터 (Particle Filter)

• 그래프 (Graph)

 

정리하자면 위치+센싱을 가지고 있으면 -> 지도를 만들어 낼 수 있다. (SLAM)

위치 + 센싱 + 지도를 가지고 있으면 -> 경로를 만들어 낼 수 있다. (Navigation)

 

CHAPTER 11-2 SLAM

Gmapping - 가장 유명함. (SLAM Pakage)

• OpenSLAM에 공개된 SLAM 의 한 종류, ROS에서 패키지로 제공

• 저자: G. Grisetti, C. Stachniss, W. Burgard

• 특징: Rao-Blackwellized 파티클 필터, 파티클 수 감소, 그리드 맵

• 하드웨어 제약 사항

  • X, Y, Theta 속도 이동 명령

     • 차동 구동형 모바일 로봇(differential drive mobile robot)

     • 전 방향 이동 로봇 (omni-wheel robot)

  • 주행기록계 (Odometry)

  • 계측 센서: 2차 평면 계측 가능 센서( LRF, LiDAR, Kinect, Xtion 등)

  • 직사각형 및 원형의 로봇

 

지도작성: Gmapping + TurtleBot3

지도작성은 간단하다.

1.마스터(roscore실행)

2.turtlebot의 모델(burger 또는 waffle) 선택 

3.roslaunch로 turtlebot_bringup 구동한다.

구동하게 되면 제일 먼저 opencr(임베디드시스템)을 구동시킨다. 모터를 제어시킬 수 있는 상황을 만들고 , 세팅을 한다.

그다음 왼쪽/오른쪽 바퀴 encoder값을 받아서 계산을 준비한다. (관련정보는 ROS SERIAL을 통해서 메세지전송)

이 로봇에는 임베디드 시스템과 single board computer 이 함께 장착되어 있다. 이런 정보를 전부 single board computer에다가 전송하게 된다. single board computer에서는 라이다가 연결되어 있다(usb로) 그래서 라이다로부터의 정보(2차평면의 거리 정보)를 전부 다 취득해서 메세지로 보내게 된다. 실질적으로 로봇에서 하는 역할은 모터를 제어하고, 오토값을 읽어서 현재의 위치를 추정하고, imu센서로 보정하고, 센서값을 받는 역할까지만 한다. 지도를 작성하는 역할은 메세지를 받은 데스크탑/랩탑이 해주는 것이다.

출처 - ROSBOTIS OpenSourceTeam

2차원 점유 격자 지도 (OGM, Occupancy Grid Map)

• 흰색 = 로봇이 이동 가능한 자유 영역 (free area)

• 흑색 = 로봇이 이동 불가능한 점유 영역 (occupied area)

• 회색 = 확인되지 않은 미지 영역 (unknown area)

 

--------------------------------------------------맵 지도를 만드는 방법 -----------------------------------------------

출처 - ROSBOTIS OpenSourceTeam

1. 로봇을 구동시킨다(sensor_node실행이 된다. 얘가 sensor raw data를 gmapping에게 보낸다.(토픽명 : scan) 

2. 아까 로봇을 구동할 때는 우리가 원격조종을 한다고 했다. 관련한 노드(turtlebot3_teleop)을 실행시켜서 메세지를 보낸다.

메세지의 이름은 velocity이며, 형식은 geometry_msgs/Twist이다. 병진속도/회전속도를 포함하고 있다.

3. turtlebot3_core 에서 속도값을 받아 실제 로봇을 구동시킨다. 왼쪽바퀴와 오른쪽바퀴의 엔코더 값을 읽을 수 있고, 로봇의 현재위치를 알아낼 수 있다. + IMU까지 더해 위치보정까지 해줄 수 있다. 그래서 로봇의 출발위치부터 어디까지 갔는지 알아낼 수 있다.

(odometry를 알아낼 수 있다) 여기서 odometry란, 단어 그대로 주행기록계라는 의미로서 엔코더를 통한 회전수와 IMU(관성 측정 장비)로 기울기 등을 측정함으로서 움직이고 있는 사물의 위치를 측정하는 방법을 의미한다. 

base_footprint 는 로봇의 밑점, base_link는 하드웨어의 중심점, 맨위의 base_scan은 센서가 어디있는지 알아낼 수 있다.

결국 알아내고 싶은 것은 odometry가 아니라, 센서의 위치를 알아내고 싶은 것이다. 이 로봇의 위치가 궁금하다기 보다는, 로봇 위에 센서가 있을 텐데, 그 센서의 값이 궁금하다는 것이다. tf형태로 이 값들을 받아온다.4. 결국 gmapping에서 필요 한 것은 위치정보이다.(로봇 X 센서 O) 전에, 위치랑 센싱을 합쳐서 지도를 만든다고 했는데, 이게 그 2개이다. gmapping에서  map이라는 메세지를 만들어낸다.5. 이 메세지를 전부 저장하는 패키지, map_server을 통해서 맵의 정보를 담고 있는 문서를 만들어 낸다.

 

키워드위치 추정에는 칼만 필터가 가장 많이 사용된다

• 칼만 필터 (Kalman filter)

• 잡음이 포함되어 있는 선형 시스템에서 대상체의 상태를 추적하는 재귀 필터

• 베이즈 확률 기반

• 예측(Prediction) - 모델을 상정하고 이 모델을 이용 하여 이전 상태로부터 현재 시점 의 상태를 예측

• 보정(update) - 앞 단계의 예측 값과 외부 계측기로 얻은 실제 측정 값 간의 오차를 이용하여 더욱 정확한 상태의 상태 값을 추정하는 보정!

파티클 필터도 나름 사용되니 알아두자.

• 파티클 필터(Particle Filter)

• 파티클 필터는 시행 착오(try-and-error)법을 기반으로한 시뮬레이션을 통하여 예측하는 기술으로 대상 시스템에 확률 분포로 임의로 생성된 추정값을 파티클(입자) 형태로 나타낸 다.

1) 초기화(initialization) 2) 예측(prediction) 3) 보정(update) 4) 위치 추정(pose estimation) 5) 재추출(Resampling)

CHAPTER 11-3 Navigation

키워드

• Dynamic Window Approach (local plan에서 주로 사용)

• 로봇의 속도 탐색 영역(velocity search space)에서 로봇과 충돌 가능한 장애물을 회피하면서 목표점까지 빠르게 다다를 수 있는 속도를 선택하는 방법

• 𝑣 (병진속도), 𝜔 (회전속도)

• 𝑉𝑠 : 가능 속도 영역

• 𝑉𝑎: 허용 속도 영역

• 𝑉𝑟 : 다이나믹 윈도우 안의 속도 영역

• 𝐺(𝑣,𝜔) = 𝜎 𝛼 ∙ ℎ𝑒𝑎𝑑𝑖𝑛𝑔 𝑣, 𝜔 + 𝛽 ∙ 𝑑𝑖𝑠𝑡 𝑣, 𝜔 + 𝛾 ∙ 𝑣𝑒𝑙𝑜𝑐𝑖𝑡𝑦 𝑣, 𝜔

• 목적함수 G는 로봇의 방향, 속도, 충돌을 고려하여, 목적함수가 최대가 되는 속도 𝑣, 𝜔 를 구하게 된다.

 

 

 

CHAPTER 11-4 실습 ( 이제 실전이다!)

 

1. 기본툴 설치

$ sudo apt install ros-melodic-joy

$ sudo apt install ros-melodic-teleop-twist-joy

$ sudo apt install ros-melodic-teleop-twist-keyboard

$ sudo apt install ros-melodic-laser-proc

$ sudo apt install ros-melodic-rgbd-launch

$ sudo apt install ros-melodic-depthimage-to-laserscan

$ sudo apt install ros-melodic-rosserial-arduino

$ sudo apt install ros-melodic-rosserial-python

$ sudo apt install ros-melodic-rosserial-server

$ sudo apt install ros-melodic-rosserial-client

$ sudo apt install ros-melodic-rosserial-msgs

$ sudo apt install ros-melodic-amcl

$ sudo apt install ros-melodic-map-server

$ sudo apt install ros-melodic-move-base

$ sudo apt install ros-melodic-urdf

$ sudo apt install ros-melodic-xacro

$ sudo apt install ros-melodic-compressed-image-transport

$ sudo apt install ros-melodic-rqt-image-view

$ sudo apt install ros-melodic-gmapping

$ sudo apt install ros-melodic-navigation

(kinetic을 melodic으로 바꾸어서 하나하나 설치해주자 ..!)

 

2. 패키지 빌드

홈으로 이동해준다.

$ cd

폴더를 생성해준다.

$ mkdir -p catkin_ws/src

폴더로 이동.

$ 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

catkin_ws폴더로 가서, 빌드를 진행한다.

$ cd ~/catkin_ws && catkin_make

쉽다.

이까지 했으면, 반은 왔다.

 

3. 패키지 실행

이제, 자신의 쉘에 새로운 문장을 추가한다.

저는 현재 zsh쉘을 사용하므로, 다음과 같은 문장을 통해 실행시킨다.

$ sudo nano ~/.zshrc

쉘을 만약 따로 설치하지 않았다면, bash쉘이므로, 다음문장을 실행한다.

$ sudo nano ~/.bashrc

방향키를 따라 맨 밑으로 이동 후, 다음과 같은 문장을 복붙해서 넣어준다.

export TURTLEBOT3_MODEL=waffle_pi

(저장은 ctrl+s, 나가기는 ctrl+x)

터미널로 나온 후, 적용을 시켜준다.

$ source .zshrc (zsh쉘 사용자)

$ source .bashrc (bash쉘 사용자)

 

마지막으로, 실행파일을 적용시켜준다.

$ source devel/setup.zsh(zsh쉘 사용자)

$ source devel/setup.bash(bash 쉘 사용자)

이거 안시켜주면 launch파일인지 아닌지 인식하지 못하므로 필수로 적용해주자(새로운 터미널 실행 시 항상 적용)

 

자, 이제 실행시켜보자!!! 이상한 장소가 나타날 것이다.

$ roslaunch turtlebot3_gazebo turtlebot3_world.launch

그다음으로, rviz를 실행시켜 주자. 이때도, 위의 source devel~~ 을 먼저 적용시키고, 실행시켜주자! 

$ roslaunch turtlebot3_gazebo turtlebot3_gazebo_rviz.launch

위처럼 뜨면, 성공이다!!

rviz상에서 빨간색 점들이 보인다. 현재 가상의 센서가 있기 때문에, turtlebot waffle 위에 있는 2d 라이다의 값이 들어있다.(무려 노이즈까지 들어있다!!)

 

두개의 창을 띄우고나서, 새로운 터미널을 작게 생성해주자. 

그다음, 키보드로 로봇을 움직이기 위해 다음의 문장을 넣어주자.

$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

 이때 로봇을 구동하면... 한 1~2초 뒤 반응하는 것을 확인할 수 있다. 조작하기 생각보다 빡센거같다.

로봇이 잘 이동한다.

rviz에서 카메라를 키고 다시 확인해보자.

우측 왼쪽아래에 카메라로 보이는 화면이 출력된다.

depthcloud 및 pointclould2를 활성화 시키자.

나름 좋은 그래픽카드 들어있는 노트북인데 그냥 멈췃다.. 실행하지 말걸

 

다시 down 시키고, roscore와 gazebo를 재실행한다.

이제 SLAM을 실행시켜보자!

$ roslaunch turtlebot3_slam turtlebot3_slam.launch

바로 rviz가 나오는 것을 확인할 수 있다.

이제, 로봇을 움직여가며 지도를 완성시켜보자!!

$ rosrun map_server map_saver -f ~/map

입력하면 home에 지도가 생긴다.

흰 부분 - 이동가능영역

검정색 - 장애물/물체

회색 - 미지의 영역

 

이제 slam은 꺼버리자. 그리고 아래와 같이 네비게이션을 실행시켜주자.

$ roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml 

이때, 뒤에 지도를 따로 지정해야 한다. 이 네비게이션은 사용자가 지정해둔 지도를 바탕으로, 로봇의 현재위치를 찾아내고 이동하기 때문이다.

확대해보면, 녹색화살표가 어마어마하게 많다. 녹색점은 잇을 확률, 방향은 향하는 확률이다.

 

2D pose Estimate를 클릭해서, 로봇의 대략적인 위치를 정해준다.

teleop_key를 켜서 로봇의 병진/회전 운동을 살짝 주고, 다시 끄자. 이제는 네비게이션으로 로봇의 움직임을 조절하기 때문이다.

2D Nav Goal을 통해 원하는 곳으로 향하게 해보자.

아주 잘 따라간다.

목적지 도달 완료!

 

나가며..

로봇공학도 배우고싶다.. 시간만 되면 로봇쪽도 공부해봐야징

반응형