diff --git a/application/cmd/robot_cmd.c b/application/cmd/robot_cmd.c index 2c7bfc3..c0a4f25 100644 --- a/application/cmd/robot_cmd.c +++ b/application/cmd/robot_cmd.c @@ -96,8 +96,8 @@ static void SwitchToAutoMode(void) return; /* 同步角度参考值为当前 IMU 角度 */ - gimbal_yaw_ref = gimbal_fetch_data.gimbal_imu_data.YawTotalAngle; - gimbal_pitch_ref = gimbal_fetch_data.gimbal_imu_data.Pitch; + gimbal_yaw_ref = gimbal_fetch_data.gimbal_imu_data->YawTotalAngle; + gimbal_pitch_ref = gimbal_fetch_data.gimbal_imu_data->Pitch; vision_data.manual_updated = 0; // 清除手动数据残留 VisionPIDReset(); @@ -110,8 +110,8 @@ static void SwitchToManualMode(void) if (current_mode == VISION_MODE_MANUAL) return; - gimbal_yaw_ref = gimbal_fetch_data.gimbal_imu_data.YawTotalAngle; - gimbal_pitch_ref = gimbal_fetch_data.gimbal_imu_data.Pitch; + gimbal_yaw_ref = gimbal_fetch_data.gimbal_imu_data->YawTotalAngle; + gimbal_pitch_ref = gimbal_fetch_data.gimbal_imu_data->Pitch; vision_data.auto_updated = 0; // 清除自动数据残留 current_mode = VISION_MODE_MANUAL; @@ -250,8 +250,8 @@ static void ManualModeSet() /* 零力子模式 */ vision_data.manual_updated = 0; gimbal_cmd_send.gimbal_mode = GIMBAL_ZERO_FORCE; - gimbal_yaw_ref = gimbal_fetch_data.gimbal_imu_data.YawTotalAngle; - gimbal_pitch_ref = gimbal_fetch_data.gimbal_imu_data.Pitch; + gimbal_yaw_ref = gimbal_fetch_data.gimbal_imu_data->YawTotalAngle; + gimbal_pitch_ref = gimbal_fetch_data.gimbal_imu_data->Pitch; } else if (vision_data.manual_updated) { @@ -285,16 +285,16 @@ static void EmergencyHandler() { robot_state = ROBOT_STOP; gimbal_cmd_send.gimbal_mode = GIMBAL_ZERO_FORCE; - gimbal_cmd_send.yaw = gimbal_fetch_data.gimbal_imu_data.YawTotalAngle; - gimbal_cmd_send.pitch = gimbal_fetch_data.gimbal_imu_data.Pitch; + gimbal_cmd_send.yaw = gimbal_fetch_data.gimbal_imu_data->YawTotalAngle; + gimbal_cmd_send.pitch = gimbal_fetch_data.gimbal_imu_data->Pitch; laser_off(); } if (!switch_is_down(rc_data[TEMP].rc.switch_right) && robot_state == ROBOT_STOP) { robot_state = ROBOT_READY; - gimbal_yaw_ref = gimbal_fetch_data.gimbal_imu_data.YawTotalAngle; - gimbal_pitch_ref = gimbal_fetch_data.gimbal_imu_data.Pitch; + gimbal_yaw_ref = gimbal_fetch_data.gimbal_imu_data->YawTotalAngle; + gimbal_pitch_ref = gimbal_fetch_data.gimbal_imu_data->Pitch; LOGINFO("[CMD] reinstate, robot ready"); } } diff --git a/application/gimbal/gimbal.c b/application/gimbal/gimbal.c index a03a69c..2048fdf 100644 --- a/application/gimbal/gimbal.c +++ b/application/gimbal/gimbal.c @@ -5,7 +5,7 @@ #include "message_center.h" #include "general_def.h" -static attitude_t *gimbal_IMU_data; +static INS_t *gimbal_IMU_data; static Publisher_t *gimbal_pub; static Subscriber_t *gimbal_sub; @@ -96,6 +96,6 @@ void GimbalTask() DMMotorSetRef(pitch_motor, gimbal_cmd_recv.pitch); } - gimbal_feedback_data.gimbal_imu_data = *gimbal_IMU_data; + gimbal_feedback_data.gimbal_imu_data = gimbal_IMU_data; PubPushMessage(gimbal_pub, (void *)&gimbal_feedback_data); } diff --git a/application/robot_def.h b/application/robot_def.h index 7f16d58..a7fd019 100644 --- a/application/robot_def.h +++ b/application/robot_def.h @@ -57,7 +57,7 @@ typedef struct /* ---- gimbal 发布给 CMD 的反馈数据 ---- */ typedef struct { - attitude_t gimbal_imu_data; + INS_t *gimbal_imu_data; // 指向 INS 实例的指针 uint16_t yaw_motor_single_round_angle; uint8_t gimbal_power; } Gimbal_Upload_Data_s; diff --git a/modules/imu/ins_task.c b/modules/imu/ins_task.c index f53e0cf..8fc1592 100644 --- a/modules/imu/ins_task.c +++ b/modules/imu/ins_task.c @@ -77,12 +77,12 @@ static void InitQuaternion(float *init_q4) init_q4[i + 1] = axis_rot[i] * sinf(angle / 2.0f); // 轴角公式,第三轴为0(没有z轴分量) } -attitude_t *INS_Init(void) +INS_t *INS_Init(void) { if (!INS.init) INS.init = 1; else - return (attitude_t *)&INS.Gyro; + return &INS; HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4); @@ -112,7 +112,7 @@ attitude_t *INS_Init(void) // noise of accel is relatively big and of high freq,thus lpf is used INS.AccelLPF = 0.0085; DWT_GetDeltaT(&INS_DWT_Count); - return (attitude_t *)&INS.Gyro; // @todo: 这里偷懒了,不要这样做! 修改INT_t结构体可能会导致异常,待修复. + return &INS; } /* 注意以1kHz的频率运行此任务 */ diff --git a/modules/imu/ins_task.h b/modules/imu/ins_task.h index 4acac19..dbecbe2 100644 --- a/modules/imu/ins_task.h +++ b/modules/imu/ins_task.h @@ -25,17 +25,6 @@ #define INS_TASK_PERIOD 1 -typedef struct -{ - float Gyro[3]; // 角速度 - float Accel[3]; // 加速度 - // 还需要增加角速度数据 - float Roll; - float Pitch; - float Yaw; - float YawTotalAngle; -} attitude_t; // 最终解算得到的角度,以及yaw转动的总角度(方便多圈控制) - typedef struct { float q[4]; // 四元数估计值 @@ -82,7 +71,7 @@ typedef struct * @brief 初始化惯导解算系统 * */ -attitude_t *INS_Init(void); +INS_t *INS_Init(void); /** * @brief 此函数放入实时系统中,以1kHz频率运行 diff --git a/modules/motor/motor_def.h b/modules/motor/motor_def.h index 1c3b0da..a45e710 100644 --- a/modules/motor/motor_def.h +++ b/modules/motor/motor_def.h @@ -3,6 +3,7 @@ #include "controller.h" #include "stdint.h" +#include "bsp_can.h" #define LIMIT_MIN_MAX(x, min, max) (x) = (((x) <= (min)) ? (min) : (((x) >= (max)) ? (max) : (x)))