Files
note_sync/ros/ros2/nav2/debug.md
T

7.2 KiB
Raw Blame History

root@nvidia:~/ros2_ws# ros2 topic echo /goal_pose
header:
  stamp:
    sec: 1776912839
    nanosec: 772353086
  frame_id: map
pose:
  position:
    x: -0.2929971516132355
    y: -28.93631362915039
    z: 0.0
  orientation:
    x: 0.0
    y: 0.0
    z: -0.7140266359687852
    w: 0.7001185350546718
---
header:
  stamp:
    sec: 1776912894
    nanosec: 349057427
  frame_id: map
pose:
  position:
    x: 1.0191293954849243
    y: -23.940237045288086
    z: 0.0
  orientation:
    x: 0.0
    y: 0.0
    z: -0.758253550259611
    w: 0.6519597790651626
---
header:
  stamp:
    sec: 1776912930
    nanosec: 59193832
  frame_id: map
pose:
  position:
    x: -0.25821736454963684
    y: -26.604511260986328
    z: 0.0
  orientation:
    x: 0.0
    y: 0.0
    z: -0.7286561115363753
    w: 0.6848797493872113
---
header:
  stamp:
    sec: 1776913007
    nanosec: 811936088
  frame_id: map
pose:
  position:
    x: -0.5403046607971191
    y: -23.95861053466797
    z: 0.0
  orientation:
    x: 0.0
    y: 0.0
    z: -0.7323575592769619
    w: 0.6809202635917743
---
header:
  stamp:
    sec: 1776913105
    nanosec: 601216801
  frame_id: map
pose:
  position:
    x: -0.13717754185199738
    y: -31.840221405029297
    z: 0.0
  orientation:
    x: 0.0
    y: 0.0
    z: -0.6531641242066932
    w: 0.7572163672618966
---

雷达同步问题

