Ubuntu 20.04下Gazebo仿真环境搭建与SLAM建图导航全流程实践

张开发
2026/4/19 23:12:17 15 分钟阅读

分享文章

Ubuntu 20.04下Gazebo仿真环境搭建与SLAM建图导航全流程实践
1. 环境准备与基础配置在Ubuntu 20.04上搭建Gazebo仿真环境前需要先确保系统基础环境配置正确。我建议使用全新安装的Ubuntu 20.04系统这样可以避免各种依赖冲突问题。记得第一次尝试时因为系统残留的旧版ROS包导致编译失败折腾了大半天才发现问题。首先更新系统软件源这个步骤虽然简单但很重要sudo apt update sudo apt upgrade -y接下来安装ROS Noetic这是官方专为Ubuntu 20.04提供的版本。执行以下命令添加ROS仓库sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654安装完整版ROS包含Gazebo等工具sudo apt install ros-noetic-desktop-full初始化rosdep时可能会遇到网络问题可以尝试以下命令sudo rosdep init rosdep update最后别忘了设置环境变量把下面这行添加到~/.bashrc文件末尾echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc2. Gazebo仿真环境搭建2.1 创建工作空间我习惯在home目录下创建catkin工作空间这样管理起来更方便mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make把工作空间的环境变量也加入bashrcecho source ~/catkin_ws/devel/setup.bash ~/.bashrc source ~/.bashrc2.2 安装必要依赖Gazebo仿真需要一些额外的ROS包建议一次性安装sudo apt install ros-noetic-gazebo-ros-pkgs ros-noetic-gazebo-ros-control \ ros-noetic-effort-controllers ros-noetic-joint-state-controller \ ros-noetic-ackermann-msgs ros-noetic-teb-local-planner \ ros-noetic-rtabmap-ros python3-tk如果遇到依赖问题可以先运行sudo apt --fix-broken install尝试修复。2.3 测试Gazebo基础功能安装完成后可以通过简单命令测试Gazebo是否正常工作roscore # 在后台启动ROS核心 gzserver # 启动Gazebo服务端 gzclient # 启动Gazebo客户端如果能看到空白的Gazebo界面说明基础环境已经配置成功。第一次启动可能会下载一些模型需要耐心等待。3. 自定义仿真环境创建3.1 使用Building Editor创建简单场景Gazebo自带的Building Editor非常适合快速搭建简单场景。启动Gazebo后点击左上角Edit菜单选择Building Editor使用左侧工具栏的Wall工具绘制墙壁完成后点击File → Save保存为house模型保存后会生成两个文件house.config和house。建议保存在~/gazebo_models目录下方便管理。3.2 导入现成3D模型Gazebo官方提供了大量现成模型可以通过以下命令下载mkdir -p ~/.gazebo/models cd ~/.gazebo/models wget http://file.ncnynl.com/ros/gazebo_models.txt wget -i gazebo_models.txt下载完成后解压所有压缩包ls model.tar.g* | xargs -n1 tar xzvf3.3 创建完整world文件将建好的场景保存为world文件在Gazebo主界面点击File → Save World As命名为house.world建议保存在工作空间的worlds目录下例如~/catkin_ws/src/your_package/worlds/一个典型的world文件示例?xml version1.0? sdf version1.6 world namedefault include urimodel://ground_plane/uri /include include urimodel://sun/uri /include include urimodel://house/uri pose0 0 0 0 0 0/pose /include /world /sdf4. 机器人模型与仿真集成4.1 URDF机器人模型创建创建一个简单的差分驱动机器人模型robot.xacro?xml version1.0? robot xmlns:xacrohttp://www.ros.org/wiki/xacro namemy_robot xacro:include filename$(find gazebo_ros)/launch/empty_world.launch / link namebase_link visual geometry box size0.3 0.2 0.1/ /geometry /visual collision geometry box size0.3 0.2 0.1/ /geometry /collision inertial mass value5/ inertia ixx0.1 ixy0 ixz0 iyy0.1 iyz0 izz0.1/ /inertial /link joint nameleft_wheel_joint typecontinuous parent linkbase_link/ child linkleft_wheel/ origin xyz0 0.15 0 rpy0 0 0/ axis xyz0 1 0/ /joint joint nameright_wheel_joint typecontinuous parent linkbase_link/ child linkright_wheel/ origin xyz0 -0.15 0 rpy0 0 0/ axis xyz0 1 0/ /joint gazebo plugin namedifferential_drive_controller filenamelibgazebo_ros_diff_drive.so commandTopiccmd_vel/commandTopic odometryTopicodom/odometryTopic odometryFrameodom/odometryFrame robotBaseFramebase_link/robotBaseFrame /plugin /gazebo /robot4.2 启动机器人仿真创建launch文件spawn_robot.launchlaunch param namerobot_description command$(find xacro)/xacro $(find your_package)/urdf/robot.xacro / node namespawn_urdf pkggazebo_ros typespawn_model args-param robot_description -urdf -model my_robot -x 0 -y 0 -z 0.1 / node namerobot_state_publisher pkgrobot_state_publisher typerobot_state_publisher / /launch5. SLAM建图实战5.1 安装gmapping包sudo apt install ros-noetic-slam-gmapping5.2 创建gmapping启动文件slam_gmapping.launchlaunch node pkggmapping typeslam_gmapping nameslam_gmapping param namebase_frame valuebase_link/ param nameodom_frame valueodom/ param namemap_update_interval value0.05/ param namemaxUrange value5.0/ param namelinearUpdate value0.1/ param nameangularUpdate value0.1/ /node node pkgrviz typerviz namerviz args-d $(find your_package)/rviz/gmapping.rviz/ /launch5.3 运行SLAM建图启动Gazebo仿真环境roslaunch your_package spawn_robot.launch启动gmappingroslaunch your_package slam_gmapping.launch使用键盘控制机器人移动完成建图rosrun teleop_twist_keyboard teleop_twist_keyboard.py保存地图rosrun map_server map_saver -f ~/my_map6. 自主导航实现6.1 导航包安装sudo apt install ros-noetic-navigation6.2 配置导航参数创建costmap_common_params.yamlobstacle_range: 2.5 raytrace_range: 3.0 footprint: [[-0.15, -0.1], [-0.15, 0.1], [0.15, 0.1], [0.15, -0.1]] inflation_radius: 0.2 cost_scaling_factor: 5.06.3 创建导航启动文件navigation.launchlaunch node pkgmap_server typemap_server namemap_server args$(find your_package)/maps/my_map.yaml/ node pkgamcl typeamcl nameamcl param nameodom_frame_id valueodom/ param namebase_frame_id valuebase_link/ /node node pkgmove_base typemove_base namemove_base rosparam file$(find your_package)/config/costmap_common_params.yaml commandload nsglobal_costmap/ rosparam file$(find your_package)/config/costmap_common_params.yaml commandload nslocal_costmap/ param namebase_global_planner valuenavfn/NavfnROS/ param namebase_local_planner valueteb_local_planner/TebLocalPlannerROS/ /node /launch6.4 测试导航功能启动仿真环境roslaunch your_package spawn_robot.launch启动导航roslaunch your_package navigation.launch在RViz中使用2D Nav Goal指定目标点观察机器人自主导航过程7. 常见问题解决在Gazebo仿真过程中我遇到过几个典型问题模型加载缓慢可以预先下载Gazebo模型并放在~/.gazebo/models目录下TF树错误检查各frame_id设置是否正确确保base_link → odom → map的转换关系完整定位漂移问题调整AMCL参数特别是odom_alpha和odom_alpha参数路径规划失败检查costmap参数适当增大inflation_radiusGazebo黑屏问题尝试设置LIBGL_ALWAYS_SOFTWARE1环境变量对于TEB局部规划器的调优建议重点关注以下参数max_vel_x最大前进速度max_vel_theta最大旋转速度acc_lim_x加速度限制footprint_model机器人轮廓定义实际项目中我发现将控制频率设置为10-15Hz效果最佳过高会导致计算负载增加过低则影响控制精度。

更多文章