给底盘添加yaw
This commit is contained in:
parent
39108dec77
commit
cce8e7bdaf
@ -165,13 +165,6 @@ int8_t Chassis_UpdateFeedback(Chassis_t *c) {
|
|||||||
c->feedback.imu.gyro = virtual_chassis.data.imu.gyro;
|
c->feedback.imu.gyro = virtual_chassis.data.imu.gyro;
|
||||||
c->feedback.imu.euler = virtual_chassis.data.imu.euler;
|
c->feedback.imu.euler = virtual_chassis.data.imu.euler;
|
||||||
|
|
||||||
/* 更新云台电机反馈数据(yaw轴) */
|
|
||||||
MOTOR_DM_Update(&(c->param->yaw_motor));
|
|
||||||
MOTOR_DM_t *dm_motor = MOTOR_DM_GetMotor(&(c->param->yaw_motor));
|
|
||||||
if (dm_motor != NULL) {
|
|
||||||
c->feedback.yaw = dm_motor->motor.feedback;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 更新机体状态估计
|
// 更新机体状态估计
|
||||||
Chassis_UpdateChassisState(c);
|
Chassis_UpdateChassisState(c);
|
||||||
|
|
||||||
@ -302,8 +295,8 @@ int8_t Chassis_LQRControl(Chassis_t *c, const Chassis_CMD_t *c_cmd) {
|
|||||||
current_state.d_theta = c->vmc_[0].leg.d_theta;
|
current_state.d_theta = c->vmc_[0].leg.d_theta;
|
||||||
current_state.x = xhat;
|
current_state.x = xhat;
|
||||||
current_state.d_x = x_dot_hat;
|
current_state.d_x = x_dot_hat;
|
||||||
current_state.phi = -c->feedback.imu.euler.pit;
|
current_state.phi = c->feedback.imu.euler.pit;
|
||||||
current_state.d_phi = -c->feedback.imu.gyro.y;
|
current_state.d_phi = c->feedback.imu.gyro.y;
|
||||||
|
|
||||||
LQR_UpdateState(&c->lqr[0], ¤t_state);
|
LQR_UpdateState(&c->lqr[0], ¤t_state);
|
||||||
|
|
||||||
@ -319,7 +312,7 @@ int8_t Chassis_LQRControl(Chassis_t *c, const Chassis_CMD_t *c_cmd) {
|
|||||||
LQR_State_t target_state = {0};
|
LQR_State_t target_state = {0};
|
||||||
target_state.theta = 0.0f; // 目标摆杆角度
|
target_state.theta = 0.0f; // 目标摆杆角度
|
||||||
target_state.d_theta = 0.0f; // 目标摆杆角速度
|
target_state.d_theta = 0.0f; // 目标摆杆角速度
|
||||||
target_state.phi = -0.2f; // 目标俯仰角
|
target_state.phi = 0.0f; // 目标俯仰角
|
||||||
target_state.d_phi = 0.0f; // 目标俯仰角速度
|
target_state.d_phi = 0.0f; // 目标俯仰角速度
|
||||||
target_state.x = c->chassis_state.target_x; // 目标位置
|
target_state.x = c->chassis_state.target_x; // 目标位置
|
||||||
target_state.d_x = target_dot_x; // 目标速度
|
target_state.d_x = target_dot_x; // 目标速度
|
||||||
@ -339,10 +332,10 @@ int8_t Chassis_LQRControl(Chassis_t *c, const Chassis_CMD_t *c_cmd) {
|
|||||||
c->feedback.yaw.rotor_abs_angle, 0.0f, c->dt);
|
c->feedback.yaw.rotor_abs_angle, 0.0f, c->dt);
|
||||||
|
|
||||||
/* 轮毂力矩输出(参考C++版本的减速比) */
|
/* 轮毂力矩输出(参考C++版本的减速比) */
|
||||||
// c->output.wheel[0] = c->lqr[0].control_output.T / 4.5f + c->yaw_control.yaw_force;
|
c->output.wheel[0] = c->lqr[0].control_output.T / 4.5f + c->yaw_control.yaw_force;
|
||||||
// c->output.wheel[1] = c->lqr[1].control_output.T / 4.5f - c->yaw_control.yaw_force;
|
c->output.wheel[1] = c->lqr[1].control_output.T / 4.5f - c->yaw_control.yaw_force;
|
||||||
c->output.wheel[0] = c->lqr[0].control_output.T / 4.5f;
|
// c->output.wheel[0] = c->lqr[0].control_output.T / 4.5f;
|
||||||
c->output.wheel[1] = c->lqr[1].control_output.T / 4.5f;
|
// c->output.wheel[1] = c->lqr[1].control_output.T / 4.5f;
|
||||||
/* 腿长控制和VMC逆解算(使用PID控制) */
|
/* 腿长控制和VMC逆解算(使用PID控制) */
|
||||||
float virtual_force[2];
|
float virtual_force[2];
|
||||||
float target_L0[2];
|
float target_L0[2];
|
||||||
@ -384,7 +377,7 @@ int8_t Chassis_LQRControl(Chassis_t *c, const Chassis_CMD_t *c_cmd) {
|
|||||||
c->vmc_[0].leg.L0, leg_d_length[0], c->dt);
|
c->vmc_[0].leg.L0, leg_d_length[0], c->dt);
|
||||||
|
|
||||||
// 腿长控制力 = LQR摆杆力矩的径向分量 + PID腿长控制输出 + 基础支撑力 - 横滚角补偿力(左腿减少支撑力)
|
// 腿长控制力 = LQR摆杆力矩的径向分量 + PID腿长控制输出 + 基础支撑力 - 横滚角补偿力(左腿减少支撑力)
|
||||||
virtual_force[0] = (c->lqr[0].control_output.Tp) * sinf(c->vmc_[0].leg.theta) + pid_output + 10.0f ;
|
virtual_force[0] = (c->lqr[0].control_output.Tp) * sinf(c->vmc_[0].leg.theta) + pid_output + 40.0f ;
|
||||||
|
|
||||||
// VMC逆解算(包含摆角补偿)
|
// VMC逆解算(包含摆角补偿)
|
||||||
if (VMC_InverseSolve(&c->vmc_[0], virtual_force[0],
|
if (VMC_InverseSolve(&c->vmc_[0], virtual_force[0],
|
||||||
@ -405,7 +398,7 @@ int8_t Chassis_LQRControl(Chassis_t *c, const Chassis_CMD_t *c_cmd) {
|
|||||||
c->vmc_[1].leg.L0, leg_d_length[1], c->dt);
|
c->vmc_[1].leg.L0, leg_d_length[1], c->dt);
|
||||||
|
|
||||||
// 腿长控制力 = LQR摆杆力矩的径向分量 + PID腿长控制输出 + 基础支撑力 + 横滚角补偿力(右腿增加支撑力)
|
// 腿长控制力 = LQR摆杆力矩的径向分量 + PID腿长控制输出 + 基础支撑力 + 横滚角补偿力(右腿增加支撑力)
|
||||||
virtual_force[1] = (c->lqr[1].control_output.Tp) * sinf(c->vmc_[1].leg.theta) + pid_output + 10.0f ;
|
virtual_force[1] = (c->lqr[1].control_output.Tp) * sinf(c->vmc_[1].leg.theta) + pid_output + 40.0f ;
|
||||||
|
|
||||||
// VMC逆解算(包含摆角补偿)
|
// VMC逆解算(包含摆角补偿)
|
||||||
if (VMC_InverseSolve(&c->vmc_[1], virtual_force[1],
|
if (VMC_InverseSolve(&c->vmc_[1], virtual_force[1],
|
||||||
|
|||||||
@ -58,6 +58,7 @@ void Task_ctrl_chassis(void *argument) {
|
|||||||
if (osMessageQueueGet(task_runtime.msgq.Chassis_cmd, &chassis_cmd, NULL, 0) != osOK) {
|
if (osMessageQueueGet(task_runtime.msgq.Chassis_cmd, &chassis_cmd, NULL, 0) != osOK) {
|
||||||
// 没有新命令,保持上次命令
|
// 没有新命令,保持上次命令
|
||||||
}
|
}
|
||||||
|
osMessageQueueGet(task_runtime.msgq.chassis_yaw, &chassis.feedback.yaw, NULL, 0);
|
||||||
|
|
||||||
Chassis_UpdateFeedback(&chassis);
|
Chassis_UpdateFeedback(&chassis);
|
||||||
|
|
||||||
|
|||||||
@ -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 "component/ahrs.h"
|
#include "component/ahrs.h"
|
||||||
@ -45,11 +46,16 @@ void Task_ctrl_gimbal(void *argument) {
|
|||||||
}
|
}
|
||||||
osMessageQueueGet(task_runtime.msgq.gimbal.cmd, &gimbal_cmd, NULL, 0);
|
osMessageQueueGet(task_runtime.msgq.gimbal.cmd, &gimbal_cmd, NULL, 0);
|
||||||
|
|
||||||
|
|
||||||
Gimbal_UpdateFeedback(&gimbal);
|
Gimbal_UpdateFeedback(&gimbal);
|
||||||
|
|
||||||
|
// osMessageQueueReset(task_runtime.msgq.chassis_yaw);
|
||||||
|
osMessageQueuePut(task_runtime.msgq.chassis_yaw, &gimbal.feedback.motor.yaw, 0, 0);
|
||||||
|
|
||||||
Gimbal_Control(&gimbal, &gimbal_cmd);
|
Gimbal_Control(&gimbal, &gimbal_cmd);
|
||||||
|
|
||||||
Gimbal_Output(&gimbal);
|
Gimbal_Output(&gimbal);
|
||||||
|
|
||||||
/* USER CODE END */
|
/* USER CODE END */
|
||||||
osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */
|
osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,6 +7,7 @@
|
|||||||
#include "task/user_task.h"
|
#include "task/user_task.h"
|
||||||
|
|
||||||
/* USER INCLUDE BEGIN */
|
/* USER INCLUDE BEGIN */
|
||||||
|
#include "device/motor.h"
|
||||||
#include "module/balance_chassis.h"
|
#include "module/balance_chassis.h"
|
||||||
#include "module/gimbal.h"
|
#include "module/gimbal.h"
|
||||||
#include "module/shoot.h"
|
#include "module/shoot.h"
|
||||||
@ -46,6 +47,7 @@ void Task_Init(void *argument) {
|
|||||||
task_runtime.msgq.user_msg= osMessageQueueNew(2u, 10, NULL);
|
task_runtime.msgq.user_msg= osMessageQueueNew(2u, 10, NULL);
|
||||||
task_runtime.msgq.chassis_imu = osMessageQueueNew(2u, sizeof(Chassis_IMU_t), NULL);
|
task_runtime.msgq.chassis_imu = osMessageQueueNew(2u, sizeof(Chassis_IMU_t), NULL);
|
||||||
task_runtime.msgq.Chassis_cmd = osMessageQueueNew(2u, sizeof(Chassis_CMD_t), NULL);
|
task_runtime.msgq.Chassis_cmd = osMessageQueueNew(2u, sizeof(Chassis_CMD_t), NULL);
|
||||||
|
task_runtime.msgq.chassis_yaw = osMessageQueueNew(2u, sizeof(MOTOR_Feedback_t), NULL);
|
||||||
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);
|
||||||
|
|||||||
@ -57,6 +57,7 @@ typedef struct {
|
|||||||
|
|
||||||
osMessageQueueId_t chassis_imu;
|
osMessageQueueId_t chassis_imu;
|
||||||
osMessageQueueId_t Chassis_cmd;
|
osMessageQueueId_t Chassis_cmd;
|
||||||
|
osMessageQueueId_t chassis_yaw;
|
||||||
struct {
|
struct {
|
||||||
osMessageQueueId_t imu;
|
osMessageQueueId_t imu;
|
||||||
osMessageQueueId_t cmd;
|
osMessageQueueId_t cmd;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user