011.SLAM与Hector_Mapping
1. SLAM
SLAM(Simultaneous Localization and Mapping)是一个用于移动机器人和无人驾驶车辆的技术,它允许设备在未知环境中同时进行自我定位和地图构建。通过传感器(如激光雷达、相机等)收集环境信息,SLAM算法能够实时更新机器人的位置和环境地图,从而实现自主导航。
omg! 太复杂了, 不过! 異議あり! 导包即可!
2. Hector_Mapping
2.1 订阅主题
- SLAM 系统使用的激光扫描。
syscommand (std_msgs/String)
- syscommand。如果字符串等于 “reset”,则地图和机器人姿势将重置为其初始状态。
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
2.4 启动
roslaunch wpr_simulation wpb_stage_slam.launch
rosrun hector_mapping hector_mapping
rosrun rviz rviz
rosrun rqt_robot_steering rqt_robot_steering
3. 通过launch文件启动Hector_Mapping的建图功能
- 新建包
catkin_create_pkg slam_pkg rospy roscpp std_msgs
- 创建文件夹
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>
- 编译, 运行
roslaunch slam_pkg hector.launch
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>
可以发现更新频率明显变快了!