LSMushui
|
72bf925f47
|
feat(buzzer): 台架调试模式把 CAN 掉线警告音换成循环旋律
台架调试时 CAN 设备(尤其 Pitch)掉线会按 legacy 语义每 2s 响 n 下,连续
滴滴声很吵且影响听其它声音,故加一个开关:
robot_param.h -> 台架调试开关
#define DEBUG_BUZZER_MELODY 1 // 1=警告音换旋律;0=legacy 报警(比赛用)
实现分三处:
- robot_param.h: 新增开关,与 DEBUG_SHOOT_WITHOUT_REFEREE 放在同一分区
- modules/BUZZER: 新增 buzzer_play_melody(step) —— 按固定 100ms/步 推进,
内部对旋律总步数取模自动循环;旋律表 buzzer_melody[] 用"上行分解和弦 +
回落"共 14 步(1.4s),空拍 BUZZER_P 作断音,选音限定中音3~高音2 避免刺耳。
驱动层本身不判断开关,保持纯外设职责,只是多了一个音符序列接口。
- monitor_task.c: CAN 掉线分支按开关二选一。旋律模式下步进用本任务自身的
100ms 节拍(与文件里已有的遥控器连接音效同一写法),不用 HAL_GetTick
采样,避免周期抖动漏掉或重复音符。
设计取舍: 只替换"声音",不替换"灯语" —— 红灯常亮、遥控器掉线红灯双闪、
BMI088 失败绿灯双闪等 LED 语义完全不变,因此调试时仍能一眼看出是哪台
设备掉线;linkcheck_first_offline() 也保留调用,方便在调试器里直接看结果。
比赛前把 DEBUG_BUZZER_MELODY 改回 0 即恢复 legacy 报警。
两个工程同步修改,内容保持一致。
|
2026-09-12 11:19:59 +08:00 |
|
LSMushui
|
3e1bae6b98
|
chore: 同步 Keil/VSCode 本地状态(非本次代码改动)
- 底盘 .uvoptx: DSP Library 分组展开状态 tvExp 0 -> 1(Keil 中展开工程树
所致,不影响编译)
- 云台 .vscode/settings.json: K230 Pylance stub 路径随工具链更新
两处均为工具自动写入,一并入库以保持工作区干净。
|
2026-09-12 11:15:24 +08:00 |
|
LSMushui
|
4f18ada2f7
|
fix(ins): 修复 QEKF 矩阵内存分配失败(堆 512B -> 8KB),并恢复姿态诊断位
## 根因: 堆太小导致卡尔曼滤波静默失效
modules/ins/kalman_filter.h 的分配宏是
#ifdef _CMSIS_OS_H
#define user_malloc pvPortMalloc
#else
#define user_malloc malloc
#endif
而 kalman_filter.c 整个编译单元只 include 了 kalman_filter.h,从未引入
cmsis_os.h,因此 _CMSIS_OS_H 未定义 -> user_malloc 展开为 libc malloc,
FreeRTOS 那 32KB(configTOTAL_HEAP_SIZE=32768)堆完全用不上。
libc malloc 的堆来自 MDK-ARM/startup_stm32f407xx.s 的 Heap_Size,CubeMX
默认值是 0x200 = 512 字节。而 Kalman_Filter_Init(6, 0, 3) 会发起 25 次
分配、合计约 1602 字节(P/Pminus/F/FT/Q/S/temp_matrix/temp_matrix1 各
144B,H/HT/K 各 72B,R 36B,Q 系列 24B 等),且全程没有一处 NULL 检查,
分配失败后紧接着 memset(NULL, 0, n) 并把 NULL 直接交给 arm_mat_* 使用:
- 前半段小分配成功、后半段 144B 级分配返回 NULL
- arm_mat_* 对 pData=NULL 只读写地址 0 附近,函数本身不报错、只是不改
动输出 -> 滤波器不再更新状态,但 QEKF_INS.UpdateCount 照常自增
- 表现为: att_ready=1(看起来"在跑")、欧拉角却恒定不动
对照原始例程(能正常工作的那版)RoboMaster-C-Board-INS-Example-master,
其 MDK-ARM/startup_stm32f407xx.s 的 Heap_Size 为 0x2000 = 8KB,是本工程
的 16 倍。本次将两个工程的 Heap_Size 一并提到 0x2000,与该例程一致。
注意: startup_stm32f407xx.s 由 CubeMX 生成,若日后重新生成工程,这行会
被改回 0x200,需再次修改(或改走 pvPortMalloc 路线)。注释用纯 ASCII,
避免 armasm 处理非 ASCII 源文件。
## 恢复姿态诊断位
上一版 debug_task.c 把 cvg 换成了 att_ready,丢掉了唯一的"是否真的收敛"
判据 —— 于是"IMU 没数据"和"滤波器没跑"都表现为 cvg=1 + 三个 0.00,无法
区分。本次:
- cvg 恢复为 INS.ConvergeFlag(与原诊断输出同义)
- 新增 rdy(=att_ready)、imu(=bmi088_online)、an(=|accel|)、
gn(=|gyro|) 四个姿态链路健康位
- 保留 DEBUG_ATT_HEALTH 开关,置 0 即只输出三个欧拉角
- 文件头补注: yaw 无绝对基准,上电静止时恒为 0,不能作为故障判据
|
2026-09-12 11:15:16 +08:00 |
|
LSMushui
|
944d0201da
|
chore(mdk): 对齐 uvoptx 的文件编号,消除删除条目留下的空档
删除 bsp_uart 的两个文件条目后,.uvoptx 的 <FileNumber> 序列在删除点后面
留下断号(云台 1..97 后直接跳到 100,底盘 1..94 后跳到 97)。Keil 重新保存
工程时会自行把末项改回连续编号(底盘已被 Keil 规范为 95),此处把云台
一并规范为 98,使两个工程的编号均为 1..N 连续。
仅改编号数值,无文件增删,不影响编译。
|
2026-09-12 11:03:44 +08:00 |
|
LSMushui
|
5e6c5068fa
|
fix(dsp): 补回缺失的 CMSIS-DSP 预编译库
上一个提交放开了 *.lib 的忽略规则,但两个工程下
Middlewares/ST/ARM/DSP/Lib/ 目录本身就不在磁盘上(此前工作区异常中随
其他被忽略文件一并丢失),导致 .uvprojx 引用的
arm_cortexM4lf_math.lib 找不到,工程无法链接。
现从同源副本 Desktop/workspace 下的对应文件还原:
- 云台/Middlewares/ST/ARM/DSP/Lib/arm_cortexM4lf_math.lib
- 底盘/Middlewares/ST/ARM/DSP/Lib/arm_cortexM4lf_math.lib
两份 SHA-256 一致(89bd896a...),各 2,729,868 字节。
还原后重新校验:两个 .uvprojx 共 193 条 <FilePath> 引用,磁盘缺失 0 个。
同时把 .workbuddy/(助手工作区状态)加入 .gitignore,不纳入固件仓库。
|
2026-09-12 11:02:09 +08:00 |
|
LSMushui
|
3c95bb0887
|
feat(debug): USB CDC 输出改为 QuaternionEKF 欧拉角
原 debug_task 每 500ms 经 CDC 打印一行混装诊断信息(芯片 ID/帧计数/空闲中断
计数/链路状态/电机掉线/跟随误差等 18 个字段),稳定后已无持续观察价值。
现改为直接输出姿态解算结果,便于上位机/串口助手直接看欧拉角与验证 EKF 收敛。
输出格式(单位: 度): yaw=<...> pitch=<...> roll=<...> cvg=<0|1>
yaw = att_deg_yaw (多圈连续偏航角,= INS.YawTotalAngle,云台 Yaw 环反馈)
pitch = att_deg_pitch (= QEKF_INS.Roll, 绕 y 轴角)
roll = att_deg_roll (= QEKF_INS.Pitch,绕 x 轴角,云台 Pitch 环反馈)
cvg = att_ready (0 表示 EKF 未收敛,此时角度不可信)
字段命名沿用工程侧语义,QEKF 内部 Pitch/Roll 与航空惯例互换的映射见
modules/attitude/attitude.c 文件头。
其他调整:
- 云台/底盘共用本文件,因两板 IMU_Task 都跑 attitude_update(),att_deg_*
均有效,故移除原 ROBOT_TYPE_GIMBAL / ROBOT_TYPE_CHASSIS 分支;
- 输出周期 500ms -> 100ms(10Hz,宏 DEBUG_OUT_PERIOD_MS 可调),2Hz 下无法
观察姿态动态响应;
- 清理因此不再需要的 include 与 dbg_* 外部声明(bmi088/ist8310/dr16/referee/
c_comm/bsp_can/bsp_usart/usart.h/dbg_imu_loop/dbg_can_loop);
- 同步更新两份 debug_task.h 的注释说明。
|
2026-09-12 10:33:29 +08:00 |
|
LSMushui
|
a9d3d97ed8
|
refactor(bsp): 删除无实际作用的 bsp_uart 模块
分析结论: Bsp 层并存 bsp_uart.{c,h} 与 bsp_usart.{c,h} 两套串口支持包,
其中 bsp_uart 是死代码,证据:
1. bsp_uart 只导出一个函数 UartSendTxMessage()(HAL_UART_Transmit 阻塞
发送 + 最多 5 次重发),全工程检索无任何调用方;
2. #include "bsp_uart.h" 只出现在 bsp_uart.c 自身,Application/Core 层
一律包含 bsp_usart.h;
3. bsp_uart.h 里的 UART1/UART2 宏也无人使用,仅被 bsp_usart.c 的注释提及;
4. 真正在用的是 bsp_usart.{c,h}(USART1/3/6 的 DMA 循环接收 + 空闲中断整帧
回调 + TX DMA),main.c/stm32f4xx_it.c/referee_task/can_task 均依赖它。
变更:
- 删除 云台/底盘 各自的 Bsp/Src/bsp_uart.c 与 Bsp/Inc/bsp_uart.h;
- 从两个 Keil 工程的 .uvprojx(编译文件列表)与 .uvoptx(文件选项)中摘除
对应条目,工程文件良构性已校验通过。
注: bsp_usart.c 中 usart1_tx_dma_enable()/usart6_tx_dma_enable() 目前也
无调用方(仅 usart1_tx_dma_init() 被 can_task 调用,为视觉自瞄预留),属接口
预留而非死模块,本次保留。
|
2026-09-12 10:33:20 +08:00 |
|
LSMushui
|
58aff16be1
|
build(gitignore): 保留 CMSIS-DSP 预编译库,不再被 *.lib 忽略
两个子工程的 .gitignore 来自通用 C 模板,其中的 *.lib 规则会把
Middlewares/ST/ARM/DSP/Lib 下的 arm_cortexM4lf_math.lib(CMSIS-DSP 预编译
库)一并排除。该文件是源码依赖而非构建产物,是工程链接 DSP 依赖时必须
的输入,一旦不入库,新克隆的仓库无法构建。故移除 *.lib 忽略规则。
|
2026-09-12 10:33:12 +08:00 |
|
LSMushui
|
a4da5ad17c
|
chore: 导入 Simba-OmniInfantry 基线(云台/底盘双工程)
- 云台(ROBOT_TYPE_GIMBAL)与底盘(ROBOT_TYPE_CHASSIS)完整固件源码
- 新增根级 .gitignore,排除 Keil MDK-ARM 构建产物(.o/.d/.crf/.axf/.lnp/.map/.htm/.sct/.dep/.iex/.lst 等)
与 *.uvguix.* / DebugConfig/(与机器绑定的 UI 布局)
- core.autocrlf=false,避免固件源码在检出时被改动换行符
|
2026-09-12 10:28:21 +08:00 |
|