본문 바로가기

Project/KUSMO

[KUSMO] 11/23 (Raspberry Pi Master-Slave 통신, Hector SLAM, Map 저장)

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

출처 : https://www.ros.org/reps/rep-0105.html

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)을 확인할 수 있다

출처 : https://automaticaddison.com/how-to-build-an-indoor-map-using-ros-and-lidar-based-slam/#Run_rviz

 

 

 

- 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/

 

ROS on Multiple Computers | Connecting Raspberry Pi with PC over LAN

In this blog I will provide instruction for setting up Network Configuration on both of your raspberry pi and PC. In my last blog i showed the way to install ROS on raspberry pi zero , so now we ca…

razbotics.wordpress.com

https://automaticaddison.com/how-to-build-an-indoor-map-using-ros-and-lidar-based-slam/

 

How to Build an Indoor Map Using ROS and LIDAR-based SLAM – Automatic Addison

In this tutorial, I will show you how to build a map using LIDAR, ROS 1 (Melodic), Hector SLAM, and NVIDIA Jetson Nano. We will go through the entire process, step-by-step. You can combine what you will learn in this tutorial with an obstacle avoiding robo

automaticaddison.com

http://jinyongjeong.github.io/2017/02/21/lec10_Grid_map/

 

[SLAM] Occupancy Grid Maps · Jinyong

[SLAM] Occupancy Grid Maps Landmark 기반이 아닌 volumetric 기반의 grid map을 소개한다. 본 글은 University Freiburg의 Robot Mapping 강의를 바탕으로 이해하기 쉽도록 정리하려는 목적으로 작성되었습니다. 개인적

jinyongjeong.github.io

http://wiki.ros.org/hector_slam/Tutorials/SettingUpForYourRobot

 

hector_slam/Tutorials/SettingUpForYourRobot - ROS Wiki

Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags. How to set up hector_slam for your robot Descr

wiki.ros.org