平衡自行車(chē)的原理以及制作方法
今天給大家?guī)?lái)的是一個(gè)博主老倪制作的迷你的平衡自行車(chē)項(xiàng)目,雖然是4年前的老項(xiàng)目了,不過(guò)相信我們?nèi)匀荒軓闹袑W(xué)到一些新東西。
▼? ?演示效果自行車(chē)平衡DIY分為3部分介紹:
- 第一部分介紹自行車(chē)平衡基本物理原理;
- 第二部分理論篇,對(duì)平衡自行車(chē)的算法進(jìn)行理論分析,包括模型分析、姿態(tài)檢測(cè)方法、PID算法,控制算法;
- 第三部分實(shí)踐篇,具體介紹平衡自行車(chē)用到的元器件,動(dòng)力、轉(zhuǎn)向、電路及代碼分析。
篇一:自行車(chē)平衡原理
自行車(chē)是怎么平衡的,老外做過(guò)一個(gè)非常好的視頻:自行車(chē)是怎么保持平衡的?這個(gè)視頻很好地證明了常見(jiàn)的”角動(dòng)量守恒”的說(shuō)法是錯(cuò)誤的,并且正確的說(shuō)明了自行車(chē)平衡原理是和轉(zhuǎn)向相關(guān)的,但沒(méi)有具體指出平衡和轉(zhuǎn)向的關(guān)系。在這里我們就先來(lái)討論一下”角動(dòng)量守恒”這種最常見(jiàn)的猜測(cè)為什么是錯(cuò)誤的,大致討論一下轉(zhuǎn)向是如何使自行車(chē)保持平衡的。1、角動(dòng)量守恒說(shuō)
角動(dòng)量守恒說(shuō)的意思就是:輪子跑的時(shí)候在轉(zhuǎn)動(dòng),此時(shí)輪子就類(lèi)似于陀螺,角動(dòng)量守恒使自行車(chē)保持不倒。小時(shí)候也有過(guò)這樣的疑問(wèn),如果把自行車(chē)車(chē)輪固定從下坡推下,自行車(chē)能不能一直往前走?到底能不能呢?老外的視頻做了這個(gè)試驗(yàn):固定之后就會(huì)倒下,可見(jiàn)輪子的陀螺儀效應(yīng)并不是維持自行車(chē)不倒的原因。另外還有老外做了一個(gè)沒(méi)有陀螺儀效應(yīng)的自行車(chē),該自行車(chē)也可以穩(wěn)定平衡:以上足以說(shuō)明陀螺儀效應(yīng)不是維持自行車(chē)平衡的根本原因。
2、轉(zhuǎn)向時(shí)的”離心力”是自行車(chē)平衡的根本原因
那么什么才是維持自行車(chē)平衡的原因呢?自行車(chē)可以看做是一個(gè)倒立擺(左右方向不穩(wěn)定),這個(gè)倒立擺受重力作用是一個(gè)不穩(wěn)定系統(tǒng),需要額外的回復(fù)力維持平衡,而提供回復(fù)力的正是自行車(chē)轉(zhuǎn)向時(shí)的”離心力”。離心力是速度和把手轉(zhuǎn)向角的函數(shù),在一個(gè)固定的速度下,可以認(rèn)為控制把手轉(zhuǎn)向角度就是控制回復(fù)力。我們先記住這一點(diǎn):維持自行車(chē)平衡,需要通過(guò)一種合適的算法控制把手角度才能使自行車(chē)穩(wěn)定平衡。機(jī)械自平衡
或許有人會(huì)奇怪,有些自行車(chē)只要推起來(lái)就可以自己平衡,如下面視頻:我自己也買(mǎi)過(guò)一個(gè)如下面這樣的遙控摩托車(chē)想要研究一下:拆開(kāi)后發(fā)現(xiàn)里面并沒(méi)有精確的轉(zhuǎn)向控制結(jié)構(gòu),仿佛在行駛時(shí)根本沒(méi)有轉(zhuǎn)向控制,就類(lèi)似于上面自行車(chē)一樣自己就可以平衡了。這到底是怎么回事呢?其實(shí)這就是結(jié)構(gòu)設(shè)計(jì)者的牛逼之處,設(shè)計(jì)的機(jī)械結(jié)構(gòu)自帶回復(fù)功能,機(jī)械結(jié)構(gòu)使得轉(zhuǎn)向會(huì)根據(jù)車(chē)身傾斜而改變,這種改變的幅度正好可以使自行車(chē)穩(wěn)定平衡。如果我們改變車(chē)身結(jié)構(gòu),可能就會(huì)破壞原有的參數(shù),使得自行車(chē)無(wú)法穩(wěn)定平衡。如在前輪綁一個(gè)重物:在老外的視頻中,分析了車(chē)身傾斜對(duì)轉(zhuǎn)向的三個(gè)影響因素:
- 前輪轉(zhuǎn)軸后傾,導(dǎo)致傾斜時(shí)前輪轉(zhuǎn)向。
- 把手安裝在前面,導(dǎo)致傾斜時(shí)前輪轉(zhuǎn)向。
- 前輪轉(zhuǎn)動(dòng)時(shí)的陀螺儀效應(yīng),車(chē)身傾斜,陀螺儀效應(yīng)使得前輪轉(zhuǎn)向。
手動(dòng)自平衡
手動(dòng)自平衡的意思就是我們自己手動(dòng)控制讓它平衡。我們既然分析平衡原理,還要做一個(gè)平衡自行車(chē)出來(lái),這一部分要好好研究一下,將會(huì)在后面理論篇重點(diǎn)討論一下控制方法。篇二:平衡自行車(chē)-理論篇
一、模型分析
1、倒立擺
很顯然我們知道自行車(chē)在左右方向上不穩(wěn)定,這是一個(gè)很常見(jiàn)的物理模型——倒立擺。顧名思義,倒立擺的意思就是倒著的擺,比如一個(gè)倒著的桿,倒立擺的特性:不穩(wěn)定,只要偏離平衡位置,就會(huì)有一個(gè)力(重力的分力)使系統(tǒng)更加偏離平衡位置,這樣偏差就會(huì)越來(lái)越大。一般倒立的桿在前后左右方向都有可能倒下,在二維的平面上不穩(wěn)定;而自行車(chē)僅在左右方向上可能倒下,是一維的倒立擺,這要簡(jiǎn)單一些。以下是幾個(gè)生活中常見(jiàn)的倒立擺例子:2、自行車(chē)的平衡控制
自行車(chē)屬于倒立擺模型,倒立擺是不穩(wěn)定的,那么倒立擺應(yīng)該如何控制才能平衡呢?我們把問(wèn)題拆分一下:- 怎樣的狀態(tài)才叫平衡?
- 我們能控制的是什么?
- 如何控制才能穩(wěn)定平衡?
2.1 怎樣的狀態(tài)才叫平衡
我們要對(duì)”平衡”進(jìn)行數(shù)學(xué)描述,所謂的平衡其實(shí)就是倒立擺的傾角穩(wěn)定在一個(gè)我們想要的值。通常我們想要平衡在θ = 0
處。2.2 我們能控制的是什么
對(duì)于倒立擺模型,通常我們能控制的是底端的 力 或 速度 或 位置,不同的控制量對(duì)應(yīng)的控制方法不同。對(duì)于自行車(chē)來(lái)說(shuō),它的控制方式不像通常的倒立擺那樣直接控制底部,而是間接地通過(guò)轉(zhuǎn)向來(lái)控制,當(dāng)自行車(chē)以一個(gè)固定的速度前進(jìn)時(shí),自行車(chē)把手以一定角度進(jìn)行轉(zhuǎn)向(設(shè)為α
),自行車(chē)會(huì)做相應(yīng)半徑的圓周運(yùn)動(dòng),產(chǎn)生相應(yīng)大小的”離心力”。在自行車(chē)這個(gè)費(fèi)慣性系里看來(lái),只要對(duì)把手進(jìn)行一定角度的轉(zhuǎn)向(α
),就會(huì)產(chǎn)生一個(gè)相應(yīng)大小的橫向力:這就是我們進(jìn)行平衡控制時(shí)的實(shí)際控制量——把手轉(zhuǎn)角α
,只要控制它就能控制回復(fù)力。2.3 如何控制才能平衡
上面我們已經(jīng)能夠通過(guò)轉(zhuǎn)向產(chǎn)生回復(fù)力,這個(gè)回復(fù)力可以把倒立擺”掰回”平衡位置,有往回掰的回復(fù)力就能穩(wěn)定平衡了嗎?并不是這樣,我們?cè)賮?lái)回顧一下中學(xué)物理:過(guò)阻尼狀態(tài)的擺會(huì)以較慢的速度回到平衡位置;欠阻尼狀態(tài)的擺會(huì)很快回到平衡位置,但會(huì)在平衡位置來(lái)回?cái)[動(dòng);臨界阻尼狀態(tài)的擺會(huì)以最快的速度穩(wěn)定在平衡位置。結(jié)合到實(shí)際的自行車(chē)平衡中就是:
如果回復(fù)力不夠大,就無(wú)法矯正,或者矯正速度很慢,這會(huì)導(dǎo)致系統(tǒng)不穩(wěn)定;如果回復(fù)力過(guò)大,就會(huì)導(dǎo)致矯正過(guò)度,這也會(huì)導(dǎo)致系統(tǒng)不穩(wěn)定;我們最希望的狀態(tài)就是回復(fù)力剛剛好,剛好使倒立擺快速回到平衡位置,又不至于矯正過(guò)度。這是一個(gè)復(fù)雜的數(shù)學(xué)計(jì)算過(guò)程,回復(fù)力大小會(huì)在系統(tǒng)運(yùn)行時(shí)不斷地計(jì)算(本平衡自行車(chē)是
20ms
計(jì)算一次),用到的是PID算法,會(huì)在后面詳細(xì)介紹。3、自行車(chē)平衡需要解決的基本問(wèn)題
- 獲取左右方向傾角
θ
- 以合適的算法控制轉(zhuǎn)角
α
使系統(tǒng)穩(wěn)定平衡
二、姿態(tài)檢測(cè)
1、檢測(cè)的是什么
檢測(cè)的是自行車(chē)左右傾斜的角度。2、怎么檢測(cè)
用一個(gè)叫gy521
的模塊,里面用的是mpu6050
芯片,帶有陀螺儀和加速度傳感器。gy521
的具體使用會(huì)在第三篇-實(shí)踐篇介紹,這里我們知道通過(guò)這個(gè)模塊我們可以得到自行車(chē)各個(gè)方向的加速度和角速度。注意哦,我們不能直接得到傾斜角度,我們的到的是各個(gè)方向的加速度和角速度,需要進(jìn)行一些復(fù)雜的計(jì)算才能得到正確的傾斜角度。常用的算法有互補(bǔ)平衡濾波、卡爾曼濾波,由于篇幅和精力問(wèn)題這部分暫不介紹,網(wǎng)上有大量資源,也可以查看本工程源碼,以后有時(shí)間再寫(xiě)詳細(xì)教程。三、PID算法
前面已經(jīng)分析了,我們通過(guò)控制把手轉(zhuǎn)角來(lái)控制回復(fù)力,我們需要實(shí)時(shí)計(jì)算一個(gè)合適的回復(fù)力使系統(tǒng)穩(wěn)定平衡。這部分內(nèi)容也不做詳細(xì)介紹了,網(wǎng)上有大量資源,也可以查看本工程源碼。在這里引用動(dòng)力老男孩[1]舉的一個(gè)例子,幫大家簡(jiǎn)單理解一下需要解決的問(wèn)題,以及PID算法是如何解決的。有一個(gè)小球在光滑球面上,小球的位置是x
,光滑球面頂端在L
處,我們可以控制小球水平方向力F
,現(xiàn)在要求讓小球穩(wěn)定平衡在x0
處。先看簡(jiǎn)單情況 x0=L
,此時(shí)偏差為L-x
,我們給出一個(gè)比例項(xiàng)(P) F = kp*(L-x)
,這樣就會(huì)有一個(gè)回復(fù)力,當(dāng)偏差存在時(shí)就會(huì)有一個(gè)力把小球拉回L
處。這存在的問(wèn)題是,小球接近L時(shí)是會(huì)有一定速度的,小球越來(lái)越接近L
,此時(shí)的力仍然是在把小球往L
處拉,這會(huì)導(dǎo)致小球到達(dá)L
時(shí)(我們想要的位置)速度很大,小球無(wú)法立刻停下來(lái),而是會(huì)沖過(guò)去。這樣小球就會(huì)在L
附近來(lái)回?cái)[動(dòng),這是不穩(wěn)定的狀態(tài),屬于欠阻尼狀態(tài)。為了解決上述問(wèn)題需要加一個(gè)微分項(xiàng)(D) F = kd*dx/dt = kd*v
,所謂”微分”指的是位置x
對(duì)時(shí)間的微分,說(shuō)白了就是速度。意思就是當(dāng)速度越大,就產(chǎn)生一個(gè)反向的力使速度減小,這樣就可以防止出現(xiàn)上面小球沖過(guò)去的。可以認(rèn)為這一項(xiàng)具有”預(yù)測(cè)”功能,預(yù)測(cè)小球下一時(shí)刻的狀態(tài)從而提前做出反應(yīng)(預(yù)測(cè)小球?qū)⒁竭_(dá)L
處,提前減速),也可以認(rèn)為這一項(xiàng)具有阻尼作用,相當(dāng)于系統(tǒng)中有一個(gè)和速度成比例的阻尼力。這個(gè)”阻尼力”調(diào)得過(guò)小會(huì)導(dǎo)致欠阻尼狀態(tài),調(diào)得過(guò)大會(huì)導(dǎo)致過(guò)阻尼狀態(tài)。積分項(xiàng)此時(shí)可以不用,積分項(xiàng)是當(dāng)平衡位置x0
不等于L
時(shí)使用的,當(dāng)平衡位置不是L
處,那么當(dāng)小球靜止在平衡位置x0
時(shí),由于在坡道上會(huì)有一個(gè)恒定的橫向偏移力,此時(shí)比例調(diào)節(jié)作用為0(Δx=0)
,微分調(diào)節(jié)作用也是0(v=0)
,所以小球在該處無(wú)法平衡,會(huì)在更遠(yuǎn)離平衡位置處達(dá)到平衡,那么就會(huì)有一個(gè)長(zhǎng)時(shí)間存在的偏差。積分作用就是檢測(cè)偏差進(jìn)行累積,對(duì)于上面這個(gè)長(zhǎng)時(shí)間存在的偏差進(jìn)行積分(累積疊加),使系統(tǒng)在長(zhǎng)時(shí)間范圍可以穩(wěn)定在要求的平衡位置。篇三:平衡自行車(chē)-實(shí)踐篇
在本文將會(huì)介紹平衡自行車(chē)的具體制作過(guò)程,包括機(jī)械、電路和代碼。平衡自行車(chē)完整的代碼托管在https://github.com/nicekwell/balance_bike
上GitHub網(wǎng)站卡的同學(xué)也可以在文末下載打包好的文檔。一、材料
機(jī)械
名稱 | 數(shù)量 | 備注 |
---|---|---|
銅柱、鐵絲、膠槍等基礎(chǔ)材料和工具 | ||
自行車(chē)架 | 1 | 自己做車(chē)架是很麻煩的,我是直接買(mǎi)的車(chē)架,淘寶上搜”自行車(chē) 拼裝 DIY”能搜到很多 |
舵機(jī) | 1 | 轉(zhuǎn)向用的,對(duì)于我用的1:6車(chē)架,普通舵機(jī)有點(diǎn)大,我用的是9g舵機(jī) |
N20電機(jī) | 1 | 選扭力大一點(diǎn),這樣轉(zhuǎn)速會(huì)比較穩(wěn)定 |
皮帶輪和皮帶 | 如上面的圖片,我是用皮帶來(lái)傳輸動(dòng)力的 |
電路
名稱 | 數(shù)量 | 備注 |
---|---|---|
電池、電池盒 | ||
洞洞板 | ||
lm1117-3.3 | 降壓芯片給控制系統(tǒng)供電 | |
stm32f103c8t6核心板 | 1 | |
gy521模塊 | 1 | 加速度傳感器 陀螺儀 |
升壓模塊 | 1 | 升到12v給電機(jī)供電,根據(jù)電機(jī)特性選擇是否使用升壓模塊 |
8050三極管 | 2 | 驅(qū)動(dòng)電機(jī),由于自行車(chē)不需要反轉(zhuǎn),所以不需要使用電機(jī)驅(qū)動(dòng)芯片,用三極管就能方便地實(shí)現(xiàn)。我用了兩個(gè)三極管并聯(lián)提高功率。 |
自鎖開(kāi)關(guān) | 1 | 整個(gè)系統(tǒng)開(kāi)關(guān) |
led指示燈 | 1 | 配合1k限流電阻 |
藍(lán)牙模塊 | 1 | 可選,如果想要遙控的話就使用藍(lán)牙 |
二、動(dòng)力部分
傳動(dòng)方式
如圖,我用的是皮帶傳送的方式,因?yàn)楸容^好實(shí)現(xiàn)。電機(jī)選擇
這個(gè)DIY是不考慮變速情況的,平衡的參數(shù)都是按照一個(gè)固定速度調(diào)的。所以動(dòng)力部分的作用就是提供一個(gè)恒定的速度,并且這個(gè)速度盡可能穩(wěn)定,盡可能不受外部影響。電機(jī)應(yīng)選擇扭力大一些、轉(zhuǎn)速穩(wěn)定的減速電機(jī)。電機(jī)供電
電機(jī)是直接供電還是使用升壓模塊供電要根據(jù)電機(jī)特性,有些電機(jī)用升壓模塊可以提高功率,有些大電流電機(jī)用升壓模塊反而可能限制了電流。我這里用升壓模塊升到12v給N20電機(jī)供電的。另外,電機(jī)通過(guò)三極管受stm32控制,通過(guò)控制占空比也可以限制電機(jī)輸出的功率。三、轉(zhuǎn)向部分
轉(zhuǎn)向部分用一個(gè)舵機(jī)帶動(dòng)把手轉(zhuǎn)動(dòng)即可。四、電路
在GitHub工程里有詳細(xì)的引腳連接表https://github.com/nicekwell/balance_bike
供電
- 用3.3v穩(wěn)壓芯片給整個(gè)控制系統(tǒng)供電,包括單片機(jī)、GY521模塊、藍(lán)牙模塊。
- 用5v穩(wěn)壓芯片給舵機(jī)供電。
- 用12v升壓模塊給電機(jī)供電。
下載
我是用串口給stm32下載程序的。引腳 | 功能 |
---|---|
PA9 | 下載TXD |
PA10 | 下載RXD |
GY521
這個(gè)模塊通過(guò)i2c通信,只需要連接4根線。- 3.3v
- GND
- PB0 ? ?GY521 I2C SCL
- PB1 ? ?GY521 I2C SDA (用的是IO模擬i2c)
電機(jī)
點(diǎn)擊用12v
升壓模塊供電,由于不需要反轉(zhuǎn),用三極管即可直接驅(qū)動(dòng),電路圖如下:加三極管的目的是為了可以通過(guò)調(diào)節(jié)PWM占空比來(lái)限制輸出功率,但我的實(shí)際情況是100%輸出時(shí)動(dòng)力才勉強(qiáng)足夠。所以如果你不需要限制電機(jī)輸出功率,或者通過(guò)其他方式限制輸出功率,也可以不要三極管,不通過(guò)單片機(jī)控制。舵機(jī)
舵機(jī)是用5v
供電的,而單片機(jī)是3.3v
電平,對(duì)于pwm控制腳可以通過(guò)2個(gè)三極管實(shí)現(xiàn)同相的電平轉(zhuǎn)換:藍(lán)牙模塊
下圖是我使用的藍(lán)牙串口模塊,可以實(shí)現(xiàn)串口透?jìng)?,只需?根線連接:vcc
、gnd
、txd
、rxd
。藍(lán)牙模塊是用來(lái)調(diào)試和遙控的,沒(méi)有它也能跑。建議還是加上這個(gè)模塊,在調(diào)試PID擦數(shù)時(shí)會(huì)非常方便。關(guān)于調(diào)試方面的內(nèi)容可以參考我寫(xiě)的另一片文章:談一談單片機(jī)開(kāi)發(fā)的幾種調(diào)試方案[2]五、代碼結(jié)構(gòu)
代碼提交在GitHubhttps://github.com/nicekwell/balance_bike
主要分為3個(gè)部分:1、基礎(chǔ)的驅(qū)動(dòng)程序,實(shí)現(xiàn)電機(jī)、舵機(jī)、gy521
數(shù)據(jù)讀??;2、平衡控制系統(tǒng),核心是一個(gè)20ms
定時(shí)器,每20ms
進(jìn)行一次數(shù)據(jù)采集、計(jì)算和響應(yīng);3、遙控和調(diào)試系統(tǒng),實(shí)現(xiàn)log輸出、接收遙控信息。驅(qū)動(dòng)
名稱 | 文件 | 功能 |
---|---|---|
i2c | i2c/i2c.c, include/i2c.h | IO 模擬i2c驅(qū)動(dòng),提供i2c基礎(chǔ)操作 |
gy521 | gy521/gy521.c, include/gy521.h | gy521模塊驅(qū)動(dòng),基于i2c驅(qū)動(dòng),提供加速度和角速度的讀取接口 |
motor | motor/motor.c, include/motor.h | 電機(jī)驅(qū)動(dòng),提供占空比控制接口 |
angle | angle/angle.c, include/angle.h | 舵機(jī)驅(qū)動(dòng),提供角度控制接口 |
平衡控制
main
函數(shù)會(huì)初始化一個(gè)定時(shí)器20ms中斷一次,調(diào)用 main/balance.c
里的 balance_tick
函數(shù),平衡算法在 main/balance.c
實(shí)現(xiàn)。每20ms
到來(lái)會(huì)執(zhí)行一次:- 讀取傳感器加速度和角速度信息。
- 互補(bǔ)平衡濾波計(jì)算當(dāng)前姿態(tài)。
- 用PID算法計(jì)算出前輪轉(zhuǎn)角。
遙控和調(diào)試
兩部分:狀態(tài)輸出和指令接收。狀態(tài)輸出
在main
函數(shù)的while
循環(huán)里,利用串口中斷構(gòu)建一個(gè)簡(jiǎn)單的界面顯示狀態(tài)。指令接收
串口接收到的數(shù)據(jù)會(huì)傳給main/control.c
,該文件分析串口數(shù)據(jù),解釋成相應(yīng)的操作。主要是PID參數(shù)調(diào)節(jié)。參考資料
[1]動(dòng)力老男孩: http://www.diy-robots.com/[2]談一談單片機(jī)開(kāi)發(fā)的幾種調(diào)試方案: http://nicekwell.net/blog/20170411/tan-[?]-tan-dan-pian-ji-kai-fa-de-ji-chong-diao-shi-fang-an.html免責(zé)聲明:本文素材來(lái)源網(wǎng)絡(luò),版權(quán)歸原作者所有。如涉及作品版權(quán)問(wèn)題,請(qǐng)與我聯(lián)系刪除。
------------?END?------------
后臺(tái)回復(fù)『科普知識(shí)』閱讀更多相關(guān)文章。
歡迎關(guān)注我的公眾號(hào),回復(fù)“加群”按規(guī)則加入技術(shù)交流群,回復(fù)“1024”查看更多內(nèi)容。
歡迎關(guān)注我的視頻號(hào):
點(diǎn)擊“閱讀原文”查看更多分享,歡迎點(diǎn)分享、收藏、點(diǎn)贊、在看。