Gmapping是ROS中常用的SLAM(同时定位与地图构建)算法,主要用于通过激光雷达和里程计数据生成二维栅格地图,为机器人导航提供基础支持。

  • 地图构建
    Gmapping通过激光雷达扫描环境并结合机器人的运动信息(里程计),实时生成环境的2D栅格地图(Occupancy Grid Map)。地图数据以nav_msgs/OccupancyGrid格式发布,用于后续的路径规划和定位。

  • 导航的前置条件
    Gmapping本身仅负责建图,导航功能需结合其他ROS包(如navigation包中的move_baseamcl等模块)实现。完整的导航流程通常包括:

    1. 建图(Gmapping)→ 2. 地图保存map_server)→ 3. 定位(AMCL)→ 4. 路径规划(MoveBase)→ 5. 控制执行(控制器)。

1.启动Gmapping导航需求:

  • 激光雷达数据(sensor_msgs/LaserScan,话题如/scan)。

  • 里程计数据(nav_msgs/Odometry,话题如/odom)。

  • 坐标系变换(tf,需包含base_linklaserodombase_link的转换)。

 2.查看ros中话题

rostopic list查看是否有激光雷达话题scan

3.查看激光雷达坐标系

rostopic echo /scan --noarr

"laser"激光雷达坐标系名称,必须与base_linklaserTF变化一致,如果自己使用的是其它厂家买的激光雷达所配对的ros功能包,一定要看清楚这个坐标系名称是否一致

 4.查看TF转换

rosrun rqt_tf_tree rqt_tf_tree

是否存在

laser ->baser_link

base_link->odom

 5.创建launch

<1>创建软件包:

catkin_create_pkg slam_pkg roscpp rospy std_msgs


在软件包中创建一个launch文件夹存放launch文件

 <2>在launch文件夹中创建launch文件

<launch>
  <!-- 启动YDLiDAR节点 -->
   <include file="$(find ydlidar_ros_driver)/launch/X3.launch" />
  
  <!-- 加载URDF模型 -->
  
 <arg
    name="model" />
  <param
    name="robot_description"
    textfile="$(find ros_urdfv3)/urdf/ros_urdfv3.urdf" />
  <node
    name="joint_state_publisher_gui"
    pkg="joint_state_publisher_gui"
    type="joint_state_publisher_gui" />
  <node
    name="robot_state_publisher"
    pkg="robot_state_publisher"
    type="robot_state_publisher" />


  

 <!-- 启动rf2o_laser_odometry节点 -->
 <include file="$(find rf2o_laser_odometry)/launch/rf2o_laser_odometry.launch">
  <param name="laser_scan_topic" value="/scan"/>
  <param name="odom_topic" value="/odom_rf2o"/>
  <param name="publish_tf" value="true"/>
  <param name="base_frame_id" value="base_link"/>
  <param name="odom_frame_id" value="odom"/>
</include>



 <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping_unique" output="screen">
  <param name="base_frame" value="base_link"/>
  <param name="odom_frame" value="odom"/>
  <param name="map_update_interval" value="1.0"/>
  <param name="maxUrange" value="12.0"/>
  <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="linearUpdate" value="0.2"/> <!-- 减少线性更新阈值 -->
  <param name="angularUpdate" value="0.1745"/> <!-- 减少角更新阈值,约10度 -->
  <remap from="scan" to="/scan"/>
</node>
 
  <!-- 发布从 base_link 到 laser 的静态变换 -->
<node pkg="tf" type="static_transform_publisher" name="base_link_to_laser" args="0 0 0.2 0 0 0 base_link laser 100"/>

   <!-- 启动RViz并加载指定配置 -->
  <node name="rviz" pkg="rviz" type="rviz" />
  
</launch>

<!-- 启动YDLiDAR节点 -->
   <include file="$(find ydlidar_ros_driver)/launch/X3.launch" />

启动官方提供的SDK雷达启动包

 <!-- 加载URDF模型 -->
  
 <arg
    name="model" />
  <param
    name="robot_description"
    textfile="$(find ros_urdfv3)/urdf/ros_urdfv3.urdf" />
  <node
    name="joint_state_publisher_gui"
    pkg="joint_state_publisher_gui"
    type="joint_state_publisher_gui" />
  <node
    name="robot_state_publisher"
    pkg="robot_state_publisher"
    type="robot_state_publisher" />
 

加载URDF模型,这个可以从solidworks创建

  <!-- 启动rf2o_laser_odometry节点 -->
 <include file="$(find rf2o_laser_odometry)/launch/rf2o_laser_odometry.launch">
  <param name="laser_scan_topic" value="/scan"/>
  <param name="odom_topic" value="/odom_rf2o"/>
  <param name="publish_tf" value="true"/>
  <param name="base_frame_id" value="base_link"/>
  <param name="odom_frame_id" value="odom"/>
</include>

启动rf2o_laser_odometry包,发布TF关系

  <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping_unique" output="screen">
  <param name="base_frame" value="base_link"/>
  <param name="odom_frame" value="odom"/>
  <param name="map_update_interval" value="1.0"/>
  <param name="maxUrange" value="12.0"/>
  <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="linearUpdate" value="0.2"/> <!-- 减少线性更新阈值 -->
  <param name="angularUpdate" value="0.1745"/> <!-- 减少角更新阈值,约10度 -->
  <remap from="scan" to="/scan"/>
</node>

配置gmapping相关参数

 <!-- 发布从 base_link 到 laser 的静态变换 -->
<node pkg="tf" type="static_transform_publisher" name="base_link_to_laser" args="0 0 0.2 0 0 0 base_link laser 100"/>

   <!-- 启动RViz并加载指定配置 -->
  <node name="rviz" pkg="rviz" type="rviz" />

这里是因为在调试过程中, base_link 到 laser一直错误,所以才加的,如果没有报错不加也可以的

6.大功告成

ros小车

参考资料:

        b站机器人工匠阿杰

更多推荐