ROS-slam_Gmapping建图
Gmapping是ROS中常用的SLAM(同时定位与地图构建)算法,主要用于通过激光雷达和里程计数据生成二维栅格地图,为机器人导航提供基础支持。
-
地图构建:
Gmapping通过激光雷达扫描环境并结合机器人的运动信息(里程计),实时生成环境的2D栅格地图(Occupancy Grid Map)。地图数据以nav_msgs/OccupancyGrid格式发布,用于后续的路径规划和定位。 -
导航的前置条件:
Gmapping本身仅负责建图,导航功能需结合其他ROS包(如navigation包中的move_base、amcl等模块)实现。完整的导航流程通常包括:-
建图(Gmapping)→ 2. 地图保存(
map_server)→ 3. 定位(AMCL)→ 4. 路径规划(MoveBase)→ 5. 控制执行(控制器)。
-
1.启动Gmapping导航需求:
激光雷达数据(
sensor_msgs/LaserScan,话题如/scan)。里程计数据(
nav_msgs/Odometry,话题如/odom)。坐标系变换(
tf,需包含base_link到laser、odom到base_link的转换)。
2.查看ros中话题
rostopic list查看是否有激光雷达话题scan
3.查看激光雷达坐标系
rostopic echo /scan --noarr
"laser"激光雷达坐标系名称,必须与
base_link到laserTF变化一致,如果自己使用的是其它厂家买的激光雷达所配对的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站机器人工匠阿杰
更多推荐






所有评论(0)