본문 바로가기
Robot/ROS

20강 ROS SLAM

by 9루트 2022. 3. 16.

1. SLAM Introduction

카메라 센서를 이용하여 3개의 점으로 위치를 찾자

천장에 AR 마커를 놓고 사용하는 방식을 쓴다.(천장의 높이가 일정하므로)

 

 

1. SLAM이란

동시적 로컬라이제이션과 맵핑

새롭게 무인도를 탐험하면서 지도를 생성하는 것.면

 

목표: 지도를 만들어 지속적으로 사용하자

 

2. SLAM의 문제점

1) 어떤 지도를 그릴 것인가

약도 형태로 간략하게 그려서 추정할 것인가. 아니면 완전한 3D그래픽으로 그릴 것인가.

얼마의 크기로 지도를 만들 것인가.

주변 환경 센싱 및 자기 위치 추정을위한 센서의 노이즈

주변 환경의 반복성 및 인식 모호성 -> 복도, 숲 등에서 쉽지 않다. 복도는 특징을 잡기 어렵다.

 

2) Grid Map

가장 많이 쓰는 2차원 맵 - 복잡하다. 확률 계산도 어렵다.

 

3) localization 과 mapping을 동시에 하기가 어렵다. - chicken & egg problem

-> 내 처음 위치(0, 0)를 어느 정도 가정하고 매핑을 시작한다

 

3. SLAM 방식

1) 실내 데이터를 오도메트리(IMU) 정보를 이용하여 매핑하는 방법

정확하지 않다. 다른 센서 데이터로 보정을 해주어야 한다.

 

2) 카메라와 라이다를 이용한 매핑 방법

라이다는 주변 환경에 영향을 덜 받는다.

카메라는 주변 환경에 영향을 잘 받으나,

라이다 보다는 카메라 센서가 더 앞으로 유망하다.

-> 카메라는 훨씬 많은 정보를 담고 있으므로 라이다보다 활용도가 높다.

테슬라 : 카메라 가지고 다 하겠다. 라이다 필요 없다....

실내 자율주행은 거의 끝난 영역이다. - 라이다로 자율주행하는 기술은 모두 구현됨. 아마 비싼 라이다 말고 카메라로 자율주행하도록 할 것 같음.

2D, 3D라이다는 거의 끝난 영역이라고 할 수 있다.

 

CARTOGRAPHER ROS

SLAM 가이드

 

 

LEGO-LOAM은 유행이 조금 지남

 

LIO-SAM 이 가장 최신 기술 - 3차원 라이다 기술은

 

LIO-SAM 논문이 나온지 꽤 됐다 2020년에 나옴

 

 

 

 

 

VISUAL SLAM은 발전이 빠르지만 대중화가 잘 안됨. - 형태로 물체를 구분할 수 있다.

 

feature map : 특징으로만 지도를 만듦용 - ORB 슬램 (영상의 특징을 잡는다.)이 가장 유명

 

STEREO DISO = 카메라에 나오는 점들을 모두 활용한다. 라이다와 비슷한 결과를 낸다.

 

KIMERA SLAM = SEMANTIC SLAM: 이미지 그대로 활용하지 않고, 실내 물체를 구분한다.

 

최신 슬램은 층과 방을 구분해준다.

 

 


 

1. Grip Map이란

셀로 나눠서 Occupied Space(검은색), Free Space(흰색), Unkown Space(회색)으로 구분한다.

Feature map이 아닌 전체 센서 데이터 모두를 저장하는 방식으로 상당히 많은 메모리를 사용한다.

feature map이 아니므로 feature detector에 의존하지 않음

 

이차원에서는 특징을 잡기 어렵고,  굳이 feature를 잡을 필요가 없다.

 

 

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

 

오 괜찮은 사이트 같다.

 

2. Occupancy Grid Mapping 방식과 LOcalization을 동시에 진행한다.

1) Occupancy Grid Mapping

확률을 이용한다.

사람이라는 물체를 지도에 찍어야 할까? 사람이라는 정보를 로봇에게 알려주기도 어렵다.

특정 물체이 존재한다고  센서 데이터에 계속 채워져 있을 때 확률적으로  높게 측정하여 검은색 영역으로 색칠한다.

 

2) 칼만 필터

타원을 가지고 설명한다. 공분산을 타원으로 이용하여 물체가 여기에 존재할 확률을 나타낸다. 타원이 클수록 물체 위치에 대한 불확실성이 크다.

칼만 필터는 물체 양이 많아질수록 계산량이 너무 많다는 한계가 있다.

계산 성능이 많이 빨라지면 다시 칼만 필터로 돌아갈 것 같다.

 

