日期:2023-04-09 15:23:56瀏覽量:65156
n20減速電機(jī) 機(jī)器人軟件篇主要介紹PID算法,可以說PID是整個(gè)項(xiàng)目程序的核心,其使用的好壞決定了你的小車能不能自平衡,以及平衡得穩(wěn)定不穩(wěn)定。PID的算法和理論分析網(wǎng)絡(luò)上有很多介紹,這里就不詳細(xì)講解了大家可以自行搜索。基于數(shù)學(xué)模型的介紹有點(diǎn)不好理解,本文從控制學(xué)的角度簡單講解一下PID及其使用方法。
所謂PID就是比例-積分-微分的英文縮寫,但并不是必須同時(shí)具備這三種算法,也可以是 PD, PI,甚至只有 P算法控制,下面分別介紹每個(gè)參數(shù)的含義:
首先需要明確一個(gè)事實(shí)就是,要實(shí)現(xiàn)PID算法,必須在硬件上具有閉環(huán)控制,就是得有反饋。比如控制一個(gè)n20減速電機(jī) 機(jī)器人電機(jī)的轉(zhuǎn)速,就得有一個(gè)測量轉(zhuǎn)速的傳感器,并將結(jié)果反饋到控制器中,而在自平衡系統(tǒng)中,常用的有三個(gè)控制環(huán) — 角度環(huán)、速度環(huán)、轉(zhuǎn)向環(huán)
大家可以想象出每個(gè)閉環(huán)的反饋元件分別是什么嗎,對就是上面元件清單里面包含的 IMU(陀螺儀+加速度計(jì))、編碼器、攝像頭(或者其他可以確定方位的元件比如陀螺儀,磁場計(jì)等)
P(比例):以小車巡線為例,現(xiàn)在需要讓小車跟隨一條軌跡前進(jìn),用PID算法控制方向環(huán),反饋傳感器就假設(shè)為攝像頭。那么小車行進(jìn)中有這么幾種情況:
1、車通過攝像頭發(fā)現(xiàn)自己處在軌跡的左邊,位置誤差值為正,那么就需要向右轉(zhuǎn)向,轉(zhuǎn)向值為正
2、車通過攝像頭發(fā)現(xiàn)自己處在軌跡的右邊,位置誤差值為負(fù),那么就需要向左轉(zhuǎn)向,轉(zhuǎn)向值為負(fù)
3、車通過攝像頭發(fā)現(xiàn)自己處在軌跡的正中間,位置誤差值為0,很歡快地筆直前行,轉(zhuǎn)向值為0
于是我們發(fā)現(xiàn),小車轉(zhuǎn)向值的輸出可以簡單地通過把位置誤差乘以一個(gè)系數(shù)就得到了,而且顯然,誤差越大,得到的轉(zhuǎn)向值也越大,符合需求。這里面這個(gè)系數(shù),就是P了,而系數(shù)具體的大小,需要根據(jù)實(shí)際情況調(diào)試確定。
我們有了n20減速電機(jī) 機(jī)器人第一個(gè)公式:
D_term = kD* (error- last_error)
如果上面的例子還是不好理解的話,考慮前面的單擺模型:
P相當(dāng)于重力的作用,讓擺左右往復(fù)運(yùn)動(dòng),而D則相當(dāng)于空氣阻力,讓擺慢慢停在中點(diǎn)。D的大小很理想的情況下,應(yīng)該是大概擺動(dòng)左右各一下之后就停在中點(diǎn),想象把擺放在水中擺動(dòng)的情況。
I(積分):有的時(shí)候我們會(huì)發(fā)現(xiàn),系統(tǒng)中存在一些固定的阻力,例如,我們用PID控制一個(gè)電機(jī)的轉(zhuǎn)速,當(dāng)給定的目標(biāo)速度很小的時(shí)候,就會(huì)出現(xiàn)這樣的情況:
根據(jù)P_term = kP * error,由于error很小,P的輸出也很小,而由于摩擦力的存在,此時(shí)并不能讓電機(jī)轉(zhuǎn)動(dòng)起來;又由D_term = kD* (error- last_error),由于電機(jī)沒有轉(zhuǎn)動(dòng),顯然(error- last_error)始終為0于是D輸出也為0,那么問題來了,除非改變目標(biāo)值,否則電機(jī)就永遠(yuǎn)轉(zhuǎn)不起來了…
I的作用就是消除這樣的靜態(tài)誤差,它會(huì)將每次的誤差都積累起來,然后同樣也是乘以一個(gè)系數(shù)之后作為輸出。比如上面的情況,雖然誤差很小,但卻不是0,于是在每一輪的計(jì)算中,I項(xiàng)把error逐漸累積,直到超過臨界值讓電機(jī)轉(zhuǎn)起來;而在誤差為0的情況下,I項(xiàng)卻又不會(huì)幫倒忙。
第三個(gè)公式:I_term = kI*(I_term + error)
以上就是PID的全部計(jì)算了,最后三者加起來就得到了:
PID_output = P_term + I_term + D_term
每隔一段固定時(shí)間把它運(yùn)行一遍,就是PID算法了。
可以看出,PID的算法實(shí)現(xiàn)其實(shí)非常簡單,不過只有幾行代碼而已,所以非常建議自己實(shí)現(xiàn)一遍PID代碼。Arduino平臺上也是有PID庫的,但庫的名字叫什么我不告訴你,自己去找哦。