跳到主要内容

011.SLAM与Hector_Mapping

1. SLAM

SLAM(Simultaneous Localization and Mapping)是一个用于移动机器人和无人驾驶车辆的技术,它允许设备在未知环境中同时进行自我定位和地图构建。通过传感器(如激光雷达、相机等)收集环境信息,SLAM算法能够实时更新机器人的位置和环境地图,从而实现自主导航。

omg! 太复杂了, 不过! 異議あり! 导包即可!

2. Hector_Mapping

2.1 订阅主题

扫描 (sensor_msgs/LaserScan

  • SLAM 系统使用的激光扫描。

syscommand (std_msgs/String

  • syscommand。如果字符串等于 “reset”,则地图和机器人姿势将重置为其初始状态。

hector_mapping - ROS Wiki

2.2 已发布的主题

map_metadata (nav_msgs/MapMetaData)

  • 从此主题获取 map 数据,该主题是 latched 的,并定期更新。

mpa (nav_msgs/OccupancyGrid)

  • 从此主题获取 map 数据,该主题是 latched 的,并定期更新

slam_out_pose (geometry_msgs/PoseStamped)

  • 无协方差的估计机器人姿势

poseupdate (geometry_msgs/PoseWithCovarianceStamped)

  • 具有高斯不确定性估计的机器人姿势

一般订阅第二个话题(/map)

2.3 安装依赖

sudo apt install ros-noetic-hector-mapping
sh

2.4 启动

roslaunch wpr_simulation wpb_stage_slam.launch
sh
rosrun hector_mapping hector_mapping
sh
rosrun rviz rviz
sh
rosrun rqt_robot_steering rqt_robot_steering
sh

3. 通过launch文件启动Hector_Mapping的建图功能

  1. 新建包
catkin_create_pkg slam_pkg rospy roscpp std_msgs
sh
  1. 创建文件夹launch, 以及.launch文件, 并且写入以下内容: (把上面四条指令翻译为.launch配置)
<launch>
<!-- roslaunch wpr_simulation wpb_stage_slam.launch -->
<include file="$(find wpr_simulation)/launch/wpb_stage_slam.launch"/>

<!-- rosrun hector_mapping hector_mapping -->
<node pkg="hector_mapping" type="hector_mapping" name="hector_mapping"/>

<!-- rosrun rviz rviz -->
<!-- <node pkg="rviz" type="rviz" name="rviz"/> -->

<!-- 或者: 从配置文件启动 rviz -->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find slam_pkg)/rviz/slam.rviz"/>

<!-- rosrun rqt_robot_steering rqt_robot_steering -->
<node pkg="rqt_robot_steering" type="rqt_robot_steering" name="rqt_robot_steering"/>
</launch>
xml
  1. 编译, 运行
roslaunch slam_pkg hector.launch
sh

4. Hector_Mapping建图的参数设置

~base_frame ( 字符串 ,默认值:base_link)

  • 机器人的基架名称。这是用于定位和转换激光扫描数据的框架。

~map_frame ( 字符串 ,默认值:map_link)

  • 地图框的名称。

~odom_frame ( 字符串 ,默认值:odom)

  • odom 帧的名称。

~map_resolution ( double ,默认值:0.025)

  • 地图分辨率 [m]。这是网格单元边缘的长度。

~map_size ( int ,默认值:1024)

  • 映射的大小 [每个轴的单元格数]。地图是正方形的,并且具有 (map_size * map_size) 个网格单元格。

~map_start_x ( double ,默认值:0.5)

  • /map 帧的原点 [0.0, 1.0] 在 x 轴上相对于网格映射的位置。0.5 位于中间。

~map_start_y ( double ,默认值:0.5)

  • /map 帧的原点 [0.0, 1.0] 在 y 轴上相对于网格映射的位置。0.5 位于中间。

~map_update_distance_thresh ( double ,默认值:0.4)

  • 执行映射更新的阈值 [m]。在地图更新发生之前,平台必须以米为单位行驶这么远,或者经历自上次更新以来 map_update_angle_thresh 参数所描述的角度变化。

~map_update_angle_thresh ( double ,默认值:0.9)

  • 执行映射更新的阈值 [rad]。在地图更新发生之前,平台必须经历自上次更新以来 map_update_distance_thresh 参数指定的行程参数所描述的角度变化。

~map_pub_period ( double ,默认值:2.0)

  • 地图发布周期 [s]。

~map_multi_res_levels ( int ,默认值:3)

  • 贴图多分辨率网格级别的数量。

~update_factor_free ( double ,默认值:0.4)

  • 用于更新 [0.0, 1.0] 范围内自由单元格的 map update 修饰符。值 0.5 表示没有变化。

~update_factor_occupied ( 双 精度,默认值:0.9)

  • 用于更新范围 [0.0, 1.0] 中占用单元格的 map update 修饰符。值 0.5 表示没有变化。

~laser_min_dist ( double ,默认值:0.4)

  • 系统要使用的激光扫描端点的最小距离 [m]。将忽略小于此值的 Scan 端点。

~laser_max_dist ( double ,默认值:30.0)

  • 系统要使用的激光扫描端点的最大距离 [m]。扫描比此值更远的端点将被忽略。

~laser_z_min_value ( double ,默认值:-1.0)

  • 系统要使用的激光扫描端点相对于激光扫描仪框架的最小高度 [m]。小于此值的 Scan 端点将被忽略。

~laser_z_max_value ( double ,默认值:1.0)

  • 系统要使用的激光扫描端点相对于激光扫描仪框架的最大高度 [m]。高于此值的 Scan 端点将被忽略。

~pub_map_odom_transform ( bool ,默认值:true)

  • 确定系统是否应发布 map->odom 转换。

~output_timing ( bool ,默认值:false)

  • 输出定时信息,以便通过 ROS_INFO 处理每个激光扫描。

~scan_subscriber_queue_size ( int ,默认值:5)

  • 扫描订户的队列大小。如果日志文件以比实时更快的速度播放到 hector_mapping,则应将其设置为较高的值(例如 50)。

~pub_map_scanmatch_transform ( bool ,默认值: true)

  • 确定是否应将 scanmatcher 到 map 转换发布到 tf。帧名称由 'tf_map_scanmatch_transform_frame_name' 参数确定。

~tf_map_scanmatch_transform_frame_name ( 字符串 ,默认值:scanmatcher_frame)

  • 将 scanmatcher 发布到 map transform 时的帧名称,如前面的参数中所述。

例如: 把之前的配置文件改为:

<node pkg="hector_mapping" type="hector_mapping" name="hector_mapping" output="screen">
<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>
xml

可以发现更新频率明显变快了!

请作者喝奶茶:
Alipay IconQR Code
Alipay IconQR Code
本文遵循 CC CC 4.0 BY-SA 版权协议, 转载请标明出处
Loading Comments...