본문 바로가기

FOSCAR-(Autonomous Driving)/ROS 스터디

[2024 ROS 스터디] 손희문 #4주차 - SLAM & Navigation

반응형

자율주행을 구현하는데 있어서 차량은 자신의 위치를 매우 '정확히' 알아내야 한다. 자신의 위치를 알아야 '길'을 찾을 수 있기 때문이다. 길 찾기에 있어 필요한 4가지 요소를 강의에서 소개하고 있다.

 

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

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

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

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

 

위 4가지를 요소를 ROS 패키지나 메시지를 통해 구현해야 한다. 각각의 요소를 순서대로 자세히 살펴보자.

 

1. 위치 : 관련 기술들

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

 단점 : 기본적으로 오차가 존재, 날씨영향, 터널에서 x, 빌딩 숲 사이(난반사)

1.2.  Indoor Positioning Sensor : 실내에서 GPS 신호를 이용할 수 없다는 점을 보완하기 위한 여러 기술들

- 가격과 성능 두 마리 토끼를 다 잡은 기술 아직까지는 x

- Landmark(Color, IR, Camera)

- Indoor GPS

- WiFi SLAM

- Beacon

 

1.3. 추측항법 (dead reckoning) : 굉장히 고전적이지만 중요한 방법

- 엔코더 모터를 통해 양 바퀴 축의 회전 값을 이용 

- 단점 : 바닥 슬립, 기계적, 누적 오차 발생

- +imu이용해서 보정 (EKF)

* 칼만 필터 관련해서는 Matlab 유튜브에 설명이 잘 나와있다. (예전에 공부할 때도 이 영상을 참고했었음 )

https://www.youtube.com/watch?v=mwn8xhgNpFY&list=PLn8PRpmsu08pzi6EMiYnR-076Mh-q3tWr

 

다만, 추측항법을 통한 위치 정보는 절대적인 것이 아니다. 시작점으로 부터의 상대위치만을 얻어낼 수 있다.

 

2. 센싱 : 관련 센서들

2.1. 거리센서 : LRF, 초음파 센서, 적외선 거리센서(PSD)

2.2. 비전센서: 스테레오 카메라, 모노 카메라, 전 방향 옴니 카메라

2.3. Depth Camera :  기존의 카메라에서는 Depth 정보가x, 이를 얻어내기 위한 기술, 그러나 현재는 이 분야 관련 투자가 중단(?), 애플의 프라임 센스 인수 이후

 

3. 지도:

SLAM을 사용해서 만들자 


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

4.1. Dynamic Window Approach ( DWA )

4.2. A*, 이를 기반으로 현재는 더욱 더 발전된 형태의 알고리즘 다수 개발됨

4.3. 포텐셜 장 (장애물 주변 : 척력, Goal  주변 인력느낌으로 )

4.4. 파티클 필터(확률을 나타낸다)

4.5. 그래프

 

위의 4가지 요소들과 이번에 실습하게 될 SLAM 및 Navigation의 관계를 정리하면 다음과 같다.

위치 + 센싱 = 지도 (SLAM)

위치 + 센싱 +지도 = 경로 (Navigation)

 

이번 실습에 사용한 패키지는 Gmapping 패키지이다.

현재 Gmapping 관련해서는 더 이상 개발이 이루어지지 않고 현재는 대부분 구글의 카토그래퍼 패키지를 사용한다고 한다.

Gmapping의 단점으로는2차원 정보만 사용한다는 것인데 카토그래퍼에서는 3차원 정보까지도 활용을 한다고 한다.

 

5. 실습

5.1. 패키지 설치 *강의 자료에는 ros 버전이 다르기에 noetic으로 맞춰서 설치해줘야 한다.

 

 

강의에서는 export TURTLEBOT3_MODEL=waffle_pi 명령어를 터미널 창을 열때마다 입력해주는데 강의 자료에 나와있는대로사용하는 쉘의 환경설정 파일에 한 줄 추가해주면 굳이 매번 입력하지 않아도 된다.

 

나는 zsh을 사용하기 때문에 ~/.zshrc 파일을 nano 편집기로 열어서 수정했다.

 

5.2. gazebo 시뮬레이터 실행 ($roslaunch turtlebot3_gazebo turtlebot3_world.launch)

 

gazebo를 실행시키고 rviz를 보면 2d라이다로 스캔한 데이터가 주변에 나타나는 것을 확인할 수 있다. 

 

 

rviz상에서 display 에서 camera를 체크표시 하면 카메라 화면도 확인할 수 있다.

강의에서는 depth 카메라 정보도 받아서 확인해보던데, ros버전이 달라서인지 강의에서 하던대로 실행은 못시켰다. (add topic에서 depth camera관련된 것을 추가해봐도 에러표시가 떠서 그냥 넘어갔다)

 

5.3. slam 실행($ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping) 후 터블봇 조정($ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch) 을 통해 map 생성 > rosrun map_server map_saver 경로 파일명 형식으로 실행시키면 맵이 저장된다. 지정한 경로에 map.pgm, map.yaml파일이 생성된 것을 확인해 볼 수 있을 것이다. 나는 홈 디렉토리에 sample_map이라는 파일명으로 저장을 했다.

 

 

5.4. 작성된 맵을 기반으로 navigation진행

아래 사진처럼 처음 실행시켰을 때는 초록색 점(파티클)이 매우 퍼져있는 것을 볼 수 있다.

직접 로봇을 움직여서 gmapping이 실행됨으로써 지도상에서 로봇의 위치가 어느정도 정확해지면 파티클이 수렴하는 것을 확인할 수 있다. 또 다른 방법으로는 rviz에 있는 2D Pose Estimate 을 통해 직접 지도상에서 로봇의 위치가 어디있는지를 지정해줘도 된다.

 

 

 

2D Nav Goal을 설정해주면 알아서 로봇이 경로를 생성해서 가는 것을 확인 할 수 있다!

반응형