Part6.1ROS gmapping 建图实现

本文详细介绍了ROS(Robot Operating System)中的机器人定位与建图过程,包括新建功能包、配置gmapping节点、启动仿真环境、键盘控制小车运动、地图保存和读取服务。通过使用amcl、gmapping、map_server和move_base等包,实现了SLAM(Simultaneous Localization And Mapping)算法,创建并更新机器人工作环境的地图。此外,还涉及到了gazebo仿真环境的设置,以及如何通过rviz进行可视化操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.新建功能包
导入依赖: amcl,gmapping,map_server,move_base
2.编写gmapping节点launch文件

<launch>
<!--仿真环境下设置为true-->
<param name="use_sim_time" value="true"/> 
    <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
     <!--雷达话题-->
      <remap from="scan" to="scan"/>
      <!--关键参数设置,与坐标系相关-->
      <param name="base_frame" value="base_footprint"/><!--底盘坐标系-->
      <param name="odom_frame" value="odom"/> <!--里程计坐标系-->

      <!--雷达的最大扫描范围-->
      <param name="map_update_interval" value="5.0"/>
      <param name="maxUrange" value="16.0"/>
      <param name="sigma" value="0.05"/>
      <param name="kernelSize" value="1"/>
      <param name="lstep" value="0.05"/>
      <param name="astep" value="0.05"/>
      <param name="iterations" value="5"/>
      <param name="lsigma" value="0.075"/>
      <param name="ogain" value="3.0"/>
      <param name="lskip" value="0"/>
      <param name="srr" value="0.1"/>
      <param name="srt" value="0.2"/>
      <param name="str" value="0.1"/>
      <param name="stt" value="0.2"/>
      <param name="linearUpdate" value="1.0"/>
      <param name="angularUpdate" value="0.5"/>
      <param name="temporalUpdate" value="3.0"/>
      <param name="resampleThreshold" value="0.5"/>
      <param name="particles" value="30"/>
      <param name="xmin" value="-50.0"/>
      <param name="ymin" value="-50.0"/>
      <param name="xmax" value="50.0"/>
      <param name="ymax" value="50.0"/>
      <param name="delta" value="0.05"/>
      <param name="llsamplerange" value="0.01"/>
      <param name="llsamplestep" value="0.01"/>
      <param name="lasamplerange" value="0.005"/>
      <param name="lasamplestep" value="0.005"/>
    </node>
    
    
    <node pkg="joint_state_publisher" name="joint_state_publisher" type="joint_state_publisher" />
    <node pkg="robot_state_publisher" name="robot_state_publisher" type="robot_state_publisher" />

    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find navigation)/config/navi.rviz"/>
    <!-- 可以保存 rviz 配置并后期直接使用-->
    <!--
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find my_nav_sum)/rviz/gmapping.rviz"/>
    -->
</launch>

3. 启动仿真环境

    <!-- 将 Urdf 文件的内容加载到参数服务器 -->
    <param name="robot_description" command="$(find xacro)/xacro $(find mycar_gazebo)/urdf/xacro/car.xacro" />
    <!-- 启动 gazebo -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch" > 
    <!--导入写好的gazabo环境-->
     <arg name="world_name" value="$(find mycar_gazebo)/worlds/box_house.world" />
    </include>
   <!--深度相机的点云信息要进行坐标转换-->
   <node pkg="tf2_ros" type="static_transform_publisher" name="static_transform_publisher" args="0 0 0 -1.57 0 -1.57 /support /support_kinec" />
    <!-- 在 gazebo 中显示机器人模型 -->
    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />
    </launch>

4.键盘控制小车运动

rosrun teleop_twist_keyboard teleop_twist_keyboard.py 

5.地图保存服务

<!--保存地图-->
<launch>
<!--对保存的文件进行封装-->
 <arg name="filename" value="$(find navigation)/map/nav" />
 <!--保存地图信息-->
 <node name="map_save" pkg="map_server" type="map_saver" args="-f $(arg filename)"/>
 </launch>

6.地图读取服务

<launch>
 <arg name="map" default="nav.yaml"/>
 <node name="map_server" pkg="map_server" type="map_server" args="$(find navigation)/map/$(arg map)"/>
