赞
踩
参考引用
SLAM 就是为了构建地图用的,这个地图可以保存下来,用于后续的定位及导航避障中,也有一些 SLAM 作为里程计在使用,始终提供估计的位姿,目前主流 SLAM 的结构分为前端里程计,后端优化,回环检测三个大模块
x k = f ( x k − 1 , u k , w k ) x_k=f(x_{k-1}, u_k, w_k) xk=f(xk−1,uk,wk)
z k , j = h ( y j , x k , v k , j ) z_{k,j}=h(y_j, x_k, v_{k,j}) zk,j=h(yj,xk,vk,j)
SLAM(Simultaneous Localization and Mapping):给定传感器数据情况下,同时进行机器人位姿和地图估计
SLAM 条件联合概率分布
p ( x 1 : t , m ∣ z 1 : t , u 1 : t − 1 ) p(x_{1:t},m|z_{1:t},u_{1:{t-1}}) p(x1:t,m∣z1:t,u1:t−1)
Hector_Mapping 是一种无需里程计数据的 SLAM 方法,利用激光雷达获得二维姿态估计,虽然没有回环检测功能,但对于大多真实场景,它是较准确的,该系统已用于无人地面机器人/车辆、手持测绘设备、四旋翼无人机
硬件要求
必要的 TF 变换
发布的 TF 变换
ROS 中常用坐标系
本小节使用 移动机器人激光SLAM导航(二):运动控制与传感器篇 中安装的测试环境 wpr_simulation(hector_mapping 已在此环境中通过脚本安装)
$ cd ~/wpr_ws/src
$ catkin_create_pkg slam_pkg roscpp rospy std_msgs
$ code . # 在 VSCode 中编辑
<launch>
<!-- 载入机器人和 SLAM 仿真环境 -->
<!-- 如果使用实体机器人,则将下行代码替换为启动激光雷达和底盘控制的 launch 文件即可 -->
<include file="$(find wpr_simulation)/launch/wpb_stage_slam.launch" />
<!-- Hector SLAM 节点 -->
<node pkg="hector_mapping" type="hector_mapping" name="hector_mapping" />
<!-- rviz 显示 -->
<!-- 其中 args 是运行该 launch 文件并在 rviz 中添加相关选项后保存的配置文件 -->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find slam_pkg)/rviz/slam.rviz" />
<!-- 机器人运动控制节点 -->
<node pkg="rqt_robot_steering" type="rqt_robot_steering" name="rqt_robot_steering" />
</launch>
$ cd ~/wpr_ws
$ catkin_make
$ source devel/setup.bash
$ roslaunch slam_pkg hector.launch
~map_update_distance_thresh (double, default: 0.4)
~map_update_angle_thresh (double, default: 0.9)
~map_pub_period (double, default: 2.0)
<launch>
<include file="$(find wpr_simulation)/launch/wpb_stage_slam.launch" />
<!-- Hector SLAM 节点 -->
<node pkg="hector_mapping" type="hector_mapping" name="hector_mapping">
<param name="map_update_distance_thresh" value="0.1" />
<param name="map_update_angle_thresh" value="0.1" />
<param name="map_pub_period" value="0.1" />
</node>
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find slam_pkg)/rviz/slam.rviz" />
<node pkg="rqt_robot_steering" type="rqt_robot_steering" name="rqt_robot_steering" />
</launch>
其他参数请参考 Hector_Mapping ROS-Wiki
<launch>
<!-- 第一个 Hector_Mapping 建图节点 -->
<group ns="slam_1">
<node pkg="hector_mapping" type="hector_mapping" name="hector_mapping_1">
<param name="map_update_distance_thresh" value="0.5"/>
<param name="map_update_angle_thresh" value="0.5" />
<param name="map_pub_period" value="0.2" />
<param name="map_frame" value="slam_1/map" />
<param name="base_frame" value="slam_1/base_footprint" />
<param name="odom_frame" value="slam_1/odom" />
</node>
</group>
<!-- 第二个 Hector_Mapping 建图节点 -->
<group ns="slam_2">
<node pkg="hector_mapping" type="hector_mapping" name="hector_mapping_2">
<param name="map_update_distance_thresh" value="0.1"/>
<param name="map_update_angle_thresh" value="0.1" />
<param name="map_pub_period" value="0.2" />
<param name="map_frame" value="slam_2/map" />
<param name="base_frame" value="slam_2/base_footprint" />
<param name="odom_frame" value="slam_2/odom" />
</node>
</group>
<!-- **************************** 分割线 **************************** -->
<!-- 载入 SLAM 的仿真场景 -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find wpr_simulation)/worlds/slam_simple.world"/>
<arg name="paused" value="false"/>
<arg name="use_sim_time" value="true"/>
<arg name="gui" value="true"/>
<arg name="recording" value="false"/>
<arg name="debug" value="false"/>
</include>
<!-- 载入 1号机器人 -->
<include file="$(find wpr_simulation)/launch/wpb_slam_template.launch">
<arg name="robot_namespace" value="slam_1" />
<arg name="local_x" value="0" />
<arg name="local_y" value="-0.3" />
<arg name="local_yaw" value="0" />
</include>
<!-- 载入 2号机器人 -->
<include file="$(find wpr_simulation)/launch/wpb_slam_template.launch">
<arg name="robot_namespace" value="slam_2" />
<arg name="local_x" value="0" />
<arg name="local_y" value="0.3" />
<arg name="local_yaw" value="0" />
</include>
<!-- 运动控制 -->
<node pkg="rqt_robot_steering" type="rqt_robot_steering" name="rqt_robot_steering"/>
<!-- 速度话题分流 -->
<node pkg = "topic_tools" type = "relay" name = "relay_1" args="/cmd_vel /slam_1/cmd_vel" />
<node pkg = "topic_tools" type = "relay" name = "relay_2" args="/cmd_vel /slam_2/cmd_vel" />
</launch>
地面移动机器人在地图中的位姿描述方式(x, y, yaw)
ROS 中通过 TF(TransForm,坐标系变换) 来获取机器人具体的定位/位姿数值
案例测试
# 利用 2.4 小节创建的 hector 建图包
$ cd ~/wpr_ws
$ source devel/setup.bash
$ roslaunch slam_pkg hector.launch
$ rostopic type /tf
tf2_msgs/TFMessage
查看 /tf 话题数值
$ rostopic echo /tf
...
---
transforms:
-
header:
seq: 0
stamp:
secs: 780
nsecs: 481000000
frame_id: "map"
child_frame_id: "scanmatcher_frame"
transform:
translation:
x: 2.27857303619
y: 1.645611763
z: 0.0
rotation:
x: 0.0
y: 0.0
z: -0.352547165132
w: 0.935794045908
...
查看 TF 关系树
$ rosrun rqt_tf_tree rqt_tf_tree
本小节使用 移动机器人激光SLAM导航(二):运动控制与传感器篇 中安装的测试环境
$ cd ~/wpr_ws
$ source devel/setup.bash
$ roslaunch wpr_simulation wpb_corridor_hector.launch
$ cd ~/wpr_ws
$ source devel/setup.bash
$ roslaunch wpr_simulation wpb_corridor_gmapping.launch
更直观化的里程计演示请查看视频 什么是里程计
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。