~/src 에 다운받은 husky 파일을 넣고
아래 명령어로 의존성 설치를 해준다.
ros와 ubuntu 버전에 맞게 설치해주면 된다.
rosdep install -i --from-path src/husky --rosdistro melodic -y --os=ubuntu:bionic
sudo apt install ros-melodic-ur-description
sudo apt install ros-melodic-lms1xx
catkin_make
roslaunch husky_navigation_launch main.launch
roslaunch husky_navigation_launch keyboard_teleop.launch
roslaunch husky_navigation_launch main.launch
roslaunch husky_navigation amcl_demo.launch
rviz
rviz > add > Map > topic > /map
rviz > add > Laserscan
rviz > add > RobotModel
rviz > add > PoseArray
roslaunch husky_navigation_launch keyboard_teleop.launch
로봇을 점점 움직일수록 화살표들 (불확실성) 이 로봇 쪽으로 모이는 것을 확인할 수 있다.
.
.
로봇은 다음에 어디로 이동할지 무작위로 추정 = particle
Lidar와 같은 sensor 값을 바탕으로 가능성이 낮은 영역을 배제하면서 particle은 가장 로봇이 있을만한 위치로 수렴하게 된다.
로봇이 움직일수록 화살표가 로봇쪽으로 모였던 이유는
움직이면서 sensor를 통해 더 많은 값을 얻을 수 있으므로 위치파악이 더 정확해진 것이다.
roslaunch husky_navigation amcl_demo.launch
2D pose estimate를 통해 초기 로봇 위치 설정
로봇을 움직이기 및 시각화
mkdir ~/sim_ws/src/husky/husky_launch/scripts
code ~/sim_ws/src/husky/husky_launch/scripts/get_pose_service.py
<get_pose_service.py>
#! /usr/bin/env python3
import rospy
from std_srvs.srv import Empty, EmptyResponse # Import the service message python classes generated from Empty.srv.
from geometry_msgs.msg import PoseWithCovarianceStamped, Pose
robot_pose = Pose()
def service_callback(request):
rospy.loginfo("Robot Pose: " + str(robot_pose))
return EmptyResponse() # the service Response class, in this case EmptyResponse
def sub_callback(msg):
global robot_pose
robot_pose = msg.pose.pose
rospy.init_node('get_pose_service')
my_service = rospy.Service('get_pose_service', Empty, service_callback) # create the Service called get_pose_service with the defined callback
sub_pose = rospy.Subscriber('amcl_pose', PoseWithCovarianceStamped, sub_callback)
rospy.spin() # mantain the service open.
rosrun husky_launch get_pose_service.py
rqt or rosservice call /get_pose_service "{}"
rqt > plugins > service > service caller > /get_pose_service 선택 후 call
rqt 상에서도 가능하고 terminal에서 명령어를 쳐도 가능하다.
map상에서 로봇의 좌표가 terminal 상에서 출력되는 것을 이야기한다.
.
.
.
.
code /home/yujin/sim_ws/src/husky/husky_launch/my_amcl.launch
<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>
code ~/sim_ws/src/husky/husky/husky_navigation/config/amcl_params.yaml
<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
roslaunch husky_navigation_launch main.launch
roslaunch husky_launch my_amcl.launch
나는 이렇게 해도 particle이 보이지 않았다... 아직 해결하지 못함
로봇의 위치를 알려줄 수 없을 때 (2D pose estimate로 지정 불가)
global_localization을 통해서 할 수 있다.
code ~/sim_ws/src/husky/husky_launch/scripts/init_particles_caller.py
<init_particles_caller.py>
#! /usr/bin/env python3
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
흩어진 불확실성 particle들이 로봇을 움직여주면 robot의 위치로 모두 모이는 것을 확인할 수 있다.
map과 scan 데이터가 어느정도 matching되면 로봇의 위치를 잘 추정했다고 생각하는 방식이다.
문제는 만약 환경이 우리가 사용하는 환경처럼 직사각형 모양이라면 위아래가 뒤집혀도
map과 scan 데이터가 matching 되므로 로봇의 위치를 잘 추정했다고 생각할 수 있다는 것이다.
따라서 환경의 특징이 매우 뚜렷하다면 global localization을 사용하기 좋지만
그렇지 않다면 위치 추정에 실패할수도 있음을 기억해두어야 한다.
.
.
hint
- amcl과 관련된 서비스를 호출하려면 amcl 노드가 실행중이어야 함
- 파티클의 공분산은 /amcl_pose 토픽을 통해 확인할 수 있음
- 파티클 공분산은 행렬형태로 publish
(첫번째 값은 x의 공분산, 8번째 값은 y의 공분산, 마지막 값은 z의 공분산