这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【digits12】PID 算法控制的时候,总是往一边飞,求解读

共5条 1/1 1 跳转至

【digits12】PID 算法控制的时候,总是往一边飞,求解读

助工
2014-05-22 19:57:39     打赏

做到姿态解算,水平方向的姿态都已经准确了,除了yaw会漂移,另外两个是准确的。

现在做PID出问题了,找不到原因


void PID_Control()
{
	rol_err_last2 = rol_err_last1;
	pit_err_last2 = pit_err_last1;
	yaw_err_last2 = yaw_err_last1;

	rol_err_last1 = rol_err;
	pit_err_last1 = pit_err;
	yaw_err_last1 = yaw_err;
	
	rol_err = angle_x - angle_x_tar;//rollÎó²î
	pit_err = angle_y - angle_y_tar;//pitchÎó²î
	yaw_err = angle_z - angle_z_tar;//yawÎó²î

	//Èý¸öPIDµÄÔöÁ¿Êä³ö
	rol_out += Kp*(rol_err - rol_err_last1) + Ki*(rol_err) + Kd*(rol_err - 2*rol_err_last1 + rol_err_last2);
	pit_out += Kp*(pit_err - pit_err_last1) + Ki*(pit_err) + Kd*(pit_err - 2*pit_err_last1 + pit_err_last2);
	yaw_out += Kp*(yaw_err - yaw_err_last1) + Ki*(yaw_err) + Kd*(yaw_err - 2*yaw_err_last1 + yaw_err_last2);

	if (rol_out < -400) rol_out = -400;
	else if (rol_out > 400) rol_out = 400;

	if (pit_out < -400) pit_out = -400;
	else if (pit_out > 400) pit_out = 400;

	if (yaw_out < -200) yaw_out = -200;
	else if (yaw_out > 200) yaw_out = 200;
	
	/////////////////////////////////////////////////////////
	yaw_out = 0;
	
	if (gas>200)
	{
		//µþ¼ÓÊä³öµ½Êµ¼ÊÓÍÃÅ
		moto1 = gas - rol_out - pit_out + yaw_out;
		moto2 = gas - rol_out + pit_out - yaw_out;
		moto3 = gas + rol_out - pit_out - yaw_out;
		moto4 = gas + rol_out + pit_out + yaw_out;

		if (moto1 < 0) moto1 = 0;
		else if (moto1 > 1000) moto1 = 1000;
		if (moto2 < 0) moto2 = 0;
		else if (moto2 > 1000) moto2 = 1000;
		if (moto3 < 0) moto3 = 0;
		else if (moto3 > 1000) moto3 = 1000;
		if (moto4 < 0) moto4 = 0;
		else if (moto4 > 1000) moto4 = 1000;
	}
	else
	{
		moto1 = 0;
		moto2 = 0;
		moto3 = 0;
		moto4 = 0;
	}
	
	motor_speed((uint16_t)moto1,(uint16_t)moto2,(uint16_t)moto3,(uint16_t)moto4);
}

 

用的是PID增量式算法,可是起飞的时候总是往一边偏,要么往左偏,要么往上偏,并且越偏越厉害,根本飞不起来,好像是PID根本没起到作用。

而且一边偏了之后,不关油门继续上升的话桨叶就打到地面了。


按理说,如果偏向一边,PID是可以将姿态调整回来的,可是现在是它会保持偏着,这是为何?

我取的参数是Kp=1.00,Ki=0.02,Kd=0


不是姿态校准不准的问题,如果只是校准不准,不会往一边越偏越厉害


高工
2014-05-22 22:09:23     打赏
2楼
很明显PID的方向反了!请检查

助工
2014-05-23 00:28:05     打赏
3楼

调试了很久,终于知道了原因,方向确实反了,

改为

rol_err = angle_x_tar - angle_x;
pit_err = angle_y_tar - angle_y ;
yaw_err = angle_z_tar - angle_z ;

 

而后是参数的问题,PID参数设置小了,调大。


此外调试的时候总是遇到些意外的情况,程序完不变,一次控制的方向错误,下一次运行控制的方向又正确了,问题多多,莫名其妙的错误耽误了好长一段时间,再后来又莫名恢复了,至现在都没找到原因。


工程师
2014-05-23 08:39:45     打赏
4楼

常用的都是位置式,你为何一定要用增量式呢?果断换位置式啊。


院士
2014-05-23 10:04:17     打赏
5楼
听老大的没错

共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]