RMUL2025/User/task/ctrl_gimbal.c
2025-03-09 18:01:50 +08:00

89 lines
3.2 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
云台控制任务
控制云台行为。
从CAN总线接收底盘电机反馈从IMU接收欧拉角和角速度
根据接收到的控制命令,控制电机输出。
*/
/* Includes ----------------------------------------------------------------- */
#include "module\gimbal.h"
#include "task\user_task.h"
/* Private typedef ---------------------------------------------------------- */
/* Private define ----------------------------------------------------------- */
/* Private macro ------------------------------------------------------------ */
/* Private variables -------------------------------------------------------- */
static CAN_t can;
#ifdef DEBUG
CMD_GimbalCmd_t gimbal_cmd;
Gimbal_t gimbal;
CAN_GimbalOutput_t gimbal_out;
Referee_GimbalUI_t gimbal_ui;
AHRS_Eulr_t gimbal_for_ai;
#else
static CMD_GimbalCmd_t gimbal_cmd;
static Gimbal_t gimbal;
static CAN_GimbalOutput_t gimbal_out;
static Referee_GimbalUI_t gimbal_ui;
static AHRS_Eulr_t gimbal_for_ai;
#endif
/* Private function --------------------------------------------------------- */
/* Exported functions ------------------------------------------------------- */
/**
* \brief 控制云台
*
* \param argument 未使用
*/
void Task_CtrlGimbal(void *argument) {
(void)argument; /* 未使用argument消除警告 */
const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_CTRL_GIMBAL;
/* 初始化云台 */
Gimbal_Init(&gimbal, &(task_runtime.cfg.robot_param->gimbal),
task_runtime.cfg.gimbal_limit, (float)TASK_FREQ_CTRL_GIMBAL);
/* 延时一段时间再开启任务 */
osMessageQueueGet(task_runtime.msgq.can.feedback.gimbal, &can, NULL,
osWaitForever);
uint32_t tick = osKernelGetTickCount(); /* 控制任务运行频率的计时 */
while (1) {
#ifdef DEBUG
/* 记录任务所使用的的栈空间 */
task_runtime.stack_water_mark.ctrl_gimbal =
osThreadGetStackSpace(osThreadGetId());
#endif
osMessageQueueGet(task_runtime.msgq.can.feedback.gimbal, &can, NULL, 0);
/* 读取控制指令、姿态、IMU数据 */
osMessageQueueGet(task_runtime.msgq.gimbal.eulr_imu,
&(gimbal.feedback.eulr.imu), NULL, 0);
osMessageQueueGet(task_runtime.msgq.gimbal.gyro, &(gimbal.feedback.gyro),
NULL, 0);
osMessageQueueGet(task_runtime.msgq.cmd.gimbal, &gimbal_cmd, NULL, 0);
osKernelLock(); /* 锁住RTOS内核防止控制过程中断造成错误 */
Gimbal_UpdateFeedback(&gimbal, &can);
Gimbal_PackAI(&gimbal, &gimbal_for_ai);
Gimbal_Control(&gimbal, &gimbal_cmd, tick);
Gimbal_DumpOutput(&gimbal, &gimbal_out);
osKernelUnlock();
osMessageQueueReset(task_runtime.msgq.can.output.gimbal);
osMessageQueuePut(task_runtime.msgq.can.output.gimbal, &gimbal_out, 0, 0);
osMessageQueueReset(task_runtime.msgq.gimbal.eulr_encoder);
osMessageQueuePut(task_runtime.msgq.gimbal.eulr_encoder, &gimbal_for_ai, 0, 0);
Gimbal_DumpUI(&gimbal, &gimbal_ui);
osMessageQueueReset(task_runtime.msgq.ui.gimbal);
osMessageQueuePut(task_runtime.msgq.ui.gimbal, &gimbal_ui, 0, 0);
tick += delay_tick; /* 计算下一个唤醒时刻 */
osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */
}
}