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控制的原理可以用人对炉温的手动控制来理解.阅读本文 ...
随机推荐
- S3C2440 DMA 驱动示例
将 DMA 抽象为一个字符设备,在初始化函数中调用 void *dma_alloc_writecombine(struct device *dev, size_t size, dma_addr_t * ...
- ASP.NET Core配置环境变量和启动设置
在这一部分内容中,我们来讨论ASP.NET Core中的一个新功能:环境变量和启动设置,它将开发过程中的调试和测试变的更加简单.我们只需要简单的修改配置文件,就可以实现开发.预演.生产环境的切换. A ...
- CentOS7日期时间设置方法以及时间基本概念介绍
在CentOS 6版本,时间设置有date.hwclock命令,从CentOS 7开始,使用了一个新的命令timedatectl. 一.基本概念 1.1 GMT.UTC.CST.DST 时间 (1) ...
- sort、sorted高级排序-Python3.7 And 算法<七>
1.sort(*, key=None, reverse=False) sort()接受两个参数,这两个参数只能通过关键字(关键字参数)传递. 参数key:带一个参数的函数(排序时,会依次传入列表的每一 ...
- OSX系统下配置Apache+PHP+MySQL+Navicat
概述 OSX系统对于PHP运行非常友好,我们只需要进行简单的配置便可以开始进行使用,本篇文章将一步一步地介绍Apache.PHP和MySQL的安装与配置,为开始进行开发铺好路 Apache 启动Apa ...
- blfs(systemv版本)学习笔记-编译安装i3-wm平铺式窗口管理器
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! i3-wm项目的官网:https://i3wm.org/ 首先需要lfs基础上编译安装完整的xorg服务 我的xorg服务编译安 ...
- canvas实现验证码
在通常的登录界面我们都可以看到验证码,验证码的作用是检测是不是人在操作,防止机器等非人操作,防止数据库被轻而易举的攻破. 验证码一般用PHP和java等后端语言编写. 但是在前端,用canva或者SV ...
- node.js入门学习笔记整理
(1)node Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node与javaScript的区别在于,javaScript的顶层对象是window,而no ...
- HTML 简单归纳 -- 前端知识
web前端 Internet:是一个全球性的计算机互联网络,中文名称“因特网”.“国际互联网”.“网际网”等等: Internet提供的服务:http.ftp.Telnet.email.www.bbs ...
- JavaScript大杂烩1 - 理解JavaScript的类型系统
随着硬件水平的逐渐提高,浏览器的处理能力越来越强大,本人坚信,客户端会越来越瘦,瘦到只用浏览器就够了,服务端会越来越丰满:虽然很多大型的程序,比如3D软件,客户端仍然会存在,但是未来的主流必将是浏览器 ...