ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

基于ROS2与Gazebo的四轮差速机器人仿真:从URDF建模到Nav2自主导航全流程实践

基于ROS2与Gazebo的四轮差速机器人仿真:从URDF建模到Nav2自主导航全流程实践 简介本资源是一套面向ROS2初学者与机器人开发者的四轮差速移动机器人仿真系统完整实现聚焦运动控制与自主导航两大核心能力适用于高校课程设计、科研原型验证及Nav2导航算法实践。压缩包共81个文件143KB涵盖21个Python节点脚本含控制、导航接口、10个Xacro宏文件模块化URDF建模、8个XML配置如Nav2插件注册、URDF描述、6个YAML参数文件传感器标定、导航栈配置及5个STL机械模型辅以world仿真场景、rviz可视化配置与多层级launch启动文件结构清晰、即装即用。已有471人学习下载资源包含完整功能链从Gazebo物理仿真环境搭建、高精度URDF/Xacro机器人建模到激光雷达IMU传感器数据融合集成再到Nav2全栈全局规划、局部避障、控制器/规划器自定义插件的实配与调优附带说明文档与附赠资料可直接复现端到端自主导航流程。1. 项目概述从零构建一个可自主导航的仿真机器人最近在社区里看到不少朋友对ROS2机器人仿真开发感兴趣尤其是想自己动手搭建一个完整的、能跑能导航的仿真机器人系统。这确实是个挺有挑战性但也极具成就感的事情。今天我就结合自己最近完成的一个项目——“基于ROS2的四轮差速机器人仿真系统”来和大家详细聊聊这里面的门道。这个项目的目标很明确在Gazebo仿真环境中从零开始设计一个四轮差速驱动的机器人模型给它装上激光雷达和IMU传感器最后用Nav2导航栈让它实现自主建图和导航。整个过程涵盖了URDF建模、传感器仿真、控制器配置、SLAM建图、路径规划等一系列核心环节算是一个比较完整的ROS2机器人开发入门到实践的微型项目。如果你刚接触ROS2想通过一个具体项目来串联起各个知识点或者你已经有一些基础但苦于不知道如何将URDF、Gazebo、导航这些模块有机地整合起来那么这个项目的拆解应该能给你提供一条清晰的路径。我们不会停留在表面操作而是会深入每个步骤背后的原理比如差速控制模型在ROS2里是怎么实现的、Nav2的代价地图如何融合激光数据、仿真环境里的噪声怎么模拟才更真实。我会分享很多在官方文档里不会写的“踩坑”经验和调试技巧确保你看完不仅能复现更能理解为什么这么做。2. 核心需求与方案设计解析2.1 为什么选择四轮差速与ROS2 Humble首先来聊聊方案选型。为什么是“四轮差速”机器人因为它结构简单、控制模型成熟是移动机器人里最经典、也最适合入门的平台。差速驱动的原理是通过独立控制左右两侧轮子的速度来实现前进、后退和转向其运动学模型清晰在ROS2的ros2_control框架和导航栈中都有非常好的原生支持。相比于全向轮或阿克曼转向它更容易在仿真中搭建和调试。选择ROS2而不是ROS1已经是当前机器人开发的主流趋势。ROS2在实时性、跨平台支持和分布式通信方面优势明显。本项目基于ROS2 Humble Hawksbill版本这是首个支持到Ubuntu 22.04的长期支持LTS版本生态和稳定性都经过了一段时间的考验。使用Humble版本意味着你可以获得更完善的工具链如colcon构建系统、rosdep依赖管理和更活跃的社区支持避免在环境配置上花费过多时间。注意虽然ROS2 Rolling是更新更快的发行版但对于仿真和导航这种对稳定性要求较高的项目尤其是初学者强烈建议从Humble LTS版本开始它能避免因依赖库频繁更新带来的兼容性问题。整个系统的架构设计遵循典型的ROS2节点通信模式。核心包括机器人本体描述URDF/Xacro定义机器人的物理结构、外观、关节和传感器链接。仿真环境Gazebo加载URDF模型提供物理引擎模拟传感器数据激光雷达点云、IMU数据。控制系统ros2_control实现差速驱动关节的位置/速度控制接口将ROS2控制指令转化为Gazebo中的关节力矩。传感器驱动与数据融合发布激光扫描/scan和惯性测量/imu话题。导航系统Nav2包含SLAM如slam_toolbox进行地图构建以及基于代价地图的全局/局部路径规划器、控制器和恢复行为。2.2 工具链选型与替代方案考量在具体工具选择上我们做了如下考量仿真器Gazebo Classic (Gazebo 11)。虽然Ignition Gazebo现更名为Gazebo是新一代仿真器但Gazebo Classic与ROS2 Humble的集成度目前更高插件生态特别是ros_gz桥接和传感器插件更成熟稳定。对于本项目目标——快速搭建和验证算法Gazebo Classic是更稳妥的选择。建模语言Xacro (XML Macros)。直接编写URDF文件在机器人结构复杂时会变得冗长且难以维护。Xacro允许我们使用变量、宏和条件语句来模块化地描述机器人比如用一段宏定义驱动轮然后重复调用四次大大提升了代码的可读性和复用性。SLAM方案slam_toolbox。在ROS2中slam_toolbox是功能强大且维护活跃的SLAM库支持同步定位与建图并且与Nav2导航栈无缝集成。它比传统的gmapping更先进能生成更稳定的栅格地图。导航栈Nav2 (Navigation2)。这是ROS2官方推荐的导航框架提供了完整的从传感器数据输入到速度指令输出的流水线。它高度可配置适合在本项目的仿真环境中进行学习和调参。当然也存在替代方案。例如你可以用Webots或CoppeliaSim替代Gazebo它们在某些方面如图形渲染、特定传感器模型可能有优势但与ROS2的集成步骤和社区资源丰富度略有不同。再比如SLAM也可以选用Cartographer它尤其擅长构建大规模环境的地图但配置复杂度相对较高。对于入门和大多数室内场景我们选择的工具链是平衡了易用性、功能性和社区支持的最佳组合。3. 机器人URDF模型设计与Gazebo集成3.1 使用Xacro构建模块化机器人模型URDF是描述机器人的基石。我们不直接写.urdf而是写.xacro文件。一个典型的四轮差速机器人模型会包含以下几个宏模块基础底盘Base Link作为机器人的根链接定义了机器人的主体质量和惯性矩阵。惯性参数即使是在仿真中也至关重要不合理的值会导致机器人在Gazebo中“飘起来”或运动失真。xacro:macro namerobot_base paramsname link name${name} visual.../visual collision.../collision inertial mass value5.0/ !-- 质量单位kg -- inertia ixx0.1 ixy0.0 ixz0.0 iyy0.1 iyz0.0 izz0.05/ !-- 惯性张量需根据形状估算 -- /inertial /link /xacro:macro驱动轮宏定义一个驱动轮包含视觉、碰撞和惯性属性并通过一个continuous类型的旋转关节连接到父链接如底盘。xacro:macro namedrive_wheel paramsprefix parent reflect joint name${prefix}_wheel_joint typecontinuous parent link${parent}/ child link${prefix}_wheel_link/ origin xyz${0.1*reflect} 0.15 -0.05 rpy0 1.5707 0/ !-- 位置和朝向 -- axis xyz0 1 0/ /joint link name${prefix}_wheel_link.../link /xacro:macro然后通过调用该宏四次并传入不同的前缀left_front,right_front,left_rear,right_rear和反射系数1或-1用于区分左右即可快速生成四个轮子。传感器挂载同样用宏来定义激光雷达如rplidar_a1模型和IMU传感器的链接和固定关节。传感器的origin必须精确设定因为它决定了传感器数据在机器人坐标系下的位姿直接影响导航算法的精度。实操心得在定义惯性矩阵时如果不知道精确值可以将机器人近似为一个长方体或圆柱体用公式进行估算。对于质量5kg、尺寸0.4x0.3x0.2m的长方体底盘其绕Z轴的惯性矩izz大约为(mass/12)*(length^2 width^2)。虽然仿真中允许一定误差但一个数量级内的合理值能极大改善物理仿真的真实性。3.2 为Gazebo仿真添加物理与传感属性URDF只定义了视觉和运动学结构。要让它在Gazebo里“活”起来必须添加Gazebo特有的标签。为链接添加Gazebo属性为每个link添加gazebo子标签指定材质、摩擦系数等。gazebo reference${prefix}_wheel_link mu1 value1.0/ !-- 摩擦系数1 -- mu2 value1.0/ kp value1000000.0 / !-- 接触刚度值太大会导致数值不稳定 -- kd value1.0 / !-- 接触阻尼 -- materialGazebo/Black/material /gazebo轮子的摩擦系数mu通常设为1.0高摩擦而底盘底部可以设一个很小的值如0.01模拟机器人在光滑地面上的移动。集成ros2_control这是连接ROS2控制指令与Gazebo物理引擎的桥梁。需要在URDF中为每个驱动关节声明transmission标签并指定硬件接口类型hardware_interface/PositionJointInterface或VelocityJointInterface。对于差速轮我们通常使用速度接口。transmission name${prefix}_wheel_joint_trans typetransmission_interface/SimpleTransmission/type joint name${prefix}_wheel_joint hardwareInterfacehardware_interface/VelocityJointInterface/hardwareInterface /joint actuator name${prefix}_wheel_joint_motor hardwareInterfacehardware_interface/VelocityJointInterface/hardwareInterface mechanicalReduction1/mechanicalReduction /actuator /transmission添加传感器插件激光雷达使用libgazebo_ros_ray_sensor.so插件。需要仔细配置扫描角度、分辨率、最大最小距离以及噪声模型。仿真中的噪声高斯噪声能让传感器数据更接近真实情况。gazebo referencelaser_link sensor typeray namerplidar pose0 0 0 0 0 0/pose visualizefalse/visualize update_rate5.5/update_rate ray ... 配置扫描范围、分辨率 ... /ray plugin namegazebo_ros_laser_controller filenamelibgazebo_ros_ray_sensor.so ros argument~/out:scan/argument !-- 输出话题重映射 -- /ros output_typesensor_msgs/msg/LaserScan/output_type frame_namelaser_link/frame_name /plugin /sensor /gazeboIMU使用libgazebo_ros_imu_sensor.so插件。同样需要配置噪声参数这对于依赖IMU进行数据融合的导航算法如机器人位姿估计的仿真测试尤为重要。完成所有Xacro模块的编写后使用一条命令将其转换为最终的URDF文件xacro robot.xacro robot.urdf。你可以用check_urdf工具检查URDF的语法正确性urdfdom_check robot.urdf。4. Gazebo仿真环境搭建与机器人部署4.1 创建并启动包含机器人的仿真世界有了机器人URDF模型下一步是把它放进一个仿真环境里。我们创建一个Gazebo世界文件.world这个世界文件可以很简单比如一个空的地面平面也可以很复杂包含墙壁、障碍物、灯光等。一个基础的世界文件结构如下?xml version1.0 ? sdf version1.6 world namedefault !-- 物理引擎参数 -- physics typeode max_step_size0.001/max_step_size real_time_factor1.0/real_time_factor real_time_update_rate1000/real_time_update_rate /physics !-- 环境光照 -- include urimodel://sun/uri /include !-- 地面 -- include urimodel://ground_plane/uri /include !-- 你可以在这里添加其他模型比如墙、桌子等 -- !-- includeurimodel://bookshelf/uripose2 0 0 0 0 0/pose/include -- /world /sdf最关键的一步是在ROS2启动文件中将机器人模型和这个世界文件同时加载到Gazebo中。我们创建一个launch.py文件from launch import LaunchDescription from launch_ros.actions import Node from launch.actions import IncludeLaunchDescription from launch.launch_description_sources import PythonLaunchDescriptionSource from ament_index_python.packages import get_package_share_directory import os def generate_launch_description(): pkg_path get_package_share_directory(my_robot_description) urdf_path os.path.join(pkg_path, urdf, robot.urdf) world_path os.path.join(pkg_path, worlds, my_world.world) # 启动Gazebo服务器和客户端并加载世界文件 gazebo_launch IncludeLaunchDescription( PythonLaunchDescriptionSource([ os.path.join(get_package_share_directory(gazebo_ros), launch, gazebo.launch.py) ]), launch_arguments{world: world_path}.items() ) # 将URDF模型生成节点并发布到/robot_description话题 robot_state_publisher Node( packagerobot_state_publisher, executablerobot_state_publisher, namerobot_state_publisher, outputscreen, arguments[urdf_path] ) # 在Gazebo中生成机器人模型 spawn_entity Node( packagegazebo_ros, executablespawn_entity.py, arguments[-entity, my_robot, -topic, /robot_description, -x, 0.0, -y, 0.0, -z, 0.1], outputscreen ) return LaunchDescription([ gazebo_launch, robot_state_publisher, spawn_entity, ])运行这个启动文件ros2 launch my_robot_bringup gazebo.launch.py你的机器人就应该出现在Gazebo的仿真世界中了。4.2 配置ros2_control与差分控制器机器人出现在Gazebo里只是第一步它现在还不会动。我们需要启动ros2_control系统来管理它的关节控制器。编写控制器配置文件controllers.yaml这个文件告诉controller_manager需要加载哪些控制器。对于差速机器人核心是一个diff_drive_controller。controller_manager: ros__parameters: update_rate: 100 # Hz diff_drive_controller: ros__parameters: left_wheel_names: [left_front_wheel_joint, left_rear_wheel_joint] right_wheel_names: [right_front_wheel_joint, right_rear_wheel_joint] wheel_separation: 0.3 # 左右轮距单位米 wheel_radius: 0.05 # 轮子半径单位米 wheel_separation_multiplier: 1.0 wheel_radius_multiplier: 1.0 # 里程计设置 publish_rate: 50.0 odom_frame_id: odom base_frame_id: base_footprint pose_covariance_diagonal: [0.001, 0.001, 0.001, 0.001, 0.001, 0.001] twist_covariance_diagonal: [0.001, 0.001, 0.001, 0.001, 0.001, 0.001] # 命令超时 cmd_vel_timeout: 1.0 # 是否发布受限的速度命令 enable_odom_tf: true这里的wheel_separation和wheel_radius必须与URDF模型中的实际尺寸严格对应否则控制器计算出的轮速指令将是错误的。编写启动控制器管理器与加载控制器的Launch文件创建一个新的launch文件或者在上一个launch文件中添加节点。# 在之前的launch.py中添加 from launch.actions import DeclareLaunchArgument from launch.substitutions import LaunchConfiguration # ... 其他代码 ... controller_manager Node( packagecontroller_manager, executableros2_control_node, parameters[urdf_path, os.path.join(pkg_path, config, controllers.yaml)], outputscreen ) load_diff_drive_controller Node( packagecontroller_manager, executablespawner.py, arguments[diff_drive_controller, --controller-manager, /controller_manager], outputscreen ) load_joint_state_broadcaster Node( packagecontroller_manager, executablespawner.py, arguments[joint_state_broadcaster, --controller-manager, /controller_manager], outputscreen )启动后diff_drive_controller会订阅/cmd_vel话题geometry_msgs/msg/Twist类型并根据运动学模型解算出每个驱动轮的目标速度通过ros2_control发送给Gazebo中的关节。现在你可以通过一个简单的命令来测试运动控制是否正常ros2 topic pub /cmd_vel geometry_msgs/msg/Twist {linear: {x: 0.2, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.5}} -1这条命令会让机器人以0.2 m/s的线速度和0.5 rad/s的角速度做圆弧运动。在Gazebo和RViz2中观察机器人是否按预期运动。5. Nav2导航栈配置与SLAM建图5.1 配置Nav2行为树与代价地图机器人能动了接下来就是让它“聪明”起来实现自主导航。Nav2导航栈的核心是行为树Behavior Tree和代价地图Costmap。行为树BT导航Nav2使用行为树来组织复杂的导航任务如接收到目标点、规划全局路径、局部控制、恢复行为等。我们通常不需要自己编写完整的行为树而是使用Nav2提供的默认导航行为树navigate_w_replanning_and_recovery.xml。我们需要在配置文件中指定其路径。# nav2_params.yaml bt_navigator: ros__parameters: global_frame: map robot_base_frame: base_footprint odom_topic: /odom bt_loop_duration: 10 default_nav_through_poses_bt_xml: $(find-pkg-share nav2_bt_navigator)/behavior_trees/navigate_w_replanning_and_recovery.xml代价地图Costmap配置这是导航的“眼睛”和“大脑”。Nav2维护两张代价地图全局代价地图用于全局路径规划和局部代价地图用于局部避障和轨迹跟踪。两者都需要配置插件层如障碍物层、膨胀层、静态地图层。# nav2_params.yaml (续) local_costmap: local_costmap: ros__parameters: update_frequency: 5.0 publish_frequency: 2.0 global_frame: odom # 局部地图通常基于里程计 robot_base_frame: base_footprint width: 3.0 height: 3.0 resolution: 0.05 plugins: [obstacle_layer, inflation_layer] obstacle_layer: plugin: nav2_costmap_2d::ObstacleLayer observation_sources: scan scan: topic: /scan data_type: LaserScan marking: true clearing: true inflation_layer: plugin: nav2_costmap_2d::InflationLayer cost_scaling_factor: 3.0 inflation_radius: 0.55障碍物层Obstacle Layer订阅激光雷达/scan话题将扫描到的点标记为障碍物。膨胀层Inflation Layer在障碍物周围产生一个梯度膨胀区域让规划出的路径与障碍物保持安全距离。inflation_radius和cost_scaling_factor是需要根据机器人尺寸和运动特性仔细调节的关键参数。5.2 集成slam_toolbox进行实时建图在未知环境中导航首先需要一张地图。我们使用slam_toolbox进行同步定位与建图。安装与配置通过apt安装sudo apt install ros-humble-slam-toolbox。创建其配置文件slam_params.yaml。关键的参数包括slam_toolbox: ros__parameters: mode: mapping # 建图模式 map_file_name: my_map # 保存的地图文件名 scan_topic: /scan use_scan_matching: true resolution: 0.05 # 地图分辨率与代价地图一致 max_laser_range: 12.0 # 激光最大有效距离 # 还有许多优化和滤波器参数初期可使用默认值启动与建图操作编写launch文件依次启动slam_toolbox节点和Nav2的map_server以map_saver模式运行。然后使用teleop_twist_keyboard或RViz2的2D Goal Pose工具遥控机器人探索整个环境。slam_toolbox会实时发布/map话题nav_msgs/msg/OccupancyGrid类型。保存地图当建图完成后通过服务调用保存地图ros2 service call /slam_toolbox/save_map slam_toolbox/srv/SaveMap {name: path/to/your/map}这会生成两个文件map.pgm地图图像和map.yaml地图元数据。5.3 定位、规划与控制器调参有了地图就可以进行真正的自主导航了。此时需要将slam_toolbox切换到localization模式或者使用nav2_amcl自适应蒙特卡洛定位进行定位。定位LocalizationAMCL通过粒子滤波器将激光观测数据与已知地图进行匹配从而估计机器人在地图中的位姿。配置amcl参数如粒子数、激光模型等对定位精度和速度影响很大。amcl: ros__parameters: min_particles: 500 max_particles: 2000 laser_model_type: likelihood_field odom_model_type: diff全局规划器Global PlannerNav2默认使用nav2_navfn_planner/NavfnPlanner。它基于Dijkstra或A算法在全局代价地图上搜索从当前位置到目标点的最优路径。主要调节参数是tolerance目标点容差和use_astar是否使用A算法通常更快。局部规划器与控制器Local Planner / Controller这是导航中最需要精细调参的部分。nav2_regulated_pure_pursuit_controller是一个常用的控制器它通过“纯追踪”算法让机器人跟随全局路径。controller_server: ros__parameters: controller_frequency: 10.0 default_controller: FollowPath FollowPath: plugin: nav2_regulated_pure_pursuit_controller::RegulatedPurePursuitController desired_linear_vel: 0.26 max_linear_vel: 0.5 lookahead_dist: 0.6 # 前瞻距离影响转弯平滑度 rotate_to_heading_angular_vel: 1.8 max_allowed_obstacle_distance: 0.3 # 安全距离lookahead_dist前瞻距离这是最重要的参数之一。值越大机器人越早开始转向路径跟踪更平滑但可能偏离路径值越小跟踪更精确但可能导致机器人频繁启停和抖动。需要根据机器人速度和环境复杂度反复调整。desired_linear_vel期望的线速度在仿真中可以从较低值如0.2 m/s开始测试。恢复行为Recovery当机器人被困住如被障碍物包围时恢复行为会被触发。通常包括“清除代价地图”、“旋转恢复”、“后退恢复”等。需要合理配置恢复行为的顺序和参数。6. 系统集成测试与常见问题排查6.1 完整启动与RViz2可视化调试将所有模块集成到一个顶层的launch文件中实现一键启动。这个launch文件会依次启动Gazebo世界和机器人。ros2_control和差速控制器。SLAM或定位节点取决于任务阶段。Nav2的所有节点lifecycle_manager,controller_server,planner_server,bt_navigator,waypoint_follower等。启动后使用RViz2进行可视化是必不可少的调试手段。你需要添加以下显示项RobotModel显示机器人URDF模型。LaserScan订阅/scan话题查看激光雷达数据是否正常。Map订阅/map话题显示当前地图建图或定位时。TF查看坐标系变换树确保map-odom-base_footprint等坐标系关系正确。Path订阅/plan或/follow_path话题显示全局和局部规划路径。PoseArray用于AMCL查看定位粒子云判断定位是否收敛。在RViz2中使用“2D Pose Estimate”按钮告诉机器人它在地图中的初始位置定位模式然后使用“2D Nav Goal”按钮指定目标点观察机器人是否能够规划路径并顺利到达。6.2 典型问题与解决方案实录在实际操作中你几乎一定会遇到下面这些问题。这里是我踩过坑后总结的排查清单问题现象可能原因排查步骤与解决方案Gazebo中机器人模型加载后下坠或抖动1. 链接的惯性参数inertial设置错误或缺失。2. 轮子或底盘碰撞体collision与视觉模型visual尺寸/位置不匹配。3. Gazebo物理引擎参数如max_step_size不合适。1. 使用check_urdf检查URDF。用inertial宏或简单几何体公式估算惯性矩阵。2. 在RViz2中同时显示RobotModel的Visual和Collision检查是否一致。3. 尝试调小max_step_size如0.001增大real_time_update_rate。/cmd_vel话题已发布但机器人不动1.ros2_control控制器未正确加载或配置。2. URDF中transmission标签的硬件接口类型与控制器配置不匹配。3. 关节名称在URDF和控制器YAML文件中不一致。1. 运行ros2 control list_controllers查看diff_drive_controller状态是否为active。2. 确认URDF中hardwareInterface是VelocityJointInterface且控制器类型正确。3. 使用ros2 topic echo /joint_states查看关节状态是否更新或用ros2 control list_hardware_interfaces检查硬件接口。激光雷达在RViz2中无显示1. Gazebo激光插件配置错误话题名、帧ID。2. 传感器链接的坐标系未正确广播到TF树。1. 运行ros2 topic listNav2规划失败提示“Start is invalid”1. 机器人初始位姿未设置或设置错误。2. 机器人的起始点或目标点位于代价地图的“致命障碍”cost255区域。3. 全局/局部代价地图的robot_base_frame配置错误。1. 在RViz2中务必先使用“2D Pose Estimate”给出机器人在地图中的大概位置。2. 在RViz2中查看全局/局部代价地图确认起始点和目标点是否在可行走区域非黑色膨胀区。检查地图本身是否有问题。3. 确认robot_base_frame参数与URDF中定义的基座标系名称完全一致通常是base_footprint或base_link。机器人靠近障碍物时剧烈抖动或原地旋转1. 局部代价地图的inflation_radius膨胀半径设置过小。2. 局部控制器的max_allowed_obstacle_distance最大允许障碍物距离设置过小。3. 控制器参数如lookahead_dist与当前速度不匹配。1. 将inflation_radius至少设置为机器人半径的1.5倍以上。2. 适当增大max_allowed_obstacle_distance给控制器更多反应空间。3. 降低desired_linear_vel并尝试动态调整lookahead_dist有些控制器支持速度比例系数。SLAM建图漂移严重闭环检测失败1. 机器人运动模型噪声参数与实际情况不符在robot_state_publisher或里程计中。2. 激光雷达数据噪声过大或特征不明显。3.slam_toolbox的扫描匹配和优化参数需要调整。1. 检查diff_drive_controller发布的/odom话题的协方差是否合理。在仿真中可以适当增加角速度的协方差值以模拟滑移。2. 在Gazebo激光插件中增加合理的噪声如noise typegaussian但不要过大。确保环境有足够的几何特征如墙角、桌椅腿。3. 尝试调整slam_toolbox的scan_buffer_size、minimum_travel_distance和minimum_travel_heading参数并确保开启use_scan_matching和do_loop_closing。调试心得Nav2的调试是一个“观察-假设-调整-验证”的循环。务必充分利用RViz2的可视化工具。当出现问题时首先按“坐标系(TF)-传感器数据(Scan/Map)-代价地图(Costmap)-路径(Path)-控制指令(CmdVel)”的数据流链条逐级排查哪个环节出现了异常。把ros2 topic echo和ros2 topic hz当成你的好朋友。另外仿真环境的一大优势是可以随时“重置世界”大胆地修改参数并快速验证效果。本文还有配套的精品资源点击获取
返回列表