3) 파티클 필터

지속적으로 쓸 것 같음

 

4) MAP Estimation 기반의 슬램 = cartographer

최적화 기반 슬램으로 넘어왔다.

 

 

나는 슬램에 관심이 딱히 없다... 다만 안드로이드 로봇의 가정 상용화에 기여하고 싶을 뿐이다.

딥러닝을 배워야겠지.

 

 


2. 슬램 패키지

 

1. GMAPPING

성능이 좋다.

http://wiki.ros.org/gmapping

 

gmapping - ROS Wiki

kinetic melodic noetic   Show EOL distros:  EOL distros:   electric fuerte groovy hydro indigo jade lunar diamondback: Only showing information from the released package extracted on Unknown. No API documentation available. Please see this page for in

wiki.ros.org

Subscribed Topics

tf (tf/tfMessage)

  • Transforms necessary to relate frames for laser, base, and odometry (see below)

scan (sensor_msgs/LaserScan)

  • Laser scans to create the map from

Required tf Transforms

<the frame attached to incoming scans> → base_link

base_link → odom

  • usually provided by the odometry system (e.g., the driver for the mobile base)

GMAPPING은 Odometry 정보)로 움직임 데이터를 만든다.

오도메트리 데이터와 라이다 데이터가 필요하다.

 

사람이 직접 손으로 들고 슬램을 하는 경우

아래 처럼 hector_slam을 이용한다. -> 오도메트리 필요없고 오로지 라이다 만 필요하다. 최적화 방식이긴 하다.

대신 단점이 있다.

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwi4gNvTx8n2AhWV_WEKHdj6BhgQFnoECAkQAQ&url=http%3A%2F%2Fwiki.ros.org%2Fhector_slam&usg=AOvVaw2bZeems7PjEKgYtcX16bhn 

 

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwi4gNvTx8n2AhWV_WEKHdj6BhgQFnoECAkQAQ&url=http%3A%2F%2Fwiki.ros.org%2Fhector_slam&usg=AOvVaw2bZeems7PjEKgYtcX16bhn

 

www.google.com

cyrill stachniss 구독하기 - 스램에 대한 내용을 다룬다.

slam kr 유튜브 구독하기

 

 

map 방식 사용

cartographer

karto

 

toolbot slam - stevem~

 

슬램에 쓰이는 용어

loop detection (순환 검출)어 - 이전에 왔던 곳인지 아닌지 검출한다.

 

 

가장 최신은 역시 LIO-SAM!

LOAM은 LOOP CLOSING이 없기 때문에 오차가 심하지만

LIO-SAM은 루프 클로징 즉 순환 검출로 오차가 적다.

 

슬램에서 사용하는 라이브러리

GT SAM - 슬램 라이브러리

G2O - GRAPH 최적화

CERES SOLVER

-> 이렇게 실시간 비선화 최적화를 해주는 SOLVER가 나오면서 슬램 최적화 방식이 가능하였다.

 

 

 

★ 미션

Simulator를 연결해서, Hector SLAM 돌리기

1) ~/catkin_ws/src/hector_slam/ hector_mapping/launch/mapping_default.launch 수정
2) ~/catkin_ws/src/hector_slam/ hector_slam_launch/launch/tutorial.launch 실행 지도를 그리기
3) $ cd ~/catkin_ws $ rosrun map_server map_saver -f "Hector_Map"

 

 

 

만약 깃허브를 클론하고 catkin build 한 후

Errors     << hector_geotiff:cmake /home/kw-cobot/catkin_ws/logs/hector_geotiff/build.cmake.002.log   
qmake: could not exec '/usr/lib/x86_64-linux-gnu/qt4/bin/qmake': No such file or directory
CMake Error at /usr/share/cmake-3.10/Modules/FindQt4.cmake:1320 (message):
  Found unsuitable Qt version "" from NOTFOUND, this code requires Qt 4.x
Call Stack (most recent call first):
  CMakeLists.txt:12 (find_package)

이런 에러가 뜬다면

 

kw-cobot@kwcobot-HGDT-Series:~/catkin_ws$ rosdep install --from-paths src --ignore-src -y

를 해보면 없어진다.

[build]   Failed:    None.   

후훗.

 

기존 mapping_default.launch

<?xml version="1.0"?>

