赛场_v1.2

This commit is contained in:
guoxy06
2026-04-03 05:06:57 +08:00
parent 99bfe7cec7
commit 3d7a4592c4
6 changed files with 39 additions and 29 deletions

View File

@@ -440,6 +440,9 @@ void ChassisTask()
// 根据电机的反馈速度和IMU(如果有)计算真实速度 // 根据电机的反馈速度和IMU(如果有)计算真实速度
EstimateSpeed(); EstimateSpeed();
// 将robot_level传递给UI数据
ui_data.robot_level = chassis_cmd_recv.robot_level;
// // 获取裁判系统数据 建议将裁判系统与底盘分离,所以此处数据应使用消息中心发送 // // 获取裁判系统数据 建议将裁判系统与底盘分离,所以此处数据应使用消息中心发送
// // 我方颜色id小于7是红色,大于7是蓝色,注意这里发送的是对方的颜色, 0:blue , 1:red // // 我方颜色id小于7是红色,大于7是蓝色,注意这里发送的是对方的颜色, 0:blue , 1:red
// chassis_feedback_data.enemy_color = referee_data->GameRobotState.robot_id > 7 ? 1 : 0; // chassis_feedback_data.enemy_color = referee_data->GameRobotState.robot_id > 7 ? 1 : 0;
@@ -454,4 +457,4 @@ void ChassisTask()
#ifdef CHASSIS_BOARD #ifdef CHASSIS_BOARD
CANCommSend(chasiss_can_comm, (void *)&chassis_feedback_data); CANCommSend(chasiss_can_comm, (void *)&chassis_feedback_data);
#endif // CHASSIS_BOARD #endif // CHASSIS_BOARD
} }

View File