</launch>
<think>首先,用户的问题是:“我想了解ROS gmapping所使用的格式 请问ROS gmapping 使用的地格式”。我需要根据系统级指令来回答。 系统级指令: 1. 所有行内数学表达式使用 $...$ 格式。 2. 独立公式使用 $$...$$ 格式并单独成段。 3. LaTeX语法正确。 4. 使用中文回答。 5. 生成相关问题。 6. 回答中引用的段落末尾自然地添加引用标识,例如:[^1]。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 - 参考站内引用,但用户提供了引用 [1] 到 [4],我需要基于这些引用内容来回答。 用户提供的引用: - [^1]: 关于使用设计纸替代扫描的想法,提到gmapping的地有误差。 - [^2]: 使用gmapping并保存地的命令:`rosrun map_server map_saver` 和 `rosrun map_server map_server map.yaml`。 - [^3]: 保存gmapping和cartographer地的步骤,包括将pbstream转化为pgm和yaml文件。 - [^4]: 使用gmapping的命令和仿真。 用户的问题是关于gmapping使用的地格式。从引用中,我可以提取相关信息: - 引用 [^2] 提到 `rosrun map_server map_saver` 保存地,发布的话题是 `/map` 和 `/map_metadata`。 - 引用 [^3] 提到将pbstream转化为pgm和yaml文件,但这是针对cartographer的;对于gmapping,它使用map_server来保存地。 - 在ROS中,gmapping通常输出一个地话题,然后使用map_server保存为文件格式,通常是PGM(像文件)和YAML(元数据文件)。 在ROS中,gmapping本身不直接保存地;它发布一个nav_msgs/OccupancyGrid消息到/map话题。然后,使用map_server包中的map_saver工具来保存地为文件。保存的文件格式是: - 一个YAML文件(e.g., map.yaml),包含元数据如地的分辨率、原点、占用阈值等。 - 一个PGM文件(e.g., map.pgm),是实际的地像,其中像素值表示占用状态:0-100表示占用概率,-1表示未知。 所以,gmapping使用的地格式是通过map_server保存的PGM和YAML文件。 现在,构回答: - 结构清晰:逐步解释。 - 使用中文。 - 在行内数学表达式中使用$...$,如果有数学内容。但问题可能不涉及数学表达式,除非提到概率或坐标。如果需要,可以添加,但保持自然。 - 生成相关问题。 - 引用时添加引用标识。 回答结构: 1. 介绍gmapping的基本过程。 2. 解释地格式:话题格式和文件格式。 3. 详细说明文件格式:YAML和PGM。 4. 如何保存地,参考引用。 5. 添加引用。 6. 生成相关问题。 最终输出应包括: - 回答部分。 - §§相关问题§§部分。 确保引用自然添加。例如,提到保存地时引用[^2]。 开始写回答。</think>### ROS gmapping 使用的地格式 在 ROS 中,gmapping 是一个基于激光雷达的 SLAM(Simultaneous Localization and Mapping)算法包,用于构环境地gmapping 本身不直接保存地文件,而是通过发布 ROS 话题来输出地数据,然后使用 `map_server` 工具将地保存为标准文件格式。下面我将逐步解释地格式和相关细节。 #### 1. **地数据的话题格式** - gmapping 在运行时发布一个 `nav_msgs/OccupancyGrid` 类型的消息到 `/map` 话题。这个消息包含地的元数据和占用网格数据: - **占用网格(Occupancy Grid)**:一个二维数组,每个元素(像素)表示该位置的占用状态: - 值在 $0$ 到 $100$ 之间:表示占用概率($0$ 为完全空闲,$100$ 为完全占用)。 - 值 $-1$:表示未知区域。 - **元数据**:包括地分辨率(单位:米/像素)、原点坐标(相对于世界坐标系)、地宽度和高度(像素数)等。 - 例如,地分辨率 $r$(单位:米/像素)决定了地精度,通常设置为 $0.05$ 米/像素[^3]。 - 用户可以通过订阅 `/map` 话题实时获取地数据,用于导航或其他应用。 #### 2. **地保存的文件格式** - 使用 `map_server` 包中的 `map_saver` 工具将 `/map` 话题的数据保存为文件。保存后生成两个文件: - **YAML 文件(e.g., `map.yaml`)**:包含地的元数据,采用 YAML 格式。关键字段包括: ```yaml image: map.pgm # PGM 像文件名 resolution: 0.05 # 分辨率(米/像素) origin: [0.0, 0.0, 0.0] # 原点坐标(x, y, 偏航角,单位:弧度) negate: 0 # 是否反转占用值(0 表示不反转) occupied_thresh: 0.65 # 占用阈值(值 ≥ 此阈值视为障碍物) free_thresh: 0.196 # 空闲阈值(值 ≤ 此阈值视为空闲区域) ``` - **PGM 文件(e.g., `map.pgm`)**:一个灰度像文件,其中像素值表示占用状态: - 白色像素(值 $255$):空闲区域。 - 黑色像素(值 $0$):占用区域(障碍物)。 - 灰色像素(值 $205$):未知区域。 - 像素值映射到占用概率:例如,$0$ 对应 $100\%$ 占用,$100$ 对应 $0\%$ 占用(通过阈值处理)。 - 保存地的命令为: ```bash rosrun map_server map_saver -f map # 保存为 map.yaml 和 map.pgm ``` 这会将当前 `/map` 话题的数据持久化[^2][^3]。 #### 3. **gmapping 流程中的地使用** - gmapping 在构时,依赖于激光雷达数据(如来自 `/scan` 话题)和里程计信息。地数据通过 `/map` 话题实时更新。 - 保存的地文件(YAML + PGM)可直接用于 ROS 导航栈,例如通过 `map_server` 节点加载: ```bash rosrun map_server map_server map.yaml # 发布 /map 话题 ``` 加载后,地可用于路径规划(如 move_base)或定位(如 AMCL)[^2][^4]。 - 与扫描相比,使用设计纸(如 CAD)直接生成地可能减少误差,但需手动转换为 PGM 格式以确保兼容性[^1]。 #### 4. **优势与局限性** - **优势**:PGM/YAML 格式轻量、易于可视化(可用像编辑器查看 PGM),且与 ROS 工具链无缝集成。 - **局限性**:地精度受激光雷达噪声影响,可能需多次扫描优化[^1]。对于大型环境,文件大小可能较大(分辨率 $r$ 越小,地越精细,但计算开销增加)。 通过以上步骤,您可以高效地使用 gmapping和保存地。如需进一步优化,可调整 gmapping 参数或结合其他传感器[^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一蓑烟雨荏平生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值