This commit is contained in:
Robofish 2025-10-19 20:22:55 +08:00
parent 10ca460ebf
commit 6d9e2a184d
6 changed files with 111 additions and 23 deletions

View File

@ -5,10 +5,12 @@ AI
/* Includes ----------------------------------------------------------------- */ /* Includes ----------------------------------------------------------------- */
#include "ai.h" #include "ai.h"
#include <stdbool.h>
#include <string.h> #include <string.h>
#include "bsp/time.h" #include "bsp/time.h"
#include "bsp/uart.h" #include "bsp/uart.h"
#include "component/ahrs.h"
#include "component/crc16.h" #include "component/crc16.h"
#include "component/crc8.h" #include "component/crc8.h"
#include "component/user_math.h" #include "component/user_math.h"
@ -64,14 +66,16 @@ int8_t AI_Restart(AI_t *ai) {
int8_t AI_StartReceiving(AI_t *ai) { int8_t AI_StartReceiving(AI_t *ai) {
UNUSED(ai); UNUSED(ai);
if (HAL_UART_Receive_DMA(BSP_UART_GetHandle(BSP_UART_AI), rxbuf, // if (HAL_UART_Receive_DMA(BSP_UART_GetHandle(BSP_UART_AI), rxbuf,
AI_LEN_RX_BUFF) == HAL_OK) // AI_LEN_RX_BUFF) == HAL_OK)
if (BSP_UART_Receive(BSP_UART_AI, rxbuf,
AI_LEN_RX_BUFF, true) == HAL_OK)
return DEVICE_OK; return DEVICE_OK;
return DEVICE_ERR; return DEVICE_ERR;
} }
bool AI_WaitDmaCplt(uint32_t timeout) { bool AI_WaitDmaCplt(void) {
return (osThreadFlagsWait(SIGNAL_AI_RAW_REDY, osFlagsWaitAll, timeout) == return (osThreadFlagsWait(SIGNAL_AI_RAW_REDY, osFlagsWaitAll,0) ==
SIGNAL_AI_RAW_REDY); SIGNAL_AI_RAW_REDY);
} }
@ -89,18 +93,47 @@ error:
return DEVICE_ERR; return DEVICE_ERR;
} }
// int8_t AI_PackMCU(AI_t *ai, const AI_Protucol_UpDataMCU_t *data){ int8_t AI_PackMCU(AI_t *ai, const AHRS_Quaternion_t *data){
// if (ai == NULL || data == NULL) return DEVICE_ERR_NULL; if (ai == NULL || data == NULL) return DEVICE_ERR_NULL;
// ai->to_host.mcu.id = AI_ID_MCU; ai->to_host.mcu.id = AI_ID_MCU;
// ai->to_host.mcu.package = *data; ai->to_host.mcu.package.quat=*data;
// ai->to_host.mcu.crc16 = ai->to_host.mcu.package.notice = ai->status;
// CRC16_Calc((const uint8_t *)&(ai->to_host.mcu), sizeof(AI_UpPackageMCU_t) - 2); ai->to_host.mcu.crc16 = CRC16_Calc((const uint8_t *)&(ai->to_host.mcu), sizeof(AI_UpPackageMCU_t) - 2, CRC16_INIT);
// return DEVICE_OK; return DEVICE_OK;
// } }
int8_t AI_PackRef(AI_t *ai, const AI_UpPackageReferee_t *data); int8_t AI_PackRef(AI_t *ai, const AI_UpPackageReferee_t *data) {
if (ai == NULL || data == NULL) return DEVICE_ERR_NULL;
ai->to_host.ref = *data;
return DEVICE_OK;
}
int8_t AI_HandleOffline(AI_t *ai); int8_t AI_HandleOffline(AI_t *ai) {
if (ai == NULL) return DEVICE_ERR_NULL;
if (BSP_TIME_Get() - ai->header.last_online_time >
100000) {
ai->header.online = false;
}
return DEVICE_OK;
}
int8_t AI_StartSend(AI_t *ai, bool ref_online); int8_t AI_StartSend(AI_t *ai, bool ref_online){
if (ai == NULL) return DEVICE_ERR_NULL;
if (ref_online) {
// 发送裁判系统数据和MCU数据
if (BSP_UART_Transmit(BSP_UART_AI, (uint8_t *)&(ai->to_host),
sizeof(ai->to_host.ref) + sizeof(ai->to_host.mcu), true) == HAL_OK)
return DEVICE_OK;
else
return DEVICE_ERR;
} else {
// 只发送MCU数据
if (BSP_UART_Transmit(BSP_UART_AI, (uint8_t *)&(ai->to_host.mcu),
sizeof(ai->to_host.mcu), true) == HAL_OK)
return DEVICE_OK;
else
return DEVICE_ERR;
}
}

View File