@@ -8,6 +8,7 @@
#include "message_center.h" #include "message_center.h"
#include "general_def.h" #include "general_def.h"
#include "dji_motor.h" #include "dji_motor.h"
#include "referee_task.h"
// bsp // bsp
#include "bsp_dwt.h" #include "bsp_dwt.h"
#include "bsp_log.h" #include "bsp_log.h"
@@ -255,6 +256,15 @@ static void MouseKeySet()
rc_data[TEMP].key_count[KEY_PRESS][Key_G] = 0; // 清除计数器,防止重复执行 rc_data[TEMP].key_count[KEY_PRESS][Key_G] = 0; // 清除计数器,防止重复执行
} }
// B键刷新裁判系统UI
if (rc_data[TEMP].key[KEY_PRESS].b && rc_data[TEMP].key_count[KEY_PRESS][Key_B] > 0) {
MyUIInit(); // 重新初始化UI
rc_data[TEMP].key_count[KEY_PRESS][Key_B] = 0; // 清除计数器,防止重复执行
}
// 将robot_level传递给底盘控制命令
chassis_cmd_send.robot_level = robot_level;
switch (robot_level) switch (robot_level)
{ {
case 1: case 1:

View File

@@ -85,7 +85,7 @@ void GimbalInit()
// }, // },
.controller_param_init_config = { .controller_param_init_config = {
.angle_PID = { .angle_PID = {
.Kp = 0.75, //0.55 .Kp = 1.00, //0.90
.Ki = 0.05,//0.05 .Ki = 0.05,//0.05
.Kd = 0.02,//0.02 .Kd = 0.02,//0.02
.CoefA =0.5,//0.5 .CoefA =0.5,//0.5

View File

@@ -154,7 +154,7 @@ typedef struct
chassis_mode_e chassis_mode; chassis_mode_e chassis_mode;
int chassis_speed_buff; int chassis_speed_buff;
// UI部分 // UI部分
// ... uint8_t robot_level; // 机器人等级
} Chassis_Ctrl_Cmd_s; } Chassis_Ctrl_Cmd_s;

View File

@@ -57,7 +57,7 @@ static Graph_Data_t UI_shoot_line[10]; // 射击准线
static Graph_Data_t UI_Energy[3]; // 电容能量条 static Graph_Data_t UI_Energy[3]; // 电容能量条
static String_Data_t UI_State_sta[6]; // 机器人状态,静态只需画一次 static String_Data_t UI_State_sta[6]; // 机器人状态,静态只需画一次
static String_Data_t UI_State_dyn[6]; // 机器人状态,动态先add才能change static String_Data_t UI_State_dyn[6]; // 机器人状态,动态先add才能change
static uint32_t shoot_line_location[10] = {540, 960, 490, 515, 565}; static uint32_t shoot_line_location[10] = {525, 950, 490, 515, 565};
void MyUIInit() void MyUIInit()
{ {
@@ -73,12 +73,12 @@ void MyUIInit()
UILineDraw(&UI_shoot_line[0], "sl0", UI_Graph_ADD, 7, UI_Color_White, 3, 710, shoot_line_location[0], 1210, shoot_line_location[0]); UILineDraw(&UI_shoot_line[0], "sl0", UI_Graph_ADD, 7, UI_Color_White, 3, 710, shoot_line_location[0], 1210, shoot_line_location[0]);
UILineDraw(&UI_shoot_line[1], "sl1", UI_Graph_ADD, 7, UI_Color_White, 3, shoot_line_location[1], 340, shoot_line_location[1], 740); UILineDraw(&UI_shoot_line[1], "sl1", UI_Graph_ADD, 7, UI_Color_White, 3, shoot_line_location[1], 340, shoot_line_location[1], 740);
UILineDraw(&UI_shoot_line[2], "sl2", UI_Graph_ADD, 7, UI_Color_Yellow, 2, 810, shoot_line_location[2], 1110, shoot_line_location[2]); UILineDraw(&UI_shoot_line[2], "sl2", UI_Graph_ADD, 7, UI_Color_Yellow, 2, 810, shoot_line_location[2], 1110, shoot_line_location[2]);
UILineDraw(&UI_shoot_line[3], "sl3", UI_Graph_ADD, 7, UI_Color_Yellow, 2, 810, shoot_line_location[3], 1110, shoot_line_location[3]); UILineDraw(&UI_shoot_line[3], "sl3", UI_Graph_ADD, 7, UI_Color_Yellow, 2, 860, 475, 1060, 475);
UILineDraw(&UI_shoot_line[4], "sl4", UI_Graph_ADD, 7, UI_Color_Yellow, 2, 810, shoot_line_location[4], 1110, shoot_line_location[4]); UILineDraw(&UI_shoot_line[4], "sl4", UI_Graph_ADD, 7, UI_Color_Yellow, 2, 810, shoot_line_location[4], 1110, shoot_line_location[4]);
UIGraphRefresh(&referee_recv_info->referee_id, 5, UI_shoot_line[0], UI_shoot_line[1], UI_shoot_line[2], UI_shoot_line[3], UI_shoot_line[4]); UIGraphRefresh(&referee_recv_info->referee_id, 5, UI_shoot_line[0], UI_shoot_line[1], UI_shoot_line[2], UI_shoot_line[3], UI_shoot_line[4]);
// 绘制车辆状态标志指示 // 绘制车辆状态标志指示
UICharDraw(&UI_State_sta[0], "ss0", UI_Graph_ADD, 8, UI_Color_Main, 15, 2, 150, 750, "chassis:"); UICharDraw(&UI_State_sta[0], "ss0", UI_Graph_ADD, 8, UI_Color_Main, 15, 2, 150, 750, "level:");
UICharRefresh(&referee_recv_info->referee_id, UI_State_sta[0]); UICharRefresh(&referee_recv_info->referee_id, UI_State_sta[0]);
UICharDraw(&UI_State_sta[1], "ss1", UI_Graph_ADD, 8, UI_Color_Yellow, 15, 2, 150, 700, "gimbal:"); UICharDraw(&UI_State_sta[1], "ss1", UI_Graph_ADD, 8, UI_Color_Yellow, 15, 2, 150, 700, "gimbal:");
UICharRefresh(&referee_recv_info->referee_id, UI_State_sta[1]); UICharRefresh(&referee_recv_info->referee_id, UI_State_sta[1]);
@@ -91,7 +91,7 @@ void MyUIInit()
// 绘制车辆状态标志,动态 // 绘制车辆状态标志,动态
// 由于初始化时xxx_last_mode默认为0,所以此处对应UI也应该设为0时对应的UI,防止模式不变的情况下无法置位flag,导致UI无法刷新 // 由于初始化时xxx_last_mode默认为0,所以此处对应UI也应该设为0时对应的UI,防止模式不变的情况下无法置位flag,导致UI无法刷新
UICharDraw(&UI_State_dyn[0], "sd0", UI_Graph_ADD, 8, UI_Color_Main, 15, 2, 270, 750, "zeroforce"); UICharDraw(&UI_State_dyn[0], "sd0", UI_Graph_ADD, 8, UI_Color_Main, 15, 2, 270, 750, "1");
UICharRefresh(&referee_recv_info->referee_id, UI_State_dyn[0]); UICharRefresh(&referee_recv_info->referee_id, UI_State_dyn[0]);
UICharDraw(&UI_State_dyn[1], "sd1", UI_Graph_ADD, 8, UI_Color_Yellow, 15, 2, 270, 700, "zeroforce"); UICharDraw(&UI_State_dyn[1], "sd1", UI_Graph_ADD, 8, UI_Color_Yellow, 15, 2, 270, 700, "zeroforce");
UICharRefresh(&referee_recv_info->referee_id, UI_State_dyn[1]); UICharRefresh(&referee_recv_info->referee_id, UI_State_dyn[1]);
@@ -116,7 +116,7 @@ void MyUIInit()
UIGraphRefresh(&referee_recv_info->referee_id, 2, UI_Energy[1], UI_Energy[2]); UIGraphRefresh(&referee_recv_info->referee_id, 2, UI_Energy[1], UI_Energy[2]);
} }
// 测试用函数,实现模式自动变化,用于检查该任务和裁判系统是否连接正常 // 测试用函数,实现模式自动变化,用于检查该任务和裁判系统是否连接正常.
static uint8_t count = 0; static uint8_t count = 0;
static uint16_t count1 = 0; static uint16_t count1 = 0;
static void RobotModeTest(Referee_Interactive_info_t *_Interactive_data) // 测试用函数,实现模式自动变化 static void RobotModeTest(Referee_Interactive_info_t *_Interactive_data) // 测试用函数,实现模式自动变化
@@ -176,27 +176,15 @@ static void RobotModeTest(Referee_Interactive_info_t *_Interactive_data) // 测
static void MyUIRefresh(referee_info_t *referee_recv_info, Referee_Interactive_info_t *_Interactive_data) static void MyUIRefresh(referee_info_t *referee_recv_info, Referee_Interactive_info_t *_Interactive_data)
{ {
UIChangeCheck(_Interactive_data); UIChangeCheck(_Interactive_data);
// chassis // robot level
if (_Interactive_data->Referee_Interactive_Flag.chassis_flag == 1) if (_Interactive_data->Referee_Interactive_Flag.robot_level_flag == 1)
{ {
switch (_Interactive_data->chassis_mode) char level_str[2];
{ level_str[0] = '0' + _Interactive_data->robot_level;
case CHASSIS_ZERO_FORCE: level_str[1] = '\0';
UICharDraw(&UI_State_dyn[0], "sd0", UI_Graph_Change, 8, UI_Color_Main, 15, 2, 270, 750, "zeroforce"); UICharDraw(&UI_State_dyn[0], "sd0", UI_Graph_Change, 8, UI_Color_Main, 15, 2, 270, 750, level_str);
break;
case CHASSIS_ROTATE:
UICharDraw(&UI_State_dyn[0], "sd0", UI_Graph_Change, 8, UI_Color_Main, 15, 2, 270, 750, "rotate ");
// 此处注意字数对齐问题,字数相同才能覆盖掉
break;
case CHASSIS_NO_FOLLOW:
UICharDraw(&UI_State_dyn[0], "sd0", UI_Graph_Change, 8, UI_Color_Main, 15, 2, 270, 750, "nofollow ");
break;
case CHASSIS_FOLLOW_GIMBAL_YAW:
UICharDraw(&UI_State_dyn[0], "sd0", UI_Graph_Change, 8, UI_Color_Main, 15, 2, 270, 750, "follow ");
break;
}
UICharRefresh(&referee_recv_info->referee_id, UI_State_dyn[0]); UICharRefresh(&referee_recv_info->referee_id, UI_State_dyn[0]);
_Interactive_data->Referee_Interactive_Flag.chassis_flag = 0; _Interactive_data->Referee_Interactive_Flag.robot_level_flag = 0;
} }
// gimbal // gimbal
if (_Interactive_data->Referee_Interactive_Flag.gimbal_flag == 1) if (_Interactive_data->Referee_Interactive_Flag.gimbal_flag == 1)
@@ -261,6 +249,12 @@ static void MyUIRefresh(referee_info_t *referee_recv_info, Referee_Interactive_i
*/ */
static void UIChangeCheck(Referee_Interactive_info_t *_Interactive_data) static void UIChangeCheck(Referee_Interactive_info_t *_Interactive_data)
{ {
if (_Interactive_data->robot_level != _Interactive_data->robot_last_level)
{
_Interactive_data->Referee_Interactive_Flag.robot_level_flag = 1;
_Interactive_data->robot_last_level = _Interactive_data->robot_level;
}
if (_Interactive_data->chassis_mode != _Interactive_data->chassis_last_mode) if (_Interactive_data->chassis_mode != _Interactive_data->chassis_last_mode)
{ {
_Interactive_data->Referee_Interactive_Flag.chassis_flag = 1; _Interactive_data->Referee_Interactive_Flag.chassis_flag = 1;
@@ -296,4 +290,4 @@ static void UIChangeCheck(Referee_Interactive_info_t *_Interactive_data)
_Interactive_data->Referee_Interactive_Flag.Power_flag = 1; _Interactive_data->Referee_Interactive_Flag.Power_flag = 1;
_Interactive_data->Chassis_last_Power_Data.chassis_power_mx = _Interactive_data->Chassis_Power_Data.chassis_power_mx; _Interactive_data->Chassis_last_Power_Data.chassis_power_mx = _Interactive_data->Chassis_Power_Data.chassis_power_mx;
} }
} }

View File

@@ -54,6 +54,7 @@ typedef struct
uint32_t lid_flag : 1; uint32_t lid_flag : 1;
uint32_t friction_flag : 1; uint32_t friction_flag : 1;
uint32_t Power_flag : 1; uint32_t Power_flag : 1;
uint32_t robot_level_flag : 1;
} Referee_Interactive_Flag_t; } Referee_Interactive_Flag_t;
// 此结构体包含UI绘制与机器人车间通信的需要的其他非裁判系统数据 // 此结构体包含UI绘制与机器人车间通信的需要的其他非裁判系统数据
@@ -61,6 +62,7 @@ typedef struct
{ {
Referee_Interactive_Flag_t Referee_Interactive_Flag; Referee_Interactive_Flag_t Referee_Interactive_Flag;
// 为UI绘制以及交互数据所用 // 为UI绘制以及交互数据所用
uint8_t robot_level; // 机器人等级
chassis_mode_e chassis_mode; // 底盘模式 chassis_mode_e chassis_mode; // 底盘模式
gimbal_mode_e gimbal_mode; // 云台模式 gimbal_mode_e gimbal_mode; // 云台模式
shoot_mode_e shoot_mode; // 发射模式设置 shoot_mode_e shoot_mode; // 发射模式设置
@@ -69,6 +71,7 @@ typedef struct
Chassis_Power_Data_s Chassis_Power_Data; // 功率控制 Chassis_Power_Data_s Chassis_Power_Data; // 功率控制
// 上一次的模式,用于flag判断 // 上一次的模式,用于flag判断
uint8_t robot_last_level;
chassis_mode_e chassis_last_mode; chassis_mode_e chassis_last_mode;
gimbal_mode_e gimbal_last_mode; gimbal_mode_e gimbal_last_mode;
shoot_mode_e shoot_last_mode; shoot_mode_e shoot_last_mode;
@@ -97,4 +100,4 @@ referee_info_t *RefereeInit(UART_HandleTypeDef *referee_usart_handle);
*/ */
void RefereeSend(uint8_t *send, uint16_t tx_len); void RefereeSend(uint8_t *send, uint16_t tx_len);
#endif // !REFEREE_H #endif // !REFEREE_H