●10강
https://www.youtube.com/watch?v=rV-POzbzoHc
10강은 11강 preview 느낌이 강해서 연달아 공부했다.
●11강
https://www.youtube.com/watch?v=067HSmDvXdE
표윤석 박사님의 ros강의 중에서 가장 신기하고 재밌던 강의였다.
●Keyword
-SLAM, Navigation, [위치, 센싱, 지도, 경로], GPS, IPS, dead reckoning, 엔코더, Gmapping, Cartographer, Odometry, tf, OGM, Kalman filter, Particle filter, DWA
●Study
이번 강의는 SLAM과 Navigation을 주제로 이론 공부와 실습을 했다.
이번 복습도 이론부분과 실습 부분으로 나눠서 작성한다.
이론
이번 강의의 핵심 키워드인 SLAM과 Navigation을 각각 정리하면 (박사님의 표현을 가져오면 - 11강 pdf 24~26p)
SLAM(Simultaneous Localization And Mapping) : 길과 장애물의 정보가 담긴 지도를 만드는 것
Navigation : SLAM으로 만든 지도를 바탕으로 장애물을 피해 원하는 위치로 스스로 이동하는 것
이고 이 두 작업을 하기 위해 필요한 정보(메시지)는 다음과 같다고 한다.
1. 위치
2. 센싱(Sensing)
3. 지도
4. 경로
즉 이 4개의 정보만 처리할 수 있으면 로봇이 스스로 원하는 위치로 자동(장애물을 피해)으로 움직이게 할 수 있다는 것이다.
이번 강의의 대부분은 저 키워드를 설명하고 관련 기술을 설명하는 것으로 진행됐었다.
한번 각각을 정리해보자.
1. 위치 : 로봇의 현재 위치를 측정/예측
GPS :
-널리 쓰이는 위치 측정 시스템으로 실외에서만 가능하며 오차(m단위)가 크고 날씨의 영향을 많이 받는다.
-일반적인 모바일 로봇에는 잘 쓰이지 않는다.
-절대 위치
IPS : Indoor PS
-실내용 시스템
-여러 방법이 연구 중이지만 무척 비싸거나 정확도가 아직은 많이 떨어진다.
-절대 위치
Dead reckoning :
-고전적인 위치 측정 방법.
-바퀴의 회전, 슬립 정도, 오차 등을 계산해서 최초 위치에 대한 상대 위치를 계산한다.
-상대 위치
Odometry :
-주행거리측정.
-Rviz상에선 이동경로에 화살표(벡터)로 나타남
Kalman filter :
-베이즈 확률 기반의 위치 추정 방법
엔코더(Encoder) :
-직선 운동이나 회전 운동의 정도를 측정 가능한 센서로 직선은 리니어 엔코더(Linear encoder), 회전은 로터리 엔코더(Rotary encoder)를 사용한다.
+)
이전부터 회전 정도는 어떻게 측정해야 하나 해서 '회전 센서'로 검색하고 좀 찾아봤었는데 원하는 답을 찾지는 못했었다. 동아리 선배 중에 팔의 움직임을 따라 하는 로봇을 만든 형이 있었는데 그때도 손목의 돌림 등을 어떻게 측정하는 건가 생각했었지만 묻지는 못했고 흐지부지 넘어갔었다. 그러다 생각지도 못한 강의에서 '엔코더'라는 단어를 배운 것이다. 강의에서 엔코더가 언급되어 몰라서 검색하니 내가 그동안 찾던 정보가 많이 나왔다. 로터리 엔코더 중엔 가변저항과 형태가 거의 똑같은 것도 있어서 조금 놀랐었다. 다른 부품인지 아님 '로터리 엔코더 일부 = 가변저항'인지는 좀 더 알아봐야 할 거 같다.
2. 센싱 : 벽, 장애물을 감지
-거리센서, 비전 센서, Depth camera
-몇 번 들었던 인텔의 RealSense가 depth camera의 대표적인 상품이다.
3. 지도 : 길과 장애물에 대한 정보가 담긴 것, 위치와 센싱 정보를 통해서 제작
Gmapping :
-SLAM의 한 종류. x, y, theta 즉 2차원 정보에 대해서만 mapping 가능
-개발은 끝났고 유지보수(지원) 정도만 진행 중
Cartographer :
-Google에서 만든 SLAM
-3d정보도 지원하며 라이선스가 자유롭고(Apache 2.0) 개발도 활발하게 이루어진다.
-2d상에선 Gmapping보다 크게 좋거나 다르지는 않음.
OGM :
-점유 격자 지도
-SLAM을 통해 완성된 지도의 종류 중 하나.
-Gmapping 기준 지도 이미지는. pgm 확장자로, 지도 정보(내비게이션에서 사용 가능한)는. yaml 확장자로 저장된다.
4. 경로 : 목적지로 가는 최적의 방법을 찾고 주행
DWA :
-최적의 경로를 계산하는 방법 중 하나
-병진 속도와 회전 속도를 독립변수로 같은 목적함수를 두어 목적함수가 최대가 되는 병진, 회전 속도를 찾아낸다.
+) 오늘 강의에 나온 수학적인 이론? 중 유일하게 제대로 이해한 것이다....
Particle filter :
try and trial 법에 의한 확률 분포를 기반으로 하는 예측 기술
+) 솔직히 kalman filter랑 이거는 거의 이해 못 했다....
정리한 거 이외에도 더 많은 설명을 하셨다. (너무 많아서 중요해 보이는 것만 정리했다,)
실습
실습은 실제 로봇이 없기에 Gazebo상에서 tutlebot3 waffle을 불러서 대신하는 방식으로 진행됐다.
우선은 10강에서 시키는 대로 Turtlebot3 패키지를 전부 설치했다.
1. Turtlebot3을 Gazebo상에서 불러오기
$roslaunch turtlebot3_gazebo turtlebot3_world.launch
*이 launch파일을 실행하면 이런 모양의 맵과 미리 bashrc에서 설정해둔 turtlebot3 모델이 가상으로 만들어진다.
*turtlebot3_gazebo 패키지를 좀 뒤져보니 다른 맵들도 많았다. house, plaza, sqaure, World. 이번 복습에선 강의의 World가 아닌 House로 실습을 해보려고 한다.
+) 추가로 패키지의 launch 파일을 좀 읽어봤다.
(catkin_ws > src > turtlebot3_simulations에 turtlebot3_gazebo 패키지가 있다.)
-2~5줄은 불러올 모델 지정과, Gazebo에서 spawn 할 위치를 지정하는 것 같다.
-7~14를 보니 launch로 또 launch파일을 실행시킬 수 있는 거 같다. 찾아보니 실행 + arg, param 설정도 가능하다고 한다.
-16이 parameter를 건드리는 줄인 거 같다.
-18은 위에서 선언한 arguments와 parameter으로 spawn_model이라는 node를 실행시키는 줄이다.
대충 이 정도로 추측해보고 구글링 해서 맞는지도 확인해봤다. launch 파일과 더불어 xml도 조금 공부할 수 있는 블로그나 사이트를 찾아봐야겠다.
2. Gmapping SLAM 실행
$roslaunch turtlebot3_slam turtlebot3_slam.launch slam_method:=gmapping
*성공적으로 실행했다면 이렇게 gmapping이 rviz상에서 실행된다.
*roslaunch명령에서 launch 파일의 argument의 값을 바로 주고 실행시킬 수도 있는 거 같다. turtlebot3_slam.launch파일을 보니 slam_method라는 argument가 실제로 있었다.
*초록점은 LiDAR가 실제로 측정한 센싱 값이고 검은색과 회색 부분은 그 값을 이용하여 장애물과 이동 가능 영역을 표시한 것이다.
3. 이동하여 지도 만들기
$roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
*최초로 지도를 만들 때는 수동으로 로봇을 조작해서 mapping을 하고자 하는 영역의 모든 곳을 센싱해야 한다. 이를 위해 teleop를 사용해서 turtlebot3을 키보드로 조작한다.
4. 지도 출력
$rosrun map_server map_saver -f ~/<map이름>
*map_server명령어의 map_saver로 현재 mapping 된 지도를 저장한다.
*-f는 저장될. pgm과. yaml의 이름을 설정하는 옵션으로 적지 않으면 그냥 map이라는 이름으로 저장된다. pgm은 지도 사진,. yaml은 지도의 데이터를 포함하고 있다.
*여기까지의 과정을 SLAM이라 한다.
5. 생성한 지도를 바탕으로 navigation
teleop, gmapping은 실행 종료
$roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/<map이름>.yaml
*처음에 실행하면 이렇게 불러온 map파일과 현재의 센싱 정보가 일치하지 않을 것이다. 이 때문에 실제 로봇이 있는(Gazebo상에서) 위치를 수동으로 지정해줘야 한다.
*Rviz 상단의 2D Pose estimate로 실제 위치와 방향을 찍어주고 teleop로 로봇을 약간 회전+이동시켜주면 지도상에서 로봇이 어디에 있는지 정확하게 파악하게 된다.
*로봇 근처의 초록색 화살표는 현재 로봇이 있을 위치를 추정해서 확률적인 분포를 보여주는 데 teleop로 움직여주면 점점 저 분포가 한 점으로 모이는 것을 확인할 수 있다.
*여기까지 하면 navigation을 할 준비가 끝난 것이다. 센싱과 teleop를 이용해 현재 '위치'를 찾았고, '센싱'은 계속 실행 중이고, 이전 SLAM을 통해 '지도'까지 만들었다.
이제 Rviz상단의 2D Nav Goal을 이용해 도착점만 지정해주면 navigation패키지가 '경로'를 계산해 이동시킬 것이다.
이렇게 SLAM과 Naigation 강의 복습이 끝났다.
각각의 대략적인 이론과 용어들도 배웠고 다시 한번 공학 수학이 얼마나 중요한지도 느꼈다.
Gazebo로 로봇을 만들기 전에 시뮬레이션이 가능하다는 것도 직접 실습해보니 더 와닿았다.
다음 주에 회의 참석하면 Gazebo상에서도 구현을 해야 할 거 같다고 의견을 내봐야겠다.
그전에 Gazebo에 3d 모델을 어떻게 올릴지 공부해봐야겠다.
===============================================================================
정확한 정보 전달보단 공부 겸 기록에 초점을 둔 글입니다.
틀린 내용이 있을 수 있습니다.
틀린 내용이나 다른 문제가 있으면 댓글에 남겨주시면 감사하겠습니다. : )
===============================================================================
'팀 프로젝트' 카테고리의 다른 글
C-2345 자세 제어 4족보행 로봇 #13 (ROS URDF, Xacro Turorial) (0) | 2021.09.06 |
---|---|
C-2345 자세 제어 4족보행 로봇 #12 (ROS 13강-Manipulation, ROS기초 강의 完) (0) | 2021.09.04 |
C-2345 자세 제어 4족보행 로봇 #10 (ROS 이기종 디바이스 간의 통신 실습) (0) | 2021.08.26 |
C-2345 자세 제어 4족보행 로봇 #9 (ROS 9강-임베디드 시스템, rosserial 실습) (0) | 2021.08.23 |
C-2345 자세 제어 4족보행 로봇 #8 (ROS 8강-카메라 캘리브레이션 실습) (0) | 2021.08.21 |