谁搞过PID算法?

lijian22500 2009-08-10 11:16:00
我想把pid算法用在动力定位上,不知道那个前辈搞过这个?
...全文
1286 36 打赏 收藏 转发到动态 举报
写回复
用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)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