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