2024超级对抗赛版本

This commit is contained in:
shmily744 2024-05-30 22:34:49 +08:00
parent 780782f6ec
commit 6cdd3d046d
5 changed files with 37 additions and 57 deletions

View File

@ -17,10 +17,10 @@
#define YAW_ALIGN_ANGLE (YAW_CHASSIS_ALIGN_ECD * ECD_ANGLE_COEF_DJI) // 对齐时的角度,0-360
#define PTICH_HORIZON_ANGLE (PITCH_HORIZON_ECD * ECD_ANGLE_COEF_DJI) // pitch水平时电机的角度,0-360
#define PITCH_SCAN -8.0f //扫描阶段PITCH固定角度
#define SHOOT_RATE 18.0f //射频
#define PITCH_SCAN -10.0f //扫描阶段PITCH固定角度
#define SHOOT_RATE 15.0f //射频
#define MIN_SHOOT_RATE 5.0f //热量过高降低射频射频
/* cmd应用包含的模块实例指针和交互信息存储*/
#ifdef GIMBAL_BOARD // 对双板的兼容,条件编译
@ -60,8 +60,6 @@ static Shoot_Upload_Data_s shoot_fetch_data; // 从发射获取的反馈信息
static Robot_Status_e robot_state; // 机器人整体工作状态
float pitch_k = 0.13;
void RobotCMDInit() {
rc_data = RemoteControlInit(&huart3); // 修改为对应串口,注意如果是自研板dbus协议串口需选用添加了反相器的那个
vision_recv_data = VisionInit(&huart1); // 视觉通信串口
@ -172,28 +170,29 @@ static void AutoControlSet() {
static int8_t yaw_dir = 1;
static int8_t pitch_dir = 1;
//trajectory_cal.v0 = 30; //弹速30
aim_select.suggest_fire = 0;
//小云台扫描
if (gimbal_scan_flag == 1) {
gimbal_cmd_send.pitch = PITCH_SCAN;
//if(gimbal_cmd_recv.game_state > 1)
{
if (yaw_dir == 1) gimbal_cmd_send.yaw += 0.06f;
else gimbal_cmd_send.yaw -= 0.06f;
if (gimbal_fetch_data.mini_yaw_encode_angle <= YAW_MIN_ENCODE_ANGLE + 2.0f) yaw_dir = 1;
if (gimbal_fetch_data.mini_yaw_encode_angle >= YAW_MAX_ENCODE_ANGLE - 2.0f) yaw_dir = -1;
}
if (yaw_dir == 1) gimbal_cmd_send.yaw -= 0.06f;
else gimbal_cmd_send.yaw += 0.06f;
if (gimbal_fetch_data.mini_yaw_encode_angle <= YAW_MIN_ENCODE_ANGLE + 2.0f) yaw_dir = -1;
if (gimbal_fetch_data.mini_yaw_encode_angle >= YAW_MAX_ENCODE_ANGLE - 2.0f) yaw_dir = 1;
shoot_cmd_send.load_mode = LOAD_STOP;
}
trajectory_cal.v0 = 28; //弹速30
trajectory_cal.v0 = 27; //弹速30
if (vision_recv_data->x == 0 && vision_recv_data->y == 0 && vision_recv_data->z == 0
&& vision_recv_data->vx == 0 && vision_recv_data->vy == 0 && vision_recv_data->vz == 0) {
aim_select.suggest_fire = 0;
//未发现目标
no_find_cnt++;
if (no_find_cnt >= 200) {
if (no_find_cnt >= 400) {
gimbal_scan_flag = 1;
//auto_aim_flag = 0;
}
@ -212,10 +211,9 @@ static void AutoControlSet() {
gimbal_cmd_send.pitch = trajectory_cal.cmd_pitch * 180 / PI;
float yaw_err = fabsf(gimbal_cmd_send.yaw - gimbal_fetch_data.gimbal_imu_data.Yaw);
if (yaw_err <= 3) //3度
if (yaw_err <= 5) //3度
{
aim_select.suggest_fire = 1;
shoot_cmd_send.shoot_mode = SHOOT_ON;
@ -397,7 +395,7 @@ static void EmergencyHandler() {
LOGINFO("[CMD] reinstate, robot ready");
}
}
static uint8_t cool_down;
/* 机器人核心控制任务,200Hz频率运行(必须高于视觉发送频率) */
void RobotCMDTask() {
// 从其他应用获取回传数据
@ -427,8 +425,15 @@ void RobotCMDTask() {
}
//热量控制
if (gimbal_cmd_recv.rest_heat > 350)
shoot_cmd_send.load_mode = LOAD_STOP;
if (gimbal_cmd_recv.rest_heat > 350){
cool_down = 1; //进入冷却状态
}else if(gimbal_cmd_recv.rest_heat < 100){
cool_down = 0; //退出冷却状态
}
if(cool_down){
shoot_cmd_send.shoot_rate = MIN_SHOOT_RATE;
}
EmergencyHandler(); // 处理模块离线和遥控器急停等紧急情况

View File

@ -206,7 +206,7 @@ void GimbalTask()
// 设置反馈数据,主要是imu和yaw的ecd
gimbal_feedback_data.gimbal_imu_data = *gimba_IMU_data;
gimbal_feedback_data.yaw_motor_single_round_angle = yaw_motor->measure.angle_single_round;
gimbal_feedback_data.mini_yaw_encode_angle = yaw_motor->measure.total_angle;
gimbal_feedback_data.mini_yaw_encode_angle = yaw_motor->measure.angle_single_round;
big_yaw_angle = gimba_IMU_data->YawTotalAngle - (yaw_motor->measure.total_angle - (-100));
gimbal_feedback_data.big_yaw_angle = big_yaw_angle;

View File

@ -32,8 +32,8 @@
#define PITCH_MAX_ANGLE 35 // 云台竖直方向最大角度 (注意反馈如果是陀螺仪,则填写陀螺仪的角度)
#define PITCH_MIN_ANGLE -15 // 云台竖直方向最小角度 (注意反馈如果是陀螺仪,则填写陀螺仪的角度)
#define YAW_MAX_ENCODE_ANGLE 45.0f //小yaw编码器限位
#define YAW_MIN_ENCODE_ANGLE -77.0f
#define YAW_MAX_ENCODE_ANGLE 300.0f //小yaw编码器限位
#define YAW_MIN_ENCODE_ANGLE 130.0f
// 发射参数
#define ONE_BULLET_DELTA_ANGLE 36 // 发射一发弹丸拨盘转动的距离,由机械设计图纸给出
#define REDUCTION_RATIO_LOADER 49.0f // 拨盘电机的减速比,英雄需要修改为3508的19.0f

View File

@ -221,8 +221,8 @@ void ShootTask()
// DJIMotorSetRef(friction_r, 0);
// break;
default: // 当前为了调试设定的默认值4000,因为还没有加入裁判系统无法读取弹速.
DJIMotorSetRef(friction_l, 43000);
DJIMotorSetRef(friction_r, 43000);
DJIMotorSetRef(friction_l, 40000);
DJIMotorSetRef(friction_r, 40000);
break;
}
}

View File

@ -91,41 +91,16 @@ int aim_armor_select(Aim_Select_Type_t *aim_sel, Trajectory_Type_t *trajectory_c
// } else label_second = 1;
// }
// 选择两块较近的装甲板
// 选择较近的装甲板
float distance[3];
int label = 0;
for (i = 0; i < 3; i++) {
distance[i] = powf(aim_sel->armor_pose[i].x, 2) + powf(aim_sel->armor_pose[i].y, 2);
if(distance[i]<distance[label])
label = i;
}
int label_first = 0;
int label_second = 1;
if(distance[label_first] > distance[label_second])
{
label_first = 1;
label_second = 0;
}
if(distance[2]<distance[label_second])
label_second = 2;
//再选择两块装甲板与自身位置连线,同旋转中心自身位置连线,夹角较小的为目标装甲板
float center_length = sqrtf(powf(aim_sel->target_state.x, 2) + powf(aim_sel->target_state.y, 2));
float cos_theta_first = (aim_sel->armor_pose[label_first].x * aim_sel->target_state.x +
aim_sel->armor_pose[label_first].y * aim_sel->target_state.y) /
(sqrtf(powf(aim_sel->armor_pose[label_first].x, 2) +
powf(aim_sel->armor_pose[label_first].y, 2)) * center_length);
float cos_theta_second = (aim_sel->armor_pose[label_second].x * aim_sel->target_state.x +
aim_sel->armor_pose[label_second].y * aim_sel->target_state.y) /
(sqrtf(powf(aim_sel->armor_pose[label_second].x, 2) +
powf(aim_sel->armor_pose[label_second].y, 2)) * center_length);
if (cos_theta_first > cos_theta_second)
idx = label_first;
else
idx = label_second;
idx = label;
} else {
for (i = 0; i < 4; i++) {
@ -212,7 +187,7 @@ int aim_armor_select(Aim_Select_Type_t *aim_sel, Trajectory_Type_t *trajectory_c
* @param[in] v_x0:
* @retval
*/
const float k1 = 0.005f;//0.0761; //标准大气压25度下空气阻力系数
const float k1 = 0.0761; //标准大气压25度下空气阻力系数
float get_fly_time(float x, float vx, float v_x0) {
float t = 0;
float f_ti = 0, df_ti = 0;
@ -235,7 +210,7 @@ void get_cmd_angle(Trajectory_Type_t *trajectory_cal) {
arm_power_f32(trajectory_cal->position_xy, 2, &trajectory_cal->dis2);
arm_sqrt_f32(trajectory_cal->dis2, &trajectory_cal->dis);
trajectory_cal->dis = trajectory_cal->dis - 0.50f;
trajectory_cal->dis = trajectory_cal->dis - 0.05f;
trajectory_cal->theta_0 = atan2f(trajectory_cal->z, trajectory_cal->dis);
trajectory_cal->alpha = atan2f(trajectory_cal->position_xy[1], trajectory_cal->position_xy[0]);
@ -270,7 +245,7 @@ void get_cmd_angle(Trajectory_Type_t *trajectory_cal) {
}
int auto_aim(Aim_Select_Type_t *aim_sel, Trajectory_Type_t *trajectory_cal, RecievePacket_t *receive_packet) {
trajectory_cal->extra_delay_time = 0.035;//0.025
trajectory_cal->extra_delay_time = 0.09;//0.025
aim_sel->target_state.armor_type = receive_packet->id;
aim_sel->target_state.armor_num = receive_packet->armors_num;