728x90
- Raspberry Pi의 data를 Remote PC(노트북)로 보내기 위해 Master-Slave 통신 사용
- Raspberry Pi에 Launch File 구성
- Raspberry Pi에서 RPLidar를 실행시키고 노트북에서 Hector SLAM package 실행
- Hector SLAM이란 : 2D LiDAR의 적은 계산량을 통해 2D Occupancy grid를 빠르게 생성하는 방식. 완전한 SLAM 접근 방식은 아니며 Loop Closure를 수행하지 않는다
- Loop Closure Detection : 로봇의 이동 궤적상에서 현재의 위치가 이전에 방문했던 위치인지를 판단하는 것으로, 검출된 결과를 환경 맵 최적화 단계에서 제약조건으로 활용하도록 하여 SLAM 알고리즘의 로봇 표류 문제를 해결한다.
- Gmapping SLAM과 반대로 Odometry 입력 값을 필요로 하지 않아 성능을 낮추는 단점이 된다
- Hector SLAM은 geometric constraints가 충분히 많지 않은 지형에 대해서는 오류가 많이 발생한다
- hector_slam package는 map을 learning하고 laser scanner frame rate에서 robot의 2D pose를 simultaneously하게 estimate하는데 사용
- hector_mapping의 frame명과 option을 알맞게 설정해야 함
- 일반적인 two wheeled robot의 standard coordinate frames
all potential frames of interest in a simplified 2D view of a robot travelling through rough terrain, leading to roll and pitch motion of the platform
- base_link frame을 laser_link frame으로 framsformation 하는 사진
- 새로운 localization component 작성에 필요한 frame들과 robot의 mobile base에 사용될 수 있는 frame에 대한 예시
- Coordinate Frames
- base_link : Robot의 base에 rigidly하게 붙는 coordinate frame으로, 임의의 위치나 방향으로 부착할 수 있으며, 모든 hardware platform에 대하여 명확한 기준점을 제공하는 다른 위치가 있다
- base_stabilized frame과 비교하여 roll, pitch angle 정보를 제공한다. (roll/pitch motion을 나타내지 않는 platform에서는 base_link와 base_stabilized frame이 동일하다)
- odom : World-fixed frame으로, 이 frame 내에서 robot의 pose는 시간이 지남에 따라 drift되어 따라서 장기적으로 사용하기에는 어려움이 있으나 연속적인 frame이므로 frame 내의 robot의 pose가 discrete한 jump없이 부드럽게 회전한다.
- 보통 바퀴나 visual, 혹은 inertial 측정 unit으로 부터 받은 odometry source를 통해 odom frame이 계산된다
- Odometry : 주행기록계라는 뜻으로 시간에 따른 위치 변화를 추정하는 개념으로, GPS와 같은 절대적 위치가 아닌 출발 지점으로부터의 상대적인 위치를 추정한다.
- Motor의 Encoder의 회전수를 통해 거리를 측정하고, IMU센서를 통해 기울기를 측정하여 로봇의 위치 추정한다
- map : odom과 마찬가지로 world-fixed frame으로, Z축이 위쪽을 향한다. 이 frame에서의 robot의 pose는 시간이 지나도 drift되어서는 안된다. 불연속적인 frame이라 frame 내의 robot의 pose는 어느때나 discrete하게 jump될 수 있다.
- 보통 localization component가 계속적으로 sensor 측정 값을 토대로 robot의 pose를 계산하므로 drift를 없애나 새로운 sensor의 정보가 입력되면 discrete한 jump가 발생한다
- 장기적으로 사용하기 유용하나 position estimator에서 discrete한 jump로 인해 local sensing과 acting의 성능을 저하시킨다
- base_footprint : 높이 정보를 제외한 robot의 2D pose를 나타낸다 (위치, 방향)
- base_stabilized : map/odom layer와 관련된 robot의 높이 정보를 나타낸다
$ cd ~/catkin_ws/src
$ git clone https://github.com/tu-darmstadt-ros-pkg/hector_slam.git
- Hector Slam package를 clone
$ cd ~/catkin_ws/src/hector_slam/hector_mapping/launch/mapping_default.launch
- Hector_SLAM의 hector_mapping node의 launch file을 염
- odom frame 없이 mapping을 진행 할 것이므로 transformation을 map->base_link로 바로 publish함 (line 5~6)
- tf parameter 수정 (lline 54)
$ cd ~/catkin_ws/src/hector_slam/hector_slam_launch/launch
$ gedit tutorial.launch
- hector_slam_launch directory로 이동하여 tutorial.launch 파일 실행
- use_sim_time 사용 X
$ cd ~/catkin_ws
$ catkin_make
- 위 과정 수행 후 package compile
- Melodic 버전에선 위와 같은 오류가 발생함
$ cd /usr/include
$ sudo ln -s opencv4/ opencv
$ cd ~/catkin_ws
$ catkin_make
- 위 오류를 해결하기 위해 opencv4를 설치하고 package를 다시 build
- 오류 해결
$ cd ~/catkin_ws
$ sudo chmod 666 /dev/ttyUSB0
$ roslaunch rplidar_ros rplidar.launch
- Port 권한 부여 후
- Raspberry Pi에서 RPLidar 실행
$ roslaunch hector_slam_launch tutorial.launch
- 노트북에서 Hector SLAM 실행
- 위 명령어는 아래 3개의 node들을 launch함
- hector_mapping : odometry 없이 SLAM을 수행할 수 있게 함
- hector_trajectory_server : tf data로부터 extracted된 tf의 이동경로를 추적하고 해당 data를 service와 topic을 통해 접근 할 수 있게 함
- hector_geotiff : occupancy grid map를 저장하고 robot의 trajectory 및 관심 객체 data를 RoboCup Rescue 호환 GeoTiff image에 저장하는데 사용할 수 있는 node를 제공함
- occupancy grid map은 자료가 격자의 형태로 전달되어지는 지도를 말한다
- Lidar를 들고 매우 천천히 움직여 map을 생성한다
- Map 저장 방식 1)
$ rostopic pub syscommand std_msgs/String "savegeotiff"
- Mapping 완료 후 CTRL + C 키를 눌러 종료시키고 아래 명령 입력
$ Go to ~/catkin_ws/src/hector_slam/hector_geotiff/maps.
- 아래 그림처럼 생성된 map(hector_slam_map_14:34:07.tfw)을 확인할 수 있다
- Map 저장 방식 2) : map_server package를 통해 map 저장. (map data를 yaml과 pgm format file로 저장)
$ sudo apt-get install ros-noetic-map-server
- map_server package install
$ mkdir ~/catkin_ws/maps
- catkin workspace에 map을 저장할 folder 생성
- 위에서 했던대로 RPLidar, Hector SLAM node를 launch하여 mapping 진행
$ cd ~/catkin_ws/maps
$ rosrun map_server map_saver -f my_map
- map directory로 이동 후 map_server node를 실행시켜 map 저장
- 'my_map'은 이름 예시
- my_map.pgm과 my_map.yaml 파일이 생성됨
$ roscore
- ROS Master 실행
$ cd ~/catkin_ws/maps
$ rosrun map_server map_server my_map.yaml
- 새로운 terminal 창에서 map directroy로 이동 후 위 명령어 실행
$ rviz
- rviz 실행 후 왼쪽 아래의 'Add'를 클릭하여 Map Display를 추가함
- Topic창의 Map의 하위 목록에 있는 /map 선택
- rviz 창에서 앞서 저장한 map을 볼 수 있음
- 저장한 map을 png format으로 변환
$ sudo apt-get install imagemagick
$ convert my_map.pgm my_map.png
- Map을 png 이미지 file로 변환하기 위해 imagemagick 설치 후 실행
- my_map.png 파일이 생성됨
$ sudo apt-get update
$ sudo apt-get install gimp
- Map을 수정하기 위해 gimp 설치
$ gimp
- gimp 실행
- Remote PC(노트북)의 bashrc
https://razbotics.wordpress.com/2018/01/23/ros-distributed-systems/
https://automaticaddison.com/how-to-build-an-indoor-map-using-ros-and-lidar-based-slam/
http://jinyongjeong.github.io/2017/02/21/lec10_Grid_map/
http://wiki.ros.org/hector_slam/Tutorials/SettingUpForYourRobot
'Project > KUSMO' 카테고리의 다른 글
[KUSMO] 1/20 (Jetson Nano Developer Kit 2GB 설정법) (0) | 2023.01.20 |
---|---|
[KUSMO] 1/8 (LN298N, USB Port 설정, 아두이노 stray ‘\302’ in program 에러) (0) | 2023.01.08 |
[KUSMO] 11/22 (ssh-Platform IO) (0) | 2022.11.23 |
[KUSMO] 11/20 (Raspberry Pi WiFi, Platform IO) (1) | 2022.11.20 |
[KUSMO] 11/19 (Motor Encoder Data Publisher) (0) | 2022.11.19 |