
1. Ubuntu 20.04环境准备与ROS安装在开始Gazebo仿真环境搭建之前我们需要确保系统环境已经准备就绪。Ubuntu 20.04作为长期支持版本是机器人开发的理想选择。我建议使用全新安装的系统开始这样可以避免各种依赖冲突问题。首先更新系统软件包sudo apt update sudo apt upgrade -y接下来安装ROS Noetic这是官方支持Ubuntu 20.04的最新ROS版本。我推荐使用桌面完整版安装它包含了ROS、rqt、rviz、机器人通用库等所有基础组件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 sudo apt update sudo apt install ros-noetic-desktop-full安装完成后记得将ROS环境变量添加到bashrc中。这个步骤很关键我见过不少新手因为漏掉这一步导致各种命令找不到echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc为了后续开发方便我们还需要安装一些基础工具。这些工具在编译和调试时非常有用sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential sudo rosdep init rosdep update2. Gazebo仿真环境搭建2.1 核心依赖安装Gazebo是ROS生态中最常用的仿真工具之一。在安装Gazebo前我们需要确保所有依赖都已就位。根据我的经验以下这些包是必须安装的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 tcl-dev tk-dev python3-tk如果遇到依赖问题可以尝试先更新软件源sudo apt-get update2.2 创建工作空间我习惯为每个项目创建独立的工作空间这样可以保持环境整洁。下面创建一个名为catkin_gazebo_ws的工作空间mkdir -p ~/catkin_gazebo_ws/src cd ~/catkin_gazebo_ws/src catkin_init_workspace接下来我们可以下载Racecar仿真包。这个包包含了完整的轮式机器人模型和Gazebo配置git clone https://github.com/soonuse/racecar.git cd .. catkin_make编译时可能会遇到Python版本问题这是Ubuntu 20.04常见的问题。解决方法是指定Python3解释器catkin_make -DPYTHON_EXECUTABLE/usr/bin/python32.3 环境配置编译完成后需要将工作空间的环境变量加入bashrc。这一步确保每次打开终端都能正确加载我们的工作空间echo source ~/catkin_gazebo_ws/devel/setup.bash ~/.bashrc source ~/.bashrc3. Gazebo世界构建与模型使用3.1 创建自定义地图Gazebo提供了强大的地图编辑器我们可以用它创建自己的仿真环境。启动Gazebo后点击左上角的Edit→Building Editor就可以开始绘制地图了。我建议先绘制简单的矩形房间作为起点选择Wall工具绘制四面墙使用Door工具添加出入口保存为house模型保存时要注意文件格式Gazebo模型通常包含.config和.dae文件。我习惯将模型保存在~/.gazebo/models目录下这样Gazebo启动时会自动加载。3.2 使用预置模型除了自己创建模型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 xzvf下载完成后在Gazebo的Insert面板中就能看到这些模型了。我特别喜欢使用cafe模型来测试导航算法它的复杂度适中非常适合调试。3.3 启动自定义世界为了在ROS中使用自定义世界我们需要创建launch文件。下面是一个典型的house_world.launch文件示例launch include file$(find gazebo_ros)/launch/empty_world.launch arg nameworld_name value$(find racecar_gazebo)/worlds/house.world/ arg namepaused valuefalse/ arg nameuse_sim_time valuetrue/ arg namegui valuetrue/ arg nameheadless valuefalse/ arg namedebug valuefalse/ /include /launch启动这个launch文件就能加载我们的自定义世界了roslaunch racecar_gazebo house_world.launch4. SLAM建图实战4.1 Gmapping算法配置Gmapping是ROS中最常用的SLAM算法之一。我们需要先确保gmapping包已安装sudo apt install ros-noetic-slam-gmapping然后创建gmapping的launch文件。这个文件配置了激光雷达参数、地图更新频率等关键参数launch node pkggmapping typeslam_gmapping nameslam_gmapping param namebase_frame valuebase_link/ param nameodom_frame valueodom/ param namemap_update_interval value0.1/ param namemaxUrange value10.0/ param namelinearUpdate value0.05/ param nameangularUpdate value0.0436/ param nameparticles value30/ /node /launch4.2 建图过程建图需要三个终端同时工作第一个终端启动Gazebo世界和小车roslaunch racecar_gazebo racecar.launch第二个终端启动gmappingroslaunch racecar_gazebo slam_gmapping.launch第三个终端启动键盘控制rosrun teleop_twist_keyboard teleop_twist_keyboard.py在建图过程中我建议先让小车沿着墙壁缓慢移动确保激光雷达能扫描到所有障碍物。建图质量很大程度上取决于移动的路径是否覆盖了整个环境。4.3 地图保存建图完成后可以使用map_server保存地图rosrun map_server map_saver -f ~/catkin_gazebo_ws/src/racecar/racecar_gazebo/map/house这会生成house.pgm和house.yaml两个文件。PGM是地图图像YAML文件包含了地图的元数据。5. 自主导航实现5.1 导航栈配置ROS导航栈需要配置多个参数文件。这些文件通常存放在包的config目录下。最重要的四个文件是costmap_common_params.yaml - 定义代价地图的通用参数global_costmap_params.yaml - 全局代价地图配置local_costmap_params.yaml - 局部代价地图配置teb_local_planner_params.yaml - 局部路径规划器参数我特别推荐使用teb_local_planner作为局部规划器它对轮式机器人的支持非常好。5.2 导航launch文件下面是一个完整的导航launch文件示例launch include file$(find racecar_gazebo)/launch/racecar.launch arg nameworld_name valuehouse/ /include node namemap_server pkgmap_server typemap_server args$(find racecar_gazebo)/map/house.yaml/ node pkgmove_base typemove_base namemove_base outputscreen rosparam file$(find racecar_gazebo)/config/costmap_common_params.yaml commandload nsglobal_costmap/ rosparam file$(find racecar_gazebo)/config/costmap_common_params.yaml commandload nslocal_costmap/ rosparam file$(find racecar_gazebo)/config/local_costmap_params.yaml commandload/ rosparam file$(find racecar_gazebo)/config/global_costmap_params.yaml commandload/ rosparam file$(find racecar_gazebo)/config/teb_local_planner_params.yaml commandload/ param namebase_global_planner valueglobal_planner/GlobalPlanner/ param namebase_local_planner valueteb_local_planner/TebLocalPlannerROS/ /node /launch5.3 路径跟踪实现为了让小车能够跟随规划出的路径我们需要编写路径跟踪脚本。下面是一个简化的Python实现#!/usr/bin/env python import rospy from nav_msgs.msg import Path from ackermann_msgs.msg import AckermannDriveStamped from geometry_msgs.msg import PoseStamped import math class PathFollower: def __init__(self): self.path_sub rospy.Subscriber(/move_base/TebLocalPlannerROS/global_plan, Path, self.path_callback) self.cmd_pub rospy.Publisher(/vesc/low_level/ackermann_cmd_mux/input/navigation, AckermannDriveStamped, queue_size1) self.lookahead_distance 0.5 self.max_speed 1.0 def path_callback(self, msg): if len(msg.poses) 0: return # 找到距离lookahead_distance最近的点 target_idx self.find_target_point(msg.poses) target msg.poses[target_idx] # 计算转向角度 angle self.calculate_steering_angle(target) # 发布控制命令 cmd AckermannDriveStamped() cmd.drive.speed self.calculate_speed(angle) cmd.drive.steering_angle angle self.cmd_pub.publish(cmd) def find_target_point(self, poses): # 简化实现实际应该考虑车辆当前位置 return min(len(poses)-1, 5) # 选择路径上第5个点 def calculate_steering_angle(self, target): # 简化实现实际应该考虑车辆当前位姿 return math.atan2(target.pose.position.y, target.pose.position.x) def calculate_speed(self, angle): # 根据转向角度调整速度 return self.max_speed * (1 - 0.5 * abs(angle)/math.pi) if __name__ __main__: rospy.init_node(path_follower) pf PathFollower() rospy.spin()5.4 完整导航测试启动导航系统的完整流程如下启动Gazebo环境和地图服务器roslaunch racecar_gazebo racecar_navigation.launch启动RViz可视化界面roslaunch racecar_gazebo view_navigation.launch在RViz中使用2D Nav Goal工具设置目标点启动路径跟踪节点rosrun racecar_gazebo path_follower.py在实际测试中我发现teb_local_planner对动态障碍物的处理非常出色。通过调整costmap参数可以让小车更好地避开未知障碍物。如果发现小车规划出的路径不够平滑可以尝试减小inflation_radius参数。