This commit is contained in:
zcj 2024-03-14 15:41:33 +08:00
parent 2aac4702b9
commit 7a85fdf4c2
10 changed files with 57 additions and 65 deletions

View File

@ -44,7 +44,7 @@ static Chassis_Ctrl_Cmd_s chassis_cmd_recv; // 底盘接收到的控制
static Chassis_Upload_Data_s chassis_feedback_data; // 底盘回传的反馈数据 static Chassis_Upload_Data_s chassis_feedback_data; // 底盘回传的反馈数据
static referee_info_t* referee_data; // 用于获取裁判系统的数据 static referee_info_t* referee_data; // 用于获取裁判系统的数据
static Referee_Interactive_info_t ui_data; // UI数据将底盘中的数据传入此结构体的对应变量中UI会自动检测是否变化对应显示UI
static SuperCapInstance *cap; // 超级电容 static SuperCapInstance *cap; // 超级电容
static DJIMotorInstance *motor_lf, *motor_rf, *motor_lb, *motor_rb; // left right forward back static DJIMotorInstance *motor_lf, *motor_rf, *motor_lb, *motor_rb; // left right forward back
@ -110,7 +110,7 @@ void ChassisInit()
chassis_motor_config.controller_setting_init_config.motor_reverse_flag = MOTOR_DIRECTION_NORMAL; chassis_motor_config.controller_setting_init_config.motor_reverse_flag = MOTOR_DIRECTION_NORMAL;
motor_rb = DJIMotorInit(&chassis_motor_config); motor_rb = DJIMotorInit(&chassis_motor_config);
referee_data = UITaskInit(&huart6,&ui_data); // 裁判系统初始化,会同时初始化UI referee_data = UITaskInit(&huart6, &ui_data); // 裁判系统初始化,会同时初始化UI
SuperCap_Init_Config_s cap_conf = { SuperCap_Init_Config_s cap_conf = {
.can_config = { .can_config = {
@ -290,6 +290,7 @@ void ChassisTask()
// // 获取裁判系统数据 建议将裁判系统与底盘分离,所以此处数据应使用消息中心发送 // // 获取裁判系统数据 建议将裁判系统与底盘分离,所以此处数据应使用消息中心发送
// // 我方颜色id小于7是红色,大于7是蓝色,注意这里发送的是对方的颜色, 0:blue , 1:red // // 我方颜色id小于7是红色,大于7是蓝色,注意这里发送的是对方的颜色, 0:blue , 1:red
chassis_feedback_data.enemy_color = !referee_data->referee_id.Robot_Color; chassis_feedback_data.enemy_color = !referee_data->referee_id.Robot_Color;
// // 当前只做了17mm热量的数据获取,后续根据robot_def中的宏切换双枪管和英雄42mm的情况 // // 当前只做了17mm热量的数据获取,后续根据robot_def中的宏切换双枪管和英雄42mm的情况
// chassis_feedback_data.bullet_speed = referee_data->GameRobotState.shooter_id1_17mm_speed_limit; // chassis_feedback_data.bullet_speed = referee_data->GameRobotState.shooter_id1_17mm_speed_limit;
// chassis_feedback_data.rest_heat = referee_data->PowerHeatData.shooter_heat0; // chassis_feedback_data.rest_heat = referee_data->PowerHeatData.shooter_heat0;

View File

@ -3,6 +3,7 @@
#include "robot_cmd.h" #include "robot_cmd.h"
// module // module
#include "remote_control.h" #include "remote_control.h"
#include "referee_task.h"
#include "ins_task.h" #include "ins_task.h"
#include "master_process.h" #include "master_process.h"
#include "message_center.h" #include "message_center.h"
@ -54,6 +55,7 @@ static Shoot_Upload_Data_s shoot_fetch_data; // 从发射获取的反馈信息
static Robot_Status_e robot_state; // 机器人整体工作状态 static Robot_Status_e robot_state; // 机器人整体工作状态
extern float horizontal_angle; extern float horizontal_angle;
int target_index = -1;
void RobotCMDInit() void RobotCMDInit()
{ {
@ -118,7 +120,13 @@ static void CalcOffsetAngle()
// else // else
// chassis_cmd_send.offset_angle = chassis_cmd_send.offset_angle; // chassis_cmd_send.offset_angle = chassis_cmd_send.offset_angle;
} }
static void update_ui_data()
{
ui_data.chassis_mode = chassis_cmd_send.chassis_mode;
ui_data.gimbal_mode = gimbal_cmd_send.gimbal_mode;
ui_data.friction_mode = shoot_cmd_send.friction_mode;
ui_data.shoot_mode = shoot_cmd_send.shoot_mode;
}
static void pitch_limit() static void pitch_limit()
{ {
if(gimbal_fetch_data.pitch_motor_total_angle > horizontal_angle + 1500) if(gimbal_fetch_data.pitch_motor_total_angle > horizontal_angle + 1500)
@ -132,6 +140,7 @@ static void pitch_limit()
*/ */
static void RemoteControlSet() static void RemoteControlSet()
{ {
aim_select.suggest_fire = 0;
// 控制底盘和云台运行模式,云台待添加,云台是否始终使用IMU数据? // 控制底盘和云台运行模式,云台待添加,云台是否始终使用IMU数据?
if (switch_is_down(rc_data[TEMP].rc.switch_right)) // 右侧开关状态[下],小陀螺 if (switch_is_down(rc_data[TEMP].rc.switch_right)) // 右侧开关状态[下],小陀螺
{ {
@ -158,7 +167,7 @@ static void RemoteControlSet()
} }
// 左侧开关状态为[下],视觉模式 // 左侧开关状态为[下],视觉模式
if (switch_is_down(rc_data[TEMP].rc.switch_left)) { if (switch_is_down(rc_data[TEMP].rc.switch_left)) {
trajectory_cal.v0 = 30; //弹速30 trajectory_cal.v0 = 12.5; //弹速30
if (vision_recv_data->x == 0 && vision_recv_data->y == 0 && vision_recv_data->z == 0 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) { && vision_recv_data->vx == 0 && vision_recv_data->vy == 0 && vision_recv_data->vz == 0) {
aim_select.suggest_fire = 0; aim_select.suggest_fire = 0;
@ -176,7 +185,8 @@ static void RemoteControlSet()
no_find_cnt = 0; no_find_cnt = 0;
auto_aim_flag = 1; auto_aim_flag = 1;
int target_index = auto_aim(&aim_select, &trajectory_cal, vision_recv_data); target_index = auto_aim(&aim_select, &trajectory_cal, vision_recv_data);
VisionSetAim(aim_select.aim_point[0],aim_select.aim_point[1],aim_select.aim_point[2]);
gimbal_cmd_send.yaw = -trajectory_cal.cmd_yaw * 180 / PI; gimbal_cmd_send.yaw = -trajectory_cal.cmd_yaw * 180 / PI;
@ -221,7 +231,6 @@ static void RemoteControlSet()
else else
shoot_cmd_send.load_mode = LOAD_STOP; shoot_cmd_send.load_mode = LOAD_STOP;
// 射频控制,固定每秒1发,后续可以根据左侧拨轮的值大小切换射频, // 射频控制,固定每秒1发,后续可以根据左侧拨轮的值大小切换射频,
shoot_cmd_send.shoot_rate = 8;
} }
/** /**
@ -230,37 +239,31 @@ static void RemoteControlSet()
*/ */
static void MouseKeySet() static void MouseKeySet()
{ {
chassis_cmd_send.vx = rc_data[TEMP].key[KEY_PRESS].a * 7000 - rc_data[TEMP].key[KEY_PRESS].d * 7000; // 系数待测 chassis_cmd_send.vx = rc_data[TEMP].key[KEY_PRESS].a * 6000 - rc_data[TEMP].key[KEY_PRESS].d * 6000; // 系数待测
chassis_cmd_send.vy = rc_data[TEMP].key[KEY_PRESS].w * 7000 - rc_data[TEMP].key[KEY_PRESS].s * 7000; chassis_cmd_send.vy = rc_data[TEMP].key[KEY_PRESS].w * 6000 - rc_data[TEMP].key[KEY_PRESS].s * 6000;
gimbal_cmd_send.yaw += (float)rc_data[TEMP].mouse.x / 660 * 7; // 系数待测 gimbal_cmd_send.yaw += (float)rc_data[TEMP].mouse.x / 660 * 7; // 系数待测
gimbal_cmd_send.pitch += (float)rc_data[TEMP].mouse.y / 660 * 7; gimbal_cmd_send.pitch += (float)rc_data[TEMP].mouse.y / 660 * 7;
pitch_limit(); pitch_limit();
switch (rc_data[TEMP].key_count[KEY_PRESS][Key_Z] % 3) // Z键设置弹速 // switch (rc_data[TEMP].key_count[KEY_PRESS][Key_Z] % 3) // Z键设置弹速//
// {
// case 0:
// shoot_cmd_send.bullet_speed = 15;
// break;
// case 1:
// shoot_cmd_send.bullet_speed = 18;
// break;
// default:
// shoot_cmd_send.bullet_speed = 30;
// break;
// }
switch (rc_data[TEMP].mouse.press_l) // 左键发射模式
{ {
case 0:
shoot_cmd_send.bullet_speed = 15;
break;
case 1:
shoot_cmd_send.bullet_speed = 18;
break;
default:
shoot_cmd_send.bullet_speed = 30;
break;
}
switch (rc_data[TEMP].key_count[KEY_PRESS][Key_E] % 4) // E键设置发射模式
{
case 0:
shoot_cmd_send.load_mode = LOAD_STOP;
break;
case 1: case 1:
shoot_cmd_send.load_mode = LOAD_1_BULLET; shoot_cmd_send.load_mode = LOAD_1_BULLET;
break; break;
case 2:
shoot_cmd_send.load_mode = LOAD_3_BULLET;
break;
default: default:
shoot_cmd_send.load_mode = LOAD_BURSTFIRE; shoot_cmd_send.load_mode = LOAD_STOP;
break; break;
} }
switch (rc_data[TEMP].key_count[KEY_PRESS][Key_R] % 2) // R键开关弹舱 switch (rc_data[TEMP].key_count[KEY_PRESS][Key_R] % 2) // R键开关弹舱
@ -349,7 +352,8 @@ void RobotCMDTask()
#endif // GIMBAL_BOARD #endif // GIMBAL_BOARD
SubGetMessage(shoot_feed_sub, &shoot_fetch_data); SubGetMessage(shoot_feed_sub, &shoot_fetch_data);
SubGetMessage(gimbal_feed_sub, &gimbal_fetch_data); SubGetMessage(gimbal_feed_sub, &gimbal_fetch_data);
//更新UI
update_ui_data();
// 根据gimbal的反馈值计算云台和底盘正方向的夹角,不需要传参,通过static私有变量完成 // 根据gimbal的反馈值计算云台和底盘正方向的夹角,不需要传参,通过static私有变量完成
CalcOffsetAngle(); CalcOffsetAngle();
// 根据遥控器左侧开关,确定当前使用的控制模式为遥控器调试还是键鼠 // 根据遥控器左侧开关,确定当前使用的控制模式为遥控器调试还是键鼠

View File

@ -168,5 +168,6 @@ void GimbalTask()
gimbal_feedback_data.yaw_motor_single_round_angle = yaw_motor->measure.angle_single_round; gimbal_feedback_data.yaw_motor_single_round_angle = yaw_motor->measure.angle_single_round;
gimbal_feedback_data.pitch_motor_total_angle = pitch_motor->measure.total_angle; gimbal_feedback_data.pitch_motor_total_angle = pitch_motor->measure.total_angle;
// 推送消息 // 推送消息
PubPushMessage(gimbal_pub, (void *)&gimbal_feedback_data); PubPushMessage(gimbal_pub, (void *)&gimbal_feedback_data);
} }

View File

@ -4,6 +4,7 @@
#include "dji_motor.h" #include "dji_motor.h"
#include "message_center.h" #include "message_center.h"
#include "bsp_dwt.h" #include "bsp_dwt.h"
#include "referee_task.h"
#include "general_def.h" #include "general_def.h"
@ -191,30 +192,9 @@ void ShootTask()
// 确定是否开启摩擦轮,后续可能修改为键鼠模式下始终开启摩擦轮(上场时建议一直开启) // 确定是否开启摩擦轮,后续可能修改为键鼠模式下始终开启摩擦轮(上场时建议一直开启)
if (shoot_cmd_recv.friction_mode == FRICTION_ON) if (shoot_cmd_recv.friction_mode == FRICTION_ON)
{ {
// 根据收到的弹速设置设定摩擦轮电机参考值,需实测后填入
switch (shoot_cmd_recv.bullet_speed)
{
case BIG_AMU_10:
DJIMotorSetRef(friction_l, 10);
DJIMotorSetRef(friction_r, 10);
DJIMotorSetRef(friction_z, 10);
break;
case BIG_AMU_16:
DJIMotorSetRef(friction_l, 16);
DJIMotorSetRef(friction_r, 16);
DJIMotorSetRef(friction_z, 16);
break;
case BULLET_SPEED_NONE:
DJIMotorSetRef(friction_l, 39000); DJIMotorSetRef(friction_l, 39000);
DJIMotorSetRef(friction_r, 39000); DJIMotorSetRef(friction_r, 39000);
DJIMotorSetRef(friction_z, 39000); DJIMotorSetRef(friction_z, 39000);
break;
default: // 当前为了调试设定的默认值4000,因为还没有加入裁判系统无法读取弹速.
DJIMotorSetRef(friction_l, 0);
DJIMotorSetRef(friction_r, 0);
DJIMotorSetRef(friction_z, 0);
break;
}
} }
else // 关闭摩擦轮 else // 关闭摩擦轮
{ {
@ -236,6 +216,7 @@ void ShootTask()
// 反馈数据,目前暂时没有要设定的反馈数据,后续可能增加应用离线监测以及卡弹反馈 // 反馈数据,目前暂时没有要设定的反馈数据,后续可能增加应用离线监测以及卡弹反馈
//推送消息 //推送消息
//ui_data.friction_mode = shoot_cmd_recv.friction_mode;
PubPushMessage(shoot_pub, (void *)&shoot_feedback_data); PubPushMessage(shoot_pub, (void *)&shoot_feedback_data);
} }

View File

@ -10,7 +10,7 @@
* @param[in] trajectory_cal: * @param[in] trajectory_cal:
* @retval * @retval
*/ */
void aim_armor_select(Aim_Select_Type_t *aim_sel, Trajectory_Type_t *trajectory_cal) { int aim_armor_select(Aim_Select_Type_t *aim_sel, Trajectory_Type_t *trajectory_cal) {
aim_sel->delay_time = trajectory_cal->fly_time + trajectory_cal->extra_delay_time; aim_sel->delay_time = trajectory_cal->fly_time + trajectory_cal->extra_delay_time;
aim_sel->target_state.yaw += aim_sel->target_state.v_yaw * aim_sel->delay_time; aim_sel->target_state.yaw += aim_sel->target_state.v_yaw * aim_sel->delay_time;
@ -190,9 +190,12 @@ void aim_armor_select(Aim_Select_Type_t *aim_sel, Trajectory_Type_t *trajectory_
} }
float r = use_1 ? aim_sel->target_state.r2 : aim_sel->target_state.r1; float r = use_1 ? aim_sel->target_state.r2 : aim_sel->target_state.r1;
aim_sel->aim_point[0] = aim_sel->armor_pose[idx].x * ((center_length - r)/center_length);
aim_sel->aim_point[1] = aim_sel->armor_pose[idx].y + ((center_length - r)/center_length); aim_sel->aim_point[0] = aim_sel->target_state.x * ((center_length - r) / center_length);
aim_sel->aim_point[2] = aim_sel->armor_pose[idx].z + ((center_length - r)/center_length); aim_sel->aim_point[1] = aim_sel->target_state.y * ((center_length - r) / center_length);
aim_sel->aim_point[2] = aim_sel->target_state.z * ((center_length - r) / center_length);
return idx;
} }
/** /**
@ -260,8 +263,8 @@ void get_cmd_angle(Trajectory_Type_t *trajectory_cal) {
trajectory_cal->cmd_pitch = trajectory_cal->theta_k; trajectory_cal->cmd_pitch = trajectory_cal->theta_k;
} }
void auto_aim(Aim_Select_Type_t *aim_sel, Trajectory_Type_t *trajectory_cal, RecievePacket_t *receive_packet) { 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.025f;//0.025
aim_sel->target_state.armor_type = receive_packet->id; aim_sel->target_state.armor_type = receive_packet->id;
aim_sel->target_state.armor_num = receive_packet->armors_num; aim_sel->target_state.armor_num = receive_packet->armors_num;
@ -277,7 +280,7 @@ void auto_aim(Aim_Select_Type_t *aim_sel, Trajectory_Type_t *trajectory_cal, Rec
aim_sel->target_state.r2 = receive_packet->r2; aim_sel->target_state.r2 = receive_packet->r2;
aim_sel->target_state.dz = receive_packet->dz; aim_sel->target_state.dz = receive_packet->dz;
aim_armor_select(aim_sel, trajectory_cal); int idx = aim_armor_select(aim_sel, trajectory_cal);
trajectory_cal->position_xy[0] = aim_sel->aim_point[0]; trajectory_cal->position_xy[0] = aim_sel->aim_point[0];
trajectory_cal->position_xy[1] = aim_sel->aim_point[1]; trajectory_cal->position_xy[1] = aim_sel->aim_point[1];
@ -287,5 +290,5 @@ void auto_aim(Aim_Select_Type_t *aim_sel, Trajectory_Type_t *trajectory_cal, Rec
trajectory_cal->velocity[2] = aim_sel->target_state.vz; trajectory_cal->velocity[2] = aim_sel->target_state.vz;
get_cmd_angle(trajectory_cal); get_cmd_angle(trajectory_cal);
return idx;
} }

View File

@ -69,9 +69,9 @@ typedef struct
}Aim_Select_Type_t; }Aim_Select_Type_t;
void aim_armor_select(Aim_Select_Type_t *aim_sel, Trajectory_Type_t *trajectory_cal); int aim_armor_select(Aim_Select_Type_t *aim_sel, Trajectory_Type_t *trajectory_cal);
float get_fly_time(float x, float vx, float v_x0); float get_fly_time(float x, float vx, float v_x0);
void get_cmd_angle(Trajectory_Type_t *trajectory_cal); void get_cmd_angle(Trajectory_Type_t *trajectory_cal);
void auto_aim(Aim_Select_Type_t *aim_sel,Trajectory_Type_t *trajectory_cal,RecievePacket_t *receive_packet); int auto_aim(Aim_Select_Type_t *aim_sel,Trajectory_Type_t *trajectory_cal,RecievePacket_t *receive_packet);
#endif //BASIC_FRAMEWORK_AUTO_AIM_H #endif //BASIC_FRAMEWORK_AUTO_AIM_H

View File

@ -172,7 +172,7 @@ void VisionSend()
send_data.header = 0x5A; send_data.header = 0x5A;
// VisionSetFlag(1); // VisionSetFlag(1);
VisionSetAim(recv_data.x,recv_data.y,recv_data.z); //VisionSetAim(recv_data.x,recv_data.y,recv_data.z);
send_data.checksum = crc_16(&send_data.header,sizeof(send_data)-2); send_data.checksum = crc_16(&send_data.header,sizeof(send_data)-2);
memcpy(send_buffer,&send_data,sizeof(send_data)); memcpy(send_buffer,&send_data,sizeof(send_data));

View File

@ -16,8 +16,8 @@
/****************************宏定义部分****************************/ /****************************宏定义部分****************************/
#define REFEREE_SOF 0xA5 // 起始字节,协议固定为0xA5 #define REFEREE_SOF 0xA5 // 起始字节,协议固定为0xA5
#define Robot_Red 1 #define Robot_Red 0
#define Robot_Blue 0 #define Robot_Blue 1
#define Communicate_Data_LEN 5 // 自定义交互数据长度,该长度决定了我方发送和他方接收,自定义交互数据协议更改时只需要更改此宏定义即可 #define Communicate_Data_LEN 5 // 自定义交互数据长度,该长度决定了我方发送和他方接收,自定义交互数据协议更改时只需要更改此宏定义即可
#pragma pack(1) #pragma pack(1)

View File

@ -14,7 +14,7 @@
#include "referee_UI.h" #include "referee_UI.h"
#include "string.h" #include "string.h"
#include "cmsis_os.h" #include "cmsis_os.h"
Referee_Interactive_info_t ui_data;
static Referee_Interactive_info_t *Interactive_data; // UI绘制需要的机器人状态数据 static Referee_Interactive_info_t *Interactive_data; // UI绘制需要的机器人状态数据
static referee_info_t *referee_recv_info; // 接收到的裁判系统数据 static referee_info_t *referee_recv_info; // 接收到的裁判系统数据
uint8_t UI_Seq; // 包序号供整个referee文件使用 uint8_t UI_Seq; // 包序号供整个referee文件使用
@ -49,8 +49,9 @@ referee_info_t *UITaskInit(UART_HandleTypeDef *referee_usart_handle, Referee_Int
void UITask() void UITask()
{ {
RobotModeTest(Interactive_data); // 测试用函数,实现模式自动变化,用于检查该任务和裁判系统是否连接正常 // RobotModeTest(Interactive_data); // 测试用函数,实现模式自动变化,用于检查该任务和裁判系统是否连接正常
MyUIRefresh(referee_recv_info, Interactive_data); MyUIRefresh(referee_recv_info, Interactive_data);
} }
static Graph_Data_t UI_shoot_line[10]; // 射击准线 static Graph_Data_t UI_shoot_line[10]; // 射击准线

View File

@ -8,6 +8,7 @@
* @brief (UI和多机通信) * @brief (UI和多机通信)
* *
*/ */
extern Referee_Interactive_info_t ui_data; // UI数据将底盘中的数据传入此结构体的对应变量中UI会自动检测是否变化对应显示UI
referee_info_t *UITaskInit(UART_HandleTypeDef *referee_usart_handle, Referee_Interactive_info_t *UI_data); referee_info_t *UITaskInit(UART_HandleTypeDef *referee_usart_handle, Referee_Interactive_info_t *UI_data);
/** /**