duolun/User/module/chassis.c
2025-09-29 19:05:35 +08:00

61 lines
2.4 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.

/*
底盘任务
*/
/* Includes ----------------------------------------------------------------- */
#include "chassis.h"
#include "device/motor_rm.h"
/*舵轮舵向校准方法注释掉关于6020反馈角度的处理以及6020数据的发送这两处(define.h里有快捷方法)
进debug将四个轮子编码器朝右左右无所谓可能会导致5065方向反在解算里加个负号就行
查看6020反馈值将6020反馈值放入motor_offset中*/
/*chassis_t结构体中的内容现在有 move_vec (最终输出速度)
hopemotorout(期望的底盘输出值)舵轮解算出的各个电机的期望输出值 包括四个6020 和四个3508
final_out;(经PID计算后的实际发送给电机的实时输出值) 四个6020 四个3508
motorfeedback(电机反馈数据) 四个3508 四个6020
pid 各个电机的pid参数
ChassisImu_t pos088; 088的实时姿态
MotorOffset_t motoroffset; //5065校准数据
const Chassis_Param_t *param; //一些固定的参数
fp32 vofa_send[8]; //vofa输出数据
LowPassFilter2p_t filled[9]; //低通滤波器
float keep_angle[4]; // 保持的 6020 角度
*/
/*底盘初始化*/
int8_t chassis_init(Chassis_t *chassis ,const Chassis_Param_t *param, float target_freq )
{
/*注册电机*/
for(int i=0;i<4;i++){
MOTOR_RM_Register(&);
}
chassis->param =param;
//舵轮安装时的6020机械误差机械校准时1号轮在左前方所有轮的编码器朝向右面
MotorOffset_t motor_offset = { {271.329506, 330.179474, 208.084482, 29.337082}};
chassis->motoroffset = motor_offset;
/*对3508的速度环和6020的角速度以及位置环pid进行初始化*/
for(int i=0;i<4;i++)
{
PID_Init(&chassis->pid.chassis_3508VPID[i], KPID_MODE_NO_D,target_freq,&chassis->param->M3508_param);
PID_Init(&chassis->pid.chassis_6020OmegaPid[i], KPID_MODE_NO_D,target_freq,&chassis->param->C6020Omega_param);
PID_Init(&chassis->pid.chassis_6020anglePid[i], KPID_MODE_NO_D,target_freq,&chassis->param->C6020Angle_param);
}
/*对遥控器的xyw进行低通滤波*/
LowPassFilter2p_Init(&chassis->filled[0], target_freq, 20.0f); // vx
LowPassFilter2p_Init(&chassis->filled[1], target_freq, 20.0f); // vy
LowPassFilter2p_Init(&chassis->filled[2], target_freq, 20.0f); // vw
chassis->set_point.yaw=0.0f;
return CHASSIS_OK;
}