zhu1 发表于 2010-11-15 13:22:54

巡线小车pid算法的实现?真正用的实践中的

我们的小车提速行驶时就会很不稳定,目前想运用pid算法,但是看得pid都只是原理,真正在实践中如何运用?第一次做巡线小车,还有很多的不懂,大侠们给点建议吧,非常感谢!

lxttian 发表于 2010-11-15 17:16:47

用不着,把参数调好就没问题

maxuedong 发表于 2010-11-19 18:58:07

1楼能说清楚点吗,参数是指哪些啊

zhq1989723 发表于 2011-1-24 20:29:07

不懂。。

syuanwang 发表于 2011-1-24 21:22:09

贴一个我这两天写的离散PID模块吧,已经成功的用于舵机控制。PID是最简单的控制,无法掌握规律的时候用不错。

这个是在ucos里用的,如果裸机跑的话,把FP32换成float。
水平有限,望过路的同学指正。

PID的运作原理是每个控制周期,获取反馈模块提供的当前值,与上级模块提供的目标值进行比较,得到误差值,同时移位更新误差历史。然后output = A*e0 - B*e1 + C*e2就能得到控制输出值。这个控制输出值在不同的上下文中有不同的含义,如果是控制电机,这个控制值可以是转速。
简单的例子就是利用三个位置误差历史,通过运算得到电机的转速,以实现准确定位。

具体的解释这里有一篇论文。
点击此处下载 ourdev_613203OBSZGV.pdf(文件大小:1.30M) (原文件名:基于增量式PID控制实现高精度跟踪机构设计研究.pdf)

头文件:

#ifndef DISCRETE_PID_H_
#define DISCRETE_PID_H_
#include "includes.h"

/*Data Structure*/
typedef struct pid_parameterpack
{
        FP32 fKp;
        FP32 fKi;
        FP32 fKd;
}PID_PP;

typedef struct pid_runtimepack
{
        FP32 fA;
        FP32 fB;
        FP32 fC;
        FP32 fError;
}PID_RP;

typedef struct pid_module
{
        PID_PP cPP;
        PID_RP cRP;
}PID_MODULE;

void PID_Reset(PID_MODULE *pPID,FP32 fTargetVal, FP32 fCurrentVal);
FP32 PID_CalculateControlOutput(PID_MODULE *pPID,FP32 fTargetVal, FP32 fCurrentVal);
#endif /* DISCRETE_PID_H_ */

源文件:
void PID_Reset(PID_MODULE *pPID,FP32 fTargetVal, FP32 fCurrentVal)
{
        //calculate factors
        pPID->cRP.fA = pPID->cPP.fKp + pPID->cPP.fKi +pPID->cPP.fKd;
        pPID->cRP.fB = pPID->cPP.fKp + 2*pPID->cPP.fKd;
        pPID->cRP.fC = pPID->cPP.fKd;

        //set 3 errors to current error
        pPID->cRP.fError = fCurrentVal - fTargetVal;
        pPID->cRP.fError = pPID->cRP.fError;
        pPID->cRP.fError = pPID->cRP.fError;
}

FP32 PID_CalculateControlOutput(PID_MODULE *pPID,FP32 fTargetVal, FP32 fCurrentVal)
{
        FP32 fPIDVal;
        //update errors 0->1->2
        pPID->cRP.fError = pPID->cRP.fError;
        pPID->cRP.fError = pPID->cRP.fError;
        pPID->cRP.fError = fCurrentVal - fTargetVal;

        //calculate pid value
        fPIDVal = pPID->cRP.fError * pPID->cRP.fA
                        - pPID->cRP.fError * pPID->cRP.fB
                        + pPID->cRP.fError * pPID->cRP.fC;

        return (fPIDVal);
}

dhbighead 发表于 2011-1-24 21:41:50

MARK。。。。。。。。
一定要顶楼上的。。。。
之前做过小车。。。没用PID车子跑得乱七八糟。。。

turf456 发表于 2011-1-24 22:10:46

翻翻别人的论文吧。智能车论坛上有好多。

edaworld 发表于 2011-1-24 22:28:28

手机mark

liudaolunhui 发表于 2012-11-15 23:53:36

我顶一个

hclin 发表于 2012-11-16 12:24:58

very good !
但是, 没用 PID 真的就不行吗? 我很怀疑.

YOU1 发表于 2012-12-1 17:11:43

顶一下了

Gost 发表于 2012-12-2 13:49:16

没用pid的也不会的飘过

netawater 发表于 2012-12-2 14:47:45

syuanwang 发表于 2011-1-24 21:22 static/image/common/back.gif
贴一个我这两天写的离散PID模块吧,已经成功的用于舵机控制。PID是最简单的控制,无法掌握规律的时候用不错 ...

学习下!

奋斗2012 发表于 2012-12-2 19:55:41

好东西 学习下

罗飞 发表于 2014-10-17 13:01:21

hclin 发表于 2012-11-16 12:24
very good !
但是, 没用 PID 真的就不行吗? 我很怀疑.

没用PID也可以!算法什么的都是用来解决问题的。只是算法比我们自己的更加精炼,毕竟是好多人好多年搞的,验证的东西

zenghui 发表于 2014-10-17 14:12:31

先占个楼,再仔细看看
页: [1]
查看完整版本: 巡线小车pid算法的实现?真正用的实践中的