<launch>
  <arg name="tf_map_scanmatch_transform_frame_name" default="scanmatcher_frame"/>
  <arg name="base_frame" default="base_footprint"/>
  <arg name="odom_frame" default="nav"/>
  <arg name="pub_map_odom_transform" default="true"/>
  <arg name="scan_subscriber_queue_size" default="5"/>
  <arg name="scan_topic" default="scan"/>
  <arg name="map_size" default="2048"/>
  
  <node pkg="hector_mapping" type="hector_mapping" name="hector_mapping" output="screen">
    
    <!-- Frame names -->
    <param name="map_frame" value="map" />
    <param name="base_frame" value="$(arg base_frame)" />
    <param name="odom_frame" value="$(arg odom_frame)" />
    
    <!-- Tf use -->
    <param name="use_tf_scan_transformation" value="true"/>
    <param name="use_tf_pose_start_estimate" value="false"/>
    <param name="pub_map_odom_transform" value="$(arg pub_map_odom_transform)"/>
    
    <!-- Map size / start point -->
    <param name="map_resolution" value="0.050"/>
    <param name="map_size" value="$(arg map_size)"/>
    <param name="map_start_x" value="0.5"/>
    <param name="map_start_y" value="0.5" />
    <param name="map_multi_res_levels" value="2" />
    
    <!-- Map update parameters -->
    <param name="update_factor_free" value="0.4"/>
    <param name="update_factor_occupied" value="0.9" />    
    <param name="map_update_distance_thresh" value="0.4"/>
    <param name="map_update_angle_thresh" value="0.06" />
    <param name="laser_z_min_value" value = "-1.0" />
    <param name="laser_z_max_value" value = "1.0" />
    
    <!-- Advertising config --> 
    <param name="advertise_map_service" value="true"/>
    
    <param name="scan_subscriber_queue_size" value="$(arg scan_subscriber_queue_size)"/>
    <param name="scan_topic" value="$(arg scan_topic)"/>
    
    <!-- Debug parameters -->
    <!--
      <param name="output_timing" value="false"/>
      <param name="pub_drawings" value="true"/>
      <param name="pub_debug_output" value="true"/>
    -->
    <param name="tf_map_scanmatch_transform_frame_name" value="$(arg tf_map_scanmatch_transform_frame_name)" />
  </node>
    
  <!--<node pkg="tf" type="static_transform_publisher" name="map_nav_broadcaster" args="0 0 0 0 0 0 map nav 100"/>-->
</launch>

중에서

이 3 줄만 고치면 된다.

  <arg name="base_frame" default="base_link"/>
  <arg name="odom_frame" default="base_link"/>
  <arg name="pub_map_odom_transform" default="true"/>
  <arg name="scan_subscriber_queue_size" default="5"/>
  <arg name="scan_topic" default="lidar2D"/>
  <arg name="map_size" default="2048"/>

 

 

 

2) ~/catkin_ws/src/hector_slam/ hector_slam_launch/launch/tutorial.launch

에서

  <param name="/use_sim_time" value="true"/>

을 아래로 고치자.

  <param name="/use_sim_time" value="false"/>

use_sim_time 은 주로 rosbag로 실행할 때 쓴다.

우리는 simulator를 이용하므로 false로 전환해주고 한다.

 

 

kw-cobot@kwcobot-HGDT-Series:~$ rosrun rqt_tf_tree rqt_tf_tree

 

launch 파일의 3줄만 고치면 아래 처럼 tf_tree가 변경된다.

map과 base_link가 연결된다.

 

 

참고

https://doongdoongeee.tistory.com/104

 

 

RPLIDAR A3 실행(Hector SLAM In ROS)

1. Work Space 생성   우선 Work Space를 생성해준다. $ mkdir catkin_ws && mkdir catkin_ws/src 2. 패키지 다운로드   위에서 생성한 src 디렉토리에서 rplidar 와 Hector_SLAM 패키지를 다운받아준다. $ git..

doongdoongeee.tistory.com

 

 

 


문제

 

바깥 검정점 없애기 = 10M이내만 표시하기

 

방법1) laserfilter 사용

특정거리까지 잘라낸다.

laser scan을 point cloud를 바꿨을 때

sout_odom/lidar_sub.py

- rostopic echo lidar2D 했을 때 10을 없앤다.

 

방법2) slam 알고리즘에서 10미터 이상은 나오지 않게 해야 한다.

 

~map_multi_res_levels (int, default: 3)

  • The number of map multi-resolution grid levels.

 

2로 쓰고 있는 중

2^1 -> 2^2 -> 2^3 ... 이렇게 해상도를 낮추면서 비교한다.

근처에서 확대해서 비교한다

