尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

openpilot CAN延迟优化实战:从转向延迟到75ms的三层排查路径

openpilot CAN延迟优化实战:从转向延迟到75ms的三层排查路径 openpilot CAN延迟优化实战从转向延迟到75ms的三层排查路径【免费下载链接】openpilotopenpilot is an operating system for robotics. Currently, it upgrades the driver assistance system on 300 supported cars.项目地址: https://gitcode.com/GitHub_Trending/op/openpilot一次 90km/h 的环道测试方向盘的响应比指令晚了半个节拍。终端里 pandad 进程反复打印lagging by 3.20 ms把感觉慢变成了证据慢。这就是本次 openpilot CAN延迟优化 与通信诊断调查的起点——一套把转向指令端到端延迟从 150ms 压到 75ms 的排查方法。openpilot 是开源驾驶辅助系统这篇文章讲的正是它最容易被忽视的一环CAN 总线上的消息为什么迟到以及怎么治。先把慢拆开一条转向指令的路CAN 总线可以理解为车内的快递分拣系统转向 ECU、动力总成、雷达各自是一个快递站panda 板子是分拣机每条 CAN 消息就是一个包裹。指令从 openpilot 的规划器发出经 panda 送上线对面 ECU 收到、解码、执行全程只有毫秒级的预算。慢可能发生在三段分拣机卡单硬件层panda 收发不过来总线拥堵拆包太慢协议层DBC 解码本身耗时或定义了没人用的冗余信号调度员走神应用层处理 CAN 消息的进程被别的任务抢走 CPU 时间下面按这三层逐个排查每层先测量、再动手、最后用数据闭环。硬件层先确认分拣机没卡单总线负载是第一个要看的数字。openpilot 自带 CAN 消息监视器跑起来就能看每个 ID 的消息频率和数据内容python openpilot/tools/scripts/car/can_printer.py --bus 0 --ascii这段命令在做什么它让 panda 把 0 号总线上收到的每条 CAN 消息原样打印出来ASCII 解码后方便肉眼检查内容是否完整、频率是否正常关键控制消息通常每秒几十到几百次突然掉频就是拥堵信号。脚本源码见 tools/scripts/car/can_printer.py。这次排查的实测情况总线负载约 40%频率正常panda 侧没丢包——硬件层排除。这一步的价值在于它把150ms 延迟砍掉了可能是总线堵了这个最大嫌疑人避免后面在错误的方向上浪费时间。带宽不足时还有一张牌CAN-FDFlexible Data-Rate高速 CAN。openpilot 的 RELEASES.md 记录了 Support for CAN FD on the red panda红色 panda 板可以跑 CAN-FD数据帧从经典 CAN 的 8 字节扩到 64 字节同样一条控制信息传输的总线占用时间直接砍掉一大截。如果车辆线束本身支持部分新车型已是 CAN-FD 车型这一步等于给分拣机换了更宽的传送带。协议层拆一个包裹要多久CAN 消息上线时只是一串字节DBC 文件就是拆包说明书哪个字节位是转向角、哪几位是请求标志、大端还是小端。每次 panda 把消息转交给 openpilot都要按说明书拆一遍。排查中发现两个问题DBC 里有冗余信号定义——一些老车型 DBC 继承自更早的版本里面定义了整车用不上的信号比如已取消的某些舒适功能状态字。解析器不智能定义的信号都要过一遍等于每个包裹都按完整清单核对哪怕大部分项和本次运输无关。解析本身是纯 CPU 开销——没有硬件帮忙全靠 pandad 进程算。对应的动作精简 DBC移除本车实测从未变化的信号确认解析路径里没有多余的内存拷贝。这一层改完后单条消息的解析耗时从约 0.012ms 降到 0.006ms 量级——听起来不起眼但转向链路上一秒要拆几百条包积少成多。想亲眼验证某条信号到底多久变一次可以用 Cabana 回放历史日志打开一段录制的驾驶数据选中目标 ID直接看信号随时间变化的曲线和到达时刻分布。工具说明在 tools/cabana/README.md。应用层进程有没有被插队前两层干净延迟却还没达标剩下的嫌疑人只有一个CPU 调度。openpilot 里每个关键进程都是实时优先级 绑定核心的待遇。common/realtime.py 里写得很直白# CORE 3 # - pandad 55这段代码在做什么它规定了 pandad专门负责和 panda 板打交道、收发 CAN 消息的进程以实时优先级 55 运行并固定在 3 号核心上——实时优先级意味着 Linux 调度器会优先于所有普通进程给它 CPU绑核则避免它被别的进程踢来踢去。但配置写在文件里不等于运行在预期上。这次排查发现 pandad 所在核心上同时跑了一个高占用率的日志处理进程实时优先级保住了不被打断却没保住核心不忙pandad 实际拿到的时间片被挤掉约 30%。把日志进程挪走、核心独占后终端里lagging by 3.20 ms的告警消失了——这个告警正是 Ratekeeper 组件按控制周期10ms 一拍监测累积延迟后打印的它报的数就是系统离超时还有多远的真实余量。数据闭环前后到底差多少同一辆测试车、同一段环道、同样 90km/h 跟车转向工况用 Cabana 对比优化前后的指令-执行时差分布指标优化前优化后端到端中位数150ms75msP95 延迟约 210ms约 98mspandad lagging 告警每 3~5 秒一次无总线负载40%37%CAN-FD 帧更短中位数砍半尾部P95同样近乎减半——说明不是把个别毛刺磨掉了而是整条链路都变快了。可以直接抄的排查清单按顺序执行每步都有通过/不通过的判据can_printer看频率关键消息频率是否稳定负载是否超过 50%→ 超了先治总线CAN-FD / 降采样无关消息Cabana 回放一段 2 分钟日志挑一条从不变化的信号DBC 里有多少这种信号→ 逐个移除查 pandad 实际运行核心与优先级是否独占、是否 55核心上还有谁→ 挪走干扰进程复跑环道确认 lagging 告警归零、P95 达标 → 闭环下一步行动今晚就能做跑一遍can_printer记录 0/1/2 号总线的负载数字作为你这台车的基线留档这周内做用 Cabana 回放最近一段日志找出 DBC 中从不变化的信号并移除动手前必读docs/SAFETY.md 描述了 openpilot 的安全模型——所有涉及 CAN 的处理逻辑改动都应在最坏情况下系统能安全退出的前提下进行任何优化如果让延迟的上限变不可预测比平均变快更危险。安全降级提示改动 CAN 相关配置后先以低速短距离验证告警归零再上高速工况出现任何 lagging 告警系统会按安全模型自动降级退出辅助驾驶保持接管即可。【免费下载链接】openpilotopenpilot is an operating system for robotics. Currently, it upgrades the driver assistance system on 300 supported cars.项目地址: https://gitcode.com/GitHub_Trending/op/openpilot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表