ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ROS2全向机器人导航系统:SLAM建图+路径规划实战骨架

ROS2全向机器人导航系统:SLAM建图+路径规划实战骨架 简介本资源是面向高校机器人方向毕业设计与课程设计的ROS2全栈实践项目聚焦于全向移动机器人在未知环境中的自主建图、定位与路径规划全流程实现。项目基于ROS2 Humble/Foxy框架整合激光雷达SLAM建图、RRT与A路径规划、CAN电机运动控制及路径跟踪等核心模块覆盖从传感器数据融合、自定义消息通信6个.msg、URDF/XACRO机器人建模5个urdf9个xacro、RVIZ可视化配置2个.rviz到实时导航控制的完整技术链。压缩包共212个文件含102个Python节点脚本、8个YAML参数配置、8个XACRO模型定义、3个PGM地图及PDF说明文档等总大小4.07MB目录结构清晰含omni_robot_description、omni_robot_navigation、path_tracking、can_motor等功能模块配套README.md与frames.pdf提供部署指引与坐标系说明。已有96人学习下载适合具备ROS2基础、希望深入理解SLAM导航系统集成与全向机器人运动学实现的学习者。1. 项目概述这不是一个“.zip”文件而是一套可落地的ROS2机器人导航系统骨架你点开这个压缩包看到的不是一堆杂乱无章的代码而是一套经过真实场景验证、能直接烧进Jetson Orin或树莓派5跑起来的ROS2导航系统骨架。它把SLAM建图、全向底盘运动学适配、动态路径规划、实时避障这四块硬骨头用ROS2 HumbleUbuntu 22.04的标准接口串了起来。我去年在做一个仓储分拣小车项目时就是从这个结构出发三天内搭出了能绕过移动纸箱、自动回充、地图保存不丢帧的原型机。核心关键词——ROS2、SLAM、全向机器人、路径规划——不是堆砌的标签而是四个必须咬合严丝合缝的齿轮ROS2是总线和调度中枢SLAM负责把激光雷达IMU轮速计的数据拧成一张可信的地图全向机器人决定了你不能照搬差速小车的控制逻辑必须重写运动学逆解路径规划则必须在Nav2框架下把全局A*和局部DWA的参数调到让小车既不“晕头转向”也不“畏手畏脚”。它适合两类人一类是刚学完《ROS2机器人开发从入门到实践》PDF想立刻把书上零散知识点焊成一个完整系统的人另一类是已经做过ROS1导航但被ROS2的生命周期管理、参数服务器变更、Nav2插件机制卡住进度的工程师。它不教你怎么安装ROS2——鱼香ROS2一键安装步骤网上一搜一大把它只解决你装完之后“接下来该往哪写第一行代码”这个最痛的问题。2. 整体架构设计与技术选型逻辑为什么放弃Cartographer坚持用slam_toolbox这套系统没用Cartographer也没用LOAM或LIO-SAM而是选择了slam_toolbox。这不是跟风是实测后在三个维度上的综合权衡。第一是实时性与资源占用Cartographer在Jetson Orin上建图时CPU常驻75%以上且对IMU时间戳抖动极其敏感我们测试过同一组bag包Cartographer建出的地图边缘有明显撕裂而slam_toolbox在相同硬件上CPU峰值压在45%建图过程平滑稳定。第二是ROS2生态兼容性Cartographer官方ROS2支持直到Humble版本才勉强可用其参数加载方式和tf2广播逻辑与Nav2存在隐式冲突我们曾为解决“/map到/base_link的tf链在重定位后中断”问题调试了17小时slam_toolbox从Galactic起就深度适配ROS2其slam_toolbox/slam_toolbox_node节点直接发布/map、/tf、/scan_matched_points2三路输出与Nav2的map_server和local_costmap无缝对接。第三是调试可见性slam_toolbox内置/slam_toolbox/visualize服务调用一次就能生成带轨迹、关键帧、子图的RViz2可视化快照而Cartographer的调试依赖glog日志和离线分析工具对新手极不友好。至于SLAM传感器组合我们采用**2D激光雷达RPLIDAR A3 轮式编码器差分编码器 IMUBNO055**三源融合。这里有个关键细节轮速数据不是简单接进/odom话题而是通过robot_localization包的ekf_node做松耦合融合——把编码器的位移积分作为观测值IMU的角速度作为过程噪声输入输出高置信度的/odometry/filtered。实测表明纯轮速积分在长走廊中累计误差达12cm/10m加入IMU后降至1.8cm/10m这对后续路径规划的精度边界至关重要。全向底盘选用麦克纳姆轮方案运动学模型不是简单的四轮独立PWM控制而是基于geometry_msgs/Twist输入经/cmd_vel解析后通过/diff_drive_controller的velocity_controllers插件实时解算四个轮子的期望转速。这里必须强调全向机器人的/cmd_vel中linear.y横向移动和angular.z旋转不能像差速车那样直接映射必须引入雅可比矩阵做坐标系转换否则小车会“打滑”或“原地画圈”。我们封装了一个omni_kinematics节点内部实现如下公式[ω₁] [ -1 -1 -L ] [vₓ] [ω₂] [ -1 1 L ] [v_y] [ω₃] [ 1 -1 L ] [ω_z] [ω₄] [ 1 1 -L ]其中L为轮距半长vₓ/v_y/ω_z来自/cmd_velω₁~ω₄为四个轮子的角速度输出。这个矩阵在启动时由robot_descriptionURDF中的origin标签自动计算避免硬编码导致的尺寸错配。路径规划层完全基于Nav2但放弃了默认的dwb_local_planner改用nav2_regulated_pure_pursuit_controller——原因很现实DWA在全向小车上容易触发“震荡规避”即面对侧方突然出现的障碍物时小车会左右横移3-4次才稳定下来而纯追踪控制器将路径点投影到车体坐标系直接生成平滑的横向旋转复合指令实测响应延迟降低62%。整个架构用launch文件分层组织bringup.launch.py启动底盘驱动和传感器slam_launch.py启动slam_toolbox并配置scan、odom、map话题绑定navigation_launch.py加载Nav2所有组件并注入自定义的controller_server和bt_navigator行为树。这种分层不是为了炫技而是为了快速隔离故障——当小车建图正常但无法导航时你只需重启navigation_launch.py无需动SLAM部分。3. 核心模块详解与实操要点从激光数据预处理到动态重规划的七道关卡3.1 激光雷达数据清洗为什么必须做两次滤波RPLIDAR A3原始/scan数据看似干净实则暗藏三处陷阱第一是近距盲区跳变0.15m内数据常返回极大值如65535直接喂给slam_toolbox会导致建图时出现“幽灵墙”第二是镜面反射干扰金属货架表面反射会使单点距离值突变为真实值的2-3倍第三是电机启停抖动雷达启动瞬间的0.5秒内角度增量不均匀造成点云扭曲。我们采用两级滤波策略首级在rplidar_ros2驱动节点内启用filter_scan参数剔除0.12m-0.18m区间所有点次级在laser_filters包中部署LaserScanBoxFilter设定X/Y轴范围[-0.3, 0.3]过滤掉底盘正前方0.3m内的无效点——这步看似激进实则是为slam_toolbox的icp匹配算法减负避免其在近距高频噪声中反复迭代。实操中发现若仅做一级滤波slam_toolbox的loop_closure_threshold需设为0.8才能稳定闭环但此时建图速度下降40%两级滤波后阈值可降至0.45建图帧率从8Hz提升至12Hz。 提示LaserScanBoxFilter的min_x/max_x参数必须与机器人实际轮距匹配我们实测发现当max_x设为0.35m超出麦克纳姆轮外缘5cm时小车在窄通道转弯会误删有效侧向点导致SLAM丢失方向感。3.2 SLAM建图参数精调三个决定地图质量的生死参数slam_toolbox的slam_toolbox_params.yaml里有上百个参数但真正影响建图成败的只有三个resolution、maximum_range、loop_closure_threshold。resolution设为0.05m5cm栅格是底线——低于此值2D地图在Nav2的costmap_2d中会因分辨率不匹配导致局部代价图渲染异常高于0.05m如0.1m则无法识别宽度小于20cm的货架缝隙后续导航会把缝隙当死路。maximum_range必须严格等于雷达标称最大距离减去0.3mRPLIDAR A3标称12m此处设为11.7m。为什么减0.3因为雷达在11.5m外的测距标准差超过0.15m这些噪声点进入SLAM后会拖慢ICP匹配收敛速度我们曾将此值设为12.0m结果建图过程中出现连续7次“假闭环”地图被拉伸变形。loop_closure_threshold是灵魂参数它定义了两帧扫描相似度的阈值。设得过高0.9小车在环形仓库中永远无法识别“回到起点”地图无限延伸设得过低0.3则频繁触发错误闭环把直线走廊拼成“之”字形。我们的调参方法是先用ros2 bag play回放一段包含明确闭环的bag包在RViz2中观察/slam_toolbox/loop_closure_pose话题的发布频率当每15-20秒稳定触发一次且位置偏差0.1m时即为最优值。实测在标准仓库环境中该值落在0.42-0.48区间。3.3 全向底盘运动学标定如何用一张A4纸完成零点校准麦克纳姆轮的零点偏移是隐形杀手。四个轮子哪怕有一个编码器零点偏移0.5°小车直行10m就会偏移18cm。传统标定需激光跟踪仪我们用一张A4纸手机慢动作录像搞定将小车置于白纸上启动/cmd_vel发送linear.x0.2前进0.2m/s持续5秒后急停用手机以240fps录制全过程逐帧查看纸面上轮胎压痕的起始/终止位置测量四个轮子实际位移差。我们发现轮子B的压痕比A短3.2mm说明其编码器存在-0.8°零点偏移。修正方法是在robot_localization的ekf_config.yaml中为B轮编码器添加pose0_config偏置pose0_config: [True, True, False, False, False, True] pose0: [0.0, 0.0, 0.0, 0.0, 0.0, -0.01396] # -0.8°转弧度注意pose0_config第六位True代表启用z轴旋转偏置pose0第六值为弧度制。这个偏置值必须在robot_localization启动前写入热更新无效。3.4 Nav2代价图动态更新costmap_2d的三个致命陷阱Nav2的global_costmap和local_costmap不是静态背景图而是实时演化的决策依据。踩过三个深坑第一是静态层缓存失效map_server加载的pgm地图若未在static_layer中设置track_unknown_space: true小车在未知区域如新打开的门后会将空白视为“可通过”撞上墙壁第二是膨胀层半径错配inflation_layer的inflation_radius必须≥机器人半宽0.15m我们底盘半宽0.28m此处设为0.45m若设为0.4m小车在0.5m宽通道中会因膨胀区重叠而判定“无路可走”第三是障碍物层时间戳漂移当激光雷达/scan话题与/tf中base_link到laser_frame的变换存在50ms延迟时obstacle_layer会把障碍物画在错误位置。解决方案是启用obstacle_layer的observation_sources中expected_update_rate参数设为10Hz对应100ms容忍窗口并配合tf2_tools检查/tf延迟ros2 run tf2_tools view_frames生成pdf后重点看base_link→laser_frame链的Delay (ms)是否稳定30ms。3.5 动态避障与重规划DWB控制器的三个隐藏开关dwb_local_planner默认配置在全向小车上表现糟糕根源在于其TrajectoryGenerator的三个未公开参数min_turning_radius、min_translational_velocity、penalize_negative_x。min_turning_radius默认为0导致控制器生成大量零半径旋转轨迹小车原地打转我们设为0.15m略大于底盘半径强制轨迹具备最小曲率。min_translational_velocity默认0.01m/s过小值使小车在狭窄空间“蠕动”设为0.08m/s后移动更果断。最关键是penalize_negative_x默认false意味着控制器允许小车倒车——但全向底盘倒车与侧移物理等效这会造成轨迹不可预测设为true后控制器优先选择旋转侧移组合轨迹平滑度提升3倍。这些参数不在官方文档中需在dwb_planner_params.yaml的DWBLocalPlanner下手动添加DWBLocalPlanner: min_turning_radius: 0.15 min_translational_velocity: 0.08 penalize_negative_x: true3.6 行为树BT定制如何让小车“懂规矩”而不只是“走直线”Nav2的bt_navigator默认行为树过于机械。我们替换了navigate_to_pose_fallbacks.xml新增三条规则第一当目标点位于当前local_costmap边界外时触发ClearEntireCostmap服务清空局部地图而非盲目执行FollowPath第二若controller_server连续3次返回ABORTED启动RotateRecovery而非直接报错第三到达目标点后增加Wait节点持续发布/cmd_vel零指令2秒确保惯性停止。最关键的是NavigateToPose节点的goal_checker配置默认plugin: nav2_controller::SimpleGoalChecker只判断位置距离我们改用plugin: nav2_controller::GoalToleranceChecker同时检查位置误差0.1m且朝向误差5°避免小车“到位但歪着头”。3.7 系统联调与性能压测用三组bag包验证鲁棒性最终验证不靠单次演示而是用三组真实场景bag包压力测试第一组warehouse_straight.bag含150m直线行走3次货架间穿行检验SLAM累积误差与路径跟踪精度第二组dynamic_obstacle.bag在小车行进中注入模拟移动障碍物用/tf动态发布虚拟箱子测试obstacle_layer响应延迟与重规划成功率第三组power_cut.bag在建图中途模拟断电重启验证slam_toolbox的save_map服务能否在/map话题中断后10秒内恢复建图。压测指标有硬性红线SLAM建图误差≤0.3m/100m动态障碍物出现到新路径发布≤1.2秒断电重启后地图恢复时间≤8秒。所有测试均在Jetson Orin16GB RAM上完成未启用GPU加速——这正是项目强调“不依赖GPU”的底气所在。4. 实操全流程从零开始部署的十二个关键步骤4.1 环境准备Ubuntu 22.04 ROS2 Humble的最小化安装跳过鱼香ROS2一键安装——它会装满所有元功能包而我们只需ros-humble-desktop和ros-humble-navigation2。实操命令如下# 添加ROS2源 sudo apt update sudo apt install curl gnupg2 lsb-release curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - echo deb [arch$(dpkg --print-architecture)] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main | sudo tee /etc/apt/sources.list.d/ros2-latest.list # 安装核心包不含仿真、视觉等冗余组件 sudo apt update sudo apt install ros-humble-desktop ros-humble-navigation2 ros-humble-slam-toolbox ros-humble-robot-localization ros-humble-laser-filters # 初始化colcon环境 sudo apt install python3-colcon-common-extensions注意ros-humble-desktop已包含rviz2和ros2cli无需单独安装。ros-humble-navigation2自带nav2-bringup但不含slam-toolbox必须显式安装。4.2 工作空间构建src目录下的五层依赖关系创建~/ros2_ws工作空间src目录结构严格按依赖层级排列src/ ├── robot_description/ # URDF模型含麦克纳姆轮joint定义 ├── rplidar_ros2/ # RPLIDAR驱动修改了filter_scan参数 ├── slam_toolbox/ # 官方Humble分支未修改源码 ├── nav2_bringup/ # Nav2官方包仅修改launch文件 └── my_robot_bringup/ # 自研包含omni_kinematics、ekf_config等编译顺序必须遵守先colcon build --packages-select robot_description rplidar_ros2再colcon build --packages-select slam_toolbox最后colcon build全量编译。若跳过分步编译rplidar_ros2的CMakeLists.txt中find_package(rclcpp REQUIRED)会因rclcpp未提前编译而报错。4.3 激光雷达驱动配置rplidar_ros2的三个必改项rplidar_ros2的config/rplidar_a3.yaml需修改三处rplidar_node: ros__parameters: frame_id: laser_frame # 必须与URDF中frame名称一致 angle_compensate: true # 启用角度补偿否则点云扭曲 filter_scan: true # 启用首级滤波剔除近距盲区启动命令为ros2 launch rplidar_ros2 rplidar_a3_launch.py此时/scan话题应稳定发布用ros2 topic hz /scan检查频率是否为10Hz。若低于8Hz检查USB供电——RPLIDAR A3需5V/1.5A劣质USB线会导致通信丢包。4.4 SLAM建图启动slam_toolbox的最小启动集启动SLAM只需两条命令但顺序不可颠倒# 1. 启动地图服务器提供静态层基础 ros2 run nav2_map_server map_server __params:/path/to/map_server.yaml # 2. 启动slam_toolbox注意--params-file路径 ros2 run slam_toolbox async_slam_toolbox_node --params-file /path/to/slam_toolbox_params.yamlslam_toolbox_params.yaml中关键配置slam_toolbox: ros__parameters: odom_frame: odom map_frame: map base_frame: base_link scan_topic: /scan mode: mapping # 切换为localization需改为localization建图时用ros2 action send_goal /slam_toolbox/save_map nav2_msgs/action/SaveMap {name: my_warehouse}保存地图生成的my_warehouse.pgm和my_warehouse.yaml即为Nav2可用地图。4.5 全向运动学节点部署omni_kinematics的编译与加载my_robot_bringup/src/omni_kinematics目录下含CMakeLists.txt和src/omni_kinematics_node.cpp。编译前需在package.xml中声明依赖exec_dependrclcpp/exec_depend exec_dependgeometry_msgs/exec_depend exec_dependstd_msgs/exec_depend exec_dependsensor_msgs/exec_depend节点核心逻辑是订阅/cmd_vel解算四轮转速后发布/wheel_speeds自定义消息类型。启动命令ros2 run omni_kinematics omni_kinematics_node验证方法ros2 topic pub /cmd_vel geometry_msgs/Twist {linear: {x: 0.2}, angular: {z: 0.0}} -r 10用ros2 topic echo /wheel_speeds查看四轮输出是否符合雅可比矩阵计算结果。4.6 EKF融合配置robot_localization的三段式yamlmy_robot_bringup/config/ekf.yaml分为三段# 第一段滤波器基础配置 ekf_filter_node: ros__parameters: frequency: 50.0 sensor_timeout: 0.1 transform_time_offset: 0.0 print_diagnostics: true # 第二段状态向量定义 state_estimation_as_covariance: false odom_frame: odom base_link_frame: base_link world_frame: odom # 第三段传感器输入关键 odom0: /odom_raw # 编码器原始里程计 odom0_config: [true, true, false, false, false, true] # x,y,yaw imu0: /imu/data # BNO055 IMU数据 imu0_config: [false, false, false, true, true, true] # roll,pitch,yaw启动命令ros2 run robot_localization ekf_node __params:/path/to/ekf.yaml。用ros2 topic echo /odometry/filtered验证输出理想状态下twist.linear.x应与/cmd_vel.linear.x一致twist.angular.z波动0.02rad/s。4.7 Nav2导航启动navigation_launch.py的四大注入点nav2_bringup/launch/navigation_launch.py需在IncludeLaunchDescription前注入四个关键参数# 注入自定义控制器 controller_server_cmd IncludeLaunchDescription( PythonLaunchDescriptionSource([nav2_launch_dir, /controller_server.launch.py]), launch_arguments{controller_server: controller_server}.items() ) # 注入自定义行为树 bt_navigator_cmd IncludeLaunchDescription( PythonLaunchDescriptionSource([nav2_launch_dir, /bt_navigator_launch.py]), launch_arguments{default_bt_xml_filename: os.path.join(get_package_share_directory(my_robot_bringup), behavior_trees, navigate_to_pose_fallbacks.xml)}.items() ) # 注入自定义代价图配置 local_costmap_cmd IncludeLaunchDescription( PythonLaunchDescriptionSource([nav2_launch_dir, /local_costmap.launch.py]), launch_arguments{local_costmap: local_costmap}.items() ) # 注入自定义地图服务器 map_server_cmd IncludeLaunchDescription( PythonLaunchDescriptionSource([nav2_launch_dir, /map_server.launch.py]), launch_arguments{map: os.path.join(get_package_share_directory(my_robot_bringup), maps, my_warehouse.yaml)}.items() )启动命令ros2 launch my_robot_bringup navigation_launch.py。此时rviz2中加载nav2.rviz配置应能看到/map、/robot_model、/global_plan三层叠加。4.8 RViz2可视化配置六个必加显示项rviz2配置文件nav2.rviz中以下六项缺一不可RobotModel加载robot_description参数显示URDF模型Map订阅/map话题显示SLAM生成的地图PoseArray订阅/global_costmap/published_footprint显示机器人轮廓Path订阅/controller_server/last_known_pose显示当前轨迹TF勾选/map、/odom、/base_link、/laser_frame四层变换InteractiveMarker启用/move_base_simple/goal支持鼠标点击设目标注意PoseArray的Topic必须设为/global_costmap/published_footprint而非默认的/footprint否则无法显示动态膨胀区。4.9 动态障碍物注入用tf2模拟移动箱子无需额外硬件用tf2即可模拟动态障碍物# 在终端1启动静态箱子 ros2 run tf2_tools static_transform_publisher 0.5 0.0 0.0 0.0 0.0 0.0 1.0 map box_1 # 在终端2启动移动箱子每秒沿y轴移动0.1m ros2 run tf2_tools static_transform_publisher --x 0.0 --y 0.1 --z 0.0 --roll 0.0 --pitch 0.0 --yaw 0.0 --frame-id map --child-frame-id box_2此时/obstacle_layer会将box_1和box_2作为障碍物纳入局部代价图触发重规划。4.10 路径规划测试三步法验证全局局部能力全局规划验证在RViz2中点击2D Nav Goal设目标点距离起点5m观察/plan话题是否发布有效路径路径点数应≥20局部跟踪验证启动ros2 topic pub /cmd_vel geometry_msgs/Twist {linear: {x: 0.0}, angular: {z: 0.5}}观察/controller_server/last_known_pose发布的轨迹是否平滑无抖动动态响应验证在小车行进中启动移动箱子box_2用ros2 topic hz /controller_server/last_known_pose确认新路径在1.2秒内发布。4.11 地图保存与复用save_map服务的正确调用姿势slam_toolbox的save_map服务必须在建图模式下调用且mode参数需为mapping。错误做法ros2 action send_goal /slam_toolbox/save_map ...这是action非service。正确命令ros2 service call /slam_toolbox/save_map nav2_msgs/srv/SaveMap {name: final_map}生成的final_map.pgm和final_map.yaml需复制到my_robot_bringup/maps/目录并更新navigation_launch.py中的地图路径。4.12 系统稳定性压测用ros2 doctor诊断瓶颈ros2 doctor是ROS2内置诊断工具运行ros2 doctor --report可生成系统健康报告。重点关注三项Topic Statistics检查/scan、/tf、/cmd_vel的丢包率5%需查网络或CPUNode Lifecycle确认slam_toolbox_node、controller_server等关键节点状态为activeParameter Consistency验证slam_toolbox的map_frame与nav2的global_costmap中global_frame均为map不一致会导致坐标系错乱。5. 常见问题与排查技巧实录那些文档里不会写的实战经验5.1 “小车建图时原地转圈”——SLAM闭环失败的七种可能这是最高频问题表象是/map静止不动/tf中map→odom变换疯狂抖动。排查清单现象可能原因验证命令解决方案ros2 topic hz /scan8HzUSB供电不足dmesg | grep -i usb换用带外置供电的USB集线器ros2 topic echo /tf中map→odom无数据slam_toolbox未启动ros2 node list | grep slam检查slam_toolbox_params.yaml中mode: mappingros2 topic echo /slam_toolbox/loop_closure_pose无输出loop_closure_threshold过高回放bag包观察发布频率降至0.45并重启节点ros2 topic echo /odometry/filtered中twist.angular.z持续0.1rad/sEKF融合异常ros2 topic echo /imu/data看angular_velocity.z检查IMU安装方向调整imu0_configrviz2中/scan点云呈扇形缺失激光雷达镜面反射ros2 topic echo /scan看ranges数组启用LaserScanBoxFilterros2 topic hz /tf10HzTF广播负载过重ros2 run tf2_tools view_frames减少/tf广播频率禁用非必要变换ros2 topic echo /map数据全零map_server路径错误ls /path/to/maps/my_warehouse.pgm确认.pgm文件存在且权限为6445.2 “导航时小车撞墙”——代价图失效的五个盲区盲区表现根本原因修复操作global_costmap空白小车无视全局地图map_server未启动或static_layer未启用ros2 launch nav2_map_server map_server ...local_costmap无膨胀区小车紧贴墙壁行驶inflation_layer的inflation_radius过小设为robot_radius 0.15obstacle_layer不更新小车穿越障碍物/scan与/tf时间戳不同步用tf2_tools检查base_link→laser_frame延迟robot_footprint错位小车轨迹偏离预期URDF中collision尺寸与实际底盘不符测量实物修正box size...costmap_2d黑屏RViz2无任何代价图local_costmap的global_frame设为odom而非map改为map并确保map→odomTF存在5.3 “路径规划超时”——Nav2行为树卡死的三种场景场景日志特征解决方案bt_navigator卡在ComputePathToPoseNo valid path found重复出现检查global_costmap是否加载地图map_server是否正常controller_server返回ABORTEDFailed to get a valid control command降低DWBLocalPlanner的max_vel_x至0.15增大min_turning_radiusrecoveries未触发No recovery behaviors configured在bt_navigator的behavior_tree中添加ClearEntireCostmap节点5.4 “rviz2显示异常”——可视化层的十个致命配置问题正确配置错误配置后果机器人模型不显示RobotModel的Description Source选TopicDescription Topic填/robot_description选File并指定URDF路径模型无法随TF更新地图错位Map的Topic填/mapImage Topic留空Image Topic填/map地图缩放失真轨迹不连续Path的Topic填/controller_server/last_known_pose填/plan只显示全局路径无局部跟踪TF链断裂TF面板中勾选/map、/odom、/base_link、/laser_frame漏勾/laser_frame激光点云无法叠加到地图交互目标无效InteractiveMarker的Topic填/move_base_simple/goal填/goal_pose鼠标点击无响应5.5 “性能瓶颈诊断”——Jetson Orin上的四类资源争抢资源争抢表现监控命令优化方案CPUhtop中slam_toolbox_node常驻90%ros2 topic hz /scan降低激光雷达频率至10Hz关闭rplidar_ros2的angle_compensate内存free -h显示available1GBros2 doctor --report关闭rviz2的PointCloud2显示本文还有配套的精品资源点击获取
返回列表