[TOC]
本节将列出英雄控制方面的新功能和特征 所有内容将在下一节按序描述细节后,再简述代码逻辑
- 双C板上下通信
- 绝对云台控制模式下,对云台位置微调
- 云台添加瞄准镜(2006电机),对瞄准镜的开环控制
- 放弃键盘控制时底盘静止(在云台微调时和开镜状态下)
没怎么用到的小功能
- 激光舵机控制
- C板KEY键开关蜂鸣器
- 船新的键位检测函数
本节将说明部分功能的细节及实现逻辑,以帮助后续维护和开发
受限于导电滑环的线路数,位于底盘的设备无法将所有信号线(CAN线与串口线)通过导电滑环与位于云台的C板通信,因此英雄采用上下双C板控制,即云台和底盘各置一块C板。其中云台C板负责主要的控制和计算,起到类似于“大脑”的功能。而底盘C板的定位类似“脊柱”,主要负责底盘设备的通信中转(包括4个底盘电机,yaw轴6020,拨弹轮和裁判系统),同时超级电容控制板直接由下C板单独控制。
这份英雄代码对应的硬件连线如图所示。上下C板之间的通信交换了:自下向上的裁判系统数据,自上向下的底盘速度数据和UI绘制所需数据。因为YAW电机和拨弹轮并入CAN2回路,不需要底盘C盘单独接收再转发。
此部分涉及的内容主要位于云台和底盘各自文件夹下的CAN_receive.c
和chassis.c
前者包含了所有的CAN通信打包拆包的约定,后者包含了通过上C板控制底盘运动的逻辑。下面就底盘运动逻辑进行简述,因为这部分代码和原始代码有较大出入。
原始控制流程大致为:接收遥控器数据-->设置状态机和英雄速度-->速度解算-->解算数据计算PID后发送给电机-->接收电机反馈数据,用于下一次PID。
流程的前两步需要与遥控器接收数据和云台状态,只能在上C板中运行。而电机的控制需要PID计算,在下C板运行更实际。因此,上板发送的底盘控制数据是包含vx_set,vy_set,wz_set
以及chassis_mode
的设定值,解算和控制全部交给下C板。
下附底盘数据接收结构体:
typedef struct
{
fp32 speed_set[3];
uint8_t chassis_mode;
uint8_t shoot_mode; // 射击模式: 0-摩擦轮、拨弹轮都不动; 1-摩擦轮动拨弹轮不动; 2-都动
uint8_t swing_flag; // 1开小陀螺 0不开
fp32 pitch_angel_degree;
int16_t fric_rpm; //摩擦轮转速
fp32 yaw_relative_angel; // 视为 body_angel
uint8_t scope_state; //1-scope_on 0-scope_off
uint8_t selected_key; //发送部分键位(awsd+shift+qe)
}gimbal_data_t;
裁判系统数据由下C板发送给上C板。下C板运行裁判系统串口任务中的数据解算函数referee_data_solve
得到数据后即发送给上板。上板创建了新的结构体chassis_data_receive
来接收下板发送数据。
由上C板发送给下C板。实现函数为send_gimbal_motor_state
。发送数据冗杂,由下板的结构体接收并直接在UI任务中调用。
当前键位设置为:c f v b。原理即是在云台绝对角度控制流程的最后加上对set值的微小加减。
实现函数:key_micro_control
简单的借用标志位进行锁定。解锁时功能才能触发,锁定时对标志位做增/减操作,一定周期后解锁。大多数增加的按键都使用这种方法,避免按一次键触发多次的“鬼键”。(这段解释一定是多余的吧)
瞄准镜的2006接入上C板的CAN1回路中,所以和原代码比CAN发送函数增加一个参数。瞄准镜的电机控制有两套控制方案,分别为开环控制和半闭环控制。为了克服可能存在的虚位问题,目前采用开环控制。
控制过程为:改变瞄准镜状态时,赋予一个绝对值递减的电流值驱动,其余时候赋予一个小电流锁住瞄准镜的位置。
虽然没有用闭环,不过还是简单讲一下,最后的实现效果未知闭环指在锁定瞄准镜位置时使用编码器闭环,且要用编码器闭环而非速度闭环才能完全锁死。
原代码中对键盘按键检测的实现形如 shoot_control.shoot_rc->key.v & SHOOT_OFF_KEYBOARD
。考虑到代码的复用性增加了键位函数bool_t key_pressed(uint16_t judged_key, uint16_t exclude_key)
。参数一为欲进行检测的键位,此参数会被进行向下严格判断,可以传入单个键位的offset或组合键(即多个键位offset的按位或运算结果)。参数二为排除键位,当排除键位被检测到函数即返回false以期望解决组合键和单键的冲突;若在这里传入组合键,则其中任意单键的按下都会返回false。若没有排除键位,传入0即可。
代码未测试!!!
自瞄射击数据通信--计算数据返回控制云台
弹速自适应逻辑优化
新版超级电容控制(抄步兵作业)
英雄视觉
左右偏移因素?
Q1 发射时云台抖动曲线是否证明弹丸接触左右摩擦轮有先后 Q2 第二轮射击(20发以后)左右散布会增大?