上海网站优化公司,石家庄最新封闭小区消息,东莞网站建设中企动力技术支持,天津网站建设制作品牌公司参考引用 Hector_Mapping ROS-Wiki从零开始搭二维激光SLAM机器人工匠阿杰wpr_simulation 移动机器人激光SLAM导航#xff08;文章链接汇总#xff09;
1. 基于滤波器的 SLAM 问题
1.1 什么是 SLAM 什么是SLAM SLAM 就是为了构建地图用的#xff0c;这个地图可以保存下来文章链接汇总
1. 基于滤波器的 SLAM 问题
1.1 什么是 SLAM 什么是SLAM SLAM 就是为了构建地图用的这个地图可以保存下来用于后续的定位及导航避障中也有一些 SLAM 作为里程计在使用始终提供估计的位姿目前主流 SLAM 的结构分为前端里程计后端优化回环检测三个大模块 前端里程计始终累加位姿作为里程计使用后端优化使用图的结构模型优化整体位姿减小前端里程计产生的累计误差回环检测可以提供一个更强烈的图结构的约束能够更好的减小累计误差
1.2 SLAM 问题的数学表述
运动方程提供对状态 x x x 的先验 x k − 1 x_{k-1} xk−1正向推理 其中 x x x 位姿 k − 1 / k k-1/k k−1/k 时刻 u u u 控制器输入/运动测量 w w w 噪声 x k f ( x k − 1 , u k , w k ) x_kf(x_{k-1}, u_k, w_k) xkf(xk−1,uk,wk)
观测方程提供对状态 x x x 的后验 x k x_k xk由果溯因 其中 z z z 传感器读数 y y y 路标 j j j 路标编号 v v v 噪声 z k , j h ( y j , x k , v k , j ) z_{k,j}h(y_j, x_k, v_{k,j}) zk,jh(yj,xk,vk,j)
已知量上一时刻位姿 x k − 1 x_{k-1} xk−1控制器输入/运动测量 u k u_k uk当前时刻对路标 j j j 的观测 z k , j z_{k,j} zk,j估计量当前时刻机器人位姿 x k x_k xk定位路标 j j j 的位置 y j y_j yj建图
1.3 SLAM 概率模型 SLAMSimultaneous Localization and Mapping给定传感器数据情况下同时进行机器人位姿和地图估计 得到一个精确的位姿需要与地图进行匹配得到一个良好的地图需要有精确的位姿 SLAM 条件联合概率分布 1 : t 1:t 1:t 表示从起始到 t 时刻 z 1 : t z_{1:t} z1:t 表示传感器观测数据如 /scan u 1 : t u_{1:t} u1:t 表示里程计测量数据如 /odom m m m 表示地图 x 1 : t x_{1:t} x1:t 表示机器人轨迹/位姿估计定位 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)
2. Hector_Mapping
2.1 简介 Hector_Mapping 是一种无需里程计数据的 SLAM 方法利用激光雷达获得二维姿态估计虽然没有回环检测功能但对于大多真实场景它是较准确的该系统已用于无人地面机器人/车辆、手持测绘设备、四旋翼无人机 硬件要求 需要高精度的激光扫描仪SICK、hokuyo 等扫描周围环境时节点会使用 TF 变换因此无需将雷达固定并且不需要里程计数据
2.2 话题节点
订阅的话题Topic scan (sensor_msgs/LaserScan)订阅 2D 激光雷达扫描数据syscommand (std_msgs/String)如果字符串等于 “reset”则地图和机器人姿态将重置为初始状态 发布的话题Topic map_metadata (nav_msgs/MapMetaData)发布 Meta 地图数据存储地图描述信息map (nav_msgs/OccupancyGrid)发布占据栅格地图数据slam_out_pose (geometry_msgs/PoseStamped)原始的机器人位姿无协方差poseupdate (geometry_msgs/PoseWithCovarianceStamped)校正后的机器人位姿具有不确定性的高斯估计 Service dynamic_map (nav_msgs/GetMap)获取地图数据reset_map (std_srvs/Trigger)调用这个服务来重置地图Hector_Mapping 将从头开始一张全新的地图。注意这不会重新启动机器人的姿势而是会从上次记录的姿势重新开始pause_mapping (std_srvs/SetBool)调用此服务来停止/开始处理激光扫描restart_mapping_with_new_pose (hector_mapping/ResetMapping)调用此服务来重置地图、机器人的姿势并恢复建图如果暂停
2.3 TF 变换 必要的 TF 变换 scan frame → base_frame通常为固定值激光雷达坐标系 与 基坐标系 之间的变换一般由 robot_state_publisher 或 static_transform_publisher 发布 发布的 TF 变换 map → odom地图坐标系 与 里程计坐标系 之间的变换估计机器人在地图中的位姿仅在参数 “pub_map_odom_transform” 为 true 时提供 ROS 中常用坐标系 map地图坐标系也被称为世界坐标系是静止不动的odom里程计坐标系相对于 map 来说一般是静止的有些情况下会变动定位节点为了修正机器人的位姿从而改变了 map-odom 间的坐标变换base_footprint位于机器人底盘中心在地面的投影不提供高度信息代表机器人的 2D 位姿base_link位于机器人几何中心与机器人刚性连接相对于 base_stabilized 坐标系增加了横滚角和俯仰角base_stabilized坐标系添加了机器人相对于 map/odom 层的高度信息对于没有横滚/俯仰运动的平台base_stabilized 等价于 base_linklaser_link激光雷达的坐标系相对于base_link来说是静止的因为雷达装在机器人上
2.4 建图测试 本小节使用 移动机器人激光SLAM导航二运动控制与传感器篇 中安装的测试环境 wpr_simulationhector_mapping 已在此环境中通过脚本安装 在 wpr_ws 工作空间新建功能包 slam_pkg$ cd ~/wpr_ws/src
$ catkin_create_pkg slam_pkg roscpp rospy std_msgs
$ code . # 在 VSCode 中编辑在 slam_pkg 中新建 launch 文件夹并在 launch 文件夹中新建 hector.launch 文件launch!-- 载入机器人和 SLAM 仿真环境 --!-- 如果使用实体机器人则将下行代码替换为启动激光雷达和底盘控制的 launch 文件即可 --include file$(find wpr_simulation)/launch/wpb_stage_slam.launch /!-- Hector SLAM 节点 --node pkghector_mapping typehector_mapping namehector_mapping /!-- rviz 显示 --!-- 其中 args 是运行该 launch 文件并在 rviz 中添加相关选项后保存的配置文件 --node pkgrviz typerviz namerviz args-d $(find slam_pkg)/rviz/slam.rviz /!-- 机器人运动控制节点 --node pkgrqt_robot_steering typerqt_robot_steering namerqt_robot_steering /
/launch编译并启动 hector.launch 建图$ cd ~/wpr_ws
$ catkin_make
$ source devel/setup.bash
$ roslaunch slam_pkg hector.launch2.5 建图参数设置 Parameters ~map_update_distance_thresh (double, default: 0.4) 地图更新的移动距离阈值 [单位米]越小则更新越快每次地图更新后机器人必须移动超过这个阈值或满足 map_update_angle_thresh 参数描述的位移角度变化才会再次更新地图 ~map_update_angle_thresh (double, default: 0.9) 地图更新的旋转角度闯值 [单位弧度]越小则更新越快每次地图更新后机器人必须转动超过这个阈值并产生超过 map_update_distance_thresh 阈值的位移才会再次更新地图 ~map_pub_period (double, default: 2.0) 地图发布的周期 [单位秒]
launchinclude file$(find wpr_simulation)/launch/wpb_stage_slam.launch /!-- Hector SLAM 节点 --node pkghector_mapping typehector_mapping namehector_mappingparam namemap_update_distance_thresh value0.1 /param namemap_update_angle_thresh value0.1 /param namemap_pub_period value0.1 //nodenode pkgrviz typerviz namerviz args-d $(find slam_pkg)/rviz/slam.rviz /node pkgrqt_robot_steering typerqt_robot_steering namerqt_robot_steering //launch其他参数请参考 Hector_Mapping ROS-Wiki 调参效果对比 wpb_hector_comparison.launch
launch!-- 第一个 Hector_Mapping 建图节点 --group nsslam_1node pkghector_mapping typehector_mapping namehector_mapping_1param namemap_update_distance_thresh value0.5/param namemap_update_angle_thresh value0.5 /param namemap_pub_period value0.2 /param namemap_frame valueslam_1/map /param namebase_frame valueslam_1/base_footprint /param nameodom_frame valueslam_1/odom //node/group!-- 第二个 Hector_Mapping 建图节点 --group nsslam_2node pkghector_mapping typehector_mapping namehector_mapping_2param namemap_update_distance_thresh value0.1/param namemap_update_angle_thresh value0.1 /param namemap_pub_period value0.2 /param namemap_frame valueslam_2/map /param namebase_frame valueslam_2/base_footprint /param nameodom_frame valueslam_2/odom //node/group!-- **************************** 分割线 **************************** --!-- 载入 SLAM 的仿真场景 --include file$(find gazebo_ros)/launch/empty_world.launcharg nameworld_name value$(find wpr_simulation)/worlds/slam_simple.world/arg namepaused valuefalse/arg nameuse_sim_time valuetrue/arg namegui valuetrue/arg namerecording valuefalse/arg namedebug valuefalse//include!-- 载入 1号机器人 --include file$(find wpr_simulation)/launch/wpb_slam_template.launcharg namerobot_namespace valueslam_1 / arg namelocal_x value0 / arg namelocal_y value-0.3 / arg namelocal_yaw value0 / /include!-- 载入 2号机器人 --include file$(find wpr_simulation)/launch/wpb_slam_template.launcharg namerobot_namespace valueslam_2 / arg namelocal_x value0 / arg namelocal_y value0.3 / arg namelocal_yaw value0 / /include!-- 运动控制 --node pkgrqt_robot_steering typerqt_robot_steering namerqt_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 //launch3. TF 和 里程计
3.1 TF 系统 地面移动机器人在地图中的位姿描述方式x, y, yaw ROS 中通过 TFTransForm坐标系变换 来获取机器人具体的定位/位姿数值 TF 主要用于描述两个坐标系之间的空间关系TF 关系由特定的 ROS 节点以消息包的形式发布到 /tf 话题中去其他节点通过订阅这个 /tf 话题来查询坐标系 案例测试 # 利用 2.4 小节创建的 hector 建图包
$ cd ~/wpr_ws
$ source devel/setup.bash
$ roslaunch slam_pkg hector.launch查看 /tf 话题类型$ rostopic type /tf
tf2_msgs/TFMessage查看 /tf 话题数值 $ rostopic echo /tf
...
---
transforms: - header: seq: 0stamp: secs: 780nsecs: 481000000frame_id: mapchild_frame_id: scanmatcher_frametransform: translation: x: 2.27857303619y: 1.645611763z: 0.0rotation: x: 0.0y: 0.0z: -0.352547165132w: 0.935794045908
...查看 TF 关系树 $ rosrun rqt_tf_tree rqt_tf_tree3.2 里程计 本小节使用 移动机器人激光SLAM导航二运动控制与传感器篇 中安装的测试环境 hector_mapping 在长直走廊建图 由于缺少参照物特征的变化导致机器人无法估计自己的位移建图失败解决办法轮子转过的圈数×轮子周长走过的距离轮子里程计算法 $ cd ~/wpr_ws
$ source devel/setup.bash
$ roslaunch wpr_simulation wpb_corridor_hector.launchGMapping 在长直走廊建图 由于 GMapping 自带里程计算法在里程计的帮助下激光 SLAM 有效克服了建图过程中位移特征缺失的问题 $ cd ~/wpr_ws
$ source devel/setup.bash
$ roslaunch wpr_simulation wpb_corridor_gmapping.launch激光雷达和里程计输出的 TF 坐标变换关系 激光雷达map -- base_footprint里程计odom -- base_footprintGMapping 的核心算法先使用里程计推算机器人的位移再使用激光雷达点云配准算法来修正里程计误差如轮子打滑 map -- odom -- base_footprint 更直观化的里程计演示请查看视频 什么是里程计