@ -25,10 +25,39 @@ extern "C" {
#define AI_ID_AI (0xA1) #define AI_ID_AI (0xA1)
/* Exported types ----------------------------------------------------------- */ /* Exported types ----------------------------------------------------------- */
typedef enum {
AI_ARMOR_HERO = 0, /*英雄机器人*/
AI_ARMOR_INFANTRY, /*步兵机器人*/
AI_ARMOR_SENTRY, /*哨兵机器人*/
AI_ARMOR_ENGINEER, /*工程机器人*/
AI_ARMOR_OUTPOST, /*前哨占*/
AI_ARMOR_BASE, /*基地*/
AI_ARMOR_NORMAL, /*由AI自动选择*/
} AI_ArmorsType_t;
typedef enum {
AI_STATUS_OFF = 0, /* 关闭 */
AI_STATUS_AUTOAIM, /* 自瞄 */
AI_STATUS_AUTOPICK, /* 自动取矿 */
AI_STATUS_AUTOPUT, /* 自动兑矿 */
AI_STATUS_AUTOHITBUFF, /* 自动打符 */
AI_STATUS_AUTONAV,
} AI_Status_t;
typedef enum {
AI_NOTICE_NONE = 0,
AI_NOTICE_SEARCH,
AI_NOTICE_FIRE,
}AI_Notice_t;
/* 电控 -> 视觉 MCU数据结构体*/ /* 电控 -> 视觉 MCU数据结构体*/
typedef struct __packed { typedef struct __packed {
AHRS_Quaternion_t quat; /* 四元数 */ AHRS_Quaternion_t quat; /* 四元数 */
uint8_t notice; /* 控制命令 */ // struct {
// AI_ArmorsType_t armor_type;
// AI_Status_t status;
// }notice; /* 控制命令 */
uint8_t notice;
} AI_Protucol_UpDataMCU_t; } AI_Protucol_UpDataMCU_t;
/* 电控 -> 视觉 裁判系统数据结构体*/ /* 电控 -> 视觉 裁判系统数据结构体*/
@ -37,7 +66,7 @@ typedef struct __packed {
uint16_t time; /* 比赛开始时间 */ uint16_t time; /* 比赛开始时间 */
} AI_Protocol_UpDataReferee_t; } AI_Protocol_UpDataReferee_t;
/* 电控 -> 视觉 数据包结构体*/ /* 视觉 -> 电控 数据包结构体*/
typedef struct __packed { typedef struct __packed {
AHRS_Eulr_t eulr; /* 欧拉角 */ AHRS_Eulr_t eulr; /* 欧拉角 */
MoveVector_t move_vec; /* 运动向量 */ MoveVector_t move_vec; /* 运动向量 */
@ -68,6 +97,7 @@ typedef struct __packed {
typedef struct __packed { typedef struct __packed {
DEVICE_Header_t header; /* 设备通用头部 */ DEVICE_Header_t header; /* 设备通用头部 */
AI_DownPackage_t from_host; AI_DownPackage_t from_host;
AI_Status_t status;
struct { struct {
AI_UpPackageReferee_t ref; AI_UpPackageReferee_t ref;
AI_UpPackageMCU_t mcu; AI_UpPackageMCU_t mcu;
@ -82,11 +112,11 @@ int8_t AI_Restart(AI_t *ai);
int8_t AI_StartReceiving(AI_t *ai); int8_t AI_StartReceiving(AI_t *ai);
bool AI_WaitDmaCplt(uint32_t timeout); bool AI_WaitDmaCplt(void);
int8_t AI_ParseHost(AI_t *ai); int8_t AI_ParseHost(AI_t *ai);
int8_t AI_PackMCU(AI_t *ai, const AI_Protucol_UpDataMCU_t *data); int8_t AI_PackMCU(AI_t *ai, const AHRS_Quaternion_t *quat);
int8_t AI_PackRef(AI_t *ai, const AI_UpPackageReferee_t *data); int8_t AI_PackRef(AI_t *ai, const AI_UpPackageReferee_t *data);
@ -94,7 +124,6 @@ int8_t AI_HandleOffline(AI_t *ai);
int8_t AI_StartSend(AI_t *ai, bool ref_online); int8_t AI_StartSend(AI_t *ai, bool ref_online);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -4,9 +4,12 @@
*/ */
/* Includes ----------------------------------------------------------------- */ /* Includes ----------------------------------------------------------------- */
#include "cmsis_os2.h"
#include "task/user_task.h" #include "task/user_task.h"
/* USER INCLUDE BEGIN */ /* USER INCLUDE BEGIN */
#include "device/ai.h"
#include "component/ahrs.h"
#include <stdbool.h>
/* USER INCLUDE END */ /* USER INCLUDE END */
/* Private typedef ---------------------------------------------------------- */ /* Private typedef ---------------------------------------------------------- */
@ -14,7 +17,8 @@
/* Private macro ------------------------------------------------------------ */ /* Private macro ------------------------------------------------------------ */
/* Private variables -------------------------------------------------------- */ /* Private variables -------------------------------------------------------- */
/* USER STRUCT BEGIN */ /* USER STRUCT BEGIN */
AI_t ai;
AHRS_Quaternion_t quat;
/* USER STRUCT END */ /* USER STRUCT END */
/* Private function --------------------------------------------------------- */ /* Private function --------------------------------------------------------- */
@ -30,12 +34,23 @@ void Task_ai(void *argument) {
uint32_t tick = osKernelGetTickCount(); /* 控制任务运行频率的计时 */ uint32_t tick = osKernelGetTickCount(); /* 控制任务运行频率的计时 */
/* USER CODE INIT BEGIN */ /* USER CODE INIT BEGIN */
AI_Init(&ai);
/* USER CODE INIT END */ /* USER CODE INIT END */
while (1) { while (1) {
tick += delay_tick; /* 计算下一个唤醒时刻 */ tick += delay_tick; /* 计算下一个唤醒时刻 */
/* USER CODE BEGIN */ /* USER CODE BEGIN */
AI_StartReceiving(&ai);
if (AI_WaitDmaCplt()) {
AI_ParseHost(&ai);
} else {
AI_HandleOffline(&ai);
}
if (osMessageQueueGet(task_runtime.msgq.ai.quat, &quat, NULL, 0) == osOK) {
AI_PackMCU(&ai, &quat);
}
AI_StartSend(&ai, false);
/* USER CODE END */ /* USER CODE END */
osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */ osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */

View File

@ -4,6 +4,7 @@
*/ */
/* Includes ----------------------------------------------------------------- */ /* Includes ----------------------------------------------------------------- */
#include "cmsis_os2.h"
#include "task/user_task.h" #include "task/user_task.h"
/* USER INCLUDE BEGIN */ /* USER INCLUDE BEGIN */
#include "bsp/mm.h" #include "bsp/mm.h"
@ -154,6 +155,8 @@ void Task_atti_esti(void *argument) {
osMessageQueueReset(task_runtime.msgq.gimbal.imu); osMessageQueueReset(task_runtime.msgq.gimbal.imu);
osMessageQueuePut(task_runtime.msgq.gimbal.imu, &gimbal_to_send, 0, 0); osMessageQueuePut(task_runtime.msgq.gimbal.imu, &gimbal_to_send, 0, 0);
osMessageQueuePut(task_runtime.msgq.ai.quat, &gimbal_ahrs.quat, 0, 0);
BSP_PWM_SetComp(BSP_PWM_IMU_HEAT_PWM, PID_Calc(&imu_temp_ctrl_pid, 40.0f, bmi088.temp, 0.0f, 0.0f)); BSP_PWM_SetComp(BSP_PWM_IMU_HEAT_PWM, PID_Calc(&imu_temp_ctrl_pid, 40.0f, bmi088.temp, 0.0f, 0.0f));
/* USER CODE END */ /* USER CODE END */

View File

@ -52,6 +52,8 @@ void Task_Init(void *argument) {
task_runtime.msgq.gimbal.imu= osMessageQueueNew(2u, sizeof(Gimbal_IMU_t), NULL); task_runtime.msgq.gimbal.imu= osMessageQueueNew(2u, sizeof(Gimbal_IMU_t), NULL);
task_runtime.msgq.gimbal.cmd= osMessageQueueNew(2u, sizeof(Gimbal_CMD_t), NULL); task_runtime.msgq.gimbal.cmd= osMessageQueueNew(2u, sizeof(Gimbal_CMD_t), NULL);
task_runtime.msgq.shoot.shoot_cmd = osMessageQueueNew(2u, sizeof(Shoot_CMD_t), NULL); task_runtime.msgq.shoot.shoot_cmd = osMessageQueueNew(2u, sizeof(Shoot_CMD_t), NULL);
task_runtime.msgq.ai.quat = osMessageQueueNew(2u, sizeof(AHRS_Quaternion_t), NULL);
task_runtime.msgq.ai.move_vec = osMessageQueueNew(2u, sizeof(MoveVector_t), NULL);
/* USER MESSAGE END */ /* USER MESSAGE END */
osKernelUnlock(); // 解锁内核 osKernelUnlock(); // 解锁内核

View File

@ -75,6 +75,12 @@ typedef struct {
osMessageQueueId_t ref; osMessageQueueId_t ref;
osMessageQueueId_t ai; osMessageQueueId_t ai;
}cmd; }cmd;
struct {
osMessageQueueId_t quat;
osMessageQueueId_t move_vec;
osMessageQueueId_t eulr;
osMessageQueueId_t fire;
}ai;
} msgq; } msgq;
/* USER MESSAGE END */ /* USER MESSAGE END */