티스토리 뷰

ROS

SLAM -2

Steve Jeong 2018. 9. 4. 18:10

(해당 내용은 로보티즈 표윤석 연구원님의 ROS 강의 자료를 기초로 작성되었습니다.)





지금까지 개념을 알아봤다. 어떻게 동작하는지 알아보자.


우리는 ROS 기본 패키지인 Gmapping을 사용할 것 이다. 


OpenSLAM에서 공개한 SLAM의 종류로 ROS에서 패키지를 제공한다.


특징으로 파티클 필터를 사용하며 그리드 맵을 제공한다.


Gmapping을 사용하기 위해서는 하드웨어적으로 필요한 것이 있다.


X, Y, Theta 속도 이동 명령


주행기록계 (Odometry) 


계측 센서: 2차 평면 계측 가능 센서


직사각형 및 원형의 로봇



그렇다면 Gmapping은 ROS에서 어떻게 처리가 되는 것일까.


다이어그램으로 알아보자

Gmapping이 동작하기 위해서 총 두가지의 토픽이 필요하다.


1번은 로봇의 센서데이터를 불러오는 노드이다.


2번은 로봇을 원격으로 조작하기 위한 노드이다.


3번은 터틀봇의 코어로 주행기록계와 바퀴에 위에 링크 위에 레이저의 위치를 가지고있다.


즉 필요한 두가지 토픽이란 지금까지 주행해온 기록계 연결된 레이저의 위치와 그 레이저의 센서 데이터 값이다.


본인 위치를 알고 자기로 부터 얼마나 물체가 떨어져 있는지 안다면 나머지는 스텍으로 쌓으면 맵을 만들 수 있다.


주행기록의 문제(SLAM -1 참조)는 칼만 필터, 파티클 필터 등으로 해결하지만 자세하게 설명하지 않겠다. (몰라서)


렇다면 직접 해보자.


기본 패키지를 설치한다. (3차원 시뮬레이터 Gazebo를 이용하기 위함이다)

1
2
 3
 4
 5
$ sudo apt-get install ros-kinetic-joy ros-kinetic-teleop-twist-joy ros-kinetic-teleop-twist-keyboard roskinetic-laser-proc
ros-kinetic-rgbd-launch ros-kinetic-depthimage-to-laserscan ros-kinetic-rosserial-arduino
ros-kinetic-rosserial-python ros-kinetic-rosserial-server ros-kinetic-rosserial-client ros-kinetic-rosserial-msgs
ros-kinetic-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 
cs
1
2
3
4
5
$ 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
cs


Gazebo에서는 가상의 로봇을 구동함과 동시에 센서 값도 구현해놨다. (터틀봇은 그렇다)


터틀봇 와플파이를 가제보에서 실행한다.

1
2
$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_gazebo turtlebot3_world.launch
cs


가제보 터틀봇을 조종한다.


1
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

cs


해당화면은 Rviz와 Gazebo를 실행시킨 화면이다. 아래는 teleop 중간에는 카메라를 띄웠다.


가제보 터틀봇의 센서 값을 Rviz에 띄운다.




1
2
$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_gazebo turtlebot3_gazebo_rviz.launch
cs




SLAM을 실행시킨다.



1
2
$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping

cs




지도 출력한다.



1
$ rosrun map_server map_saver -f ~/map
cs

 

홈 폴더에 맵 파일이 저장된다.



이제 SLAM과 teleop를 종료한다! (중요) SLAM은 맵을 만들었기 때문에 필요가 없고, teleop는 내비게이션 움직일 때 데이터가 겹칠 가능성이 있기 때문에 종료해야한다.




네이게이션을 실행한다.



1
2
$ export TURTLEBOT3_MODEL=waffle_pi
$ roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml
cs



초기 값은 센터로 되어있다. 이를 조정하기 위해 Rviz 상단에 pose estimate로 추정위치에 대충 놓는다.


센서 위치가 대충 맞는다. 그리고 보면 수 많은 초록색 벡터가 있는데 이는 추정 위치이다. 움직이다보면 추정 위치가 로봇 위치에 수렴한다.


내비게이션으로 골 위치를 지정하면 이동한다. 초록색 벡터도 로봇 위치에 수렴한다. 

맵을 기준으로 경로를 작성하며 실제 센서데이터를 판단해 우회하기도 한다.




그래서 테스트! 중간에 오프젝트를 3개를 놓았다.





처음에는 못 찾는 듯 했지만 다시 경로를 재 탐색했다.







여담이지만 Gmapping은 라이센스가 더러워 구글 cartographer로 넘어가는 추세하고 한다. 




다음 시간에는 cartographer를 테스트 해 보겠다.

'ROS' 카테고리의 다른 글

SLAM -1  (0) 2018.09.04
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/11   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함