PID控制本版一 (M100可用)
版本1 云台+无人机
https://en.wikipedia.org/wiki/PID_controller

https://github.com/tekdemo/MiniPID
详细讲解
PIDController.h
#ifndef _POSITION_CONTROLLER_H
#define _POSITION_CONTROLLER_H
//#include "RefPoint.h"
#include <iostream>
#include <vector>
#include <stdint.h> class MoSLAM;
class PIDController{
public:
/* coefficients for P, I, D*/
double kP, kI, kD;
/* coefficient for filtering the derivative values */
double kN;
double _P, _I, _D;
bool _bFirstFrame;
//protected:
double old_err, cur_err;
//////////////////////////////
double errs[20];
/* error integration*/
double cur_I;
/* error derivative*/
double old_D;
public:
PIDController():kP(0.0),kI(0.0),kD(0.0){reset();}
void loadParam(const char* filePath);
void setParam(double _kP, double _kI, double _kD, double _kN); void reset();
double getOutput(double curerr, double dt);
};
/*
class PositionController{
protected:
uint32_t _oldts;
///* reference point
RefPoint _refPt;
///* error to the reference point
const MoSLAM* _moSLAM;
PIDController _pidX, _pidY, _pidZ;
public:
PositionController():_oldts(0),_moSLAM(0){}
void loadParameters();
void setMoSLAM(const MoSLAM* moSLAM){
_moSLAM = moSLAM;
}
void reset(){
_oldts = -1;
_pidX.reset();
_pidY.reset();
_pidZ.reset();
_refPt.setFinished();
//std::cout <<" reset is called!" << std::endl;
}
void moveTo(RefPoint refPt){
reset();
_refPt = refPt;
_refPt.setRunning();
}
void getXYZErrors(double scale, const double* R, const double* t, double err[3]);
void correct(double dt, double scale, const double* R, const double* t, double roll, double pitch, double yaw);
void update();
};
void sendMove(double req_phi, double req_theta, double req_speed);
*/
#endif
PIDController.cpp
#include "PIDController.h" #include <fstream>
using namespace std;
void PIDController::loadParam(const char* filePath)
{
std::ifstream file(filePath);
file >> kP >> kI >> kD >> kN;
cout <<" kP:" << kP << " kI:" << kI << " kD:" << kD << " kN:" << kN << endl;
file.close();
}
void PIDController::setParam(double _kP, double _kI, double _kD, double _kN)
{
kP = _kP;
kI = _kI;
kD = _kD;
kN = _kN;
}
void PIDController::reset(){
old_err = 0;
cur_err = 0;
old_D = 0;
cur_I = 0;
old_D = 0;
for (int i = 0; i < 20; ++i)
{
errs[i] = 0;
}
_bFirstFrame = true;
}
double PIDController::getOutput(double curerr, double dt)
{
old_err = cur_err;
cur_err = curerr;
///////////////////////////////
for (int i = 0; i < 10; ++i)
{
errs[i + 1] = errs[i];
}
errs[0]=curerr;
/////////////////////////// double s = 0;
if( !_bFirstFrame)
{
//assert(dt > 0);
cur_I += cur_err*dt;
_P = cur_err;
_I = cur_I;
double Derr = (cur_err - old_err)/dt;
_D = (kN*dt*Derr + old_D)/(kN*dt + 1);
old_D = _D;
}else
{
_P = cur_err;
_I = 0;
_D = 0;
_bFirstFrame = false;
}
//////////////////////////////
double aveerr = (errs[0]+errs[1])/2;
double pasterr =0;
for (int i=1; i<=3; ++i) pasterr+=errs[i];
pasterr/=3;
_D = aveerr - pasterr;
//cout << " _P" << _P << " _D" << _D << endl; //<< " _I" << _I
return kP*_P + kI*_I + kD*_D;
}
使用
#define IMAGECETREX 960
int main(int argc, char* argv)
{
PIDController pid;
pid.reset(); //初始化PID
pid.setParam(0.32,0.009,0.0028,0); //基本参数
int x = 10;
int diffX = (x - IMAGECETREX);
while (1)
{
x = x - pid.getOutput(diffX, 0.04);
diffX = (x - IMAGECETREX);
//cout << "diffX = " << diffX << endl;
if (diffX == 0)
system("pause");
cout << "x = " << x << "diffX = " << diffX << "id.getOutput(diffX, 0.04) = "<< pid.getOutput(diffX, 0.04) << endl;
}
return 0;
}
PID控制本版一 (M100可用)的更多相关文章
- PID控制本版二
https://gist.github.com/bradley219/5373998 特色: 比起第一版,加入了 最大最小值限制,暂无测试. PIDImpl( double dt, double ma ...
- 【iCore3应用开发平台】发布 iCore3 应用开发平台PID控制代码
说明:1.本代码包包含FPGA和STM32F407两部分内容2.FPGA工程为出厂代码FPGA工程,版本为REV43.STM32F407为只含PID控制的ARM工程4.在使用风扇过程中,请勿将手伸入扇 ...
- 两轮自平衡小车双闭环PID控制设计
两轮自平衡小车的研究意义 ...
- 数字式PID控制的应用总结
PID控制是一个二阶线性闭环控制器,通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能.PID控制优点:a. 技术成熟,b. 易被人们熟悉和掌握,c. 不需要建立数学模型 ...
- PID控制学习笔记(二)
不管是基本的PID控制还是变形的PID控制算法,其核心都是对输入信号(设定值信号.测量信号或者偏差信号等)做基本的比例.积分.微分运算,最终提供给被控过程良好的调节信号. 在过程控制仪表,特别是在数字 ...
- SLAM+语音机器人DIY系列:(四)差分底盘设计——5.底盘PID控制参数整定
摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...
- MATLAB-离散系统的数字PID控制仿真
%PID Controller clear all; close all; ts=0.001; %采样时间=0.001s sys=tf(,]); %建立被控对象传递函数 dsys=c2d(sys,t ...
- 了解PID控制
@2019-03-07 [小记] 了解PID控制 比例 - 积分 - 微分 积分 --- 记忆过去 比例 --- 了解现在 微分 --- 预测未来
- PID控制最通俗的解释与PID参数的整定方法
转自->这里 PID是比例.积分.微分的简称,PID控制的难点不是编程,而是控制器的参数整定.参数整定的关键是正确地理解各参数的物理意义,PID控制的原理可以用人对炉温的手动控制来理解.阅读本文 ...
随机推荐
- 发布webservice之后调用不通
在websrvice发布文件的webconfig中加入 <httpRuntime maxRequestLength="102400" /> <webServic ...
- C#新功能--命名参数
命名参数会潜在的改变编写代码的方式.这个新功能能使代码更容易阅读和理解. 例如,看一下System.IO名称空间中的File.Copy()方法,它一般构建为 File.Copy(@"C:\m ...
- 造轮子,模仿WPF的UI框架,还没完善。。。
Wtf(暂时命名,随便起的 = _=),模仿WPF的框架,还没有完善,只有简单的基础元素,支持数据绑定.虽然支持mono但是mono有bug 写这个只是兴趣爱好,感觉也没多大意义了,如果这个UI框架完 ...
- [javaEE] HTTP协议总结
OSI网络7层协议 物理层 ==> 数据链路层 ==> 网络层ip ==> 传输层 TCP UDP ==>会话层 ==>表示层 ==> 应用层 HTTP FTP S ...
- javasript中var、let和const区别
let和const都是es5,es6新版本的js语言规范出来的定义,在这以前定义一个变量只能用var.let和const都是为了弥补var的一些缺陷而新设计出来的. 简单来说是: let是修复了var ...
- 去除input获取光标时的默认样式
给input加上样式 outline:none;
- array.js
// “最后加” concat 连接两个或更多的数组,并返回结果. var a = ['a','b','c']; var b = ['x','y','z']; var c = a.concat(b,t ...
- 微信 H5 支付流程以及一些坑
原文:https://blog.niceue.com/front-end-development/wechat-h5-payment-process-as-well-as-some-pits.html ...
- 使用CSS兄弟选择器完成复杂垂直边距(vertical margins)的设计
-------------------sibling选择器如何在完成复杂设计要求的同时,保持CSS可读 这是web前端开发过程中开始简单逐步变的复杂的例子之一:将一篇文章中的所有元素应用垂直边距(ve ...
- loadrunner 脚本开发-int型变量和字符串的相互转换
脚本开发-int型变量和字符串的相互转换 by:授客 QQ:1033553122 字符串转化为int型变量 Action2() { int j = 0; j = atoi("12345&qu ...