版本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可用)的更多相关文章

  1. PID控制本版二

    https://gist.github.com/bradley219/5373998 特色: 比起第一版,加入了 最大最小值限制,暂无测试. PIDImpl( double dt, double ma ...

  2. 【iCore3应用开发平台】发布 iCore3 应用开发平台PID控制代码

    说明:1.本代码包包含FPGA和STM32F407两部分内容2.FPGA工程为出厂代码FPGA工程,版本为REV43.STM32F407为只含PID控制的ARM工程4.在使用风扇过程中,请勿将手伸入扇 ...

  3. 两轮自平衡小车双闭环PID控制设计

                                                                                            两轮自平衡小车的研究意义 ...

  4. 数字式PID控制的应用总结

    PID控制是一个二阶线性闭环控制器,通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能.PID控制优点:a. 技术成熟,b. 易被人们熟悉和掌握,c. 不需要建立数学模型 ...

  5. PID控制学习笔记(二)

    不管是基本的PID控制还是变形的PID控制算法,其核心都是对输入信号(设定值信号.测量信号或者偏差信号等)做基本的比例.积分.微分运算,最终提供给被控过程良好的调节信号. 在过程控制仪表,特别是在数字 ...

  6. SLAM+语音机器人DIY系列:(四)差分底盘设计——5.底盘PID控制参数整定

    摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...

  7. MATLAB-离散系统的数字PID控制仿真

    %PID Controller clear all; close all; ts=0.001; %采样时间=0.001s  sys=tf(,]); %建立被控对象传递函数 dsys=c2d(sys,t ...

  8. 了解PID控制

    @2019-03-07 [小记] 了解PID控制 比例 - 积分 - 微分 积分 --- 记忆过去 比例 --- 了解现在 微分 --- 预测未来

  9. PID控制最通俗的解释与PID参数的整定方法

    转自->这里 PID是比例.积分.微分的简称,PID控制的难点不是编程,而是控制器的参数整定.参数整定的关键是正确地理解各参数的物理意义,PID控制的原理可以用人对炉温的手动控制来理解.阅读本文 ...

随机推荐

  1. python程序编写中常见错误

    1,NameError语法错误 s还没定义,给s赋值就行了 2,IndexError 索引错误 对于列表l1来说,只有4个元素,所以l1的Index只能是0-3,当你所输入的Index不在这范围,就会 ...

  2. springboot使用遇到问题:Class “model.Address” is listed in the persistence.xml file but not mapped

    报错如下: 解决如下: 这是一个Eclipse的怪癖.我最近在创建一个禁用了JPA库配置的新JPA项目时遇到了这个问题,但是在我通过Eclipse New JPA Entity向导创建实体之前没有手动 ...

  3. Apollo源码阅读笔记(一)

    Apollo源码阅读笔记(一) 先来一张官方客户端设计图,方便我们了解客户端的整体思路. 我们在使用Apollo的时候,需要标记@EnableApolloConfig来告诉程序开启apollo配置,所 ...

  4. docker构建自定义镜像

    docker构建自定义镜像 要构建一个镜像,第一步准备所需要的文件,第二步编写Dockerfile文件,比如我现在构建一个java web镜像 第一步:准备java web工程的war包文件(这里假设 ...

  5. JavaScript基础要点

    一.值和类型及运算 JavaScript中的六种基本值类型 数字(number).字符串(string).布尔值(boolean).对象(object).函数(function).未定义类型(unde ...

  6. 小结:ES7——async和await初识

    一.async async其实是ES7才有有的关键字,async的意思是异步,顾名思义是有关异步的操作 async用于声明一个函数是异步的. 通常情况下async.await都是跟随promise一起 ...

  7. 【代码笔记】Web-ionic-select

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  8. 伪类选择器 E:nth-child(n)、E:nth-of-type(n)

    结构伪类是css3新增的类型选择器. E:nth-child(n).E:nth-of-type(n)就是其中之二.搞懂了这两个,基本上跟他俩一家的其他几个兄弟伙基本上也可以弄懂了. 首先先用文字语言来 ...

  9. 虚拟 DOM

    虚拟DOM :virtual dom(以下简称vdom,是vue和react的核心),使用比较简单. 一,vdom是什么,为何会存在vdom 1,什么是vdom:用js模拟DOM结构,DOM操作非常‘ ...

  10. 纯小白入手 vue3.0 CLI - 3.2 - 路由的初级使用

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...