先看圖:
?
?
下圖是本項目要說的簡易mini版平衡小車
?
??自行車平衡DIY分為3部分介紹:
第一部分介紹自行車平衡基本物理原理;
第二部分理論篇,對平衡自行車的算法進行理論分析,包括模型分析、姿態檢測方法、PID算法,控制算法;
第三部分實踐篇,具體介紹平衡自行車用到的元器件,動力、轉向、電路及代碼分析。
一、自行車平衡原理
自行車是怎么平衡的,老外做過一個非常好的視頻,這個視頻很好地證明了常見的”角動量守恒”的說法是錯誤的,并且正確的說明了自行車平衡原理是和轉向相關的,但沒有具體指出平衡和轉向的關系。
在這里我們就先來討論一下”角動量守恒”這種最常見的猜測為什么是錯誤的,大致討論一下轉向是如何使自行車保持平衡的。
1、角動量守恒說
角動量守恒說的意思就是:輪子跑的時候在轉動,此時輪子就類似于陀螺,角動量守恒使自行車保持不倒。
小時候也有過這樣的疑問,如果把自行車車輪固定從下坡推下,自行車能不能一直往前走?
到底能不能呢?老外的視頻做了這個試驗:
固定之后就會倒下,可見輪子的陀螺儀效應并不是維持自行車不倒的原因。另外還有老外做了一個沒有陀螺儀效應的自行車,該自行車也可以穩定平衡:
以上足以說明陀螺儀效應不是維持自行車平衡的根本原因。
2、離心力是自行車平衡的根本原因
那么什么才是維持自行車平衡的原因呢?
自行車可以看做是一個倒立擺(左右方向不穩定),這個倒立擺受重力作用是一個不穩定系統,需要額外的回復力維持平衡,而提供回復力的正是自行車轉向時的”離心力”。
離心力是速度和把手轉向角的函數,在一個固定的速度下,可以認為控制把手轉向角度就是控制回復力。
我們先記住這一點:維持自行車平衡,需要通過一種合適的算法控制把手角度才能使自行車穩定平衡。
機械自平衡
或許有人會奇怪,有些自行車只要推起來就可以自己平衡
我自己也買過一個如下面這樣的遙控摩托車想要研究一下:
拆開后發現里面并沒有精確的轉向控制結構,仿佛在行駛時根本沒有轉向控制,就類似于上面自行車一樣自己就可以平衡了。
這到底是怎么回事呢?其實這就是結構設計者的牛逼之處,設計的機械結構自帶回復功能,機械結構使得轉向會根據車身傾斜而改變,這種改變的幅度正好可以使自行車穩定平衡。
如果我們改變車身結構,可能就會破壞原有的參數,使得自行車無法穩定平衡。如在前輪綁一個重物:
在老外的視頻中,分析了車身傾斜對轉向的三個影響因素:
前輪轉軸后傾,導致傾斜時前輪轉向。
把手安裝在前面,導致傾斜時前輪轉向。
前輪轉動時的陀螺儀效應,車身傾斜,陀螺儀效應使得前輪轉向。
以上是所謂”機械自平衡”,平衡根本原因還是轉向,只不過巧妙的機械設計使得前輪轉向特性恰好很容易維持平衡。
手動自平衡
手動自平衡的意思就是我們自己手動控制讓它平衡。
我們既然分析平衡原理,還要做一個平衡自行車出來,這一部分要好好研究一下,將會在后面理論篇重點討論一下控制方法。
二、平衡自行車-理論篇
一、模型分析
1、倒立擺
很顯然我們知道自行車在左右方向上不穩定,這是一個很常見的物理模型——倒立擺。
顧名思義,倒立擺的意思就是倒著的擺,比如一個倒著的桿,
倒立擺的特性:不穩定,只要偏離平衡位置,就會有一個力(重力的分力)使系統更加偏離平衡位置,這樣偏差就會越來越大。
一般倒立的桿在前后左右方向都有可能倒下,在二維的平面上不穩定;而自行車僅在左右方向上可能倒下,是一維的倒立擺,這要簡單一些。
2、自行車的平衡控制
自行車屬于倒立擺模型,倒立擺是不穩定的,那么倒立擺應該如何控制才能平衡呢?
我們把問題拆分一下:
怎樣的狀態才叫平衡?
我們能控制的是什么?
如何控制才能穩定平衡?
2.1 怎樣的狀態才叫平衡
我們要對”平衡”進行數學描述,所謂的平衡其實就是倒立擺的傾角穩定在一個我們想要的值。
通常我們想要平衡在θ = 0處。
2.2 我們能控制的是什么
對于倒立擺模型,通常我們能控制的是底端的力或速度或位置,不同的控制量對應的控制方法不同。
對于自行車來說,它的控制方式不像通常的倒立擺那樣直接控制底部,而是間接地通過轉向來控制,當自行車以一個固定的速度前進時,自行車把手以一定角度進行轉向(設為α),自行車會做相應半徑的圓周運動,產生相應大小的”離心力”。
在自行車這個費慣性系里看來,只要對把手進行一定角度的轉向(α),就會產生一個相應大小的橫向力:
這就是我們進行平衡控制時的實際控制量——把手轉角α,只要控制它就能控制回復力。
2.3 如何控制才能平衡
上面我們已經能夠通過轉向產生回復力,這個回復力可以把倒立擺”掰回”平衡位置,有往回掰的回復力就能穩定平衡了嗎?
并不是這樣,我們再來回顧一下中學物理:
“
過阻尼狀態的擺會以較慢的速度回到平衡位置;欠阻尼狀態的擺會很快回到平衡位置,但會在平衡位置來回擺動;臨界阻尼狀態的擺會以最快的速度穩定在平衡位置。
”
結合到實際的自行車平衡中就是:
“
如果回復力不夠大,就無法矯正,或者矯正速度很慢,這會導致系統不穩定;如果回復力過大,就會導致矯正過度,這也會導致系統不穩定;我們最希望的狀態就是回復力剛剛好,剛好使倒立擺快速回到平衡位置,又不至于矯正過度。
”
這是一個復雜的數學計算過程,回復力大小會在系統運行時不斷地計算(本平衡自行車是20ms計算一次),用到的是PID算法,會在后面詳細介紹。
3、自行車平衡需要解決的基本問題
獲取左右方向傾角θ
以合適的算法控制轉角α使系統穩定平衡
這將會在下面詳細討論。
二、姿態檢測
1、檢測的是什么
檢測的是自行車左右傾斜的角度。
2、怎么檢測
用一個叫gy521的模塊,里面用的是mpu6050芯片,帶有陀螺儀和加速度傳感器。
gy521的具體使用會在第三篇-實踐篇介紹,這里我們知道通過這個模塊我們可以得到自行車各個方向的加速度和角速度。注意哦,我們不能直接得到傾斜角度,我們的到的是各個方向的加速度和角速度,需要進行一些復雜的計算才能得到正確的傾斜角度。
常用的算法有互補平衡濾波、卡爾曼濾波。
三、PID算法
前面已經分析了,我們通過控制把手轉角來控制回復力,我們需要實時計算一個合適的回復力使系統穩定平衡。
有一個小球在光滑球面上,小球的位置是x,光滑球面頂端在L處,我們可以控制小球水平方向力F,現在要求讓小球穩定平衡在x0處。
先看簡單情況x0=L,此時偏差為L-x,
我們給出一個比例項(P) F = kp*(L-x),這樣就會有一個回復力,當偏差存在時就會有一個力把小球拉回L處。
這存在的問題是,小球接近L時是會有一定速度的,小球越來越接近L,此時的力仍然是在把小球往L處拉,這會導致小球到達L時(我們想要的位置)速度很大,小球無法立刻停下來,而是會沖過去。
這樣小球就會在L附近來回擺動,這是不穩定的狀態,屬于欠阻尼狀態。
為了解決上述問題需要加一個微分項(D) F = kd*dx/dt = kd*v,所謂”微分”指的是位置x對時間的微分,說白了就是速度。
意思就是當速度越大,就產生一個反向的力使速度減小,這樣就可以防止出現上面小球沖過去的。
可以認為這一項具有”預測”功能,預測小球下一時刻的狀態從而提前做出反應(預測小球將要到達L處,提前減速),
也可以認為這一項具有阻尼作用,相當于系統中有一個和速度成比例的阻尼力。
這個”阻尼力”調得過小會導致欠阻尼狀態,調得過大會導致過阻尼狀態。
積分項此時可以不用,積分項是當平衡位置x0不等于L時使用的,
當平衡位置不是L處,那么當小球靜止在平衡位置x0時,由于在坡道上會有一個恒定的橫向偏移力,此時比例調節作用為0(Δx=0),微分調節作用也是0(v=0),所以小球在該處無法平衡,會在更遠離平衡位置處達到平衡,那么就會有一個長時間存在的偏差。
積分作用就是檢測偏差進行累積,對于上面這個長時間存在的偏差進行積分(累積疊加),使系統在長時間范圍可以穩定在要求的平衡位置。
三、平衡自行車-實踐篇
在本文將會介紹平衡自行車的具體制作過程,包括機械、電路和代碼。
平衡自行車完整的代碼托管在https://github.com/nicekwell/balance_bike
上GitHub網站卡的同學也可以在文末下載打包好的文檔。
一、材料
機械
名稱 | 數量 | 備注 |
---|---|---|
銅柱、鐵絲、膠槍等基礎材料和工具 | 若干 | 輔助用具,果果小師弟 |
自行車架 | 1 | 自己做車架是很麻煩的,我是直接買的車架,淘寶上搜”自行車 拼裝 DIY”能搜到很多 |
舵機 | 1 | 轉向用的,對于我用的1:6車架,普通舵機有點大,我用的是9g舵機 |
N20電機 | 1 | 選扭力大一點,這樣轉速會比較穩定 |
皮帶輪和皮帶 | 1 | 如上面的圖片,我是用皮帶來傳輸動力的 |
電路
名稱 | 數量 | 備注 |
---|---|---|
電池、電池盒 | ? | ? |
lm1117-3.3 | 1 | 降壓芯片給控制系統供電 |
stm32f103c8t6核心板 | 1 | ? |
gy521模塊 | 1 | 加速度傳感器 + 陀螺儀 |
升壓模塊 | 1 | 升到12v給電機供電,根據電機特性選擇是否使用升壓模塊 |
8050三極管板 | 1 | 驅動電機,由于自行車不需要反轉,所以不需要使用電機驅動芯片,用三極管就能方便地實現。我用了兩個三極管并聯提高功率。 |
自鎖開關 | 1 | 整個系統開關 |
led指示燈 | 1 | 配合1k限流電阻 |
藍牙模塊 | 1 | 可選,如果想要遙控的話就使用藍牙 |
二、動力部分
傳動方式
如圖,我用的是皮帶或者齒輪傳送的方式,因為比較好實現。
電機選擇
這個DIY是不考慮變速情況的,平衡的參數都是按照一個固定速度調的。
所以動力部分的作用就是提供一個恒定的速度,并且這個速度盡可能穩定,盡可能不受外部影響。
電機應選擇扭力大一些、轉速穩定的減速電機。
電機供電
電機是直接供電還是使用升壓模塊供電要根據電機特性,有些電機用升壓模塊可以提高功率,有些大電流電機用升壓模塊反而可能限制了電流。
我這里用升壓模塊升到12v給N20電機供電的。
另外,電機通過三極管受stm32控制,通過控制占空比也可以限制電機輸出的功率。
三、轉向部分
轉向部分用一個舵機帶動把手轉動即可。
四、電路
在GitHub工程里有詳細的引腳連接表
https://github.com/nicekwell/balance_bike
供電
用3.3v穩壓芯片給整個控制系統供電,包括單片機、GY521模塊、藍牙模塊。
用5v穩壓芯片給舵機供電。
用12v升壓模塊給電機供電。
下載
我是用串口給stm32下載程序的。
?
引腳 | 功能 |
---|---|
PA9 | 下載TXD |
PA10 | 下載RXD |
?
GY521
3.3v
GND
PB0 ? ?GY521 I2C SCL
PB1 ? ?GY521 I2C SDA (用的是IO模擬i2c)
電機
點擊用12v升壓模塊供電,由于不需要反轉,用三極管即可直接驅動,電路圖如下:
加三極管的目的是為了可以通過調節PWM占空比來限制輸出功率,但我的實際情況是100%輸出時動力才勉強足夠。所以如果你不需要限制電機輸出功率,或者通過其他方式限制輸出功率,也可以不要三極管,不通過單片機控制。
舵機
舵機是用5v供電的,而單片機是3.3v電平,對于pwm控制腳可以通過2個三極管實現同相的電平轉換:
藍牙模塊
下圖是我使用的藍牙串口模塊,可以實現串口透傳,只需要4根線連接:vcc、gnd、txd、rxd。
藍牙模塊是用來調試和遙控的,沒有它也能跑。建議還是加上這個模塊,在調試PID擦數時會非常方便。
五、代碼結構
代碼提交在GitHub
https://github.com/nicekwell/balance_bike
主要分為3個部分:
1、基礎的驅動程序,實現電機、舵機、gy521數據讀取;
2、平衡控制系統,核心是一個20ms定時器,每20ms進行一次數據采集、計算和響應;
3、遙控和調試系統,實現log輸出、接收遙控信息。
?
名稱 | 文件 | 功能(智果芯) |
---|---|---|
i2c | i2c/i2c.c, include/i2c.h | IO 模擬i2c驅動,提供i2c基礎操作 |
gy521 | gy521/gy521.c, include/gy521.h | gy521模塊驅動,基于i2c驅動,提供加速度和角速度的讀取接口 |
motor | motor/motor.c, include/motor.h | 電機驅動,提供占空比控制接口 |
angle | angle/angle.c, include/angle.h | 舵機驅動,提供角度控制接口 |
?
平衡控制
main函數會初始化一個定時器20ms中斷一次,調用 main/balance.c 里的 balance_tick 函數,平衡算法在 main/balance.c 實現。
每20ms到來會執行一次:
讀取傳感器加速度和角速度信息。
互補平衡濾波計算當前姿態。
用PID算法計算出前輪轉角。
遙控和調試
兩部分:狀態輸出和指令接收。
狀態輸出
在main函數的while循環里,利用串口中斷構建一個簡單的界面顯示狀態。
指令接收
串口接收到的數據會傳給main/control.c,該文件分析串口數據,解釋成相應的操作。主要是PID參數調節。
編輯:黃飛
?
評論
查看更多