ROS2 Jazzy + Gazebo Harmonic 保姆级教程:从零搭建你的仿真机器人(含Cartographer建图与Nav2导航)

张开发
2026/4/6 7:00:04 15 分钟阅读

分享文章

ROS2 Jazzy + Gazebo Harmonic 保姆级教程:从零搭建你的仿真机器人(含Cartographer建图与Nav2导航)
ROS2 Jazzy Gazebo Harmonic 全栈实战从仿真环境搭建到自主导航系统部署当机器人开发者第一次接触ROS2和Gazebo时往往会被复杂的工具链和版本兼容性问题困扰。2024年发布的ROS2 Jazzy与Gazebo Harmonic组合为机器人仿真带来了更稳定的性能表现和更简化的开发流程。本教程将带你从零开始构建一个完整的移动机器人仿真系统涵盖URDF建模、传感器仿真、SLAM建图到导航规划的全流程。1. 环境配置与基础准备在开始之前我们需要准备一台运行Ubuntu 24.04 LTS的机器。这个版本是ROS2 Jazzy官方推荐的操作系统能够确保最佳的兼容性。系统要求至少4核CPU8GB以上内存支持OpenGL 3.0的显卡50GB可用磁盘空间安装ROS2 Jazzy的核心步骤如下# 设置locale sudo apt update sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALLen_US.UTF-8 LANGen_US.UTF-8 export LANGen_US.UTF-8 # 添加ROS2仓库 sudo apt install software-properties-common sudo add-apt-repository universe sudo apt update sudo apt install curl -y sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release echo $UBUNTU_CODENAME) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null # 安装ROS2基础包 sudo apt update sudo apt install ros-jazzy-desktop安装Gazebo Harmonic需要额外执行# 添加Gazebo仓库 sudo apt install wget sudo wget https://packages.osrfoundation.org/gazebo.gpg -O /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main | sudo tee /etc/apt/sources.list.d/gazebo-stable.list /dev/null # 安装Gazebo sudo apt update sudo apt install gz-harmonic环境验证命令# 在新终端中 source /opt/ros/jazzy/setup.bash ros2 run demo_nodes_cpp talker # 在另一个终端中 source /opt/ros/jazzy/setup.bash ros2 run demo_nodes_py listener如果能看到talker发送消息而listener接收消息说明ROS2环境配置成功。Gazebo的验证则可以通过运行gz sim命令应该能看到Gazebo的图形界面启动。2. 机器人URDF建模与Gazebo集成创建一个完整的机器人模型是仿真的第一步。我们将使用URDF(XML格式)和xacro(宏扩展)来定义机器人的机械结构和物理属性。典型的移动机器人URDF结构包含以下组件底盘定义机器人的基础框架驱动轮配置电机和转向机构万向轮提供稳定性传感器如激光雷达、IMU等外观可视化的3D网格示例xacro文件结构?xml version1.0? robot namefishbot xmlns:xacrohttp://www.ros.org/wiki/xacro !-- 材料定义 -- material nameblue color rgba0 0 0.8 1/ /material !-- 基础链接 -- link namebase_link visual geometry cylinder length0.1 radius0.2/ /geometry material nameblue/ /visual collision geometry cylinder length0.1 radius0.2/ /geometry /collision inertial mass value5.0/ 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 link nameleft_wheel visual geometry cylinder length0.05 radius0.05/ /geometry /visual !-- 其他物理属性... -- /link !-- 添加激光雷达 -- gazebo referencelaser_link sensor typeray namelidar_sensor pose0 0 0.1 0 0 0/pose visualizetrue/visualize update_rate10/update_rate ray scan horizontal samples360/samples resolution1/resolution min_angle-3.1415926/min_angle max_angle3.1415926/max_angle /horizontal /scan range min0.1/min max10.0/max resolution0.01/resolution /range /ray plugin namelidar_controller filenamelibgazebo_ros_ray_sensor.so ros namespace//namespace argument~/out:scan/argument /ros output_typesensor_msgs/msg/LaserScan/output_type frame_namelaser_link/frame_name /plugin /sensor /gazebo /robot将URDF加载到Gazebo中的关键步骤使用xacro处理宏定义xacro fishbot.urdf.xacro fishbot.urdf检查URDF有效性check_urdf fishbot.urdf在Gazebo中生成机器人gz service -s /world/empty/create \ --reqtype gz.msgs.EntityFactory \ --reptype gz.msgs.Boolean \ --timeout 1000 \ --req sdf_filename: /path/to/fishbot.sdf常见问题解决方案问题现象可能原因解决方法模型显示为白色材料定义错误检查material标签和颜色值机器人下坠质量参数不合理调整inertial标签中的质量值传感器无数据插件配置错误确认Gazebo插件名称和参数3. Cartographer SLAM建图实战Cartographer是Google开源的实时SLAM算法在ROS2中已经得到良好支持。我们将配置一个适合仿真环境的Cartographer参数集。关键配置文件fishbot_2d.lua- 主配置文件cartographer.launch.py- 启动文件cartographer.rviz- RViz可视化配置优化后的Lua配置示例include map_builder.lua include trajectory_builder.lua options { map_builder MAP_BUILDER, trajectory_builder TRAJECTORY_BUILDER, map_frame map, tracking_frame base_link, published_frame odom, odom_frame odom, provide_odom_frame true, publish_frame_projected_to_2d true, use_odometry true, use_nav_sat false, use_landmarks false, num_laser_scans 1, num_multi_echo_laser_scans 0, num_subdivisions_per_laser_scan 1, num_point_clouds 0, lookup_transform_timeout_sec 0.2, submap_publish_period_sec 0.3, pose_publish_period_sec 5e-3, trajectory_publish_period_sec 30e-3, rangefinder_sampling_ratio 1., odometry_sampling_ratio 1., fixed_frame_pose_sampling_ratio 1., imu_sampling_ratio 1., landmarks_sampling_ratio 1., } MAP_BUILDER.use_trajectory_builder_2d true TRAJECTORY_BUILDER_2D.submaps.num_range_data 35 TRAJECTORY_BUILDER_2D.min_range 0.3 TRAJECTORY_BUILDER_2D.max_range 8. TRAJECTORY_BUILDER_2D.missing_data_ray_length 5. TRAJECTORY_BUILDER_2D.use_imu_data false TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching true TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.linear_search_window 0.1 TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.translation_delta_cost_weight 10. TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.rotation_delta_cost_weight 1e-1 POSE_GRAPH.constraint_builder.min_score 0.65 POSE_GRAPH.constraint_builder.global_localization_min_score 0.7 POSE_GRAPH.optimize_every_n_nodes 35 POSE_GRAPH.max_num_final_iterations 200 return options启动Cartographer的完整命令序列# 终端1 - 启动Gazebo仿真 ros2 launch bme_gazebo_basics world.launch.py # 终端2 - 启动Cartographer ros2 launch bme_cartographer cartographer.launch.py # 终端3 - 启动RViz可视化 rviz2 -d install/bme_cartographer/share/bme_cartographer/rviz/cartographer.rviz # 终端4 - 保存地图 ros2 run nav2_map_server map_saver_cli -f ~/maps/fishbot_map建图过程中的调试技巧地图质量评估检查闭环检测是否正常工作观察子图边缘是否对齐良好确认没有明显的重影或错位性能优化调整num_range_data减少子图更新频率降低pose_publish_period_sec提高位姿更新速率根据CPU负载调整max_num_final_iterations常见问题处理注意如果地图出现严重扭曲尝试增加real_time_correlative_scan_matcher的权重参数4. Nav2导航系统配置与调优Nav2是ROS2中的标准导航栈包含全局路径规划、局部路径规划和恢复行为等核心功能。我们将基于Cartographer生成的地图配置完整的导航系统。核心配置文件结构bme_navigation2/ ├── launch/ │ └── bme_nav2.launch.py ├── param/ │ └── bme_nav2.yaml └── maps/ ├── fishbot_map.pgm └── fishbot_map.yaml优化后的Nav2参数配置示例controller_server: ros__parameters: controller_frequency: 20.0 min_x_velocity_threshold: 0.001 min_y_velocity_threshold: 0.001 min_theta_velocity_threshold: 0.001 progress_checker_plugin: progress_checker goal_checker_plugin: goal_checker controller_plugins: [FollowPath] FollowPath: plugin: dwb_core::DWBLocalPlanner min_vel_x: -0.3 max_vel_x: 0.3 min_vel_y: 0.0 max_vel_y: 0.0 min_rot_vel: -0.5 max_rot_vel: 0.5 acc_lim_x: 0.5 acc_lim_y: 0.0 acc_lim_theta: 0.5 decel_lim_x: -0.5 decel_lim_y: 0.0 decel_lim_theta: -0.5 vx_samples: 20 vy_samples: 0 vtheta_samples: 40 sim_time: 1.7 scaling_xy: 0.5 scaling_theta: 0.25 planner_server: ros__parameters: planner_plugins: [GridBased] GridBased: plugin: nav2_navfn_planner/NavfnPlanner tolerance: 0.5 use_astar: false allow_unknown: true behavior_server: ros__parameters: behavior_plugins: [Spin, BackUp, Wait] Spin: plugin: nav2_behaviors/Spin spin_dist: 1.57 # 90度旋转 time_allowance: 10.0 BackUp: plugin: nav2_behaviors/BackUp backup_dist: 0.15 backup_speed: 0.025 time_allowance: 10.0 Wait: plugin: nav2_behaviors/Wait wait_duration: 5 time_allowance: 10.0启动导航系统的完整流程# 终端1 - 启动Gazebo仿真 ros2 launch bme_gazebo_basics world.launch.py # 终端2 - 启动导航系统 ros2 launch bme_navigation2 bme_nav2.launch.py # 终端3 - RViz可视化 rviz2 -d install/bme_navigation2/share/bme_navigation2/rviz/nav2_default_view.rviz在RViz中设置导航目标的两种方法手动指定目标点击工具栏中的2D Goal Pose按钮在地图上点击选择目标位置拖动箭头调整最终朝向通过代码发送目标from geometry_msgs.msg import PoseStamped from rclpy.node import Node class Nav2Goal(Node): def __init__(self): super().__init__(nav2_goal) self.publisher self.create_publisher(PoseStamped, /goal_pose, 10) def send_goal(self, x, y, theta): msg PoseStamped() msg.header.frame_id map msg.pose.position.x x msg.pose.position.y y msg.pose.orientation.z sin(theta/2) msg.pose.orientation.w cos(theta/2) self.publisher.publish(msg)导航性能调优指南全局规划器优化调整tolerance参数控制目标点容差设置use_astar为true可以获得更优路径但计算量更大allow_unknown决定是否允许在未知区域规划局部规划器优化sim_time影响轨迹预测的长度vx_samples和vtheta_samples决定采样密度scaling_xy和scaling_theta控制路径跟随的紧密程度恢复行为配置调整spin_dist改变旋转角度修改backup_dist设置后退距离wait_duration控制等待时间提示在实际调试中建议先调整全局规划器确保大范围路径合理再优化局部规划器改善运动细节

更多文章