지난번에 로봇이 자율주행 하기 위해서 필요한 Mapping 이라는 요소를 알아보았다.
이번에는 Localization에 대해서 알아보고 어떤식으로 동작하는지 알아보자.
아래의 사진은 이번에 사용할 로봇 모델 husky.
rviz 에서 depth 카메라 및 AMCL을 사용해서 localization 을 어떤식으로 하는지,
AMCL 노드의 경우 여러가지 파라미터를 수정 할 수 있는데, 각종 파라미터를 변경해보고 결과를 확인해보자.
기존에 사용하던 cafe 맵에 husky 로봇을 소환하였다.
rviz에서 depth 카메라를 확인 할 수 있다.
로봇 앞에 원통의 장애물을 두었을때 아래의 사진과 같이 기본 사진(좌측 하단)과, depth를 파악한 사진(좌측 상단)을 확인 할 수 있다.
AMCL은 적응형 몬테카를로 로컬라이제이션으로 센서의 값과 map data를 바탕으로 로봇의 위치를 추정하는 기법이다.
아래의 실행화면을 보면 로봇근처에 수많은 화살표를 볼 수 있다.
데이터를 취합해서 로봇이 위치할 수 있는 확률이 있는 곳에 표현하게 된다.
하나의 화살표를 파티클이라고도 한다.
map의 데이터가 정확하고 로봇을 움직일 수록 화살표가 한점으로 모이게 된다.
.yaml
파일을 통해 amcl
의 파라미터를 변경할 수 있다.
아래와 같이 런치 파일 및 .yaml
코드를 작성하였다.
🚀my_amcl.launch
<?xml version="1.0"?>
<launch>
<arg name="scan_topic" default="scan" />
<arg name="map_file" default="$(find husky_navigation)/maps/my_map.yaml" />
<node name="map_server" pkg="map_server" type="map_server" args="$(arg map_file)" />
<!-- AMCL Node -->
<node pkg="amcl" type="amcl" name="amcl">
<rosparam file="$(find husky_navigation)/config/amcl_params.yaml" command="load" />
<remap from="scan" to="$(arg scan_topic)" />
</node>
<!-- Visulization -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find husky_navigation)/rviz/amcl.rviz"/>
</launch>
🗒amcl_params.yaml
use_map_topic: true
odom_model_type: diff
odom_frame_id: odom
gui_publish_rate: 10.0
min_particles: 500
max_particles: 2000
kld_err: 0.05
update_min_d: 0.25
update_min_a: 0.2
resample_interval: 1
transform_tolerance: 1.0
laser_max_beams: 60
laser_max_range: 1.0
laser_z_hit: 0.5
laser_z_short: 0.05
laser_z_max: 0.05
laser_z_rand: 0.5
기존의 설정 값보다 매우 적은 파티클을 확인 할 수 있다.
이렇게 되면 로봇의 위치파악이 훨씬 더 어려워 진다고 할 수 있다.
그러면 화살표가 많으면 좋을수 있지 않을까?
하지만 연산수가 늘어나기 때문에 로봇의 스펙에 맞춰서 결정하는것이 좋다.
초기화면은 동일하나 로봇을 키보드를 통해 조작하였을 경우 파티클이 뭉치지 않고,
파티클이 좀더 분산돼어 정확한 위치를 확인 할 수 없었다.
레이저 센서를 사용하여 localization 에 얼마나 중요한 지 알 수 있었다.
amcl 노드에서는 여러가지 서비스를 제공 사용할 수 있는데, 그중에는 global_localization
과 static_map
이 있다.
global_localization
은 모든 파티클이 Map의 빈공간에 무작위로 분산되는 기능이다.
무작위로 분산시키는 기능은 로봇의 위치를 제공해주지 않을 때, 센서로 주변환경의 데이터를 취합하여 amcl의 위치 추정 정보를 제공하게 된다.
static_map
은 Laser 기반 위치 추정에 사용되는 Map을 가져오는 기능을 한다. 필요한 map data를 얻을 때 사용한다.
🐍init_particles_caller.py
#! /usr/bin/env python
import rospy
from std_srvs.srv import Empty, EmptyRequest
import sys
rospy.init_node("init_particles_caller")
rospy.wait_for_service('/global_localization')
disperse_particles_service = rospy.ServiceProxy('/global_localization', Empty)
msg = EmptyRequest()
result = disperse_particles_service(msg)
rospy.loginfo(result)
월드 및 로봇을 소환하고 아래의 명령어를 통해 파이썬코드를 실행하면 아래와 같이 파티클이 퍼지는 것을 확인 할 수 있다.
로봇을 계속움직일 수록 로봇의 실제 위치와 가까운 곳에 파티클이 모이는 것을 확인 할 수 있었다.
rosrun husky_launch init_particles_caller.py