2023.03.14 수정
저번시간에는 YDLidar를 이용하여 rviz툴로 point cloud를 시각화 해보았다.
이번 시간에는 Hecto-slam을 이용하여 mapping을 해보자.
그전에 Slam, Mapping, Hector이 무엇인지 알아보자.
ROS melodic
Ubuntu 18.04
Jetson Nano jetpack(4.6.1)
Simultaneous Localization and Mapping 이란 기술의 이름을 줄인말로써, 직역하면 "동시적으로 위치를 추정하고 지도를 작성" 하는 것을 의미한다.
RPG 게임을 할 떄 맵 혹은 협곡을 돌아다니면서 지도를 얻는 것이 일종의SLAM이라고 할 수 있다.
SLAM이 주로 사용되는 분야는 자율주행이다.
SLAM알고리즘을 통해 차량은 지도를 작성할 수 있고, 지도 정보를 사용하여
경로를 지정하고 장애물을 피하는 등의 작업을 수행할 수 있다.
일상생활에서의 SLAM
SLAM의 작동방식은 두가지의 구성요소로 작동한다.
제목에서 말한 Hector-mapping은 Hector를 사용한 지도작성이란 뜻인데
그렇다면 Hector은 무엇일까?
Hector SLAM은 스캔된 점군 자체로 실시간 정합을 수행하는 SLAM이므로, 동일한 특징점을 발견하기 어려운 조건(스캔된 점군의 급격한 회전 및 이동), 특징점의 변화가 없는 구역(일직선 통로 등)에서 오류가 발생한다.
이를 보완하는 SLAM기법은 여러가지가 있다. 예를 들어, gmapping 은 odometry(주행계) 센서 값을 이용해 이를 보정한다.
cf) odometry센서는 다양하나 IMU가 지원되는 센서이면 가능하다(예. MPU6050). SLAM 알고리즘 성능 비교는 다음 링크를 참고한다.
먼저 hector-mapping은 Qt4패키지를 필요로 한다. 따라서 Qt4를 설치해준다.
$ sudo apt-get install qt4-qmake qt4-dev-tools
다음 github에서 Hector-mapping를 위한 환경 구축을 위해 소스를 복제하고 빌드한다.
이전 포스팅에서 생성한 ydlidar_ros_driver 폴더에 src 폴더안에 git clone을 하자.
:~/ydlidar_ros_driver/src$ git clone https://github.com/tu-darmstadt-ros-pkg/hector_slam.git
$ cd ..
$ catkin_make
opencv, opencv3, opencv4 중 어떤 것인지, 어디에 있는지 찾아보는 과정이다.
pkg-config —cflags opencv4 명령어로 해결 가능
/opt/ros/melodic/share/cv_bridge/cmake/cv_bridgeConfig.cmake파일에서 opencv를 opencv4로 변경한다.
[solved]
.lanuch파일의 대한 정보는 이곳을 참고하면 좋을 것 같다.
3-1. 1. "mapping_default.launch" 파일을 수정해준다.
파일 위치
$ nano ~/ydlidar_ros_driver/src/hector_slam/hector_mapping/launch/mapping_default.launch
.launch파일은 태그 사용언어인 xml 형식으로 씌여진 파일이다.
roslaunch명령어에서 사용되는
$ nano ~/ydlidar_ros_driver/src/hector_slam/hector_mapping/launch/mapping_default.launch
< launch >두 번째 줄을 주석처리 후 다음과 같이 수정해준다.
3-2. 마지막 부분의 < node > 부분을 다음과 같이 수정해준다.
3-3. tutorial.launch 파일 수정
파일위치
$ nano ~/ydlidar_ros_driver/src/hector_slam/hector_slam_launch/launch/tutorial.launch
< launch >의 두번째 줄을 주석처리 후 다음과 같이 수정해준다.
터미널 3-4개가 필요하다.
터미널을 열고 다음 명령어를 실행한다.
$ roscore
roscore명령어는 모든 ros 노드들에 대한 정보 중계를 담당한다.
각 노드들이 서로의 존재를 인식하게 하는 역할만 담당하고, 이후는 노드들끼리 직접 통신한다.
모든 통신이 roscore를 거치는 것은 아니다.
$ roslaunch ydlidar_ros_driver lidar_view.launch
$ roslaunch hector_slam_launch tutorial.launch
roslaunch 명령어는 노드를 여러 개 실행 및 실행 옵션을 설정 한다.
roscore명령어를 사용하지 않고서 여러개의 실행파일을 동시 실행할 수 있는 명령어이다.
참고
https://kr.mathworks.com/discovery/slam.html
https://blog.naver.com/PostView.naver?blogId=ycpiglet&logNo=222153686510
http://kasimov.korea.ac.kr/dokuwiki/doku.php/activity/public/2021/ros/2
http://daddynkidsmakers.blogspot.com/2019/
https://archit0994.wixsite.com/architshah/post/manage-your-blog-from-your-live-site
'
이전 포스팅에서 생성한 ydlidar_ros_driver 폴더에 src 폴더안에 git clone을 하자.
:~/ydlidar_ros_driver/src$ git clone https://github.com/tu-darmstadt-ros-pkg/hector_slam.git
$ cd ..
$ catkin_make
'
위 과정을 진행할 때, ydlidar_ros_driver 폴더에 src 폴더안에 git clone 까지는 잘 됩니다.
그 다음 $ cd .. $ catkin_make 를 진행할 때,
The specified base path "/home/dogbug3/rostest/ydlidar_ws/src/ydlidar_ros_driver" contains a package but "catkin_make" must be invoked in the root of workspace 라고 빨간색 에러가 뜹니다.
이 원인 때문인지 모르겠지만 마지막 단계에서
1번 터미널에서 roscore명령어 입력후
2번 터미널에서 lidar_view.launch를 실행하고
3번 터미널에서 tutorial.launch를 실행하면
2번 터미널에서 Shutdown request received.
Reason given for shutdown : [[/rviz] Reason: new node registered with same name 이라고 오류가 뜨며 lidar_view.launch가 종료됩니다.
혹시 해결방법 아실까요..?ㅜㅜ