2020-10-20 学习日志(Crazepony控制环)

2023-05-16

2020年10月20日 学习任务:完成Crazepony控制环的理解

之前是通过姿态解算获得了 四元数→旋转矩阵→欧拉角

  1. CtrlAttiRate();

void CtrlAttiRate(void)
{
 	float yawRateTarget=0;
	static uint32_t tPrev=0; 

	float dt=0,t=0;
	t=micros();
	dt=(tPrev>0)?(t-tPrev):0;
	tPrev=t;//计算两次时间差
		
    //定义了一个结构体yaw pitch roll throttle(油门)
	yawRateTarget=-(float)RC_DATA.YAW;
	
	//注意,原来的pid参数,对应的是 ad值,故转之
    /*param 1是角速度PID中各个数据 param 2是角度PID中各个数据 param 3 没看懂是啥*/
  
	#ifdef IMU_SW
	PID_Postion_Cal(&pitch_rate_PID,pitch_angle_PID.Output,imu.gyro[PITCH]*180.0f/M_PI_F,dt);	
	PID_Postion_Cal(&roll_rate_PID,roll_angle_PID.Output,imu.gyro[ROLL]*180.0f/M_PI_F,dt);//gyroxGloble
	PID_Postion_Cal(&yaw_rate_PID,yawRateTarget,imu.gyro[YAW]*180.0f/M_PI_F,dt);//DMP_DATA.GYROz
	#else
	
	//原参数对应于 DMP的直接输出gyro , 是deg.  且原DMP之后的处理运算是错误的
	PID_Postion_Cal(&pitch_rate_PID,pitch_angle_PID.Output,imu.gyro[PITCH]*DMP_GYRO_SCALE,0);	
	PID_Postion_Cal(&roll_rate_PID,roll_angle_PID.Output,imu.gyro[ROLL]*DMP_GYRO_SCALE,0);//gyroxGloble
	PID_Postion_Cal(&yaw_rate_PID,yawRateTarget,imu.gyro[YAW]*DMP_GYRO_SCALE,0);          //DMP_DATA.GYROz
	#endif

	Pitch = pitch_rate_PID.Output;
	Roll  = roll_rate_PID.Output;
	Yaw   = yaw_rate_PID.Output; 
}

1.2 采用位置式PID:

static void PID_Postion_Cal(PID_Typedef * PID,float target,float measure,int32_t dertT)
{
	float termI=0;
	float dt= dertT/1000000.0;

	//误差=期望值-测量值
	PID->Error=target-measure;

	PID->Deriv= (PID->Error-PID->PreError)/dt;

	PID->Output=(PID->P * PID->Error) + (PID->I * PID->Integ) + (PID->D * PID->Deriv);    //PID:比例环节+积分环节+微分环节

	PID->PreError=PID->Error;
	//仅用于角度环和角速度环的

	if(FLY_ENABLE && offLandFlag){
		if(fabs(PID->Output) < Thro )		              //比油门还大时不积分
		{
			termI=(PID->Integ) + (PID->Error) * dt;     //积分环节
			if(termI > - PID->iLimit && termI < PID->iLimit && PID->Output > - PID->iLimit && PID->Output < PID->iLimit)       //在-300~300时才进行积分环节
					PID->Integ=termI;
		}
	}else{
		PID->Integ= 0;
	}
}

 


CtrlMotor();

  1.  

 

void CtrlMotor(void)
{
		float  cosTilt = imu.accb[2] / ONE_G;
	
		if(altCtrlMode==MANUAL)
		{
			DIF_ACC.Z =  imu.accb[2] - ONE_G;
			Thro = RC_DATA.THROTTLE;
			cosTilt=imu.DCMgb[2][2];
			Thro=Thro/cosTilt;
		}else{
			Thro=(-thrustZSp) * 1000;// /imu.DCMgb[2][2];  //倾角补偿后效果不错,有时过猛
			if(Thro>1000)
				Thro=1000;
		}
		
		//将输出值融合到四个电机 
		Motor[2] = (int16_t)(Thro - Pitch - Roll - Yaw );    //M3  
		Motor[0] = (int16_t)(Thro + Pitch + Roll - Yaw );    //M1
		Motor[3] = (int16_t)(Thro - Pitch + Roll + Yaw );    //M4 
		Motor[1] = (int16_t)(Thro + Pitch - Roll + Yaw );    //M2
	
   	if((FLY_ENABLE!=0)) 
			MotorPwmFlash(Motor[0],Motor[1],Motor[2],Motor[3]);   
		else                  
			MotorPwmFlash(0,0,0,0); 
}

​​



总结:

  Crazepony飞机的总体框架看完  其他的细节算法打算采用minifly进行学习

还存在的疑惑有:

①没有见到使用 三轴角速度进行姿态解算

②电机控制中的 倾角补偿未看懂

                                                                                                                           

                                                                                                                          02:36

                                                                                                                       October 20, 2020   

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2020-10-20 学习日志(Crazepony控制环) 的相关文章

随机推荐