2026rc_r2/User/module/chassis.h
2026-03-17 04:39:54 +08:00

146 lines
3.7 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.

#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#include "bsp/struct_typedef.h"
#include "component/ahrs.h"
#include "component/filter.h"
#include "component/mixer.h"
#include "component/pid.h"
#include "component/user_math.h"
#include "device/bmi088.h"
#include "device/motor_rm.h"
#include "module/cmd.h"
#define CHASSIS_OK (0)
#define CHASSIS_ERR (-1)
#define CHASSIS_ERR_NULL (-2)
#define CHASSIS_ERR_MODE (-3) /* 底盘模式错误CMD_ChassisMode_t */
#define CHASSIS_ERR_TYPE (-4) /* 底盘类型错误Chassis_Type_t */
typedef enum {
CHASSIS_MODE_RELAX, /* 放松模式,电机不输出,一般用于底盘初始化后 */
CHASSIS_MODE_MOVE
} Chassis_Mode_t;
/* 限幅 */
typedef struct {
float max;
float min;
} Chassis_Limit_t;
/* 底盘类型(底盘的物理设计) */
typedef enum {
CHASSIS_TYPE_MECANUM, /* 麦克纳姆轮 */
CHASSIS_TYPE_PARLFIX4, /* 平行摆放的四个驱动轮 */
CHASSIS_TYPE_PARLFIX2, /* 平行摆放的两个驱动轮 */
CHASSIS_TYPE_OMNI_CROSS, /* X 型摆放的四个全向轮 */
CHASSIS_TYPE_OMNI_PLUS, /* 十字型摆放的四个全向轮 */
CHASSIS_TYPE_DRONE, /* 无人机底盘 */
CHASSIS_TYPE_SINGLE, /* 单个麦克纳姆轮 */
} Chassis_Type_t;
/* 底盘参数结构体,初始化所需参数 */
typedef struct {
MOTOR_RM_Param_t motor_param[4];
struct {
KPID_Params_t motor_pid_param; /* 底盘电机 PID 参数 */
KPID_Params_t follow_pid_param; /* 跟随云台 PID 参数 */
} pid;
Chassis_Type_t type; /* 底盘类型,决定机械设计和轮组配置 */
/* 低通滤波器截止频率 */
struct {
float in; /* 输入 */
float out; /* 输出 */
} low_pass_cutoff_freq;
/* 电机反转设置,应与云台方向配置一致 */
struct {
bool yaw;
} reverse;
struct {
float max_vx, max_vy, max_wz;
float max_current;
} limit;
} Chassis_Params_t;
typedef struct {
AHRS_Gyro_t gyro;
AHRS_Eulr_t eulr;
} Chassis_IMU_t;
typedef struct {
MOTOR_Feedback_t motor[4]; // 四个 3508 电机反馈
float encoder_gimbalYawMotor;
} Chassis_Feedback_t;
/* 底盘输出结构体 */
typedef struct {
float motor[4];
} Chassis_Output_t;
/*
* 运行时主结构体
* 包含初始化参数、中间变量和输出变量
*/
typedef struct {
uint64_t last_wakeup;
float dt;
Chassis_Params_t *param; /* 底盘参数,在 Chassis_Init 中设置 */
/* 模块通用 */
Chassis_mode_t mode; /* 底盘模式 */
/* 底盘设计参数 */
int8_t num_wheel; /* 底盘轮子数量 */
Mixer_t mixer; /* 混控器:移动向量 -> 电机目标值 */
MoveVector_t move_vec; /* 底盘实际运动向量 */
MOTOR_RM_t *motors[4];/* 指向底盘各个电机参数 */
float mech_zero;
float wz_multi; /* 小陀螺旋转模式倍率 */
/* PID 计算目标值 */
struct {
float motor_rpm[4]; /* 电机转速动态数组单位RPM */
} setpoint;
/* 反馈控制使用的 PID */
struct {
KPID_t motor[4]; /* 控制轮组电机的 PID 动态数组 */
KPID_t follow; /* 跟随云台使用的 PID */
} pid;
struct {
Chassis_Limit_t vx, vy, wz;
} limit;
/* 滤波器 */
struct {
LowPassFilter2p_t in[4]; /* 反馈值滤波器 */
LowPassFilter2p_t out[4]; /* 输出值滤波器 */
} filter;
Chassis_Output_t out; /* 电机输出 */
Chassis_Feedback_t feedback;
//float out_motor[4];
} Chassis_t;
int8_t Chassis_Init(Chassis_t *c, Chassis_Params_t *param,
float target_freq);
int8_t Chassis_UpdateFeedback(Chassis_t *c);
int8_t Chassis_Control(Chassis_t *c, const Chassis_CMD_t *c_cmd, uint32_t now);
void Chassis_Output(Chassis_t *c);
void Chassis_ResetOutput(Chassis_t *c);
#ifdef __cplusplus
}
#endif