社区
C语言
帖子详情
谁搞过PID算法?
lijian22500
2009-08-10 11:16:00
我想把pid算法用在动力定位上,不知道那个前辈搞过这个?
...全文
1286
36
打赏
收藏
谁搞过PID算法?
我想把pid算法用在动力定位上,不知道那个前辈搞过这个?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
36 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
乾坤幻影
2011-08-16
打赏
举报
回复
请问楼主现在的pid算法的项目还有没有印象了?小弟现在也在做一个用到这个算法的项目,有几个不明白的地方呢。。。
lijian22500
2009-08-17
打赏
举报
回复
成都信息工程学院,不是好学校。
找工作的人太多了,哪有不愁哦
wissup
2009-08-17
打赏
举报
回复
哈哈,看来你对控制是有点理解了!
研究生都愁工作呀?啥学校,这年头,混饭吃不容易!
lijian22500
2009-08-17
打赏
举报
回复
是计算机应用的研究生喽,要毕业,愁工作呢!
lijian22500
2009-08-17
打赏
举报
回复
你的 C(动力实际控制量) = C(原有的动力PID控制量)+ C(原有的方向控制量)* α
公式不错,让动力大小和方向有了个联系,在程序可以试试效果怎么样。我原先的意思是用两个PID,一个控制输出动力大小,一个控制方向。现在想想好像没有必要,直接得方向偏角,输给舵,又让这个方向影响动力大小就得了。方法好想比较简单,不知道这个方法的效果怎么样。用在实际中,当然看重的就是它的工程效果。
对于神经网络和模糊控制 我只是听说,没接触过,不懂,要是对项目有用,还得去看看。
wissup
2009-08-14
打赏
举报
回复
呵呵,这样也可以叫做解耦的控制,就是本身是有耦合的量,你不在输入端做而已,而在输出端做,你可以再原本给动力的控制量上再加上一个系数*原本控制方向的输出量,用公式可以表示为:
C(动力实际控制量) = C(原有的动力PID控制量)+ C(原有的方向控制量)* α,α表示系数,可正可负,看你怎么调整了。你说的意思我不是特别懂。
这种就是典型的解耦控制的具体实现了,不过,工程调试要费点时间的,如果调不好,比较麻烦的~,因为你一般不会去建立精确的的数学模型,不能仿真,所以调试有点麻烦的,不过我们应该有的是青春哇!
这种方法应该是最经典的控制算法,有一定的弊端和缺点,这些论文你应该上面有说。如果你精度要求很高很高,那就只有考虑考虑模糊和神经网络的高级玩意了,费时费力费脑子。如果有研究,记得告诉我一下!呵呵。。。
如果你会看控制的方框图的话,这种就比较好理解一点。光文字,没有一张图好!
顺便问句,你是本科生,还是研究生?
lijian22500
2009-08-13
打赏
举报
回复
你说的用两个PID控制器,我有所启示,确实可采用两个PID算法,一个通过当前位置和目标位置的距离查,经过PID算法,计算动力(或着叫速度),另一个当前位置的方向,和要当前位置到目标位置的角度(即为要调整的角度),做为e(t)通过PID算法,计算要调整的位置。
这样问题也来了,一是,直接将位置差,和角度差作为要调整的参数,不经过PID算法,有什么区别。那道只有引入电动桨和舵,这个PID才有意义。
二是,这桨调整和舵调整是有关联的,很明显,当物体离目标位置比较远的时候,而且方向也向着偏离的方向,那么当我们调整的时候,一开始速度或动力是不能太大的,要是大了,就偏离更远了,耗能,且调整回原位在时间上就慢了;还不能小了,小了这个动力调整回原位在时间上会慢。到底取什么值,值得考虑。方向和动力在这里能体现关联吗,是不是通过调整这两组的PID参数就能实现,要是不行,你有什么好的建议吗。
还有就是多输入多输出的问题,解决这类问题,(有耦合的),工程应用一般怎么处理的,我看论文上有说用神经网络的。但它没说的PID控制。又根据资料说,在控制回路中,90%都是用的PID算法,是不是神经网络不够成熟,所以问问工程上成熟的做法是什么。
其实我们这个系统真算是多输入,多输出的。
lijian22500
2009-08-13
打赏
举报
回复
看来一时半会儿,我是搞不定 这个东西啊
wissup
2009-08-13
打赏
举报
回复
QQ我不是经常上了,所以就不告诉你了!呵呵
wissup
2009-08-13
打赏
举报
回复
其实,我的意思是说,你单独一个距离的偏移,经过PID运算,然后既要控制舵,又要控制桨,这样貌似不好弄的呀,可以是可以,你把距离的结果乘以一个系数,给桨,然后又乘以一个系数,给舵。一般而言,应该是方向的你要给个方向的偏差,距离上的差距你要给个距离的偏差。距离的调整用电动桨,方向的调整用舵。
这样,对整个系统而言,是多输入多输出的,但是你分到每一个具体的回路上,还是单一的控制,这个系统由多个闭路形成,比如说,你先控制方向形成一个回路,然后桨又形成一个回路,先调整好方向,然后再施加桨的动力呀。
上面说的都是逻辑上的思路,具体应用时,是直接给硬件的。比如说,你软件上得到PID的结果了,你可以送去显示,也可以分别给不同的硬件去输出哦,至于硬件怎么做,那就要问问做硬件的人了。比如说我们上位机,是windows系统的,你应用程序计算了一个数,你这个数要送到网络上,可能你调用winsock控件,送到打印机上,你可能调用打印机相关的类。只不过,你在windows上,调用相关控件或类了,就相当于对直接的硬件操作了呀。
另外,控制更讲究的是思想,PID只是一个很基础的算法,可以在这个算法上面玩出很多花样,当然,至于为什么PID是可以的,可能就需要控制理论的相关知识。但是,我们不做理论验证,而是直接应用,所以,单一的PID控制未必可以达到那么好的控制效果,你就可以想办法做点其他的了。举个例子,比如说,你用桨去控制动力了,可能动力开大了,或是开小了,要精确控制,它可能在目标位置上动来动去,那这实际上就是单纯的PID控制结果,因为涉及到3个参数计算呀,不能100%控制得那么好,这个时候,你可以在没有到达那个位置之前,关闭桨,让其靠惯性到达位置,由于没有动力了,所以到达位置以后就停止了,不动了,至于什么位置上关闭动力,那就是要调试的。
至于你提到的多输出多输出的东东,控制系统上是存在这么一种系统,而这种系统更多的输入的变量都是相互影响的,我们称之为耦合,比如在造纸过程中,需要将纸浆沉淀,得到一定浓度的纸浆,这个时候需要用水来混合原有的纸浆,这时,水大水小跟纸浆浓度是两个相互关联的,这个时候,你要单独一个控制水,就比较麻烦了,因为纸浆浓度时不断变化得,而纸浆的浓度也是需要控制的。所以说,这种控制系统用单纯的PID控制算法是没有办法实现的,但是如果在这个基础上叠加其他控制思想,比如说计算浓度和水的比值,稳定纸浆浓度等等,就会很好的实现。
这个例子不是特别的好,可能跟你查论文查书有所出入,只是想介绍一下这个意思。
还有,你查论文时,得到的什么什么船舶动力控制,更高级的抽象是位置随动系统,比如说导弹飞行,需要定位角位移,就是方向,还有就是线位移(不知道这个名词对不对??),就是距离,这两种位移称为空间位移。你可以循着这个方向,去查查相关的资料,仔细研究研究可能会有所启发。
等你好好做过了这个项目以后,你就一目了然了,控制就是这么回事,实现是一回事,理论又是一回事,千万不要乱看论文,都是唬人的东东,没啥意思!说不定你看了好多好多,大家说的都一样,天下文章一大抄呀!
lijian22500
2009-08-13
打赏
举报
回复
[Quote=引用 28 楼 wissup 的回复:]
如果你是做个小项目来玩的,我觉得上述方法可行,就是难看点,反正玩玩的嘛!
如果你是做个卖钱的,或是完整的科研或是怎么地,对精度有要求的。那么就是将方向,速度等作为两个回路控制,先控制好方向,再控制好速度,然后每隔一定的时间,要去调整,不然由于外力作用,比如说风啊,水的阻力呀等等,会运动偏了,或是实时调整也行。每个回路用PID去控制。这种方法应该可行。
如果你是做高精度的,这种方法就玩不转了,你只有好好考虑考虑用模糊控制或是神经网络啥的等等,这种东西一般需要建模仿真,如果直接上,人工调整,需要好长时间才能搞定。比调几个PID参数啰嗦多了,而且还涉及到一些理论知识,麻烦的,我也不懂了!
祝福LZ!
[/Quote]
wissup说的是,我也这么想,做工程项目的时候,采用两个PID回路控制,毕竟工程要的可靠。做论文就采用你说的第三种方案。吹忽吹忽!
lijian22500
2009-08-13
打赏
举报
回复
我觉的我要做的系统更想动力定位,但是我在船舶动力定位论文方面没有看到插补算法,我会去看看的。
从当前点到目标点,那是一个缩影,其实我希望让物体在一个经纬度上保持不变(一个小的范围)。我看你上面第一段,第二段说的挺简单的,现在还没涉及到设备,要是加入设备就参数就比较多了,像陀螺仪,风力,风向,还有原来说的GPS信息。是一个闭合的系统,结果的输出会造成陀螺仪,风力风向仪读取的参数。耦合是肯定的。你说解耦,不知道效果怎么样。
你说看一步走一步,运动轨迹是折线,很生硬,运动不连贯,对电动螺旋桨的耗电量也是一个考验。
我现在的想法:
系统输入的是两个参数,分别:为当前点和目标点的距离差,船头方向和当前点目标点的夹角。
而要输出的参数为,动力(也可为速度),还有一个为转向(舵的转向)。
我想采用两个PID算法,将夹角作为参数去控制第一个PID算法,让它影响动力。因为角度越大,这个动力或速度就不能太快,太快了离目标点就更远了。当角度变小后,当变成0,即船头的方向就是目标点的方向,这个时候夹角影响的动力(速度)就变的很大。
这样也算是一种耦合,让夹角影响动力(速度)。
这样是不是可行?
wissup
2009-08-13
打赏
举报
回复
如果你是做个小项目来玩的,我觉得上述方法可行,就是难看点,反正玩玩的嘛!
如果你是做个卖钱的,或是完整的科研或是怎么地,对精度有要求的。那么就是将方向,速度等作为两个回路控制,先控制好方向,再控制好速度,然后每隔一定的时间,要去调整,不然由于外力作用,比如说风啊,水的阻力呀等等,会运动偏了,或是实时调整也行。每个回路用PID去控制。这种方法应该可行。
如果你是做高精度的,这种方法就玩不转了,你只有好好考虑考虑用模糊控制或是神经网络啥的等等,这种东西一般需要建模仿真,如果直接上,人工调整,需要好长时间才能搞定。比调几个PID参数啰嗦多了,而且还涉及到一些理论知识,麻烦的,我也不懂了!
祝福LZ!
wissup
2009-08-13
打赏
举报
回复
工程应用当中神经网络,模糊控制都是唬人的,一般没有完整的数学建模情况下,这个根本不顶用。工程应用当中最多的还是PID算法,而且多数是单回路,连两个回路的都比较少。
如果有耦合的,一般都是解耦,就是乘系数的那种,减少耦合,然后把值加起来。
一是,直接将位置差,和角度差作为要调整的参数,不经过PID算法,有什么区别。那道只有引入电动桨和舵,这个PID才有意义。
是引入偏差,然后经过PID运算,再输出调整量去调整。
还有控制时,你不断计算呀,隔一定时间,判断一下,然后调整,最理想的情况就是方向对,速度对,然后运动轨迹是直线。
所以,其实我觉得,你这个控制不需要用PID控制,你应该学习过计算机图形学,那里边那种画直线的插补算法,好像就能解决你的第2个问题,就是走一步,看一步,运动轨迹是多段折线。你每次调整的就是90°方向,然后运动距离小一点。先转好角度,然后再做直线运动。
这样不可以么?
wissup
2009-08-12
打赏
举报
回复
LZ,你是在校学生,还是什么,怎么还做航模的?
搞了半天,你是不明白PID运算结果是干什么用的呀!你想想了,你的控制手段是电动桨和舵,那么就有两个问题了:
1、电动桨是动力了,是吧,你要不要控制多大的动力的,如果要的话,多大动力靠谁给呢,就是你算的结果了。
2、舵是用来控制方向的,如果要控制,那又要谁给这个控制量呢,也可以是这个结果。
比如说,你现在知道了目标点和当前船的点不是在同一个位置上,那么需要控制动力和方向两个变量,控制动力是说不能太大也不能太小,太大了,要冲过去了,完了以后你又要倒回来,太小了,你又到不了。那方向呢,就更明显了,就是方向错了,就是方向有偏差了,那就调整回来。
说得明显一点,控制的思想就是:我知道有个偏差,对吧,那我就需要一个量不断去纠正这个偏差,那这个量又是什么样的呢?就是对原有的偏差进行PID运算的结果了。那为什么PID运算结果可以呢,那就是另外一个话题了,有时间,小伙子可以慢慢研究去。
好的,思想讲完了。下面以我不丰富的C语言知识解释一下你这个程序,讲错了不要怪我哈:
struct _pid {
struct point evn; //当前位置值
struct point dest; //目标位置值
double integral; //积分项值
double pgain; //比例增益
double igain; //积分增益
double dgain; //微分增益
double deadband; //死区
double last_error; //上次偏差
};
//err为当前位置和目标位置的距离偏差
err = sqrt(((pid->evn.x) - (pid->dest.x))*((pid->evn.x) - (pid->dest.x)) + ((pid->evn.y) - (pid->dest.y))*((pid->evn.y) - (pid->dest.y)));
后面那些程序是其中一个具体的PID算法的实现。
你的这个程序说明偏差量为一个距离,然后经过PID运算,得到一个结果,这个结果就是控制输出量,要具体给电动桨或是舵,才有实际的物理意义呀!
我怎么看这个程序就能控制好,个人表示怀疑!
lijian22500
2009-08-12
打赏
举报
回复
首先 谢谢 wissup 那么热心 帮忙解答问题。
我是在校学生,跟一个导师“做项目”,我也不知道是不是项目了,是他向学校申请的项目,关于普适计算移动学习的,这个项目很广泛,没什么实际意义。他就像拿这部分经费搞点自己的事,现在他想做一个热气球(也可能是飞艇)空中定位系统。大概是地面通过无线装置控制热气球,要求能控制定位,和按照地面的指令按轨迹飞行。后来发现热气球忒贵,就像在航模船上完成系统,成功了,考虑移植到热气球上。那是后话了。
船上系统设想:
买个航模船,装上arm板,在arm板上插上 zigbee (无线通信用的),GPS模块、陀螺仪,风力风向仪,让电动桨、舵连上板子。通过陆地上的电脑控制它航行,我要做的就是保持它平衡(就是定位),我查了资料,发现就是论文中的船舶动力定位系统。但是说的都很大概,不懂。
因为上面的设备,除arm板,zigbee和GPS模块,别的都没见到面,所以怎么控制电动机,舵,怎么从陀螺仪,风力风向仪上读数据我还不清楚。
现在我们在搞测试程序,就是让个人拿查有GPS模块的arm板在操场上跑,要求控制端能够显示它的位置,并能提供“动力定位”。其实没动力。我下了PID算法,要是测试,我想PID函数返回的可以理解为速度或动力,而方向不由PID得出,直接为物体当前点当目标点。
我想问一下,要是按你说的那样,要把PID计算的结果转成对舵的参数和对电动桨的参数两个参数,这怎么分?
要是以后用到船上,那个系统应该是闭路的,要输入多个变量参数,输出也是多个变量参数,PID能胜任吗,
按论文说可以,但都没说怎么把PID得到的数据分成多个推力器(我们这为电动桨,舵)的参数?
gooogleman
2009-08-11
打赏
举报
回复
哈哈,这要对控制啊,还有数学有较深了解才可以融汇贯通的。
lijian22500
2009-08-11
打赏
举报
回复
代码如下:
#include <stdio.h>
#include<math.h>
struct point
{
double x;
double y;
};
struct _pid {
struct point evn;
struct point dest;
double integral;
double pgain;
double igain;
double dgain;
double deadband;
double last_error;
};
double pid_calc(struct _pid *pid)
{
double err;
double pterm, dterm, result, ferror;
err = sqrt(((pid->evn.x) - (pid->dest.x))*((pid->evn.x) - (pid->dest.x)) + ((pid->evn.y) - (pid->dest.y))*((pid->evn.y) - (pid->dest.y)));
if (fabs(err) > pid->deadband)
{
ferror = err;
pterm = pid->pgain * ferror;
if (pterm > 100 || pterm < -100)
{
pid->integral = 0.0;
}
else
{
pid->integral += pid->igain * ferror;
if (pid->integral > 100.0)
{
pid->integral = 100.0;
}
else if (pid->integral < 0.0) pid->integral = 0.0;
}
dterm = ((double)(err - pid->last_error)) * pid->dgain;
result = pterm + pid->integral + dterm;
}
else result = pid->integral;
pid->last_error = err;
return (result);
}
void main(void)
{
double display_value;
double count=0;
struct _pid warm,*pid;
pid = &warm;
warm.dest.x = 0.0;
warm.dest.y = 0.0;
warm.pgain = 1.0;
warm.igain = 0.0;
warm.dgain = 0.0;
warm.deadband = 2.0;
warm.evn.x = 0.0;
warm.evn.y = 0.0;
warm.last_error = 0.0;
warm.integral = 0.0;
while(count<=20)
{
printf("Please input x,y of post!\n");
scanf("%lf %lf",&warm.evn.x, &warm.evn.y);
display_value = pid_calc(&warm);
printf("\n%lf\n", display_value);
count++;
}
}
lijian22500
2009-08-11
打赏
举报
回复
[Quote=引用 17 楼 wissup 的回复:]
哥们,你学计算机的,就不要从控制理论从头看了,等你看懂了,黄花菜都凉了!
其实,没有你想的这么难,这里推荐一本书《新型PID控制及其应用》 陶永华 机械工业出版社,里边介绍的东西仔细看,就可以编程实现它了。
还有你要搞清楚几个问题:
1、控制的目标是什么?
2、控制的手段是什么,即通过什么东西去控制?
这里说的就是PID其实参数是难调,但是时间久了自然就会了,关键你要理解P、I、D三个参数干什么用的,然后才好调。
[/Quote]
控制的目标 就是让物体定位,我这里是航模船定位。 手段是航模船上的电动桨和舵。
现在还没有买船模,所以只是个模拟程序,让一个人拿着gps在旷地上走,在电脑上显示这个人,并表示出这个人偏离定位点,给出一个长短不一箭头来表示。
参数不忙定下.
我下了个pid控制的程序,改了改,感觉这个目标是一个坐标点,当前物体也是个坐标点。这个函数的输出,当p为1,i和d为0是,这个输出就是当前点和目标点的距离了。当i和d不为0,得出的数据我不知道能表示什么,速度,距离??
wissup
2009-08-11
打赏
举报
回复
哥们,你学计算机的,就不要从控制理论从头看了,等你看懂了,黄花菜都凉了!
其实,没有你想的这么难,这里推荐一本书《新型PID控制及其应用》 陶永华 机械工业出版社,里边介绍的东西仔细看,就可以编程实现它了。
还有你要搞清楚几个问题:
1、控制的目标是什么?
2、控制的手段是什么,即通过什么东西去控制?
这里说的就是PID其实参数是难调,但是时间久了自然就会了,关键你要理解P、I、D三个参数干什么用的,然后才好调。
加载更多回复(16)
四轴
PID
算法
讲解(单环
PID
、串级
PID
).docx
在整定
PID
参数时,
PID
三个参数的大小都不是绝对的,而是相对的。也就是说,如果发现一个参数比较合适,就把这个参数固定死,不管别的参数怎么变化,永远不动前 面固定的参数是错误的;如果是串级调节系统,在整定参数时,一般把主、副调隔离开来,先整定一个回路,再全面考虑。一般而言,先整定内回路。把
PID
参数隔离开来,先去掉积分、微分作 用,让系统变为纯比例调节方式,再考虑积分,最后考虑微分
一文带你
搞
懂
PID
算法
及参数整定
PID
算法
的详细介绍,详细的介绍了
PID
算法
控制的本质,包括位置式
PID
控制以及增量式
PID
控制,以及
PID
参数的正定方法。
标准
PID
算法
的实现
PID
算法
的不一样的讲解,想
搞
PID
的可以看看。
PID
算法
概念详解 初学者值得一看
讲解PID
算法
的基本概念,深入浅出,通俗易懂,初学者必备。。。
一文
搞
懂
PID
控制
算法
PID
算法
是工业应用中最广泛
算法
之一,在闭环系统的控制中,可自动对控制系统进行准确且迅速的校正。
PID
算法
已经有100多年历史,在四轴飞行器,平衡小车、汽车定速巡航、温度控制器等场景均有应用。...
C语言
69,382
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章