98 lines
3.6 KiB
C
98 lines
3.6 KiB
C
/*
|
||
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); /* 运行结束,等待下一次唤醒 */
|
||
}
|
||
} |