版本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. 发布webservice之后调用不通

    在websrvice发布文件的webconfig中加入 <httpRuntime maxRequestLength="102400" />  <webServic ...

  2. MVC和WebForm区别

    WebForm的理解 1. WebForm概念 ASP.NETWebform提供了一个类似于Winform的事件响应GUI模型(event-drivenGUI),隐藏了HTTP.HTML.JavaSc ...

  3. LeetCode子域名访问计数-Python3.7<五>

    上一篇:LeetCode 键盘行<四> 题目:https://leetcode-cn.com/problems/subdomain-visit-count/description/ 一个网 ...

  4. SQL Server 数据类型映射(转载)

    SQL Server 数据类型映射 SQL Server 和 .NET Framework 基于不同的类型系统. 例如,.NET Framework Decimal 结构的最大小数位数为 28,而 S ...

  5. 将第三方包安装到maven本地仓库

    今天在做jasper report生成pdf文档的时候,需要引入亚洲字体jar包.maven仓库是有这个jar包,但是在项目pom文件始终不能下载.无奈只有将jar包安装到maven本地仓库. 1 将 ...

  6. 2018-01-03 烂尾工程: Java实现的汇编语言编译器

    在半年前的中文编程的尝试历程小记中简单介绍了这一项目. 由于短期内估计不会继续进行, 而且这个项目好像是至今个人在中文命名实践中的代码量最大的一个项目, 谨在此作一小结. 最新的源码库在program ...

  7. 【代码笔记】Web-JavaScript-JavaScript语法

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

  8. python之管道, 事件, 信号量, 进程池

    管道:双向通信 2个进程之间相互通信 from multiprocessing import Process, Pipe def f1(conn): from_zjc_msg = conn.recv( ...

  9. 从零开始学习html(六)开始学习CSS,为网页添加样式

    一.认识CSS样式 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type&quo ...

  10. recovery 升级过程执行自定义shell命令

    有时候我们需要,在升级的过程中,执行一些shell命令,来完成我们的一些需求,利用升级过程,进行一些特殊化的操作,思路如下: 第一: 把我们需要执行的命令,写成一个test.sh脚本,然后在recov ...