자율주행을 구현하는데 있어서 차량은 자신의 위치를 매우 '정확히' 알아내야 한다. 자신의 위치를 알아야 '길'을 찾을 수 있기 때문이다. 길 찾기에 있어 필요한 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을 설정해주면 알아서 로봇이 경로를 생성해서 가는 것을 확인 할 수 있다!
'FOSCAR-(Autonomous Driving) > ROS 스터디' 카테고리의 다른 글
[2024 ROS 스터디]정주광 #4주차 -SLAM과 내비게이션 (0) | 2024.02.20 |
---|---|
[2024 ROS 스터디] 안선영 #4주차 - ROS 기본 프로그래밍 (0) | 2024.02.20 |
[2024 ROS 스터디] 유민아 #4주차 SLAM 과 NAVIGATION (0) | 2024.02.19 |
[2024 ROS 스터디] 변수양 #4주차 - SLAM과 내비게이션 (0) | 2024.02.18 |
[2024 ROS 스터디] 이상혁 #4주차 - SLAM & Navigation (0) | 2024.02.18 |