This commit is contained in:
2026-04-05 11:26:16 +08:00
parent c2a70c9470
commit 5e3685ce47

View File

@@ -142,29 +142,8 @@ void AppTasks_RunMonitorTask(void *argument)
can_ctx->status.diag_bits, can_ctx->status.diag_bits,
can_ctx->status.online); can_ctx->status.online);
// 4. 里程计更新:从 CAN 0x200 累加器原子取走增量,积分并推送黑板 // 4. 里程计更新已迁移到 navTask(20ms),此处不再消费
// 使用 SNC_CAN_ConsumeOdomDelta() 解决漏积分/重复积分问题: // 原因odom 实时性对 EKF 预测至关重要,需要与导航闭环同频
// - ISR 侧每帧累加,不覆盖
// - 此处原子取走并清零,每份增量恰好消费一次
{
int16_t odom_fl, odom_rl, odom_fr, odom_rr;
uint32_t odom_span_ms;
uint8_t odom_frames = SNC_CAN_ConsumeOdomDelta(
&odom_fl, &odom_rl,
&odom_fr, &odom_rr,
&odom_span_ms);
if (odom_frames > 0U) {
/* 有新的增量帧需要积分 */
Odom_Update(now_ms,
odom_fl, odom_rl,
odom_fr, odom_rr,
odom_span_ms);
} else {
/* odom 断流保护:超过协议允许时间后主动清零黑板里的速度 */
Odom_HandleTimeout(now_ms, SNC_ODOM_TIMEOUT_MS);
}
}
/* 指令下发已由 navTask 接管,此处不再发送测试指令 */ /* 指令下发已由 navTask 接管,此处不再发送测试指令 */
// 调用纯净版播报员 (内部自带分频逻辑) // 调用纯净版播报员 (内部自带分频逻辑)
@@ -316,6 +295,27 @@ void AppTasks_RunNavTask_Impl(void *argument)
} }
last_ms = now_ms; last_ms = now_ms;
/* --- Step 0: 里程计更新(从 monitorTask 迁移至此20ms 实时消费)--- */
{
int16_t odom_fl, odom_rl, odom_fr, odom_rr;
uint32_t odom_span_ms;
uint8_t odom_frames = SNC_CAN_ConsumeOdomDelta(
&odom_fl, &odom_rl,
&odom_fr, &odom_rr,
&odom_span_ms);
if (odom_frames > 0U) {
/* 有新的增量帧需要积分 */
Odom_Update(now_ms,
odom_fl, odom_rl,
odom_fr, odom_rr,
odom_span_ms);
} else {
/* odom 断流保护:超过协议允许时间后主动清零黑板里的速度 */
Odom_HandleTimeout(now_ms, SNC_ODOM_TIMEOUT_MS);
}
}
/* --- Step 1: 拍摄黑板快照 --- */ /* --- Step 1: 拍摄黑板快照 --- */
RobotBlackboard_t board; RobotBlackboard_t board;
Blackboard_GetSnapshot(&board); Blackboard_GetSnapshot(&board);