用Python實現的PID控制演算法的演示

2021-10-04 20:19:08 字數 1615 閱讀 9175

看了看pid控制演算法的原理,自己用python的matplotlib簡單寫了乙個控制小球到指定位置的小演示。

如果小球不在指定的高度,就計算誤差,再輸入乙個控制訊號——這裡是加速度a,以便驅動小球運動,從而改變小球的位置。

不停的計算:計算高度誤差,計算輸出的訊號——加速度a,計算新的速度,計算新高度。

如果只考慮小球當前位置和指定高度的誤差,始終會來回擺動,無法進入穩定狀態。

如果用到pid演算法,可以很好的進入穩定狀態。

因為是虛擬環境,沒有考慮摩擦力,也就用不上pid演算法的積分項,也是偷懶,就相當於pid裡的pd兩部分考慮了。

# -*- coding: utf-8 -*-

# author: [email protected]

import matplotlib as mpl

from matplotlib import pyplot as plt

import numpy as np

# 設定字型

# mpl.rcparams['font.sans-serif'] = ['simhei'] # 指定預設字型

# mpl.rcparams['axes.unicode_minus'] = false # 解決儲存影象是負號'-'顯示為方塊的問題

# 定義資料

itor = 1

x1 = 5 # 橫座標固定為5,只改變小球的高度

x2 = 15 # 初始縱座標

xp = 10 # 預設的縱座標

v = 0 # 速度

a = 0 # 加速度

kp = 0.2

kd = 0.2

err1 = x2 - xp

err0 = 0

max_itor = 50000

#plt.figure(figsize=(12, 8), dpi=100)

plt.ion()

while itor < max_itor:

# 清空舊的畫布

plt.cla()

plt.xlim((-1, 20))

plt.ylim((-1, 20))

plt.plot([-1, 20], [xp, xp], 'r-')

# rgeion

a = kp*(1.0*err1 + kd*(err1-err0)) # 按pd演算法計算要給予的加速度

# a = kp*(1.0*err1) # 不用pd演算法

v = v - a

x2 = x2 + v

# endregion

err0 = err1 # 保留舊的誤差

err1 = x2 - xp # 計算新的誤差

plt.scatter(x1, x2, # 散點的橫、縱座標序列

s=30, # 點

c='blue',

label="pd algorithm")

plt.legend() # 顯示圖例說明

itor = itor + 1

plt.pause(0.008)

通過這個小演示案例,更熟悉了一下matplotlib,確實功能強大。

用matplotlib的互動模式,能很簡單的完成演示動畫。

Pid控制演算法 增量型pid演算法的C 實現

上一節中介紹了最簡單的位置型pid的實現手段,這一節主要講解增量式pid的實現方法.實現過程仍然是分為定義變數 初始化變數 實現控制演算法函式 演算法測試四個部分,這裡直接給出 了。pid.h ifndef pid h define pid h typedef struct pidpid class...

串級PID控制(多閉環PID控制)的理解

網路上很多雙閉環或者三閉環pid控制的講述,其實就是串級pid控制,之前一直沒能理解,更不知道如何應用。現在用伺服電機為例,一起理解一下pid串級控制。伺服電機一般為三個環控制,所謂三環就是3個閉環負反饋pid調節系統。最內的pid環就是電流環,此環完全在伺服驅動器內部進行,通過霍爾裝置檢測驅動器給...

對PID控制的理解

p 比例 i 積分 d 微分 比例控制使反應變快 積分控制使反應滯後 微分控制使反應超前 模糊pd方式控制舵機轉向,反饋控制 分段模糊pid方式控制電機轉速,pwm控制功率 位置型pid include include struct pidpid 專案中獲取到的引數 void pid init fl...