rm_balance/User/task/ctrl_virtual_chassis.c
2025-10-04 21:00:35 +08:00

98 lines
3.6 KiB
C
Raw 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.

/*
ctrl_virtual_chassis Task - 使用虚拟底盘设备的示例任务
*/
/* Includes ----------------------------------------------------------------- */
#include "task/user_task.h"
/* USER INCLUDE BEGIN */
#include "device/virtual_chassis.h"
#include "module/config.h"
#include "bsp/time.h"
/* USER INCLUDE END */
/* Private typedef ---------------------------------------------------------- */
/* Private define ----------------------------------------------------------- */
/* Private macro ------------------------------------------------------------ */
/* Private variables -------------------------------------------------------- */
/* USER STRUCT BEGIN */
static Virtual_Chassis_t virtual_chassis;
static bool chassis_enabled = false;
static float test_torques[VIRTUAL_CHASSIS_MOTOR_COUNT] = {0.0f, 0.0f, 0.0f, 0.0f};
/* USER STRUCT END */
/* Private function --------------------------------------------------------- */
/* Exported functions ------------------------------------------------------- */
void Task_ctrl_virtual_chassis(void *argument) {
(void)argument; /* 未使用argument消除警告 */
/* 计算任务运行到指定频率需要等待的tick数 */
const uint32_t delay_tick = osKernelGetTickFreq() / 100.0f; // 100Hz频率
osDelay(500); /* 延时一段时间再开启任务 */
uint32_t tick = osKernelGetTickCount(); /* 控制任务运行频率的计时 */
/* USER CODE INIT BEGIN */
// 初始化虚拟底盘
if (Virtual_Chassis_Init(&virtual_chassis, &Config_GetRobotParam()->virtual_chassis_param) != DEVICE_OK) {
// 初始化失败处理
return;
}
// 使能底盘电机
Virtual_Chassis_Enable(&virtual_chassis);
chassis_enabled = true;
/* USER CODE INIT END */
while (1) {
tick += delay_tick; /* 计算下一个唤醒时刻 */
/* USER CODE BEGIN */
// 更新虚拟底盘数据(接收反馈)
Virtual_Chassis_Update(&virtual_chassis);
// 检查设备在线状态
if (Virtual_Chassis_IsOnline(&virtual_chassis)) {
// 发送力矩控制命令(这里可以根据实际需要设置力矩值)
if (chassis_enabled) {
Virtual_Chassis_SendTorqueCommand(&virtual_chassis, test_torques);
}
// 获取电机反馈数据
for (int i = 0; i < VIRTUAL_CHASSIS_MOTOR_COUNT; i++) {
Virtual_Chassis_MotorFeedback_t *motor_fb = Virtual_Chassis_GetMotorFeedback(&virtual_chassis, i);
if (motor_fb != NULL && motor_fb->online) {
// 这里可以使用电机反馈数据
// 例如:发送到其他任务或用于控制算法
// motor_fb->current_angle, motor_fb->current_velocity, motor_fb->current_torque
}
}
// 获取IMU反馈数据
Virtual_Chassis_IMUFeedback_t *imu_fb = Virtual_Chassis_GetIMUFeedback(&virtual_chassis);
if (imu_fb != NULL && imu_fb->online) {
// 这里可以使用IMU数据替换原有的陀螺仪数据
// 例如:将数据发送给底盘控制任务
Chassis_IMU_t chassis_imu = {
.accl = imu_fb->accl,
.gyro = imu_fb->gyro,
.euler = imu_fb->euler,
};
// 发送IMU数据到底盘控制任务
osMessageQueuePut(task_runtime.msgq.chassis_imu, &chassis_imu, 0, 0);
}
} else {
// 设备离线,重新使能
if (chassis_enabled) {
Virtual_Chassis_Enable(&virtual_chassis);
}
}
/* USER CODE END */
osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */
}
}