Files
ASER/Doc/大体方案.md
2026-04-03 07:57:57 +08:00

507 lines
39 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ASER 平台 B 方案走廊相对定位实现与模块化解耦技术报告
**执行摘要**:本报告围绕你选择的 **B 方案(走廊相对定位 Corridor-relative Estimation**,在不破坏现有 ASER 工程结构与 **STM32H743上位机↔ STM32F407底盘既有 CAN 协议**的前提下,给出一套可落地、可扩展、可“先跑通再变强”的实现路线。核心思想是:不把比赛当作“绝对坐标 SLAM”而把赛场 40cm 窄通道视为拓扑段落序列,实时估计 **横向偏差 e_y、航向误差 e_θ、沿通道进度 s**,并用侧向测距闭环实现“居中/偏置行走 + 对齐”,以对抗 **赛场尺寸 ±5% 误差、地毯导致的轮滑、测距偶发失效**(比赛规则明确存在地毯模拟松软路面、且尺寸允许误差 ±5%)。同时,将 **0x100 速度指令 20ms 周期硬实时发送**作为最高优先级工程约束,任何导航/融合/日志都不得影响其节拍(否则底盘可能进入 SAFE_FAULT。赛场层面规则要求 **5 分钟限时**且未完全驶出与未停在启动区内可判 0 分,因此系统优先级必须是 **安全与完赛闭环 > 定位美观 > 路径最优**。(赛事通道/出入口 40cm、启动区、5 分钟限制、尺寸误差 ±5%见《附件6…比赛规则》13 页与 14 页;上位机 CAN 协议关键帧见《通讯协议》24 页、810 页ASER 工程任务/协议层约束见《aser》15 页。)
## 系统约束与现状梳理
### 赛场与任务约束对算法与工程的“硬约束”
比赛场地为 **390cm × 300cm**,共有 5 条田垄;围栏与田垄之间、以及相邻田垄之间均为 **40cm 通道(垄沟)**,出入口宽 **40cm**,出入口外侧紧邻 **40cm × 100cm 启动区**;比赛 **限时 5 分钟**,且规则强调必须驶离场地并停在启动区,否则可能判 0 分;尺寸允许误差 **±5%**(意味着通道宽可能约 3842cm任何“贴边”策略都必须考虑裕量。这些约束直接决定控制目标应是“别蹭边、别失控、能跑完”而非追求全局米级地图的一致性。《附件6…比赛规则》13 页、14 页)
### 现有硬件与软件约束
以下为你给定的固定约束(本报告按此设计):
- 车体:**20×20cm**,轮厚 **3cm****差速四轮结构**(四电机)。
- 控制器三块:
- **STM32F407底盘**:已实现四轮 **LADRC**,通过 CAN 与上位机通信。
- **STM32H743主控/上位机)**:传感器融合、底盘与机械臂控制(现状上位机)。
- **K230视觉中枢**:用于视觉语义/目标等(本报告将其作为增强/降级输入,不进入硬实时链路)。
- ASER 工程形态(来自你上传的 ASER 文档):基于 STM32CubeMX + FreeRTOSCMSIS-V2已建立 **20ms canTxTask****100ms monitorTask**CAN 协议层在 `App/Can/snc_can_app.c/.h`,并明确要求保持既有协议/中断接收链路,新增功能优先放到 `App/` 目录以避免再生成覆盖FDCAN 接收链路保持 IRQ→回调→协议解析的单路径。《aser》15 页)
### 既有 CAN 协议是“不可破坏”的硬边界
你已确认 H7↔F4 通信协议“已经制定好”,因此本文不再“重新设计协议”,而是把协议当作 **契约contract**
- 0x100 为速度命令,**DLC=8**,包含 `vx_x1000``wz_x1000`、rolling counter、CRC8要求 **建议 20ms** 周期持续发送,且 **不得超过 150ms 不发送合法 0x100**,否则底盘进入 SAFE_FAULT心跳帧 0x080 **不刷新运动看门狗**《通讯协议》24 页、810 页)
这些要求决定:**所有算法模块必须围绕“20ms 严格出 v/ω”来组织调度与解耦**。
## 传感器清单、性能与可观测性分析
### 传感器清单(按你给定配置)
- **4 电机编码器**:提供四轮增量/速度,可构造差速里程计,并可用于同侧前后轮差异的 **轮滑检测**(工程上很关键)。
- **高精度单轴 IMUω_z 或 θ)**:你给定“短时漂移可忽略”。这对 B 方案非常有利:可把“短段航向保持/原地转向闭环”做得很稳,同时简化滤波状态维度(但仍需讨论风险与退路,见后文)。
- **8 个测距模块**:前后左右各 2 个:
- 左右侧向:**VL53L0X V2**(最远 2m。ST 官方产品页说明 VL53L0X 为 ToF 测距,最大可到 **2m**。citeturn2search3
同时其官方数据手册给出典型“Range profile”High speed 20ms、Long range 33ms、High accuracy 200ms 等 timing budget 配置对你做“关键动作更稳、巡航更快”的动态配置非常实用。citeturn2search41
- 前后向(每端 2 个):**STP-23L7cm7.5m** + **ATKMS53L1M4m**。其中 4m 量程模块工程上高度可能基于 VL53L1X 类 ToFST 官方 VL53L1X 产品页给出“up to 4m、up to 50Hz”能力可作为你对 4m 级传感器的性能参考上限。citeturn0search0
- 结构:**差速四轮** → 上位机输出 (v, ω) 即可驱动底盘;底盘闭环已由 F407 LADRC 负责。
### B 方案的可观测性:为什么侧向双点能同时观测 e_y 与 e_θ
走廊相对定位的关键是:**只关心“相对墙/垄侧”的横向与航向误差**,不强求全局 (x,y)。只要左右两侧各有前后两个测距点(你是每侧 2 个 VL53L0X就可以构造两个稳定的派生量测
- **航向误差 e_θ相对走廊方向**:利用同侧前后距离差与传感器纵向基线 \(L_s\),可用
\[
e_{\theta,L} \approx \arctan\left(\frac{d_{Lf}-d_{Lr}}{L_s}\right),\quad
e_{\theta,R} \approx \arctan\left(\frac{d_{Rf}-d_{Rr}}{L_s}\right)
\]
该构造与你上传的《大体方案》对 B 方案与派生量测的定义一致《大体方案》45 页)。
- **横向误差 e_y相对中心线/偏置线)**:用左右平均间隙差得到
\[
e_y \approx \frac{1}{2}( \bar d_L - \bar d_R) - y_{\text{offset}}
\]
其中 \(y_{\text{offset}}\) 是你可以显式引入的“偏置行走”目标(例如机械臂在右侧外凸时令车辆略偏左,降低擦碰风险)。同样与《大体方案》对 B 方案的描述一致《大体方案》45 页)。
前后向测距STP-23L / 4m 模块)主要用于:**到端触发(段落切换)**、安全制动、以及对沿程 \(s\) 的事件校正(见后文)。
## 走廊相对定位与融合算法设计
### 问题建模与坐标系
定义走廊(或垄沟)局部坐标系 \(\{C\}\)
- \(x_C\):沿走廊前进方向;
- \(y_C\):走廊横向(向左为正);
- 车辆车体坐标 \(\{B\}\)\(x_B\) 前、\(y_B\) 左。
B 方案输出状态:
\[
\mathbf{x}_c = [e_y,\ e_\theta,\ s]^T
\]
其中:
- \(e_y\):车辆参考点(建议用车体几何中心或“控制点”)相对走廊目标线(中心线或偏置线)的横向偏差;
- \(e_\theta\):车辆航向相对走廊方向的误差;
- \(s\)沿走廊进度m用于段落终止触发/动作编排,不作为“强闭环精确位姿”。
### 传感器融合总体策略:分层、分频、强约束
建议采用“三层融合与控制”:
- **层 A硬实时输出层20ms**:必须产出 (v_cmd, ω_cmd) 并发送 CAN 0x100。无论任何模块异常这层都不能停摆最多把速度降到 0 并持续发送合法 0x100。这是由底盘运动看门狗与超时机制决定的0x080 心跳不刷新看门狗,只有合法 0x100 刷新;超时阈值 150ms。 《通讯协议》24 页、810 页)
- **层 B相对定位与走廊闭环建议 50100Hz**:估计 \(e_y,e_\theta,s\),并形成走廊跟随控制律;允许降级(只用单侧、只用 IMU 航向保持等),但必须在可控范围内给出指令。
- **层 C段落状态机/任务决策1020Hz**执行段脚本Segment List、处理到端触发、重定位行为扫描/后退重试/停车保护)、以及与机械臂/视觉的协同。
这样做的目的:**把“安全与完赛”从定位精度中解耦**。
### 状态估计实现方案对比:从“极简互补”到“鲁棒 EKF/UKF”
你明确提出希望覆盖 EKF/UKF/粒子滤波。结合 STM32H743 算力与工程风险,本报告建议按阶段实现:
#### 极简方案:互补滤波 + 鲁棒观测融合(优先推荐做 P0
利用你给定“短时 IMU 漂移可忽略”,可以先不引入复杂滤波矩阵,直接做:
- 航向误差 \(e_\theta\)
- 预测:\(e_{\theta,k|k-1}=e_{\theta,k-1} + \omega_z \Delta t\)
- 校正:用侧向差分观测 \(e_{\theta,L}, e_{\theta,R}\) 做加权融合(按健康度/置信度权重),再与预测做互补融合:
\[
e_\theta \leftarrow \alpha(e_\theta + \omega_z\Delta t) + (1-\alpha)\cdot e_{\theta,\text{meas}}
\]
- 横向误差 \(e_y\)
- 直接由 \(\frac{1}{2}(\bar d_L-\bar d_R)-y_{\text{offset}}\) 给出,并做一阶低通(根据 VL53L0X timing budget 动态调整滤波带宽20ms 档噪声较大、200ms 档更稳但延迟更大,可从数据手册的 profile 及误差差异得到工程依据。citeturn2search41
- 沿程 \(s\)
- 用编码器里程计积分为主(来自 CAN 0x200 的轮增量 ticks你需要在 H743 侧累加积分)。 《通讯协议》57 页)
- 用前向测距做“事件校正”:当 \(d_\text{front}\) 小于阈值(接近端部围栏)触发段切换,并把 \(s\) 校正到“段长 - d_front - 安装偏置”。
优点:实现快、数值稳定、适合先把整车跑通;缺点:难以严格输出协方差,也不便于统一做马氏门限。
#### 鲁棒 EKF推荐做 P1
若你希望更系统地融合并获得一致的健康度/协方差,则做小维 EKF
- 状态:\(\mathbf{x}=[e_y,e_\theta,s]^T\) 或扩展为 \([e_y,e_\theta,s,b_g,k_s]\)(陀螺零偏、轮滑比例因子)以吸收轮滑/地毯误差《大体方案》4 页提到类似扩展思路)。
- 预测模型(简化差速运动学在走廊局部系下的表达):
\[
\begin{aligned}
e_{y,k+1} &\approx e_{y,k} + v_k\sin(e_{\theta,k})\Delta t \\
e_{\theta,k+1} &\approx e_{\theta,k} + (\omega_{z,k}-b_{g,k})\Delta t \\
s_{k+1} &\approx s_k + v_k\cos(e_{\theta,k})\Delta t
\end{aligned}
\]
其中 \(v_k\) 来自里程计估计或上一周期命令(两者在轮滑情况下要区别对待)。
- 量测模型:
- \(z_{e_y}=\frac{1}{2}(\bar d_L-\bar d_R)-y_{\text{offset}}\)
- \(z_{e_\theta}\):由左/右侧差分观测(可单侧/双侧)
- \(z_s\):端部事件约束(触发式更新)
- **异常值剔除(创新门限/χ²)**
用马氏距离innovation 的归一化残差做门限d² 超限则拒绝该测距更新、降低该传感器健康度,并触发降级/重定位动作。创新卡方检验型鲁棒 EKF 在导航融合领域是成熟手段例如武汉大学学报给出“基于创新卡方检验的扩展鲁棒卡尔曼滤波”并说明可有效抑制观测粗差、提高稳定性。citeturn5search1
同时马氏距离平方在高斯假设下与 χ² 分布的关系可作为你选择阈值的理论依据。citeturn5search0
#### UKF备选 P1/P2
UKF 的优势是减少雅可比推导错误风险,对非线性更稳健;其系统性论述可参考 Julier & Uhlmann 的综述文章Proceedings of the IEEE, 2004。citeturn4search8
但对 MCU 工程而言UKF 的实现细节sigma 点、数值稳定、协方差正定维护)仍需严格测试。建议在 EKF 稳定后再引入 UKF或仅在仿真/离线回放中验证。
#### 粒子滤波(不建议作为主线)
粒子滤波更适合多峰分布或强非线性/非高斯,但你这里的走廊状态空间维度小、观测约束强、且 MCU 实时性要求更硬,粒子滤波的收益通常不如鲁棒 EKF/UKF 明显。建议仅在“视觉地标 + 多段拓扑歧义”场景出现时再考虑。
### 控制律:走廊闭环优先,轨迹跟踪为辅
走廊段推荐直接闭环 \(e_y,e_\theta\) 输出角速度:
\[
\omega_\text{cmd}=k_\theta e_\theta + k_y e_y
\]
线速度:
\[
v_\text{cmd}=\min(v_\text{ref},\ v_\text{safety})
\]
其中 \(v_\text{safety}\) 由安全层根据前向距离与最小侧向间隙硬约束裁剪(见下节)。
对于“入场对准、退出与停回启动区”等非典型走廊段,可以上层用段脚本触发“短距离轨迹跟踪”(如 Pure Pursuit但其输出仍应统一进入 **命令仲裁器**,最终被安全层裁剪后送给 CAN 0x100。
### 安全层、异常检测与重定位策略
这是 B 方案能否“比赛不判零”的关键(规则对失控/冲出场地会强制罚下,且未驶出/未停在启动区可能 0 分。《附件6…比赛规则》1、89 页
#### 传感器健康度与一致性检查
建议对每个测距传感器维护 `health_score∈[0,1]``state∈{OK,SUSPECT,FAIL}`,并用以下规则更新(工程可解释、易调参):
- **有效性**:超量程/无数据/固定值卡死 → 直接 FAIL可加 N 次确认)。
- **跳变**\(|d_k-d_{k-1}|>\Delta d_\text{max}\) 且与冗余传感器不一致 → SUSPECT。
- **走廊一致性**
- 左右平均距离差过大(\(e_y\) 过大)接近阈值 → 触发降速/停车;
- 左右和与走廊宽度模型严重不符(考虑 ±5% 尺寸误差)→ 可能进入入口/出口开阔区或测距误读,切换“入口/开阔区模式”。
#### 轮滑检测(地毯场景必须做)
规则明确会在垄沟中随机铺设地毯模拟松软路面《附件6…比赛规则》23 页),强烈建议把轮滑检测当作“安全与融合共同输入”:
- 同侧前后轮编码器差异过大(四轮提供更多冗余)
- \(|\Delta\theta_\text{enc} - \Delta\theta_\text{imu}|\) 超阈值IMU 短时漂移可忽略时,这个检测更可靠)
轮滑触发后动作:
- 降低 \(v_\text{max}\)、限制加速度;
- 融合层增大过程噪声 \(Q\) 或降低对里程计的信任;
- 控制层更依赖侧向闭环(\(e_y,e_\theta\)),减少对 \(s\) 的硬依赖。
#### 重定位/恢复动作链(建议用段脚本固化)
当“走廊观测不可用”或“误差超过安全阈值”时,不要让系统继续前冲;建议固化为可重复执行的恢复链:
1. **低速前进 + 侧向对齐**:尝试恢复 \(e_\theta\) 可观测(左右/单侧)。
2. **原地旋转扫描**:转动寻找两侧墙面,使 \(e_y/e_\theta\) 可观测。
3. **后退重试或停车保护**:连续失败 N 次后退出(比赛是否允许等待/重试由你们策略决定,但从“避免失控罚下”角度,停车保护是最后底线)。
这类恢复链在你上传的《大体方案》中已有雏形《大体方案》13 页建议工程化为状态机NORMAL/DEGRADED/RECOVERY/STOP_SAFE
### “IMU 短时漂移可忽略”的简化与风险
你给定该条件,可以显著简化实现(例如可不立刻估计 \(b_g\)),但必须明确风险边界:
- 风险来源:温漂、振动、饱和、安装误差、长时间累计偏置。短时可忽略 ≠ 全程可忽略。
- 工程缓解:
- 开机静止校零(估计陀螺零偏);
- 在走廊段用侧向差分观测周期性校正 \(e_\theta\)(即使不用 EKF也做互补融合
- 若引入 EKF/UKF建议把 \(b_g\) 作为可选状态并在“长段/高温漂”时开启。
## 通讯协议与硬实时调度约束
### CAN 报文契约(按现有协议原样遵守)
你上传的《通讯协议》给出了当前固件实装版协议要点(标准帧 11-bit、DLC、字节序、缩放、CRC8 等),这里整理为“实现必须满足的契约”:
- **0x100 Velocity CommandH743→F407**
- DLC=8`vx,wz``int16 = 物理量 × 1000`(小端);包含 `rolling_counter``CRC8-SAE J1850`(对 Byte0~6 计算,放 Byte7
- 推荐周期 **20ms****绝不能超过 150ms 不发送合法 0x100**(即使停车也继续发 vx=0,wz=0 的合法帧rolling counter 在正常运行时要求与上一帧差值在 1..3,否则拒收。
《通讯协议》24 页、810 页)
- **0x080 HeartbeatH743→F407**:仅表示链路活着,**不刷新运动看门狗**,不能替代 0x100。 《通讯协议》23 页、810 页)
- **0x181 StatusF407→H74320ms**:包含 `system_state、system_health、diag_bits、cmd_age_10ms` 等,用于安全降级决策。 《通讯协议》45 页)
- **0x184 Comm DiagF407→H743100ms**:统计 CRC 错误、counter 拒收、bus-off 等,必须纳入诊断与回放。 《通讯协议》6 页)
- **0x200 Odom DeltaF407→H743轮询约 60ms**:四轮增量 ticks上位机需自行累积。 《通讯协议》57 页)
> 说明:你已表示协议既有且固定,因此本报告不建议在 H7↔F4 CAN 上新增“破坏兼容”的帧。若未来要加扩展帧,建议在不影响现有 ID/节拍/接收逻辑的前提下做“可选附加 ID”并通过版本位/能力位协商(但这属于后续扩展,不是当前 P0 必需)。
### 优先级、周期与超时处理(工程实现建议)
- **最高优先级**`can_tx_0x100_task`20ms硬实时禁止被日志/融合阻塞)。
ASER 工程现有结构已采用 20ms 的 canTxTask 且强调绝对节拍osDelayUntil与协议层保持《aser》1、5 页)。
- **第二优先级**CAN Rx 中断回调(接收 0x181/0x184/0x200以“快照/无锁或短临界区”方式写入共享上下文,避免长时间占用 ISR。
- **第三优先级**:控制/估计50100Hz必须保证“在下一个 0x100 截止前产出最新命令”,但即便估计超时,也要有“上一帧命令 + 安全裁剪”的保底。
- **监控任务100ms**:读取 `cmd_age_10ms、diag_bits、comm diag`,若发现异常趋势(例如 DIAG_COMM_TIMEOUT、bus-off、连续 CRC 错误风暴)立即触发上位机 STOP_SAFE 模式并把 (v,ω) 置零,但仍持续发合法 0x100。 《通讯协议》810 页)
为实现稳定周期,建议使用 FreeRTOS 的 `vTaskDelayUntil()`按绝对时间唤醒适合固定频率周期任务。citeturn3search34
在 ISR→任务的事件通知上任务通知`vTaskNotifyGiveFromISR`通常比信号量更轻FreeRTOS 手册亦将其描述为更快的替代机制。citeturn2search42
### 关键消息帧示例(十六进制 + 结构体)
下面给出 **0x100** 的一个可复现实例示例vx=0.30m/swz=0.80rad/sctrl_flags=0x01counter=0x10CRC8=SAE J1850对 Byte0~6 计算):
- `vx_x1000 = 300 = 0x012C`小端2C 01
- `wz_x1000 = 800 = 0x0320`小端20 03
- 组合 Byte0~6`2C 01 20 03 01 00 10`
- 计算得到 `CRC8 = 0xA1`
- 最终 8 字节:
**`2C 01 20 03 01 00 10 A1`**
对应 C 结构体(注意小端序与打包):
```c
#pragma pack(push,1)
typedef struct {
int16_t vx_x1000; // Byte0-1, m/s * 1000
int16_t wz_x1000; // Byte2-3, rad/s * 1000
uint8_t ctrl_flags; // Byte4
uint8_t reserved; // Byte5, fixed 0
uint8_t rolling_counter; // Byte6
uint8_t crc8; // Byte7, CRC8-SAE J1850 over Byte0..6
} CanCmdVel_0x100_t;
#pragma pack(pop)
```
0x100 字段定义、CRC 规则、rolling counter 规则、150ms 超时见《通讯协议》24 页、810 页。)
## 软件模块化与解耦方案
### 解耦目标与原则
在 ASER 现有工程约束下(协议层/中断链路/任务框架尽量不动),解耦的关键是把系统切成三类模块:
1. **硬实时链路模块**:唯一职责是“稳定发 0x100”只从一个“命令槽Command Slot”读取最新的 (v,ω);不做复杂计算、不打印日志。
2. **可实时模块**:估计、控制、预处理,允许在极端情况下掉周期,但必须提供保底输出与超时策略。
3. **非实时模块**:日志、回放、仿真接口、参数调试、统计;永不阻塞硬实时。
ASER 文档明确CAN 协议层位置固定,并建议新功能放 App/ 目录,且 canTxTask/monitorTask 已存在。《aser》15 页)
### 数据流总览mermaid
```mermaid
flowchart LR
subgraph S[传感器/底盘输入]
VL53[VL53L0X x4 侧向测距]
FRONT[前向测距: STP-23L + 4m模块]
BACK[后向测距: STP-23L + 4m模块]
IMU[单轴IMU ωz/θ]
CANRX[CAN Rx IRQ: 0x181/0x184/0x200]
end
subgraph P[预处理与健康度]
PRE[时间戳对齐/滤波/有效性检测/健康度]
OBS[派生观测构造: e_y_meas, e_theta_meas, d_front, d_back]
end
subgraph E[估计与控制]
EST[走廊相对定位滤波器\n(x=[e_y,e_θ,s] 或扩展)]
SEG[段脚本解释器 + 拓扑状态机]
CTRL[走廊控制器/原地转向/入口对准]
SAFE[安全监督器/降级状态机/命令仲裁]
end
subgraph R[硬实时输出]
CANTX[CAN Tx Task\n0x100 @20ms]
end
subgraph L[工具链]
LOG[日志记录/回放/故障注入]
SIM[仿真/传感器注入接口]
end
VL53 --> PRE
FRONT --> PRE
BACK --> PRE
IMU --> PRE
CANRX --> PRE
PRE --> OBS --> EST
CANRX --> EST
EST --> CTRL
SEG --> CTRL
CTRL --> SAFE --> CANTX
CANRX --> SAFE
SAFE --> LOG
OBS --> LOG
EST --> LOG
SIM --> PRE
```
### 模块清单、接口消息、周期与最大延迟(必须表格)
下表给出“建议模块化拆分”,并明确每个模块 I/O、周期与延迟预算。**注意开发语言、CPU 负载预算未指定**;下表的资源估计按 STM32H743 “小维滤波 + 50100Hz 控制”属于轻量任务的常见工程经验给出,最终应以运行时 profile 校准。STM32H743 的 480MHz CortexM7 与双精度 FPU、TCM RAM 能力为小维滤波提供了硬件基础。citeturn1search1
| 模块 | 职责 | 输入(消息/接口) | 输出(消息/接口) | 典型周期 | 最大延迟(建议) | 资源估计H743 |
|---|---|---|---|---|---|---|
| CAN协议适配层既有 | 按既有协议收发、CRC、上下文维护禁止破坏兼容 | FDCAN IRQ | `ChassisStatus(0x181)``CommDiag(0x184)``OdomDelta(0x200)` | IRQ/20ms/轮询 | <2ms 解析写入 | 低;保持原样 |
| CAN Tx 0x100 硬实时任务 | 固定 20ms 发送合法 0x100任何情况下不断流 | `CmdSlot(v,w,flags)` | CAN 0x100 | **20ms** | **<1ms 抖动** | 极低;最高优先级 |
| 编码器里程计模块 | ticks 累加、四轮→差速等效、轮滑检测特征 | `OdomDelta(0x200)` | `OdomEst{ds, v, yaw_enc}``SlipFeat` | 50100Hz或随0x200 | <20ms | 低 |
| IMU采集模块 | 采集 ωz/θ、时间戳、静止校零 | SPI/I2C/串口(未指定) | `ImuZ{wz, dt}` | 200500Hz建议 | <5ms | 低 |
| VL53侧向驱动 | 4 个 VL53L0X 轮询/异步读取、模式切换20/33/200ms | I2C | `RangeSideRaw` | 2050Hz视 timing budget | <40ms | 低到中I2C占用 |
| 前后测距驱动 | STP-23L 与 4m 模块读取、冗余校验 | UART/I2C(未指定) | `RangeFrontBackRaw` | 2050Hz | <50ms | 低到中 |
| 预处理与健康度 | 对齐时间戳、滤波、有效性、跳变检测、一致性/走廊模式识别 | Raw ranges、IMU、Odom | `CorridorObs{e_y_meas,e_th_meas,d_front,d_back,valid}``SensorHealth` | 50100Hz | <20ms | 低 |
| 走廊相对定位滤波 | 互补/EKF/UKF 输出 e_y/e_θ/s 与置信度 | `CorridorObs``ImuZ``OdomEst` | `CorridorState{e_y,e_th,s,cov/conf}` | 50100Hz | <2040ms | 低(小维) |
| 段脚本解释器 | Segment List 执行:走廊段/原地转向/退出停车/失败恢复 | `CorridorState``SensorHealth` | `SegmentCmd{mode,v_ref,y_offset,end_trigger}` | 1020Hz | <100ms | 低 |
| 控制器集合 | 走廊闭环、原地转向、入口对准等 | `SegmentCmd``CorridorState` | `RawCmd{v,w}` | 50100Hz | <20ms | 低 |
| 安全监督器/仲裁 | 急停/限速/降级/模式切换;融合底盘 diag_bits/cmd_age | `RawCmd`、0x181/0x184、ranges | `CmdSlot(v,w,flags)``SafetyState` | 50100Hz | **<20ms**到0x100 | 低 |
| 日志与回放 | 记录观测/状态/命令/故障;支持离线回放复现实验 | 全部关键消息 | log文件/串口输出 | 520Hz批量写 | 不得阻塞实时链路 | 中(取决于介质) |
| 测试仿真/注入接口 | PC 仿真或回放注入 ranges/odom/imu用于HIL | 离线数据/串口/USB | 注入到 PRE | 非实时 | 不影响0x100 | 低 |
**接口命名建议**把“CAN 帧”与“内部消息”严格区分,例如 `CanCmdVel_0x100_t``CmdSlot`,避免上层直接依赖 CAN 打包细节,从而实现解耦与可测试性。
## 实现步骤与里程碑
### 分阶段实施步骤清单(可操作)
由于赛期时间表“未指定”,下面以“无特定期限”的工程顺序给出建议;若你们有明确赛期,可按周压缩/并行。
**阶段 P0跑通闭环目标能稳定走通道、不撞、不中断 0x100**
1. 固化 **0x100 20ms** 发送硬实时:把 canTxTask 设为最高优先级,只从 `CmdSlot` 取值;加 watchdog/统计,任何异常也持续发送 vx=0,wz=0 的合法帧。《通讯协议》24 页、810 页《aser》1、5 页)
2. 接入 CAN Rx0x181/0x184/0x200 解析快照写入上下文monitorTask 先只做可视化打印与超时报警。《通讯协议》47 页《aser》15 页)
3. 侧向 VL53L0X 驱动:先用固定 profile例如 33ms 或 30ms 档),跑出稳定的 `d_Lf,d_Lr,d_Rf,d_Rr`;必要时在关键动作切换到 200ms 高精度档(官方数据手册给出 profile 与 timing budget。citeturn2search41
4. 前后测距驱动:至少保证一个“前向安全距离”可用,先实现安全限速/急停。
5. 实现派生观测 \(e_y,e_\theta\) 并闭环:先用互补滤波/低通 + 走廊控制律,让车在 40cm 通道内稳定跑直线与到端停车。
6. 段脚本最小集CorridorFollow / TurnInPlace / ExitAndStop动作少但可跑完全程
**阶段 P1鲁棒性与可调参**
1. 加入健康度、异常检测、降级状态机:单侧可用时切“单侧贴边 + IMU 航向约束”;双侧不可用时低速+停车保护。
2. 加入轮滑检测与自适应策略(地毯段必需):轮速差与 IMU/里程计不一致触发降速与融合降权。地毯存在见《附件6…比赛规则》23 页)
3. 引入鲁棒 EKF或对互补滤波加入创新门限用 χ²/马氏距离拒绝异常测距,参考创新卡方检验鲁棒 EKF 的工程化做法。citeturn5search1turn5search0
4. 完善日志与回放:把“每次撞/每次抖动”都能离线复现,支撑快速迭代。
**阶段 P2增强与赛场集成**
1. K230 输出“结构化低带宽特征”作为增强/降级输入例如走廊中心偏差、地标识别结果K230 的多核 RISCV 与 KPU 能力适合做推理后输出特征量,而不承担 20ms 硬实时闭环。citeturn6search3
2. 若需要局部绕障(比赛道具/土块干扰可能导致异常行为),可做“小范围 DWA 风格速度采样”但务必以安全层为前提DWA 原始思想是“在速度空间搜索可停、避障、前进最优的 (v,ω)”。citeturn4search0
### 仿真工具与场景建议
未指定你们必须使用 ROS/某仿真器,因此给出三档可选:
- **轻量快速(推荐 P0/P1**Python/Matlab 自建 2D 走廊仿真(差速模型 + 墙面 ToF 测距模型 + 噪声/丢包/跳变),用于调 \(k_y,k_\theta\)、异常门限、降级策略;优点是迭代极快、与 B 方案高度匹配。
- **中等复杂(可选)**Webots/Gazebo 的差速车模型 + 简化距离传感器,验证入口/转向等几何行为。
- **硬件在环 HIL推荐 P1/P2**
- H743 跑真实控制栈;
- 通过“仿真注入接口”把 ranges/imu/odom 注入 PRE 模块(测试编译开关),同时真实发送 CAN 0x100 给 F4看 F4 是否稳定接受、是否出现 counter/CRC 风暴、cmd_age 是否异常。《通讯协议》810 页)
### 里程碑甘特图(示例:无特定期限,按 6 周节奏展示)
```mermaid
gantt
title ASER B方案走廊相对定位里程碑示例无特定期限
dateFormat YYYY-MM-DD
axisFormat %m-%d
section P0 跑通(先安全后精度)
0x100 20ms硬实时不掉帧 + 基础安全层 :a1, 2026-03-18, 7d
CAN Rx接入(0x181/0x184/0x200)+里程计 :a2, after a1, 7d
VL53侧向+前后测距驱动 + e_y/e_θ观测 :a3, after a2, 10d
走廊控制器 + 最小段脚本(走廊/转向/退出) :a4, after a3, 10d
section P1 稳定与容错
健康度/异常检测/降级状态机 :b1, after a4, 7d
轮滑检测与自适应降速/融合降权 :b2, after b1, 7d
鲁棒EKF/互补+χ²门限(可选) :b3, after b2, 7d
section 集成与验证
日志回放/自动化测试/故障注入 :c1, after a3, 14d
HIL联调 + 赛场流程演练 + 参数冻结 :c2, after b3, 14d
```
## 性能指标与验证方法
### 建议性能指标(赛前可再定阈值)
结合 40cm 通道与车辆 20cm 外形,工程上建议把“安全裕量”明确成指标:
- **走廊横向控制**
- \(e_y\) RMS直通道匀速 0.20.4m/s建议目标 < 1020mm取决于传感器安装与轮滑程度
- \(e_y\) 峰值:不得触发“最小侧向间隙”保护线。
- **航向对齐**\(e_\theta\) RMS < 1入口/转向后重新进入走廊的恢复时间也应记录)。
- **端到端延迟**:从侧向测距采样到 0x100 生效的闭环延迟建议 < 40ms两周期0x100 发送抖动应远小于 20ms 周期。
- **鲁棒性**:单侧 VL53 临时失效(例如 0.51s仍能保持不碰撞前向测距失效时必须降速并可安全停车。
- **完赛相关**:在 5 分钟限制下完成“驶出场地 + 停在启动区”动作(规则强调未完成可 0 分)。 《附件6…比赛规则》1 页)
### 数据采集需求(支撑可复现实验)
建议每条日志至少包含:
- 时间戳(单调时钟)、段 ID、模式NORMAL/DEGRADED/RECOVERY/STOP_SAFE
- 原始测距8 路)、有效标志、健康度
- 派生观测 \(e_y,e_\theta,d_\text{front},d_\text{back}\)
- 估计状态(\(e_y,e_\theta,s\) 与协方差/置信度)
- 输出命令RawCmd 与最终 CmdSlot、0x100 counter/CRC 统计
- 底盘状态0x181 system_state/health/diag_bits/cmd_age与 0x184 通信统计
这些字段在协议中均可获得见《通讯协议》47 页。)
### 单元测试与整车测试用例示例
**单元测试Host 或 MCU 上跑,推荐“输入→输出可验算”)**
- UT-EST-001给定理想走廊、已知 \(L_s\)、固定 \(e_\theta\),构造 \(d_{Lf},d_{Lr}\) 并验证 \(e_{\theta,L}\) 反解误差 < 阈值。
- UT-GATE-001给定 EKF 创新与协方差,构造离群点,验证 χ² 门限拒绝逻辑;门限选择可参考创新卡方检验鲁棒 EKF 文献。citeturn5search1
- UT-CAN-0010x100 打包vx/wz 缩放、小端序、CRC8-J1850 校验与 rolling counter 递增规则;确保 counter 跳变策略不会触发底盘拒收。《通讯协议》24 页)
- UT-SAFE-001前向距离 < d_stop → v=0cmd_age_10ms 超阈值或 diag_bits 出现致命位 → STOP_SAFE 并持续发 0x100=0。《通讯协议》45 页、810 页)
**整车测试(建议可回归)**
- IT-COR-001入场对准启动区→40cm 出入口→进入第一通道指标不触碰、最大横向误差、耗时。赛场尺寸见《附件6…比赛规则》2 页)
- IT-COR-002走廊直行匀速 0.2/0.3/0.4m/s统计 \(e_y\) RMS/峰值、\(e_\theta\) RMS。
- IT-END-001到端触发接近端部围栏验证触发准确率与停车距离一致性。
- IT-SLIP-001地毯轮滑在地毯段运行验证轮滑检测触发率、降速策略与不碰撞。地毯见《附件6…比赛规则》23 页)
- IT-DROP-001侧向遮挡遮挡一只 VL53 或一侧两只,验证降级切换时间与稳定性。
- IT-CAN-FAULT-001CAN 抖动/延迟注入):验证即使系统负载上升也不会超过 150ms 不发合法 0x100。《通讯协议》810 页)
## 风险与替代方案
### 主要风险点与缓解
- **通道极窄 + 尺寸误差 ±5%**:通道宽可能缩到约 38cm若车辆外廓/轮子外露估计不足,居中也可能刮擦。缓解:把“最小侧向间隙”作为硬安全约束,并支持按段设置 \(y_\text{offset}\)。 尺寸误差见《附件6…比赛规则》14 页)
- **测距盲区/遮挡/高反射干扰**VL53L0X 在高速档噪声更大;缓解:关键动作切高精度 timing budget200ms并降低速度按 datasheet profile 做“模式-噪声-速度”联动。citeturn2search41
- **前后测距冗余冲突**:两种前向传感器可能在某些目标材质/角度下给不同值;缓解:做一致性选择(例如取更保守的近距离值)+ 门限剔除。
- **地毯轮滑导致里程计失真**规则明确存在地毯《附件6…比赛规则》23 页)。缓解:轮滑检测触发后降低对里程计的信任、降速并强化侧向闭环。
- **CAN 带宽与实时性**:若日志/调试占用 CPU 或关中断过久,可能导致 0x100 抖动/丢帧;缓解:日志异步队列+独立低优先级 logger task0x100 发送任务最高优先级且即使停车也持续发合法帧。0x100 硬约束见《通讯协议》24 页、810 页)
- **计算资源不足**:若引入过重的规划(全局优化/TEB 等),会侵蚀硬实时;缓解:主线坚持 B 方案小维估计+简单控制;局部避障仅做轻量 DWA 风格采样且可选。citeturn4search0
### 替代/增强方案
- **A 方案度量定位 EKF/UKF 作为评估与恢复辅助**:在不依赖其做走廊闭环的前提下输出 (x,y,θ) 与协方差用于段落切换一致性检查与日志评估《大体方案》4 页)。
- **K230 视觉作为测距降级备份**K230 的双核 RISCV + KPU 适合推理后输出结构化特征,作为走廊偏差/地标观测源之一。citeturn6search3
- **局部避障(可选)**:若赛场土块/障碍导致必须绕行,可引入 DWA 思想做速度空间采样;其原始工作在 IEEE Robotics and Automation Magazine 1997 年文章中系统阐述。citeturn4search0
## 代码生成与 AI 协作建议
### 为什么必须“接口契约优先”
你明确提到多数代码将由 AI 生成。要让 AI 代码可控,必须先把系统拆成“可替换模块 + 明确消息契约 + 可回归测试”。否则 AI 很容易在“看似能跑,但破坏实时性/破坏协议/破坏并发安全”的地方踩雷。
ASER 文档中已经明确:协议层与接收链路不要随意改动,新逻辑应放 App/ 并遵守现有任务框架。《aser》15 页)
### 建议的仓库结构与代码模板(示例)
建议在 `App/` 下新增(不动协议层):
- `App/sensors/``vl53_driver.c/.h``stp23l_driver.c/.h``ms53_driver.c/.h``imu_z.c/.h`
- `App/preproc/``corridor_obs.c/.h``health_monitor.c/.h`
- `App/est/``corridor_filter.c/.h`(互补/EKF/UKF 可切换)
- `App/nav/``segment_fsm.c/.h``corridor_ctrl.c/.h``safety_supervisor.c/.h`
- `App/log/``logger_task.c/.h``replay.c/.h`
- `App/test/`host 可编译的纯 C 测试(或 Unity/Ceedling/CppUTest
**接口契约头文件(强制先写)**:例如 `corridor_msgs.h`
```c
#pragma pack(push,1)
typedef struct {
uint32_t t_ms;
float d_lf, d_lr, d_rf, d_rr; // meters
float d_front, d_back; // meters
uint8_t valid_mask; // bitfield
} CorridorObs_t;
typedef struct {
uint32_t t_ms;
float e_y; // meters
float e_th; // radians
float s; // meters
float conf; // 0..1 or covariance proxy
} CorridorState_t;
typedef struct {
uint32_t t_ms;
float v; // m/s
float w; // rad/s
uint8_t flags;
} RawCmd_t;
#pragma pack(pop)
```
### 单元测试规范(让 AI 代码“可验收”)
- **每个模块至少 3 类测试**:正常、边界、异常(离群/丢包/超时)。
- **所有纯算法模块必须可在 Host 编译运行**(不依赖 HAL把硬件依赖封装成接口`read_range()` 函数指针或 mock
- **协议相关测试必须比对字节级输出**0x100 的 CRC/rolling counter/小端序是典型“AI 容易写错但编译不过不报错”的点。《通讯协议》24 页)
### 自动化生成与审查流程建议
- 先由你/团队写“模块接口契约 + 时序约束表 + 禁止事项”如“0x100 发送任务不得阻塞”),再让 AI 生成实现。
- CI 至少包含:
1) Host 单元测试;
2) 静态检查clang-tidy/cppcheck 任选);
3) 构建固件;
4) 可选HIL 脚本:注入传感器回放数据,检查 0x100 发送间隔最大值与 counter 连续性。
- Code review checklist必须人工看
- 是否出现长时间关中断/在高优先级任务里打印;
- 是否对共享上下文无保护读写导致撕裂;
- 是否更改了 `snc_can_app` 协议定义/接收链路ASER 文档明确不建议破坏)。 《aser》15 页)
---
**参考资料(你上传的原始文档)**
- 《附件6B类“马铃薯捡拾机器人竞技”比赛及评审规则》赛场尺寸、40cm 通道/出入口、地毯、5分钟限时、尺寸误差 ±5%13 页、14 页)。
- 《通讯协议》:现有 H7↔F4 CAN 协议、0x100 20ms/150ms 超时、CRC8/rolling counter、0x181/0x184/0x200 定义与诊断位210 页)。
- 《aser》ASER 工程结构、FreeRTOS 任务20ms/100ms、协议层位置与“不要破坏接收链路/协议层”的约束15 页)。
- 《大体方案》B 方案状态与派生量测构造、走廊闭环思想、降级/恢复链与实施计划45 页、1316 页)。
**参考资料(官方/原始文档与论文)**
- ST VL53L0X 产品页(最大 2mciteturn2search3
- ST VL53L0X 数据手册timing budget 与 profile20ms/33ms/200ms 等citeturn2search41
- ST VL53L1X 产品页up to 4m、up to 50Hzciteturn0search0
- STM32H743480MHz CortexM7、双精度 FPU、TCM 等特性citeturn1search1
- FreeRTOS `vTaskDelayUntil()`固定频率周期任务的绝对时间阻塞citeturn3search34
- FreeRTOS `vTaskNotifyGiveFromISR()`ISR→任务通知citeturn2search42
- 创新 χ² 检验鲁棒 EKF武汉大学学报citeturn5search1
- 马氏距离与 χ² 门限关系、鲁棒策略示例citeturn5search0
- UKFJulier & Uhlmann 综述条目citeturn4search8
- DWA 原始工作Fox/Burgard/Thrun 1997citeturn4search0
- K230 官方文档CPU0 Linux/CPU1 RTOS、KPU INT8/INT16 等citeturn6search3