PID解释:
位置式:
但直观上看,要计算第
然而在具体编程操作中,可在每一拍对积分部分进行累积,再加上当前拍的比例部分,即为当前

然而很多场合下需要的往往不只增量,还有上一拍的输出值,于是可知增量式PI调节器算法为
由于
PID一般有两种:位置式PID和增量式PID。在小车里一般用增量式,为什么呢?位置式PID的输出与过去的所有状态有关,计算时要对e(每一次的控制误差)进行累加,这个计算量非常大,而明没有必要。而且小车的PID控制器的输出并不是绝对数值,而是一个△,代表增多少,减多少。换句话说,通过增量PID算法,每次输出是PWM要增加多少或者减小多少,而不是PWM的实际值。
//计算PI控制器的输出,并将结果显示到窗口
float errorheight = currentheight - beforeheight;
detaheight = KP * (errorheight - beforeheight) + KI * errorheight; //PI 控制器计算高度变化值
//对控制器输出做出必要的防错
if ( detaheight <= 0 )
{
detaheight = 1;
}
//更新PI控制上次误差
beforeheight = errorheight;
pd
while ( (abs(theta1) > epson) || (abs(theta2) > epson) )
{
//利用雅克比矩阵求得电机的运动
gemm( Jaco_rot.inv(cv::DECOMP_SVD), ImageCharacterVar, 1, NULL, 0, MotorPoseVar, 0);
//采用PD控制,控制电机的运动
float deltaThetax(0), deltaThetay(0);
deltaThetax = kpX * MotorPoseVar.at<float>(0,0) + kdX *(MotorPoseVar.at<float>(0,0)- ErrorOrigin.at<float>(0,0) );
deltaThetay = kpY * MotorPoseVar.at<float>(1,0) + kdY *(MotorPoseVar.at<float>(1,0)- ErrorOrigin.at<float>(1,0) );
//电机运动
if ( deltaThetay < 0 )
SurugaController5.RelativeMove(1, 1, int(deltaThetay));
else
SurugaController5.RelativeMove(1, 0, int(deltaThetay));
if ( deltaThetax < 0 )
SurugaController5.RelativeMove(2, 0, int(deltaThetax));
else
SurugaController5.RelativeMove(2, 1, int(deltaThetax));
ErrorOrigin = MotorPoseVar;
上述为典型的增量式
J*△μi=ei=△xi
△x2i= ui= kp*(ei-ei-1)+ki*ei
输出为增量,适合电机