Files
Simba-OmniInfantry/云台/Application/robot_param.h
T
lyf 267a659242 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 一处校正。
2026-10-16 04:24:32 +08:00

210 lines
14 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
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.
/* =============================================================================
* robot_param.h - 全部个性化参数(整车唯一调参入口)
* 分区:云台限位/转速 -> 云台 Yaw/Pitch PID(双陀螺环) -> 摩擦轮/拨弹 ->
* 底盘几何/轮速 PID/跟随(双 INS 世界系)/功率 -> CToC 帧 ID ->
* CAN ID 表 -> 掉线时间 -> IMU 恒温 -> 台架调试开关
* 控制周期 2ms(改周期需重调所有 PID!)
* ========================================================================== */
#ifndef ROBOT_PARAM_H
#define ROBOT_PARAM_H
/* ============================ 云台 ============================ */
#define PITCH_GM6020_POSITION_UPPER_LIMIT 2260 // Pitch 轴抬起极限(最高位,编码器较小值;实测2203撞死限位,留余量设2260)
#define PITCH_GM6020_POSITION_LOWER_LIMIT 3950 // Pitch 轴压低极限(最低位,编码器较大值;实测4234撞死限位,留余量设3950)
#define PITCH_GM6020_ENCODER_ZERO 3200 // Pitch 轴编码器水平零位
#define YAW_GM6020_ENCODER_ZERO 7730 // Yaw 轴编码器零位(机械正前方,0~8191)
#define CHASSIS_SPIN_FEEDFORWARD_K 0.008f // 小陀螺解算时延前馈补偿系数(s)
#define GIMBAL_FRICTION_WHEEL_SPEED 5500.0f // 摩擦轮转速(RPM)
#define GIMBAL_RAMMER_SPEED -5400.0f// 拨弹盘转速(RPM,负向发射)
#define GIMBAL_LEVER_SPEED_MAP_RATE 2.0f // 云台拨杆速度映射比例(Yaw 用)
#define GIMBAL_PITCH_LEVER_RATE 5.0f // Pitch 专用比例(满杆≈110°/s)
#define GIMBAL_YAW_PITCH_SPEED_RATE 3.0f // 云台偏航/俯仰速度比
#define PC_MOUSE_RL_SENSITIVITY 3.0f // 鼠标左右灵敏度
#define PC_MOUSE_DU_SENSITIVITY 8.0f // 鼠标上下灵敏度
/* ---- Yaw 双环(2ms):位置环与速度环都以陀螺仪为反馈 ----
* 设计要点(2026-09 重写):
* - 旧方案速度环用电机转子转速、位置环用陀螺角度,两类传感器的方向关系
* 由装配(皮带是否交叉)决定,一个符号参数无法同时保证两环负反馈——
* 这是反复"疯转"的根源,已废弃;
* - 现在两环共用陀螺,整条链只有一个装配符号,由上电自检自动测定
* (GIMBAL_YAW_DETECT 见下),无需人工猜;
* - 单位:角度环 误差° -> 目标角速度°/s;速度环 误差°/s -> 电流。
* 调参顺序:先速度环(点动不振荡),再位置环(刚性)——见移植 README §8.1 */
#define GIMBAL_YAW_ANGLE_KP 20.0f // ° -> °/s:10° 误差给 150°/s
#define GIMBAL_YAW_ANGLE_KI 0.0f
#define GIMBAL_YAW_ANGLE_KD 0.0f // 速度环本身即微分,不再叠加
#define GIMBAL_YAW_ANGLE_EK_DEADBAND 0.05f // 误差死区(°),QEKF 噪声小可用窄死区
#define GIMBAL_YAW_ANGLE_OUT_LIMIT 360.0f // 目标角速度上限(°/s)
#define GIMBAL_YAW_SPEED_KP 85.0f // °/s -> 电流:100°/s 误差给 6000(约 36% 满电流)
#define GIMBAL_YAW_SPEED_KI 0.0f // 稳定后可回填 0.5~2 消速度稳态差
#define GIMBAL_YAW_SPEED_KD 0.0f // 陀螺速率反馈噪声小,先不用 D
#define GIMBAL_YAW_SPEED_OUT_LIMIT 16384.0f// GM6020 电流限幅(±16384 对应 ±3A)
#define GIMBAL_YAW_SPIN_FEEDFORWARD_K 24.0f // 小陀螺底盘自旋解耦前馈系数(RPM->电流)
/* Yaw 装配符号自动检测:上电自检时给 Yaw 电机一个正向小电流脉冲,
* 看陀螺 z 轴往哪边转——脉冲引起同向转动则符号 +1,反向则 -1。
* 检测时云台会轻转几度,勿扶云台;失败(被按住/电机离线)时用 FALLBACK */
#define GIMBAL_YAW_SIGN_AUTO 1 // 1=上电自动检测 0=直接用 FALLBACK
#define GIMBAL_YAW_SIGN_FALLBACK (1.0f)
#define GIMBAL_YAW_DETECT_CURRENT 3500 // 检测脉冲电流(约 21% 满电流 16384)
#define GIMBAL_YAW_DETECT_RATE_MIN 20.0f // 判定转动的陀螺速率阈值(°/s)
/* ---- Pitch(位置环陀螺 Roll,速度环转子转速——Pitch 无符号史问题,维持原案) ---- */
#define GIMBAL_PITCH_ANGLE_EK_DEADBAND 0.05f // 误差死区(°),收窄死区消除边缘阶跃
#define GIMBAL_PITCH_ANGLE_KP 15.0f
#define GIMBAL_PITCH_ANGLE_KI 0.0f
#define GIMBAL_PITCH_ANGLE_KD 0.0f // 原100.0f是万级电流振颤主因!清零以消除剧烈振荡
#define GIMBAL_PITCH_SPEED_KP 40.0f // 速度/电流环Kp
#define GIMBAL_PITCH_SPEED_KI 0.0f
#define GIMBAL_PITCH_SPEED_KD 0.0f
/* Pitch 重力拟合前馈参数: I_g = K_COS * cos(a) + K_SIN * sin(a) + K_CONST
* 其中 a = (raw_angle - ZERO_ECD) * 360 / 8192 (°) */
#define GIMBAL_PITCH_GRAVITY_ZERO_ECD 3200.0f // 重力补偿拟合基准编码值
#define GIMBAL_PITCH_GRAVITY_K_COS 2856.1f// cos 项系数
#define GIMBAL_PITCH_GRAVITY_K_SIN 4340.3f// sin 项系数
#define GIMBAL_PITCH_GRAVITY_K_CONST 2826.5f // 常数偏置项
/* ---- 2026-10-15 台架前馈实测记录(未采用,保留备查) ----
* 用上位机 203Hz 遥测在编码器 -16.91°/+4.88°/+9.30° 三处长时间静止(编码器
* 零漂移+目标恒定)实测真实保持电流 3597/4498/4613 counts;当时上面这组参数
* 分别高估 699/1543/1733 counts,折合 1.17~2.89° 稳态静差
* (位置环 Kp15×Kp40 = 600 counts/°:静差 = 前馈高估量 / 600)。
* 按"保留原相位与形状(K_COS:K_SIN 不变)、幅值×0.503 并微调常数项"重标定为:
* GIMBAL_PITCH_GRAVITY_K_COS 1435.4f
* GIMBAL_PITCH_GRAVITY_K_SIN 2181.3f
* GIMBAL_PITCH_GRAVITY_K_CONST 2861.6f
* 该组在当次数据上残差 RMS 16 counts(0.03°),看似很准;**但换到另一机械状态后
* 同一编码器角度实测保持电流又差约 1650 counts**,说明被标定对象本身在变
* (见上方"机械滞回 2130 counts"记录),故不采用,前馈保持原值不动。
* 另一并记录:PID 动态特性实测良好(上升时间 0.095~0.14s、超调 0.3~5.2%、
* 16s 稳态段纹波 p-p 0.046°、无振荡),故 GIMBAL_PITCH_*_KP/KI/KD 也未改动。 */
#define GIMBAL_FRICTION_WHEEL_KP 16.0f
#define GIMBAL_FRICTION_WHEEL_KI 0.0f
#define GIMBAL_FRICTION_WHEEL_KD 30.0f
#define GIMBAL_RAMMER_KP 16.0f
#define GIMBAL_RAMMER_KI 0.0f
#define GIMBAL_RAMMER_KD 0.0f
/* ============================ 底盘 ============================ */
#define MECANUM_WHEEL_RADIUS 7.0f // 麦轮半径(cm)
#define MECANUM_RX 18.0f // 底盘中心到轮心的x轴分量(cm)
#define MECANUM_RY 18.75f // 底盘中心到轮心的y轴分量(cm)
/* 转速换算系数 = 19(减速比)*60*100/(2π*R_cm) */
#define MECANUM_SPEED_FACTOR 18143.663512f
#define MECANUM_CHASSIS_SPEED_SCALE 0.004f // 摇杆->线速度比例(legacy)
#define MECANUM_KEYBOARD_SPEED 2.4f // 键盘 WASD 平移速度(m/s 量纲映射值)
#define MECANUM_SPIN_SLOW_W 4.0f // 慢速小陀螺角速度(rad/s 量纲映射值)
#define MECANUM_SPIN_FAST_W 7.0f // 快速小陀螺角速度(legacy 7.0)
#define MECANUM_SHIFT_BOOST_RATE 1.3f // SHIFT 加速增益(超电接入前的临时方案)
/* 底盘轮速 PID(legacy 已调参数,2ms 控制周期) */
#define MECANUM_WHEEL_SPEED_KP 0.8f
#define MECANUM_WHEEL_SPEED_KI 0.0f
#define MECANUM_WHEEL_SPEED_KD 0.0f
#define MECANUM_WHEEL_SPEED_OUT_LIMIT 15000.0f
/* ---- 跟随(2ms):双 INS 世界系方案(2026-09 重写) ----
* 云台把世界系 yaw 经 0x1A9 帧发给底盘,底盘用自己的 INS yaw 相减:
* err = wrap180(云台yaw - 底盘yaw)
* 不再依赖底盘侧 GM6020(0x205) 反馈,皮带虚位不在环内,无基准锁定时序坑。
* 两板 INS 各自上电零点任意,但差值只随相对转动变化,天然正确 */
#define CHASSIS_FOLLOW_KP 0.4678f // w 量纲/°:10° 偏差给 w=4
#define CHASSIS_FOLLOW_KI 0.0f // 调试期 0,同旧教训(积分残留)
#define CHASSIS_FOLLOW_KD 24.452f
#define CHASSIS_FOLLOW_OUT_LIMIT 5.5f // 输出限幅(介于慢/快陀螺之间)
#define CHASSIS_FOLLOW_DEADBAND 1.0f // 误差死区(°)
/* 跟随符号全自动综合:云台自检(0x1A9 flags)下发编码器 tick 增向,
* 底盘自检用小 w 脉冲+INS 测 w 正向对应的车身转向,两者相乘。
* CHASSIS_FOLLOW_SIGN 仅作自检失败时的回退值 */
#define CHASSIS_FOLLOW_SIGN (1.0f)
#define CHASSIS_DETECT_W 1.2f // 自检 w 脉冲幅值
#define CHASSIS_DETECT_TIME_MS 80 // 脉冲时长(落地整车轻转)
#define CHASSIS_DETECT_YAW_MIN 0.5f // 判定转动的 INS yaw 阈值(°)
/* 功率限制(简易方案:缓冲能量不足时按比例缩放轮电流) */
#define POWER_LIMIT_BUFFER_LOW 30.0f // 缓冲能量低于此值开始限流(J)
#define POWER_LIMIT_BUFFER_MIN 10.0f // 缓冲能量最低保护值(J)
/* ============================ CToC 板间通讯 ============================ */
#define CTOC_MASTER_ID1 0x019 // 底盘->云台:发射机构状态+底盘故障位
#define CTOC_SLAVE_ID1 0x149 // 云台->底盘:摇杆数据
#define CTOC_SLAVE_ID2 0x189 // 云台->底盘:控制状态+故障/陀螺使能位
#define CTOC_SLAVE_ID3 0x1A9 // 云台->底盘:云台世界系 yaw(float)+att_ready
#define CTOC_SLAVE_ID4 0x1B9 // 云台->底盘:自定义UI 专用(pitch + 摩擦轮 L/R 转速)
/* ============================ CAN ID ============================ */
/* 云台板:CAN1 = Pitch GM6020(0x206,0x1FE)+摩擦轮 M3508(0x201/0x202,0x200)
* CAN2 = Yaw GM6020(0x205,0x1FE)+拨弹 M2006(0x201,0x200)+底盘回传(0x019)
* 底盘板:CAN1 = 四轮 M3508(0x201~0x204)
* CAN2 = 云台数据(0x149/0x189/0x1A9) */
/* ============================ 台架调试开关 ============================ */
#define DEBUG_SHOOT_WITHOUT_REFEREE 1 // 1=无裁判系统时也允许开摩擦轮(台架调试用),比赛请改 0
#define GIMBAL_RAMMER_INSTALLED 0 // 1=拨弹 M2006 已安装;0=暂缺,不参与掉线判定
/* ================= 2026-10-15 Pitch 台架 PID 调参改动(已停用,保留备查) =================
* 以下开关是一次台架 Pitch 调参试验所加,已用 #if 0 停用:不参与编译、不影响现有行为。
* 需要复现时把外层 #if 0 改成 #if 1,并同步启用 gimbal.c / gimbal_task.c / gimbal.h
* / debug_task.c 里同名的停用块。
* 启用前务必先确认机械无卡滞:当时实测**同一编码器角度下保持电流可差 2130 counts
* (≈3.55° 当量)**,属机械滞回(线缆拖拽/接触/摩擦),不是控制问题;机械不一致时
* 任何固定前馈都标不准,调参也无意义。 */
#if 0
/* ---- Pitch 台架 PID 调参(仅台架;调完/比赛必须置 0) ----
* 1=在 Pitch 位置环设定值上叠加一个方波阶跃,用于定量观测阶跃响应。
* 安全约束(务必遵守):
* - **有界**:只跑 GIMBAL_BENCH_PITCH_HALF_COUNT 个半周期就自动归零停住,
* 不做长时间连续抖动;
* - **限位内**:轴距上下软限位不足 GIMBAL_BENCH_PITCH_SAFE_MARGIN_DEG 时
* 不施加阶跃,绝不把轴推向限位;
* - 该偏置是纯附加量,不累加进 pitch_target_deg,关掉即完全恢复原行为。 */
#define GIMBAL_BENCH_PITCH_TUNE 0
#define GIMBAL_BENCH_PITCH_STEP_DEG 3.0f // 阶跃幅值(°)
#define GIMBAL_BENCH_PITCH_HALF_MS 800 // 半周期(ms),(跑完自动停,非持续抖动)
#define GIMBAL_BENCH_PITCH_HALF_COUNT 4 // 总半周期数:4×0.8s=3.2s 后自动静止
#define GIMBAL_BENCH_PITCH_SAFE_MARGIN_DEG 5.0f // 距上下限位至少留这么多才允许阶跃
/* Pitch 软限位外的电流限制(方向 + 堵转双层保护):
* - 压向限位的方向一律清零(绝不顶限位);
* - 离开限位的方向允许 GIMBAL_PITCH_LIMIT_CURRENT_RECOVER,让轴能自行归位
* (烧录/上电会短暂失力矩,轴会掉到限位,必须能自己爬起来);
* - 但限位外若连续 GIMBAL_PITCH_LIMIT_STALL_MS 编码器一动不动,判为堵转/
* 撞死,允许电流降到 GIMBAL_PITCH_LIMIT_CURRENT,避免长时间过载发热。
* 轴回到软限位内后闭环自动恢复正常输出。 */
#define GIMBAL_PITCH_LIMIT_CURRENT_RECOVER 12000.0f // 限位外抬升方向允许电流(≈2.2A,额定3A的73%)
#define GIMBAL_PITCH_LIMIT_CURRENT 1500.0f // 限位外判定堵转后的涓流上限(≈0.27A)
#define GIMBAL_PITCH_LIMIT_STALL_MS 300 // 限位外不动多久判定堵转(高位电流只持续这么久)
#endif
/* ================= 以上为停用块,以下为原有代码 ================= */
/* 1=把 CAN 掉线警告音替换成循环播放的旋律《你》(RM动画片尾曲),报警时播放;
* 旋律音符表见 modules/dev/buzzer.c 的 buzzer_melody[] */
#define DEBUG_BUZZER_MELODY 0
#define BUZZER_MELODY_SPEED_DIV 1 // 旋律降速分频(默认1:每步100ms精准匹配原版带吐音断音节拍)
/* ============================ 掉线检测 ============================ */
#define DEVICE_OFFLINE_TIME_MS 100 // CAN 设备/裁判系统掉线判定时间
#define CTOC_OFFLINE_TIME_MS 100 // 板间通讯掉线判定时间
/* ============================ IMU ============================ */
/* 姿态解算为 QuaternionEKF(见 modules/ins);z 轴零偏上电静止标定约 1s,
* x/y 由 EKF 在线估计;EKF 参数(Q1/Q2/R/lambda)在 ins.c 的 ins_init() 内调整 */
#define IMU_TEMPERATURE_TARGET 40.0f // BMI088 恒温目标(℃)
#define IMU_TEMPERATURE_LIMIT 50.0f // 温度报警阈值(℃)
#define IMU_TEMP_KP 20.0f
#define IMU_TEMP_KI 0.0003f
#define IMU_TEMP_KD 0.0f
#endif