// /* // 底盘模组 // */ // #pragma once // #ifdef __cplusplus // extern "C" { // #endif // /* Includes ----------------------------------------------------------------- */ // #include // #include "bsp/can.h" // #include "component\filter.h" // #include "component\mixer.h" // #include "component\pid.h" // #include "component\ahrs.h" // #include "device/motor_rm.h" // /* Exported constants ------------------------------------------------------- */ // #define CHASSIS_OK (0) /* 运行正常 */ // #define CHASSIS_ERR (-1) /* 运行时出现了一些小错误 */ // #define CHASSIS_ERR_NULL (-2) /* 运行时发现NULL指针 */ // #define CHASSIS_ERR_MODE (-3) /* 运行时出配置了错误的ChassisMode_t */ // #define CHASSIS_ERR_TYPE (-4) /* 运行时出配置了错误的Chassis_Type_t */ // #define MAX_MOTOR_CURRENT 20.0f // /* 底盘控制模式 */ // typedef enum { // CHASSIS_MODE_RELAX, /* 放松模式,电机不输出。一般情况底盘初始化之后的模式 */ // CHASSIS_MODE_BREAK, /* 刹车模式,电机闭环控制静止。用于机器人停止状态 */ // CHASSIS_MODE_FOLLOW_GIMBAL, /* 通过闭环控制使车头方向跟随云台 */ // CHASSIS_MODE_FOLLOW_GIMBAL_35, /* 通过闭环控制使车头方向35°跟随云台 */ // CHASSIS_MODE_ROTOR, /* 小陀螺模式,通过闭环控制使底盘不停旋转 */ // CHASSIS_MODE_INDEPENDENT, /*独立模式。底盘运行不受云台影响 */ // CHASSIS_MODE_OPEN, /* 开环模式。底盘运行不受PID控制,直接输出到电机 */ // } Chassis_Mode_t; // /* 小陀螺转动模式 */ // typedef enum { // ROTOR_MODE_CW, /* 顺时针转动 */ // ROTOR_MODE_CCW, /* 逆时针转动 */ // ROTOR_MODE_RAND, /* 随机转动 */ // } Chassis_RotorMode_t; // /* 底盘控制命令 */ // typedef struct { // Chassis_Mode_t mode; /* 底盘运行模式 */ // Chassis_RotorMode_t mode_rotor; /* 小陀螺转动模式 */ // MoveVector_t ctrl_vec; /* 底盘控制向量 */ // } Chassis_CMD_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, /* 叉型摆放的四个全向轮 */ // CHASSIS_TYPE_OMNI_PLUS, /* 十字型摆设的四个全向轮 */ // CHASSIS_TYPE_DRONE, /* 无人机底盘 */ // CHASSIS_TYPE_SINGLE, /* 单个摩擦轮 */ // } Chassis_Type_t; // /* 底盘参数结构体,ALL初始化参数 */ // 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; // /* Exported functions prototypes -------------------------------------------- */ // /** // * \brief 底盘初始化 // * // * \param c 包含底盘数据的结构体 // * \param param 包含底盘参数的结构体指针 // * \param target_freq 任务预期的运行频率 // * // * \return 运行结果 // */ // int8_t Chassis_Init(Chassis_t *c, const Chassis_Params_t *param, // float target_freq); // /** // * \brief 更新底盘反馈信息 // * // * \param c 包含底盘数据的结构体 // * \param can CAN设备结构体 // * // * \return 运行结果 // */ // int8_t Chassis_UpdateFeedback(Chassis_t *c); // /** // * \brief 运行底盘控制逻辑 // * // * \param c 包含底盘数据的结构体 // * \param c_cmd 底盘控制指令 // * \param dt_sec 两次调用的时间间隔 // * // * \return 运行结果 // */ // int8_t Chassis_Control(Chassis_t *c, const Chassis_CMD_t *c_cmd, // uint32_t now); // /** // * \brief 复制底盘输出值 // * // * \param s 包含底盘数据的结构体 // * \param out CAN设备底盘输出结构体 // */ // void Chassis_Output(Chassis_t *c); // /** // * \brief 清空Chassis输出数据 // * // * \param out CAN设备底盘输出结构体 // */ // void Chassis_ResetOutput(Chassis_t *c); // /** // * @brief 底盘功率限制 // * // * @param c 底盘数据 // * @param cap 电容数据 // * @param ref 裁判系统数据 // * @return 函数运行结果 // */ // //还没有加入,waiting。。。。。。int8_t Chassis_PowerLimit(Chassis_t *c, const CAN_Capacitor_t *cap, // // const Referee_ForChassis_t *ref); // /** // * @brief 导出底盘数据 // * // * @param chassis 底盘数据结构体 // * @param ui UI数据结构体 // */ // //void Chassis_DumpUI(const Chassis_t *c, Referee_ChassisUI_t *ui); // #ifdef __cplusplus // } // #endif