看了看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...