news 2026/7/16 3:32:03

【ROS机器人】—— 从仿真到实战:Gazebo+Rviz+gmapping的SLAM建图与地图持久化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【ROS机器人】—— 从仿真到实战:Gazebo+Rviz+gmapping的SLAM建图与地图持久化

1. 环境准备与基础概念

在开始SLAM建图之前,我们需要先搭建好ROS开发环境。这里假设你已经安装了Ubuntu系统和ROS(推荐Noetic或Melodic版本)。如果还没安装,可以通过以下命令快速完成:

sudo apt update sudo apt install ros-noetic-desktop-full

安装完成后,别忘了初始化rosdep并配置环境变量:

sudo rosdep init rosdep update echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc

为什么选择Gazebo+Rviz+gmapping这个组合?我在实际项目中发现,Gazebo提供了高度可配置的物理仿真环境,Rviz能实时可视化传感器数据,而gmapping作为经典的2D SLAM算法,对新手非常友好。三者配合就像搭积木一样——Gazebo生成虚拟世界,gmapping处理激光雷达数据构建地图,Rviz则让我们直观看到建图过程。

2. 搭建Gazebo仿真环境

2.1 创建机器人URDF模型

首先我们需要一个带激光雷达的机器人模型。在ROS中,通常使用URDF文件描述机器人结构。这里给出一个简化版的四轮小车模型框架:

<!-- 文件保存为car.urdf --> <robot name="my_robot"> <link name="base_link"> <visual> <geometry> <box size="0.4 0.3 0.2"/> </geometry> </visual> <collision> <geometry> <box size="0.4 0.3 0.2"/> </geometry> </collision> </link> <!-- 添加激光雷达 --> <link name="laser_link"/> <joint name="laser_joint" type="fixed"> <parent link="base_link"/> <child link="laser_link"/> <origin xyz="0.2 0 0.1" rpy="0 0 0"/> </joint> <gazebo reference="laser_link"> <sensor type="ray" name="laser_sensor"> <pose>0 0 0 0 0 0</pose> <visualize>true</visualize> <update_rate>40</update_rate> <ray> <scan> <horizontal> <samples>720</samples> <resolution>1</resolution> <min_angle>-1.570796</min_angle> <max_angle>1.570796</max_angle> </horizontal> </scan> <range> <min>0.1</min> <max>30.0</max> </range> </ray> <plugin name="laser_controller" filename="libgazebo_ros_laser.so"> <topicName>/scan</topicName> <frameName>laser_link</frameName> </plugin> </sensor> </gazebo> </robot>

2.2 启动Gazebo世界

创建launch文件car_gazebo.launch来加载机器人模型和仿真环境:

<launch> <!-- 加载URDF到参数服务器 --> <param name="robot_description" textfile="$(find your_pkg)/urdf/car.urdf" /> <!-- 启动Gazebo --> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="world_name" value="$(find your_pkg)/worlds/simple_room.world"/> </include> <!-- 在Gazebo中生成机器人 --> <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model my_robot" /> </launch>

启动后会看到一个带激光雷达的小车出现在空房间中。我建议先在Gazebo中添加一些墙壁和障碍物,这样建图时能看到更明显的效果。

3. 配置gmapping建图节点

3.1 安装gmapping包

如果还没安装gmapping,运行以下命令:

sudo apt install ros-noetic-slam-gmapping

3.2 编写gmapping启动文件

创建gmapping.launch文件,关键参数我都加了中文注释:

<launch> <!-- 使用仿真时间 --> <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_link" /> <param name="map_frame" value="map" /> <param name="odom_frame" value="odom" /> <!-- 地图更新频率 --> <param name="map_update_interval" value="2.0"/> <!-- 激光参数 --> <param name="maxUrange" value="15.0"/> <param name="sigma" value="0.05"/> <param name="kernelSize" value="1"/> <!-- 运动模型参数 --> <param name="linearUpdate" value="0.5"/> <param name="angularUpdate" value="0.5"/> <param name="temporalUpdate" value="3.0"/> <!-- 粒子滤波参数 --> <param name="particles" value="50"/> <!-- 地图范围 --> <param name="xmin" value="-20.0"/> <param name="ymin" value="-20.0"/> <param name="xmax" value="20.0"/> <param name="ymax" value="20.0"/> <param name="delta" value="0.05"/> </node> </launch>

3.3 启动建图系统

依次打开三个终端分别执行:

# 终端1:启动Gazebo仿真 roslaunch your_pkg car_gazebo.launch # 终端2:启动gmapping roslaunch your_pkg gmapping.launch # 终端3:启动Rviz rosrun rviz rviz

在Rviz中需要手动添加以下显示项:

  1. 添加RobotModel显示机器人URDF模型
  2. 添加LaserScan并设置Topic为/scan
  3. 添加Map并设置Topic为/map

4. 控制机器人建图

4.1 键盘控制移动

