본문 바로가기

FOSCAR-(Autonomous Driving)/ROS 스터디

[2023 ROS 스터디] 최지웅 #4주차 - SLAM과 내비게이션

반응형

이번주차도(4주차) 마찬가지로 SLAM과 내비게이션에 관한 강의를 듣고 이론 및 실습을 정리해보도록 하겠습니다.

https://www.youtube.com/watch?v=067HSmDvXdE&list=PLRG6WP3c31_VIFtFAxSke2NG_DumVZPgw&index=11 

이번주도 위 강의(Chapter 11) 및 githun에 올라온 PDF를 참고하여 작성했습니다.

 

SLAM(simultaneous localization and mapping) & Navigation

 = 동시적 위치 추정 및 지도 작성 & 차량 자동 항법 장치 (간단하게 길찾기)

 

길 찾기에 필요한 4가지! (ROS의 메시지)

 

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

- GPS : 오차,날씨,실외 등의 문제점

- 해결책(절대위치): IPS(indoor positioning sensor): landmark, indoor gps, wifi slam, beacon

- 추측항법(상대위치): 양 바퀴 축의 회전 값 이용/ 이동거리와 회전 값 이용해 위치 측정, IMU(관성센서, 필터))로 위치 보상

   -> 필요정보: 양 바퀴 축의 엔코더 값, 바퀴 간 거리, 바퀴반지름 이용하여 식에 대입

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

- 거리센서, 비전센서, Depth camera

 

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

- 지도가 없으면 만들면 된다 => 이게 SLAM (로봇의 위치와 지도를 만드는 과정)


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

-  A* 알고리즘, 포텐셜 장, 파티클 필터, 그래프 등

 

** 정리하자면, 슬램은 위치와 센싱을 이용하여 지도를 만들고,

네비게이션은 위치와 센싱과 지도를 이용해 경로를 만드는 것이다.

ex) Gmapping: openSLAM에 공개된 SLAM의 한 종류

 

(SLAM)지도 작성: Gmapping + TurtleBot 3

마스터 실행 -> 터틀봇 및 센서 구동 -> RViz, 터틀봇 원격조정, 지도 작성

TurtleBot3이용해서 지도 작성

지도 작성할때는 자동이 아닌 수동으로 로봇 조정한다. (로봇 손상 방지)

 

완성된 지도의 모습(Gmapping)
지도 작성 결과(GMapping&Cartographer)

 

SLAM 관련 노드들의 처리 과정을 알아보자. (실제 활용할 때)

노드 처리과정

위 과정, 즉 Gmapping에서 결과적으로는 필요한 것은 위치정보이다. 로봇이 아닌 센서의 위치 정보이다.

(위치와 센싱으로 지도를 만든다)

 

위치추정 키워드 설명이다

 

- 칼만 필터: 잡음이 포함되어 있는 선형 시스템에서 대상체의 상태를 추적하는 재귀 필터이다. 가장 보편적으로 사용된다.예측과 보정의 반복이다.

 

- 파티클 필터: 초기화, 예측, 보정, 위치추적, 재추출의 과정을 통한 필터이다. 시행착오법을 기반으로한 시뮬레이션을 통해 예측하는 기술이다.

 

(내이베이션) : Navigation + TurtleBot3

마스터 실행 -> 터틀봇 및 센서 구동 -> RViz, 터틀봇 원격조종, 내비게이션

내비게이션 작동과정 영상

DWA(dynamic window approach): 충돌 가능한 장애물을 회피하며 목표점까지 빠르게 갈수 있는 속도를 선택하는 방법.

즉, 지도를 위치영역 기반이 아닌 속도영역으로 바꿔버린다.

정리하면, 로봇에게 어느 위치로 얼마만큼 이동해! 가 아닌, 얼마만큼의 병진과 회전속도로 이동해! 의 정보를 제공한다.

DWA 활용 예시

이제 4주차 실습을 해보자.

우선, 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

위의 코드로 개발환경 준비를 해준다.

코드를 다 쳐주면 나오는 화면

1. 가상 로봇 실행 with Gazebo

 

이제, 3차원 시뮬레이터 Gazebo 상에서 가상의 로봇을 구동해준다.

구동해주기 위한 코드

$export TURTLEBOT3_MODEL=waffle_pi
$rosalunch turtlebot3_gazebo turtlebot3_world.launch

gazebo 처음 켠 모습이다

이후 저기 보이는 turtle을 조정해주기 위한 코드 작성을 해주자

$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

이후 

$ export TURTLEBOT3_MODEL = waffle
$ roslaunch turtlebot3_gazebo turtlebot3_gazebo_rviz.launch

을 통해 Rviz를 실행시켜서 Gazebo 의 로봇의 장착된 센서 값을 확인해줄 수 있다.

gazebo, rviz, teleop동시에 실행한 모습(렉이 좀 걸린다.)

2. 가상 SLAM with Gazebo

 

1번에서 했던 코드로 Gazebo를 실행해준다

이후, SLAM을 실행해준다

$ export TURTLEBOT3_MODEL=waffle
$ roslaunch turtlebot3_slam turtlebot3_slam.launch

이후에 터틀봇 원격조종 코드를 쳐주고 구조물 사이들을 움직이면서 구조 파악을 한다.

마지막으로 구조가 정리된 map을 추출해준다

$ rosrun map_server map_saver -f ~/map

gazebo, slam(Rviz), teleop실행해서 map 생성을 위해 turtle을 움직여준다
파일을 찾아보면 내가 만든 map이 생성된 모습이다

3. 가상 내비게이션 with Gazebo

 

2D Pose Estimate 를 눌러서, 초기위치를 클릭해준다.

teleop를 통해서 제자리 회전운동 및 병진 운동을 해줘서  확률을 수렴시켜준다.

이후에는 내비게이션을 실제로 이용해본다.(2D Nav Goal) 이때는 teleop는 꺼준다. (방해할 수 있기 때문이다)

확률이 줄어든 모습(초록색 선)
이후 내비게이션 기능을 이용해서 경로 확인

참고) 빨간색선 은 글로벌 경로이고 파란색선은 DWA에 따라서 국부 경로이다.

 

이로써, 4주의 스터디 내용이 모두 끝났다. 4주차에 배운 내용은 자율주행 자동차와의 관련성이 제일 높다고

느껴, 매우 흥미롭게 수강하고 실습했던 것 같다. 추후, 더 자세한 내용들을 배워서 

실제 자율주행 자동차에 어떻게 적용되는지 알아보고 싶다.

반응형