[ROS] Robot Localization

Nodazi·2024년 1월 20일
0

ROS

목록 보기
20/21
post-thumbnail

🐣0.개요

지난번에 로봇이 자율주행 하기 위해서 필요한 Mapping 이라는 요소를 알아보았다.
이번에는 Localization에 대해서 알아보고 어떤식으로 동작하는지 알아보자.
아래의 사진은 이번에 사용할 로봇 모델 husky.

🗺️1.Rviz에서 Localization 사용하기

rviz 에서 depth 카메라 및 AMCL을 사용해서 localization 을 어떤식으로 하는지,
AMCL 노드의 경우 여러가지 파라미터를 수정 할 수 있는데, 각종 파라미터를 변경해보고 결과를 확인해보자.

📹2. depth 카메라

기존에 사용하던 cafe 맵에 husky 로봇을 소환하였다.
rviz에서 depth 카메라를 확인 할 수 있다.
로봇 앞에 원통의 장애물을 두었을때 아래의 사진과 같이 기본 사진(좌측 하단)과, depth를 파악한 사진(좌측 상단)을 확인 할 수 있다.

⚙️3. AMCL (Adaptive Monte Carlo Localization)

AMCL은 적응형 몬테카를로 로컬라이제이션으로 센서의 값과 map data를 바탕으로 로봇의 위치를 추정하는 기법이다.
아래의 실행화면을 보면 로봇근처에 수많은 화살표를 볼 수 있다.
데이터를 취합해서 로봇이 위치할 수 있는 확률이 있는 곳에 표현하게 된다.
하나의 화살표를 파티클이라고도 한다.


map의 데이터가 정확하고 로봇을 움직일 수록 화살표가 한점으로 모이게 된다.

3.1 AMCL 파라미터 변경해보기

.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

3.1.1 min_particle 및 max_particles를 각 1 ,5로 설정

기존의 설정 값보다 매우 적은 파티클을 확인 할 수 있다.
이렇게 되면 로봇의 위치파악이 훨씬 더 어려워 진다고 할 수 있다.
그러면 화살표가 많으면 좋을수 있지 않을까?
하지만 연산수가 늘어나기 때문에 로봇의 스펙에 맞춰서 결정하는것이 좋다.

3.1.2 laser_max_range 를 1로 변경하기

초기화면은 동일하나 로봇을 키보드를 통해 조작하였을 경우 파티클이 뭉치지 않고,
파티클이 좀더 분산돼어 정확한 위치를 확인 할 수 없었다.
레이저 센서를 사용하여 localization 에 얼마나 중요한 지 알 수 있었다.
이동 전

이동 후

3.2 global_localization

amcl 노드에서는 여러가지 서비스를 제공 사용할 수 있는데, 그중에는 global_localizationstatic_map 이 있다.
global_localization은 모든 파티클이 Map의 빈공간에 무작위로 분산되는 기능이다.
무작위로 분산시키는 기능은 로봇의 위치를 제공해주지 않을 때, 센서로 주변환경의 데이터를 취합하여 amcl의 위치 추정 정보를 제공하게 된다.
static_map 은 Laser 기반 위치 추정에 사용되는 Map을 가져오는 기능을 한다. 필요한 map data를 얻을 때 사용한다.

3.2.1 global_localization 호출코드

🐍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)

3.2.2 global_localization 실행화면

월드 및 로봇을 소환하고 아래의 명령어를 통해 파이썬코드를 실행하면 아래와 같이 파티클이 퍼지는 것을 확인 할 수 있다.
로봇을 계속움직일 수록 로봇의 실제 위치와 가까운 곳에 파티클이 모이는 것을 확인 할 수 있었다.

rosrun husky_launch init_particles_caller.py

profile
GoGoSing

0개의 댓글

관련 채용 정보