sanmohuang 发表于 2012-7-2 15:49:30

请教傻孩子位置PID和速度PID怎么结合?

请教傻孩子大哥,位置PID和速度PID怎么结合的呢?谢谢。我现在单个的位置PID和速度PID已经好了,也看了这个帖子,但是看不懂。

http://www.amobbs.com/thread-5412366-1-1.html

Gorgon_Meducer 发表于 2012-7-2 21:50:22

首先你实现了一个位置PID对么?
有以下疑问:特性硬么?也就是在给定的位置,如果你用手能拧动么?拧动时所需的力气大么?

实现了位置PID,那么你一定有一个位置变量,比如P,这个P假设是用一个长整形表示的。当然
对于轮子来说,这个P一定是轮子一圈的周期函数。假设轮子一圈有A线,显然P = nA + x。这里
的x取值0~A。

当我们有了这个目标P,意思就是说,我们只要设定了P,位置环就会不惜一切代价拼命的转动到
这个目标去。
那么假设,我们按照固定的时间间隔,比如1ms,给这个P增加一个固定的增量,是不是意味着我
们的轮子现在有了一个固定的速度呢?这就是所谓的速度环——其实没有速度环,只不过用位置环
产生了一个精确的速度。

tiancaigao7 发表于 2012-7-3 08:15:47

位置环的输出是速度环的输入,也就是对应的参考速度。

Gorgon_Meducer 发表于 2012-7-3 17:34:26

速度环的输出是位置环的输入

sanmohuang 发表于 2012-7-4 10:10:59

好啊。谢谢傻孩子大哥的回答,有点理解了。呵呵。位置PID硬的。{:lol:}

ln08136207 发表于 2013-4-2 09:55:45

Gorgon_Meducer 发表于 2012-7-2 21:50 static/image/common/back.gif
首先你实现了一个位置PID对么?
有以下疑问:特性硬么?也就是在给定的位置,如果你用手能拧动么?拧动时所 ...

你好,请教你一个问题,我用的是位置式的PID控制:只用PD控制时,是硬的,拧不动,但当我加上积分控制时,就能拧动了,这是怎么回事?

Gorgon_Meducer 发表于 2013-4-2 12:53:15

ln08136207 发表于 2013-4-2 09:55 static/image/common/back.gif
你好,请教你一个问题,我用的是位置式的PID控制:只用PD控制时,是硬的,拧不动,但当我加上积分控制时 ...

这要看你的代码具体怎么处理的了。最好用流程图或者状态图描述一下你的算法。

ln08136207 发表于 2013-4-2 14:50:52

Gorgon_Meducer 发表于 2013-4-2 12:53 static/image/common/back.gif
这要看你的代码具体怎么处理的了。最好用流程图或者状态图描述一下你的算法。 ...

PID代码部分是:
         result= Kp*(expect_position - current_position ) + Kd*(currentposition - prev_position );
                integration +=expect_position - current_position ;
                if(((expect_position - current_position )!= 0)&&(current_position - prev_position)==0))
                {
                      result += Ki*(integration);
               }






我是做一个舵机,有一个疑问就是如果仅仅使用PD控制,用手拧不动,但是在舵机带大负载的时候,如果Kp*(expect_position - current_position )太小,导致输出不足以启动电机,想用积分解决这个问题,加上积分项后,用手去拧时,却能拧动,就是你说的不够硬,
不知道这个问题怎么解决

Gorgon_Meducer 发表于 2013-4-2 15:22:59

ln08136207 发表于 2013-4-2 14:50 static/image/common/back.gif
PID代码部分是:
         result= Kp*(expect_position - current_position ) + Kd*(currentpositio ...

检查积分的变量符号与Result的符号是否匹配。

ln08136207 发表于 2013-4-2 15:32:49

Gorgon_Meducer 发表于 2013-4-2 15:22 static/image/common/back.gif
检查积分的变量符号与Result的符号是否匹配。

我检查了,并且加了一个条件:if(((expect_position - current_position )!= 0)&&(current_position - prev_position)==0))
                                       {
                                              if((expect_position - current_position)*intergration)>0)
                                             {
                                                result += Ki*(integration);
                                             }
                                          }

测试 出来的结果还是一样,可以用手拧动,但如果完全不加积分项,就拧不动,其实我想解决的是如何在小误差是保证大扭力,但是想到的办法都不行

Gorgon_Meducer 发表于 2013-4-2 15:42:53

ln08136207 发表于 2013-4-2 15:32 static/image/common/back.gif
我检查了,并且加了一个条件:if(((expect_position - current_position )!= 0)&&(current_position - pr ...

我的意思是,当误差为正的时候,积分的结果也是正数,那么result就会获得一个正的修正,那么这个正向的修正
是不是会起到让电机向减小误差的方向进行运动的效果呢?

调试I其实很简单,直接把PD屏蔽掉,只保留I,看看电机是否有减小误差的行为。

ln08136207 发表于 2013-4-2 16:17:09

Gorgon_Meducer 发表于 2013-4-2 15:42 static/image/common/back.gif
我的意思是,当误差为正的时候,积分的结果也是正数,那么result就会获得一个正的修正,那么这个正向的修 ...

单独调试 I 项,有减小误差的作用,但是和PD加起来后,用手能够拧动,有点无法理解,还有就是当带着负载,误差很小时,Kp*(except_position - current_position )项很小,无法启动,只能靠积分来来累加使其启动吗?还是有其他的算法?

Gorgon_Meducer 发表于 2013-4-2 16:45:43

ln08136207 发表于 2013-4-2 16:17 static/image/common/back.gif
单独调试 I 项,有减小误差的作用,但是和PD加起来后,用手能够拧动,有点无法理解,还有就是当带着负载 ...

带着附载的时候,如果没有I,只有PD就可能出现由于误差过小,输出的值产生的力量与负载产生的扭矩平衡的现象
——一般叫做静差。在这种情况下,通常只能通过I来解决问题。

加入I以后变得可以扭动是非常不正常的。但我觉得是你的I溢出了……溢出以后就变成负数了……你可以考虑给I的结果
增加一个上限,或者result加上I的值不应该出现溢出的现象。
页: [1]
查看完整版本: 请教傻孩子位置PID和速度PID怎么结合?