3. EyeQ软件架构与标定数据流

EyeQ 芯片上运行的并不是一个“单程序”,而是一套分层软件栈:最底层是 EyeQ 的实时操作系统(EyeQ OS,基于 AUTOSAR Classic 与自研调度内核的混合形态),其上运行中间件(Middleware),再往上是感知、规划、控制等应用模块。标定工程师真正需要建立的认知是:标定参数不是散落在代码里的常量,而是沿软件栈逐层加载、逐层生效的数据对象。理解这条数据流,才能判断“改了参数为什么没生效”“刷写后为什么行为不一致”。

一、EyeQ 软件栈的分层结构

从下往上,EyeQ 软件栈大致分为四层。第一层是 硬件抽象与驱动层,包含 MIPS/ARM 核的启动引导、DMA、CAN/FlexRay 控制器、摄像头串行接口(CSI-2)驱动,以及 EyeQ 特有的加速器(如视觉计算单元 VMP、深度加速器)驱动。第二层是 EyeQ OS 与运行时,负责多核任务调度、内存保护、时间同步(基于 PTP 或硬件定时器)和进程间通信(IPC)。第三层是 中间件,典型组件包括通信中间件(SOME/IP、DDS 或自研消息总线)、诊断中间件(UDS 服务栈)、标定中间件(XCP/CCP 或自研标定协议栈)以及日志与追踪模块。第四层是 应用层,即感知(目标检测、车道线、可行驶区域)、规划(路径生成、行为决策)和控制(横向/纵向执行器指令)模块。

标定参数主要作用于第三层和第四层:中间件负责“把参数从存储介质搬到内存并通知应用”,应用层负责“用参数改变算法行为”。

二、感知—规划—控制数据链路

EyeQ 内部的数据链路可以概括为一条带时间戳的信号链。摄像头原始图像经 CSI-2 进入,由感知模块输出结构化目标列表(含 ID、位置、速度、置信度)和车道线多项式系数;规划模块消费这些结构化结果,结合本车状态(车速、横摆角速度、方向盘转角)生成一条带曲率序列的期望轨迹;控制模块再把轨迹转换为横向扭矩或转角请求、纵向加速度请求,通过 CAN 或以太网发送给执行器。

这条链路上,标定参数以“配置”形式嵌入每一级:感知级有检测阈值、ROI 裁剪参数、相机内外参;规划级有安全距离、跟车时距、最大横向加速度;控制级有 PID 增益、前馈系数、执行器死区补偿。链路中每一级都带时间戳,标定调试时可通过追踪接口观察端到端延迟,判断参数是否引入了额外计算负担。

EyeQ 软件栈与标定数据流 应用层 感知 / 规划 / 控制 中间件 通信 / 诊断 / 标定 / 日志 EyeQ OS 与运行时 调度 / IPC / 时间同步 硬件抽象与驱动 CSI-2 / CAN / DMA / 加速器 感知 目标列表 / 车道线 规划 期望轨迹 / 曲率序列 控制 扭矩 / 加速度 标定参数注入点 检测阈值 / ROI 相机内外参 安全距离 / 时距 最大横向加速度 PID 增益 / 前馈 执行器死区补偿 标定数据存储与加载路径 Flash / EEPROM A2L 描述文件 标定中间件 XCP / 自研协议 RAM 参数区 运行时生效 诊断与刷写通道 UDS over CAN / DoIP 0x34 / 0x36 / 0x37 服务 Bootloader 刷写

三、标定参数在软件栈中的存储与加载机制

标定参数在工程上通常以 A2L 文件描述其地址、数据类型、量纲和上下限。在 EyeQ 上,参数的实际存储分为两级:非易失存储(Flash 或 EEPROM 中的标定数据块)和运行时内存(RAM 中的参数区)。上电流程大致是:Bootloader 校验应用镜像 → OS 启动 → 中间件从 Flash 读取标定数据块 → 按 A2L 描述解析并写入 RAM 参数区 → 通知各应用模块重新读取参数。

这里有一个工程上极易踩坑的点:参数生效时机。部分参数在模块初始化时读取一次,之后不再刷新;部分参数支持在线修改(通过 XCP 的 SHORT_UPLOAD/DOWNLOAD 或标定工具写入 RAM),但需要显式触发“参数重载”事件才会被算法重新读取。因此调试时若发现“改了没反应”,应先确认该参数属于“初始化加载”还是“在线可刷新”,再检查是否触发了重载。

另一个关键机制是参数版本与校验。标定数据块通常带 CRC 校验和版本号,刷写后 Bootloader 或中间件会校验一致性。若版本不匹配,系统可能回退到默认参数或拒绝启动。标定工程师在交付标定数据时,必须同时记录 A2L 版本、数据块 CRC 和对应的软件基线版本。

四、诊断与刷写通道

EyeQ 的诊断通道通常基于 UDS(ISO 14229),物理层可以是 CAN 或 DoIP(以太网)。刷写流程使用 UDS 的 0x34(RequestDownload)、0x36(TransferData)、0x37(RequestTransferExit)服务,配合 0x31(RoutineControl)触发校验和激活。Bootloader 负责在应用镜像无效或收到刷写请求时接管通信。

对标定工程师而言,需要区分两条通道:诊断刷写通道用于更新整个软件镜像或标定数据块,属于“离线”操作;在线标定通道(XCP/CCP)用于在系统运行时读写 RAM 参数,属于“在线”操作。两者使用的协议栈、安全访问(Security Access)等级和会话状态不同,不能混用。

在实际项目中,建议先通过在线标定通道完成参数寻优,确认效果后再将最终参数固化到标定数据块,通过诊断刷写通道写入 Flash,最后做一次完整的上电加载验证,确保“在线生效”与“固化后生效”行为一致。

五、一个可复用的检查清单

当标定参数行为异常时,可按以下顺序排查:确认参数所属模块和加载时机(初始化加载 / 在线可刷新);确认当前会话是否允许写入(UDS 会话状态、安全访问等级);确认参数地址与 A2L 描述一致;确认写入后是否触发重载;确认 CRC 与版本号匹配;最后通过端到端数据链路观察参数变化是否真正影响了感知、规划或控制输出。

理解这条从 Flash 到 RAM、从中间件到应用、从在线标定到离线刷写的完整数据流,是后续所有标定实操的基础。只有知道参数“在哪里、怎么进去、什么时候生效”,调试才不是碰运气。