value 값을 작게 할 수록 해상도가 낮아진다.

    <!-- Map size / start point -->
    <param name="map_resolution" value="0.050"/>
    <param name="map_size" value="$(arg map_size)"/>
    <param name="map_start_x" value="0.5"/>
    <param name="map_start_y" value="0.5" />
    <param name="map_multi_res_levels" value="2" />
    <!-- Map size / start point -->
    <param name="map_resolution" value="0.10"/>
    <param name="map_size" value="$(arg map_size)"/>
    <param name="map_start_x" value="0.5"/>
    <param name="map_start_y" value="0.5" />
    <param name="map_multi_res_levels" value="5" />

 

http://wiki.ros.org/hector_mapping

 

hector_mapping - ROS Wiki

kinetic melodic noetic   Show EOL distros:  EOL distros:   electric fuerte groovy hydro indigo jade electric: Documentation generated on March 05, 2013 at 01:09 PMfuerte: Documentation generated on July 15, 2013 at 04:52 PMgroovy: Documentation genera

wiki.ros.org

에서 API 파라미터들이 무엇을 의미하는 지 꼭 파악해서 알아내자!

 

물체가 있을 확률과 없다고 판정하는 기준

값이 0.4이하로 내려오면 흰색 처리한다.

0.9이상이면 물체가 있다.

~update_factor_free (double, default: 0.4)
  • The map update modifier for updates of free cells in the range [0.0, 1.0]. A value of 0.5 means no change.
~update_factor_occupied (double, default: 0.9)
  • The map update modifier for updates of occupied cells in the range [0.0, 1.0]. A value of 0.5 means no change.

 

 

 

~laser_min_dist (double, default: 0.4)
  • The minimum distance [m] for laser scan endpoints to be used by the system. Scan endpoints closer than this value are ignored.
~laser_max_dist (double, default: 30.0)
  • The maximum distance [m] for laser scan endpoints to be used by the system. Scan endpoints farther away than this value are ignored.

이게 정답이었다...

    <!-- Map update parameters -->
    <param name="update_factor_free" value="0.4"/>
    <param name="update_factor_occupied" value="0.9" />    
    <param name="map_update_distance_thresh" value="0.4"/>
    <param name="map_update_angle_thresh" value="0.06" />
    <param name="laser_z_min_value" value = "-1.0" />
    <param name="laser_z_max_value" value = "1.0" />
    <param name="laser_max_dist" value = "9.9" />

또는

<param name="use_tf_scan_transformation" value="false"/>

로 바꿔주면 된다. (true -> false)


소스 코드 리뷰할 때

mapping > CMakeList.txt

add_excutable 부분은 꼭 보자.

실행할 때 type에 들어가는 것이 실행하는 노드 이름인데

예를들면 hector_mapping : 헥터 맵핑 이름으로 뒤에 적혀있는 애들로 실행 파일을 만들어 주세요.

 

 

main.cpp

로스에서 사용할 수 있게 인터페이스만 갈아줌

init 이랑 spin 은 같음

sm 이 같음

이제

h, cpp 파일 을 보러가자

 

cpp 파일에서

이름 같으면 생성자

 

 

 

결과

 

 

hector_slam의 가장 큰 단점은

만카메라와 IMU 없이 LIDAR 만으로 맵핑이 잘 되지만

복도와 같이 형태가 비슷한 구조인 곳에서는 앞 뒤 이동을 예측할 수 없다.

따라서 HECTOr_slam은 아주 좋은 lidar 센서를 써야 한다. 즉, 라이다 센서가 인식할 수 있는 길이가

엄청 긴 좋은 라이다 센서를 써야 한다.

 

특징적인 외형이 많은 영역이면 헥터 슬램으로 돌려봐도 좋지만

특징이 별로 없는 장소는 gmapping을 쓴다.

 

추후에 헥터 슬램에 loop closing 기능을 코드로 추가해보면 좋을 것 같다.


3. gmapping

 

http://wiki.ros.org/gmapping

 

gmapping - ROS Wiki

kinetic melodic noetic   Show EOL distros:  EOL distros:   electric fuerte groovy hydro indigo jade lunar diamondback: Only showing information from the released package extracted on Unknown. No API documentation available. Please see this page for in

wiki.ros.org

kw-cobot@kwcobot-HGDT-Series:~/catkin_ws/src$ git clone -d melodic-devel https://github.com/ros-perception/slam_gmapping.git

 

kw-cobot@kwcobot-HGDT-Series:~/catkin_ws$ catkin  build 

 

gmapping은 loop closing이 있다.

 

'Robot > ROS' 카테고리의 다른 글

킴 - lane detector  (0) 2022.03.15
민 - ar_maker  (0) 2022.03.15
민 - ar_maker  (0) 2022.03.14
민 - [20강]  (0) 2022.03.14
킴 [이미지 처리]  (0) 2022.03.10