新开终端安装键盘控制包:

sudo apt install ros-noetic-teleop-twist-keyboard

然后运行:

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

按提示使用键盘控制机器人移动。建议先缓慢绕场一周,确保激光雷达能扫描到所有障碍物。

4.2 自动建图策略

手动控制容易漏扫区域,这里分享一个自动建图技巧——编写简单的巡逻脚本patrol.py

#!/usr/bin/env python import rospy from geometry_msgs.msg import Twist def patrol(): rospy.init_node('patrol_node') pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10) rate = rospy.Rate(10) while not rospy.is_shutdown(): # 前进2米 move_forward(pub, 2.0) # 原地旋转180度 rotate(pub, 3.14) def move_forward(pub, distance): cmd = Twist() cmd.linear.x = 0.2 start_time = rospy.Time.now() while (rospy.Time.now() - start_time).to_sec() < distance/0.2: pub.publish(cmd) rospy.sleep(0.1) cmd.linear.x = 0 pub.publish(cmd) def rotate(pub, angle): cmd = Twist() cmd.angular.z = 0.5 start_time = rospy.Time.now() while (rospy.Time.now() - start_time).to_sec() < abs(angle)/0.5: pub.publish(cmd) rospy.sleep(0.1) cmd.angular.z = 0 pub.publish(cmd) if __name__ == '__main__': try: patrol() except rospy.ROSInterruptException: pass

5. 地图保存与重用

5.1 安装map_server

sudo apt install ros-noetic-map-server

5.2 保存地图

当建图完成后,新开终端执行:

rosrun map_server map_saver -f ~/my_map

这会生成两个文件:

  • my_map.pgm:地图图像文件
  • my_map.yaml:地图元数据

5.3 加载已有地图

创建load_map.launch

<launch> <node name="map_server" pkg="map_server" type="map_server" args="$(find your_pkg)/maps/my_map.yaml"/> </launch>

启动后可以在Rviz中添加Map组件查看历史地图。我在实际项目中常用这种方式做多机器人地图共享。

6. 常见问题排查

问题1:地图出现重影

  • 检查各坐标系是否正确设置
  • 尝试减小map_update_interval参数
  • 确保use_sim_time参数一致

问题2:建图时机器人位置漂移

  • 调整gmapping的运动模型参数
  • 降低机器人移动速度
  • 在Gazebo中检查物理引擎参数

问题3:保存的地图不完整

  • 确保保存前机器人已探索完所有区域
  • 检查地图范围参数是否足够大
  • 尝试手动调用地图保存服务:
rosservice call /dynamic_map_save "filename: '/home/user/final_map'"
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 3:31:17

依赖注入Dagger初学习

第一章 一堆废话 第01节 前置内容 最近在学习 Android 源码&#xff0c;在研究 SystemUI 源代码的过程中&#xff0c;发现了一段代码&#xff1a; public interface StatusBarIconController ... {}protected StatusBarIconController mIconController; protected void getD…

作者头像 李华
网站建设 2026/7/16 3:28:30

OpenViking+OpenClaw构建多Agent共享记忆中台

1. 项目概述&#xff1a;为什么“失忆”是多Agent系统最隐蔽的致命伤你有没有试过让两个AI助手协同完成一件事&#xff1f;比如让一个查资料、一个写报告&#xff0c;结果后者完全不记得前者刚找到的关键数据&#xff0c;还得重新问一遍——这根本不是协作&#xff0c;是各自为…

作者头像 李华
网站建设 2026/7/16 3:28:02

Windows Defender Remover v13.0:Windows安全组件深度管理解决方案

Windows Defender Remover v13.0&#xff1a;Windows安全组件深度管理解决方案 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh…

作者头像 李华
网站建设 2026/7/16 3:27:03

ABAP 没有 TemplateRef,但四类 SAP 技术可以承担相近职责

在一个采购审批页面里,订单处于待审批、已批准、已驳回三种状态时,页面中间区域可能呈现完全不同的内容。使用 Angular 时,可以分别声明几个 <ng-template>,再把对应的 TemplateRef 交给某个宿主组件,由宿主决定在什么位置、带着什么上下文创建视图。 把同一个问题…

作者头像 李华
网站建设 2026/7/16 3:26:19

OpenClaw:Windows原生数字员工,中文指令驱动的办公自动化

1. OpenClaw不是“另一个AI工具”&#xff0c;而是Windows上第一个真正能自己干活的数字员工你有没有过这种时刻&#xff1a;早上打开电脑&#xff0c;第一件事是手动整理昨天下载的27个PDF&#xff0c;把它们按项目名归类到不同文件夹&#xff1b;接着复制粘贴三份Excel里的客…

作者头像 李华
网站建设 2026/7/16 3:21:50

股票买卖问题

1、基础问题只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。class Solution {public int maxProfit(int[] prices) {int n prices.length;int pre prices[0]; //记录可买入的最小值int a…

作者头像 李华