이번주차도(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, 터틀봇 원격조정, 지도 작성
지도 작성할때는 자동이 아닌 수동으로 로봇 조정한다. (로봇 손상 방지)
SLAM 관련 노드들의 처리 과정을 알아보자. (실제 활용할 때)
위 과정, 즉 Gmapping에서 결과적으로는 필요한 것은 위치정보이다. 로봇이 아닌 센서의 위치 정보이다.
(위치와 센싱으로 지도를 만든다)
위치추정 키워드 설명이다
- 칼만 필터: 잡음이 포함되어 있는 선형 시스템에서 대상체의 상태를 추적하는 재귀 필터이다. 가장 보편적으로 사용된다.예측과 보정의 반복이다.
- 파티클 필터: 초기화, 예측, 보정, 위치추적, 재추출의 과정을 통한 필터이다. 시행착오법을 기반으로한 시뮬레이션을 통해 예측하는 기술이다.
(내이베이션) : Navigation + TurtleBot3
마스터 실행 -> 터틀봇 및 센서 구동 -> RViz, 터틀봇 원격조종, 내비게이션
DWA(dynamic window approach): 충돌 가능한 장애물을 회피하며 목표점까지 빠르게 갈수 있는 속도를 선택하는 방법.
즉, 지도를 위치영역 기반이 아닌 속도영역으로 바꿔버린다.
정리하면, 로봇에게 어느 위치로 얼마만큼 이동해! 가 아닌, 얼마만큼의 병진과 회전속도로 이동해! 의 정보를 제공한다.
이제 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
이후 저기 보이는 turtle을 조정해주기 위한 코드 작성을 해주자
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
이후
$ export TURTLEBOT3_MODEL = waffle
$ roslaunch turtlebot3_gazebo turtlebot3_gazebo_rviz.launch
을 통해 Rviz를 실행시켜서 Gazebo 의 로봇의 장착된 센서 값을 확인해줄 수 있다.
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
3. 가상 내비게이션 with Gazebo
2D Pose Estimate 를 눌러서, 초기위치를 클릭해준다.
teleop를 통해서 제자리 회전운동 및 병진 운동을 해줘서 확률을 수렴시켜준다.
이후에는 내비게이션을 실제로 이용해본다.(2D Nav Goal) 이때는 teleop는 꺼준다. (방해할 수 있기 때문이다)
참고) 빨간색선 은 글로벌 경로이고 파란색선은 DWA에 따라서 국부 경로이다.
이로써, 4주의 스터디 내용이 모두 끝났다. 4주차에 배운 내용은 자율주행 자동차와의 관련성이 제일 높다고
느껴, 매우 흥미롭게 수강하고 실습했던 것 같다. 추후, 더 자세한 내용들을 배워서
실제 자율주행 자동차에 어떻게 적용되는지 알아보고 싶다.
'FOSCAR-(Autonomous Driving) > ROS 스터디' 카테고리의 다른 글
[2023 ROS 스터디] 오준호 #4주차 - SLAM & NAVIGATION (0) | 2023.02.02 |
---|---|
[2023 ROS 스터디] 정혁제 #4주차 - SLAM / 네비게이션 (1) | 2023.02.01 |
[2023 ROS 스터디] 안수빈 #3주차 - ROS 기본 프로그래밍 (0) | 2023.01.30 |
[2023 ROS 스터디] 조한준 #3주차 -ROS기본프로그래밍 (0) | 2023.01.29 |
[2023 ROS 스터디] 오준호 #3주차 - ROS 기본 프로그래밍 (0) | 2023.01.29 |