feat(ui): 新增裁判系统自定义UI(0x0301)并打通键鼠→底盘链路
键鼠控制(此前 WASD 无反应): - 云台 robot_cmd_task:0x0304 与 USART3 帧内键鼠合并为共享视图 keyboard_merged(0x0304 优先); 键鼠模式由帧内键鼠动作进入,动云台左摇杆退出 - c_comm_task/c_comm:键鼠在控时底盘摇杆由 WASD+鼠标合成,改读共享视图(此前只认 0x0304) - dr16/调试输出:新增帧内键鼠原始字节诊断(key_lo/key_hi/mouse_*/s1/frames) 自定义UI(底盘板经裁判系统 USART6 绘制到选手端): - 新增 底盘/modules/comms/referee_ui.c|h:15 字节图形组包(带编译期断言), v5 卡片式 HUD = 俯仰梯(pitch) + 罗盘刻度带(底盘朝向) + 预估底盘功率 + 超级电容 + 摩擦轮 L/R 转速 + 小陀螺状态,yaw 在刻度带右侧;5Hz 刷新,约 50 图元/8 包 - referee.c 新增 referee_send_frame()(cmd 0x0301 机器人交互数据,CRC8+CRC16,USART6 TX DMA) - 新增 CToC 0x1B9:云台把 pitch 与摩擦轮转速带给底盘(底盘本地没有这两个量) - 版式避开官方保留区:顶部比分条/左下小地图/右下战车模块/中部两块官方保留 验证:云台 Code=99540 RO=1764 RW=420 ZI=62572;底盘 Code=99452 RO=1928 RW=416 ZI=62584;均 0 错误 0 警告。 未做实机验证(当前无板/无图传);UI 协议常量(UI_RECEIVER_ID/UI_SEND_HZ)与版式坐标集中在 referee_ui.h 宏区,便于按协议 PDF 一处校正。
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/* =============================================================================
|
||||
* debug_task.c - USB 虚拟串口(CDC)姿态输出(欧拉角 + 姿态链路诊断)
|
||||
* debug_task.c - USB 虚拟串口(CDC)姿态输出(欧拉角 + 姿态链路诊断 + 控制量)
|
||||
* 每 DEBUG_OUT_PERIOD_MS 输出一行。单位: 角度 ° / 加速度 m/s² / 角速度 rad/s
|
||||
*
|
||||
* ---- 欧拉角(QuaternionEKF 解算结果,见 modules/ins) ----
|
||||
@@ -25,7 +25,30 @@
|
||||
* se bmi088_spi_errors:SPI/DMA 出错次数;st=bmi088_spi_state()
|
||||
* (1=READY,非 1 说明 SPI 被卡住,数据路会因此停摆)
|
||||
*
|
||||
* 开关: DEBUG_ATT_HEALTH=0 只输出三个欧拉角;DEBUG_ATT_DIAG=0 去掉诊断位。
|
||||
* ---- 控制量(DEBUG_CMD_OUT=1 时追加;用于排查 控制源→cmd_robot→执行机构) ----
|
||||
* online 1=**遥控器(DR16)在线** —— 本板这一位只反映 DR16,键鼠不置位!
|
||||
* 没有遥控器时整段控制分支都不执行(见 robot_cmd_task.c 的 online 门控),
|
||||
* 所以"键鼠测试"也必须有遥控器在线,否则这里恒为 0。
|
||||
* src 0=遥控器 1=键鼠(判据:0x0304 在 1s 内到过 keyboard_data.last_tick)
|
||||
* spin 小陀螺使能(云台侧检测,随 0x189 下发给底盘)
|
||||
* yaw_d/pitch_d 本周期云台角度增量(°/2ms 任务周期,×500 即 °/s)
|
||||
* fric/fire/eject 发射机构开关 reset 云台角度复位请求
|
||||
* s2/ctrl 遥控器 S2 档位与 Ctrl 按下沿 —— 底盘就是靠这两个量推出
|
||||
* chassis_mode,所以本板不输出模式本身(本板该字段恒为 OFF)
|
||||
* wheel 遥控拨轮原始值(1000~1050 为中立)
|
||||
* --- 以下为 DR16 帧内容诊断(判断"键鼠数据到底有没有到机器人") ---
|
||||
* s1 左侧拨杆(1上 2下 3中)。注意官方 RoboRTS 的 dbus.c 与本工程一致:
|
||||
* sw2=bit44-45→s2, sw1=bit46-47→s1;若与实物相反,用本列与 s2 对照即可判定
|
||||
* mouse_rl/mouse_du/mouse_wheel 帧里 data[6..11] 解析出的鼠标三轴
|
||||
* mouse_l/mouse_r 帧里 data[12]/data[13](鼠标左右键)
|
||||
* key_lo/key_hi 帧里 data[14]/data[15] **原始字节**(不做位拆分)
|
||||
* ★ 按下 W 时 key_lo 应变 0x01;若恒为 0,说明帧里根本没有键鼠数据
|
||||
* frames dr16_frame_count;持续增长说明 USART3 一直在收帧
|
||||
* 无健康位(DEBUG_ATT_HEALTH=0)时输出为纯数字 CSV,列序即上面顺序,
|
||||
* 可被 Lissio FireWater 直接解析成通道绘图。
|
||||
*
|
||||
* 开关: DEBUG_ATT_HEALTH=0 只输出三个欧拉角;DEBUG_ATT_DIAG=0 去掉诊断位;
|
||||
* DEBUG_CMD_OUT=1 追加控制量字段。
|
||||
* ========================================================================== */
|
||||
#include "debug_task.h"
|
||||
#include "cmsis_os.h"
|
||||
@@ -37,6 +60,7 @@
|
||||
#include "bmi088.h"
|
||||
#include "gimbal.h"
|
||||
#include "dr16.h"
|
||||
#include "robot_typedef.h"
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
@@ -60,6 +84,8 @@
|
||||
#define DEBUG_ATT_DIAG 0
|
||||
/* 1-仅输出 Pitch 调参行(便于用 VOFA+/串口示波器绘图); 0-同时输出姿态行与 Pitch 调参行 */
|
||||
#define DEBUG_PITCH_ONLY 0
|
||||
/* 1-追加控制量字段(见文件头); 0-保持原姿态输出不变 */
|
||||
#define DEBUG_CMD_OUT 1
|
||||
|
||||
/* 输出周期(ms)。姿态观测建议 100ms(10Hz) */
|
||||
#define DEBUG_OUT_PERIOD_MS 100
|
||||
@@ -114,17 +140,68 @@ void debug_task(void const * argument)
|
||||
#endif
|
||||
|
||||
#if DEBUG_ATT_HEALTH
|
||||
#if DEBUG_CMD_OUT
|
||||
/* 健康位分支是文本格式,控制量就按 key=value 追加,便于人读 */
|
||||
char ctl[160];
|
||||
snprintf(ctl, sizeof(ctl),
|
||||
" online=%u src=%u spin=%u yaw_d=%.4f pitch_d=%.4f fric=%u fire=%u"
|
||||
" eject=%u reset=%u s2=%u ctrl=%u wheel=%d",
|
||||
(unsigned)cmd_robot.online, (unsigned)cmd_robot.source,
|
||||
(unsigned)cmd_robot.spin_flag,
|
||||
cmd_robot.gimbal_yaw_delta, cmd_robot.gimbal_pitch_delta,
|
||||
(unsigned)cmd_robot.friction_on, (unsigned)cmd_robot.fire,
|
||||
(unsigned)cmd_robot.eject, (unsigned)cmd_robot.gimbal_reset,
|
||||
(unsigned)dr16.s2, (unsigned)dr16.key_push_ctrl,
|
||||
(int)cmd_robot.thumb_wheel);
|
||||
#else
|
||||
const char * ctl = "";
|
||||
#endif
|
||||
int len = snprintf(line, sizeof(line),
|
||||
"ecd=%u yaw=%.2f pitch=%.2f roll=%.2f cvg=%u rdy=%u imu=%u an=%.2f gn=%.3f%s\r\n",
|
||||
"ecd=%u yaw=%.2f pitch=%.2f roll=%.2f cvg=%u rdy=%u imu=%u an=%.2f gn=%.3f%s%s\r\n",
|
||||
(unsigned)motor_yaw_gimbal.fdb.raw_angle,
|
||||
att_deg_yaw, att_deg_pitch, att_deg_roll,
|
||||
(unsigned)INS.ConvergeFlag, (unsigned)att_ready,
|
||||
(unsigned)bmi088_online, an, gn, tail);
|
||||
(unsigned)bmi088_online, an, gn, tail, ctl);
|
||||
#else
|
||||
#if DEBUG_CMD_OUT
|
||||
/* 纯数字 CSV。前 3 列保持原样(pitch_ecd, pitch_current, yaw_ecd),其余:
|
||||
* online,src,spin, yaw_d,pitch_d, fric,fire,eject,reset, s2,ctrl,wheel,
|
||||
* s1, mouse_rl,mouse_du,mouse_wheel,mouse_l,mouse_r, key_lo,key_hi,
|
||||
* dr16_frame_count
|
||||
* 末尾这 9 列是 DR16 帧内容诊断:key_lo/key_hi 就是帧里的 data[14]/data[15]。
|
||||
* 按住 W 时若它们仍为 0,说明帧里本就没有键鼠数据(不是解析问题)。 */
|
||||
int len = snprintf(line, sizeof(line),
|
||||
"%u,%.1f,%u,%u,%u,%u,%.4f,%.4f,%u,%u,%u,%u,%u,%u,%d,%u,%d,%d,%d,%u,%u,%u,%u,%lu\r\n",
|
||||
(unsigned)motor_pitch_gimbal.fdb.raw_angle,
|
||||
pitch_current,
|
||||
(unsigned)motor_yaw_gimbal.fdb.raw_angle,
|
||||
(unsigned)cmd_robot.online,
|
||||
(unsigned)cmd_robot.source,
|
||||
(unsigned)cmd_robot.spin_flag,
|
||||
cmd_robot.gimbal_yaw_delta,
|
||||
cmd_robot.gimbal_pitch_delta,
|
||||
(unsigned)cmd_robot.friction_on,
|
||||
(unsigned)cmd_robot.fire,
|
||||
(unsigned)cmd_robot.eject,
|
||||
(unsigned)cmd_robot.gimbal_reset,
|
||||
(unsigned)dr16.s2,
|
||||
(unsigned)dr16.key_push_ctrl,
|
||||
(int)cmd_robot.thumb_wheel,
|
||||
(unsigned)dr16.s1,
|
||||
(int)dr16.mouse_rl,
|
||||
(int)dr16.mouse_du,
|
||||
(int)dr16.mouse_wheel,
|
||||
(unsigned)dr16.mouse_key_l,
|
||||
(unsigned)dr16.mouse_key_r,
|
||||
(unsigned)dr16.key_code_lo,
|
||||
(unsigned)dr16.key_code_hi,
|
||||
(unsigned long)dr16_frame_count);
|
||||
#else
|
||||
int len = snprintf(line, sizeof(line), "%u,%.1f,%u\r\n",
|
||||
(unsigned)motor_pitch_gimbal.fdb.raw_angle,
|
||||
pitch_current,(unsigned)motor_yaw_gimbal.fdb.raw_angle);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user