导航时小车定位飘怎么办

使用的是亚博官方的RDKX5套件,包括底盘,摄像头,雷达等,按照官方例程:
虚拟机端:
ros2 launch yahboomcar_rviz yahboomcar_nav_launch.py
ssh连接小车端启动底盘及雷达:
ros2 launch yahboomcar_nav laser_bringup_launch.py
启动导航节点:ros2 launch yahboomcar_nav navigation_dwb_launch.py

在地图中为小车手动指定位姿,此时雷达代价地图等都正常。
然后在rviz中为小车指定目标点。
此时小车如果要转弯定位就会飘(体现为rviz中更新速度很慢,估计只有1hz,还有就是车都停下来了,但是rviz里它的位置还在飘),终端查看ekf和odom输出都是9.几hz,接近设置的10hz

底盘与雷达控制终端有提示建议减少传感器(可是我只用了导航最基本的几个,甚至没加摄像头)
本地虚拟机rviz中从打开就开始报消息队列满了的警告

我是麦轮底盘

根据你描述的现象(RViz 定位飘、消息队列满、频率显示异常),这是典型的 ROS2 通信瓶颈 + 时间同步问题。按以下优先级排查:


:wrench: 立即执行(3 步解决 80% 问题)

:one: 强制时间同步(最关键!)

定位飘移 90% 是时间不同步导致传感器数据时间戳错乱。

# 小车端安装 chrony
sudo apt install chrony -y
sudo chronyd -q 'server ntp.aliyun.com iburst'

# 虚拟机端同样执行
sudo chronyd -q 'server ntp.aliyun.com iburst'

# 验证时间差(必须 < 10ms)
chronyc tracking

:two: 降低网络负载

消息队列满 = 网络带宽不足,优先砍掉非必要数据:

# 修改 yahboomcar_nav_launch.py,找到雷达节点添加:
parameters=[{'use_sim_time': False, 
             'scan_topic': '/scan_raw',  # 改用降频话题
             'publish_rate': 5.0}]       # 强制 5Hz

或在 RViz 中取消订阅 /point_cloud/camera 等高带宽话题。

:three: 调整 EKF 参数

编辑 ekf_config.yaml(通常在 yahboomcar_nav/config/):

odom0: /odom
odom0_config: [true, true, false, false, false, true, true, false, false, false, false, true, false, false, false]
odom0_differential: true   # 启用微分模式抗漂移
odom0_relative: true

:magnifying_glass_tilted_left: 深度排查(若仍未解决)

:play_button: 检查网络质量

# 小车端持续 ping 虚拟机
ping -i 0.2 <虚拟机 IP> 

# 虚拟机端监控 ROS2 流量
ros2 topic hz /odom /scan /tf

正常值:延迟 < 20ms,丢包率 0%。若延迟>50ms,换 5G WiFi 或有线连接。

:play_button: 验证 QoS 配置

在 RViz 启动命令中添加 QoS 参数:

ros2 run rviz2 rviz2 --ros-args -p use_sim_time:=false \
  -p qos_overrides./odom.depth:=100 \
  -p qos_overrides./scan.depth:=100

:play_button: 检查传感器冲突

# 查看是否有重复发布 odom 的节点
ros2 topic info /odom -v

# 临时禁用底盘里程计测试
ros2 param set /base_controller publish_odom false

:pushpin: 社区参考

:light_bulb: 关键提示:亚博套件默认配置未针对 ROS2 优化,务必先做时间同步+降频,再调参数。若仍飘移,建议用 ros2 bag record 录制数据包分析时间戳连续性。

这是什么原因呢 ??/

这个警告是亚博底层驱动检测到系统资源瓶颈时触发的保护机制,不是让你物理上拔掉传感器,而是逻辑上减少数据负载


:magnifying_glass_tilted_left: 警告触发的真实原因

:one: USB 带宽竞争(最可能)

麦轮底盘的编码器 + 雷达都走 USB 总线,当同时传输时:

  • 雷达点云数据量大(尤其 10Hz 全量发布)
  • 底盘里程计数据频繁更新
  • USB 2.0 带宽上限 480Mbps,实际可用约 280Mbps
# 查看 USB 带宽占用
lsusb -t
# 如果看到同一 USB 控制器下有多个高速设备,就是瓶颈

:two: CPU 资源竞争

导航栈 + 雷达驱动 + 底盘驱动同时运行,CPU 负载过高:

# 小车端实时查看
htop
# 关注:ros2 相关进程是否占用 >60%

:three: 亚博默认配置过于激进

官方例程默认开启所有传感器话题,包括:

  • /scan(雷达原始点云)
  • /scan_raw(降频前的全量数据)
  • /odom(底盘里程计)
  • /imu(如果有)
  • /camera/*(即使你没启用,节点可能仍在发布)

:white_check_mark: 解决方案(按优先级)

步骤 1:禁用非必要话题

编辑小车端的启动文件 laser_bringup_launch.py

# 找到雷达节点,添加参数限制发布频率
Node(
    package='yahboom_lidar',
    executable='lidar_node',
    parameters=[{
        'publish_rate': 5.0,      # 从 10Hz 降到 5Hz
        'scan_topic': '/scan',    # 只发布一个话题
        'disable_raw_data': True  # 禁用 /scan_raw
    }]
)

步骤 2:关闭底盘冗余数据

编辑底盘驱动配置(通常在 yahboomcar_hw/config/):

# base_controller.yaml
publish_odom: true       # 保持开启(导航需要)
publish_tf: false        # 关闭(让 EKF 统一发布 tf)
publish_imu: false       # 如果没接 IMU 就关掉
publish_joint_state: false  # 导航不需要关节状态

步骤 3:验证资源释放

# 查看当前活跃话题数量
ros2 topic list | wc -l

# 查看各话题频率
ros2 topic hz /odom /scan /tf

# 查看 CPU 负载
top -d 1

目标值

  • 话题数 < 30 个
  • CPU 负载 < 50%
  • /odom/scan 频率稳定在 5-10Hz

:pushpin: 为什么"没加摄像头"还会报?

即使你没启动摄像头节点,亚博的默认 launch 文件可能仍在后台运行

# 检查是否有摄像头进程
ps aux | grep camera

# 如果有,找到对应的 launch 文件并注释掉
# 通常在 yahboomcar_nav_launch.py 中有类似:
# IncludeLaunchDescription(
#     LaunchDescriptionSource([pkg_dir, '/launch/camera_launch.py'])
# )

:test_tube: 验证是否解决

完成上述修改后,重新运行导航:

  1. RViz 中不再出现"消息队列满"警告
  2. 终端不再提示"建议减少传感器"
  3. 小车转弯时定位不再飘移

如果仍有问题,执行:

# 录制数据包分析
ros2 bag record /odom /scan /tf -o nav_debug

# 发给社区时带上这个包,方便分析时间戳连续性

:books: 社区参考

:light_bulb: 关键提示:这个警告是"软限制",不是硬件故障。通过降低发布频率 + 关闭冗余话题即可解决,不需要物理移除传感器。