ros2_ws\src\rslidar_sdk\config\config.yaml
use_lidar_clock: false
 ---
  ⚠️ 警告1:No goal checker was specified in parameter 'current_goal_checker'. Server will use only plugin loaded
  general_goal_checker

  含义

  这是配置缺失类警告,不影响功能,只是提示你没有显式指定当前使用的目标检查器,系统自动用了第一个加载的general_goal_check
  er。
  根因

  ROS2 Humble及以上版本的Nav2新增了current_goal_checker强制配置项,你的配置里只定义了goal_checker插件,但没有指定当前使
  用哪一个。
  ✅ 解决方案

  在controller_server的ros__parameters下添加一行即可:
  controller_server:
    ros__parameters:
      current_goal_checker: "general_goal_checker"  # 新增这行
      controller_frequency: 20.0
      # ... 其他原有配置

  ---
  ⚠️ 警告2:Behavior Tree tick rate 100.00 was exceeded!

  含义

  这是性能类警告,行为树默认tick频率是100Hz(每10ms执行一次),现在单次tick执行时间超过了10ms,导致频率不达标。
  根因

  行为树中的计算密集型节点执行太慢,90%的情况是MPPI控制器计算耗时过长,小概率是系统CPU负载过高、规划器卡顿等。
  ✅ 排查&解决方案

  1. 先看CPU占用:top 看controller_server进程的CPU占比,如果超过100%就是计算量太大
  2. 优先优化MPPI参数(你的当前配置计算量过高),后面警告3会详细说
  3. 实在优化不了可以调大BT的tick间隔,在bt_navigator下加:
  bt_navigator:
    ros__parameters:
      bt_loop_duration: 20  # 从10ms改成20ms,频率降到50Hz,不推荐,优先优化控制器

  ---
  ⚠️ 警告3:Control loop missed its desired rate of 20.0000Hz

  含义

  这是核心性能警告,控制器要求20Hz的控制频率(每50ms输出一次速度指令),现在单次循环执行超过了50ms,频率不达标。
  ⚠️ 这个问题必须优先解决:控制频率低于15Hz会导致MPPI控制不稳定,甚至出现急刹、撞障碍物的情况。
  根因

  你的MPPI配置计算量过大,两个核心参数超标:
  FollowPath:
    batch_size: 2000  # 单次迭代采样2000条轨迹,计算量极大
    time_steps: 56    # 每条轨迹预测56步(0.05*56=2.8秒预测时长)
  - 2000的batch_size在Jetson NX级别的嵌入式平台单次计算就要60-80ms,肯定达不到50ms的要求
  - 额外加重负载的配置:local costmap的obstacle_max_range: 20.0,local
  costmap本身只有6m×6m,处理20米内的点云完全是浪费CPU
  ✅ 解决方案(按优先级)

  1. 调小MPPI计算量(优先保证控制频率达标):
  FollowPath:
    batch_size: 1000  # 降到800-1200,轨迹采样数减半,性能提升一倍,效果下降不明显
    time_steps: 40    # 降到32-40,预测时长2秒足够,履带车速度慢不需要太长预测
  2. 缩小local costmap障碍物检测范围:
  # local_costmap的voxel_layer下的scan配置
  obstacle_max_range: 10.0  # 从20米改成10米,足够覆盖6m的local costmap范围
  3. 验证效果:改完后用ros2 topic hz /cmd_vel_nav看频率,稳定在18Hz以上就算合格

  ---
  ❌ 错误1:Failed to create a plan from potential when a legal potential was found. This shouldn't happen.

  含义

  这是Navfn规划器内部错误:规划器已经算出了从起点到终点的势场(理论上存在可行路径),但实际提取路径的时候失败了。
  根因

  结合你的配置,最可能的几个原因:
  4. 可行通道太窄:你的膨胀半径是1.8m,车身本身宽1.8m,通道宽度必须大于3.6m才能通过,如果路径上有窄于这个宽度的通道,膨
  胀后就没有可行空间了
  5. 起点/终点落在膨胀区内:虽然势场是通的,但膨胀后的代价太高,路径提取的时候找不到合法的起点/终点
  6. 膨胀半径过大:1.8m的膨胀半径刚好是车身宽度,没有冗余,稍微有点障碍物就会把通道堵死
  7. 全局costmap噪点过多:点云误检的障碍物挡住了路径
  ✅ 排查&解决方案

  8. 排查路径情况:规划失败时,在rviz上看起点到终点的通道宽度,是不是小于3.6m
  9. 优化膨胀半径(如果通道普遍较窄):
  # 全局和局部costmap的inflation_radius都可以降到1.5m(只要大于车身最大半长1.2m就满足SMAC优化要求)
  inflation_radius: 1.5
  10. 优化Navfn参数:
  GridBased:
    tolerance: 1.0  # 从0.5米改成1.0米,允许终点有更大的容忍范围
  11. 终极方案:换规划器:如果经常走窄通道,把Navfn换成nav2_smac_planner/SmacPlanner,对窄通道的支持好很多
  12. 检查全局costmap噪点:如果有很多误检的小障碍物,调大mark_threshold过滤噪点

  ---
  ❌ 错误2:Failed to get result for follow_path in node halt!

  含义

  这是次生错误,不影响功能,只是日志提示:行为树在终止(halt)的时候,尝试获取follow_path节点的执行结果,但结果不存在。
  根因

  完全是前面的规划失败导致的连锁反应:规划失败后整个导航任务提前终止,follow_path节点还没来得及产生结果就被强制停止了。
  ✅ 解决方案

  解决前面的规划失败问题后,这个错误会自动消失,不需要单独处理。

  ---
  🎯 解决优先级建议

  13. 【最高优先级】先解决控制循环频率不够的问题,直接影响导航安全性
  14. 【次高优先级】解决规划失败的问题,影响导航可用性
  15. 【低优先级】解决剩下的配置类警告,不影响功能只是优化日志

  额外优化建议

  你现在的voxel层mark_threshold: 10有点太高了,需要10个点才能标记障碍物,容易漏检小障碍物,建议调到3-5更合适:
  voxel_layer:
    mark_threshold: 3  # 从10改成3,平衡噪点过滤和小障碍物检测