步驟1:硬件
原型視頻中顯示的內容包括:
MPU6050
Pololu低功率直流電動機(2282:590 rpm,9.68:1,17 oz-in)
霍爾編碼器464.64 cpr(齒輪后為48 cpr)
Pololu輪120 x 60 mm(通行節拍器)
Arduino UNO
Seeed Studio 4A電機罩
大沽藍牙模塊(HC06)
Raspberry Pi 2B +
2x UltraBorg板,用于讀取Raspberry上的超聲波傳感器
2x DFRobot LiPo 7.4 V電池
HOBBYWING 3A開關模式UBEC 5V 6V
慣性測量單元(IMU)
視頻中的機器人使用基于InvenSense MPU6050芯片的基本且成本非常低的模塊。我還嘗試了基于MPU9150和MPU9250的多個SeeedStudio模塊和版本。后者的芯片名為10DOF(自由度),因為它在陀螺儀(3軸),加速度計(3軸)和磁力計(3軸)上增加了氣壓計(單軸)。
所有3種芯片上都裝有數字運動處理器(DMP)。使用此處理器有很大的優勢。它在計算垂直角度(傳感器融合和濾波)時節省了大量代碼。其次,它具有內置的校準程序。最后但并非最不重要的一點是:它節省了Arduino的CPU和內存的使用。
如果您想將DMP與Arduino結合使用,即使在“開發人員專區”中,InvenSense文檔也無濟于事。 Jeff Rowberg在這里發布了有關MPU6050寄存器的出色技巧。該庫僅適用于MPU6050和MPU9150。 MPU9250的寄存器配置不同。在使用MPU9150芯片進行測試時,DMP偶爾會停止工作(可能是該芯片)。最后,MPU6050給出了最佳結果。 (其他優點:這些模塊是最小,最薄且價格非常低的模塊。)
如果MPU6050產生錯誤的數據,則可能需要校準傳感器的x,y,z偏移量。可以在此處找到用于校準偏移量的Arduino草圖
我經歷過,調整偏移量可以提高小角度的精度,但也會降低大角度的精度。到最后,芯片默認偏移量在大多數情況下效果最好。
電動機,編碼器,電動機驅動器和車輪
我使用的電動機(全部為Pololu):
大功率Micro no 1101,990 rpm,齒輪:100.37:1,失速扭矩:30 oz/in
大功率Micro no 2271,990 rpm,齒輪:9.68:1,失速扭矩: 39 oz/in
大功率no 2274,210 rpm,齒輪:100:1,失速轉矩:80 oz/in
小功率no 2282,590 rpm,齒輪:9.68 :1,失速轉矩:17 oz/in
除微型版本外,所有電機均隨附霍爾編碼器。它們產生易于操作的分辨率,取決于齒輪比,分辨率為464至2248節拍。對于微型馬達,我使用了產生48個刻度的光學編碼器。
在我看來,在室內使用扭矩不太重要。我也經歷了高功率版本,因為調音更難。它們具有更大的靜摩擦力(“死功率區” =開始移動所需的功率),因此,我發現很難以很小的平衡差(即小的垂直角度)來調節功率。轉速與最大速度直接相關。在我看來,對于首次建立平衡器也不太重要。但是,極低的轉速幾乎不可能達到穩定的平衡。我的建議:使用普通電動機,最好以600 rpm左右的速度運轉。
總體而言,盡管來自相同系列的直流電動機顯示出不同且不一致的靜摩擦力。內置差動控制被證明是必不可少的。也許步進電機將減少此問題(它們移動直到到達某個位置或角度)。步進電機也消除了對編碼器的需求。
我已經使用L298N雙(2A)電動機控制器板和Seeed Studio 4A電動機控制器護罩進行了測試。我更喜歡后者,因為它是盾牌。易于安裝,占用空間少。此外:我發現屏蔽罩4Amp可以更好地緩沖大功率電機的堵轉電流。 (注意:請注意我的Arduino草圖中的引腳排列。我體驗到的屏蔽線與Seeed示例不同。)
輪子 您的生活輕松。我使用的直徑分別為4.2、9和12厘米。大輪轂帶來更大的穩定性。這也適用于表面上的抓地力。我的最愛:“野生ump擊器”車輪(12x6厘米)。
身高和體重 對機器人的行為也很重要。較大的重量會使機器人保持惰性:反應緩慢,因此一開始會顯示較大的過沖。當然也需要大功率的電動機。重心(COG)較高將使機器人更加穩定,但也可能會導致后果。高度加上頂部的重量也會使機器人保持惰性。因此,這完全是調整的問題。當機器人保持穩定平衡時,如果發現它在向前或向后移動時反應緩慢,請嘗試減輕重量和/或減輕重量。
電源
該機器人由兩節LiPo電池供電。一種用于為Arduino和電機供電。一種用于為Raspberry供電,并通過它與HC-SR04超聲波傳感器配合使用。我從所有組件的一個來源開始。當電動機處于“重載”狀態時,它們吸收了太多電流,以至于超聲波讀數變得錯誤,甚至RPi有時也會復位。為RPi和Ultraborgs使用單獨的LiPo解決了這一問題,但我必須添加UBEC才能獲得5V 3A的穩定電流。
步驟2:邏輯和編碼
網上有很多有關平衡機器人和/或倒立擺的信息。但是,我使用了一個非常簡化的邏輯,并具有以下假設:
1-電機軸應該旋轉的角度(至少)與機器人掉落的角度相同。因此,請嘗試控制電動機軸的角度,而不是距離和/或速度。 (如前所述,使用步進電機可能更容易實現。)
2-為了平衡,需要控制角度及其導數,即電機軸的角速度。這可以通過使用PD控制回路來完成。它不像PID回路那樣常見,但是由于運動方向會迅速變化,因此使用積分因子幾乎沒有用處。
3 –要保持位置,必須控制水平移動和速度。這可以通過將傳感器(編碼器)輸出轉換為補償角度來完成。出于與垂直控制相同的原因,所需的控制循環也是PD循環。
可以簡單地將2和3的結果相加,但是最好在水平方向使用嵌套(級聯)控制循環控制回路為垂直控制回路產生目標角度。
按照這些假設進行操作可以節省機器人的高度和質量(甚至是線速度)的計算負擔(如上所述:這些是重要因素,但可以輕松調整)。這樣,在不更改(大部分)編碼參數的情況下調整機器人的高度和COG相對容易。
保持機器人直面是通過差動控制(轉彎)完成的,并且可以獨立于機器人水平和垂直控制。輸入可以來自編碼器(即滴答聲數量的差異)或來自IMU(即偏航數據)。后者所需的編碼要少得多。
要對其進行總結,為了平衡,需要:
1將水平位移轉換為垂直位移角度
2補償該角度與測得的角度之差
3將電機軸移動此補償角度
要翻譯成代碼,需要機器人的某些功能:
最大電動機速度以編碼器刻度表示。這是編碼器可以在特定電機上產生的最大滴答聲。在公式中: RPM/60 *每轉刻度數
編碼器刻度數和度之間的關系。在公式中: 360/每轉刻度數
使用這兩個公式,我們可以推論度數與電動機功率之間的關系(PWM值0-255)。
Arduino草圖作為具有以下功能的機器人“固件”運行:
根據車輪編碼器的輸入進行水平控制
垂直和差分基于IMU輸入(俯仰和偏航)的控制
用于調整,輸出監視和運動測試的藍牙通信
與Raspberry Pi的串行通信
草圖在這里。用于遠程控制和調整的android應用程序是使用MIT App Inventor開發的,可以在此處找到這些塊。用于在Raspberry和Arduino之間進行通信和控制的Python腳本位于同一存儲庫中。我不會在此贅述,因為該帖子僅用于平衡基本面。
有關Arduino草圖的注釋很好。因此,我將只介紹一下其功能。
初始化
UNO的插針已被占用,沒有將傳感器連接到Arduino的空間很大(pwm,中斷和模擬引腳已售罄)。
一些機器人/電機常數進行計算(如上所述)。
松弛或靜摩擦常數。通過試用和測試收集。我從草圖開始,以獲取空載條件下的平均值。您會在這里找到它。在實踐中,我在測試平衡和運動的同時根據觀察結果對它們進行了重大調整。這些常數就足夠了,但是在很大程度上取決于電動機的性能。跳過這些功率量會使機器人在(很小)小角度時反應更快。但是將這些值設置得太高會在調整控制循環時帶來一些挑戰!
maxAngle
假設無法進行補償的角度。用于確定機器人是站立還是躺下。
間隔
穩定的間隔對于控制回路至關重要。在Arduino站點上有一個“ TimedAction”庫,但是一個計時器的直接編碼非常簡單,并且節省了一些內存。
pitchOffset
通過調整IMU獲得。最簡單的方法是將機器人固定在絕對90度的位置(由頂部的數字水平儀測量)并讀取IMU值。
cogOffset
沒有此常數,控制回路也將獲得平衡。第一個原型機帶有8個超聲波傳感器,這使它的前部有點沉重。正如您在視頻中看到的那樣,控制循環通過讓機器人稍微向后傾斜來進行調整。使用 cogOffset 可以補償傾斜,并使機器人前進時更加靈活。
序列。 begin()和Bluetooth.begin()
與RPi的通信通過USB串行進行。 SoftwareSerial接線庫用于與Android應用進行藍牙通信。
wdt_enable(WDTO_500MS)
初始化IMU錯誤時,設置了Averdude看門狗定時器,這將強制Arduino復位。
resetRobot()
每次運行時都會初始化所有變量(并停止電動機)機器人放下。這對拾起機器人很有幫助。
loop()
只要機器人站立時,將檢查所有輸入。當間隔過去后,將執行控制循環。我嘗試了不同的時間間隔。最佳選擇取決于傳感器和所用電機的類型。超過100Hz(《0.01秒)時,我遇到了錯誤的編碼器數據,并且機器人的動作也太“辣”了。在50Hz時,機器人變得“笨拙”。在大多數情況下,100Hz環路效果最佳。
horizontalControl()
檢查是否已經確定了目標距離,并向目標刻度添加了速度偏移。速度偏移是在間隔內以特定速度進行的滴答聲數量。如果未設置距離和速度目標,則在機器人上升時設置目標刻度數。這使機器人可以返回其位置(如果命令移動一定距離,則可以返回新位置)。
differentialControl()
這對于IMU的偏航輸出有點特殊在這里使用。 IMU返回-π《=偏航《=π(弧度)。
getAngles() 例程將讀數轉換為以度為單位的角度0-360范圍。
resetRobot() 例程將機器人上升時的偏航角設置為yawTarget(基本上是360度刻度上的角度偏移量) )。
最后一個角度讀數和偏移之間的差被視為錯誤。
冒充360度的刻度(例如在指南針上)可以輕松確定最小角度(=旋轉方向)。可以根據向機器人補償的方向(左/右)以及機器人必須移動的方向(向前/向后),簡單地將結果添加到發送到各個電動機的功率中或從中減去。
僅當在 getMessage() 例程中通過藍牙或從Raspberry接收命令時,才會執行以下3個例程。
setSpeed()
取一個電機一次可產生的最大滴答聲的百分比( = RPM/60 *每轉刻度數*時間間隔(秒)。)
setDistance()
將以米為單位的行駛距離乘以每米的刻度數( =每轉刻度數/以米為單位的車輪周長)
setTurn()
為偏航偏移量添加所需的度數,將新目標調整為360度并重置轉彎命令以防止連續轉彎。
傳感器和電機例程非常簡單。 resetEncoders() 例程可防止由于編碼器“翻轉”(編碼器輸出為整數)而引起的事故。
交互例程檢查串行和藍牙隊列中是否有新命令,如果有,則通過通用的案例結構對其進行處理。
第3步:調整控制循環
出于明顯的原因,PID調整有時被稱為“黑手藝”。這個過程可能非常繁瑣和令人沮喪。盡管有許多獲取控制器值的半結構化方法,但為獲得機器人平衡,幾乎總是不可避免地要進行手動調整。
一些注意事項將在這里有所幫助:
此過程需要耐心和觀察:如果更改增益值,可以觀察到哪種行為?
比例收益代表補償的 P 下位。即所供應的電動機功率。
微分增益代表 D 放大所供電功率的效果。
請記住,這一切都與加速度有關。所提供的動力很快就會加速。
從兩個增益都為零開始,然后以小步長開始增加 P (向下)。當漫游器自行停留或多或少時停止。也許太“搖晃”或“搖擺”,但它應該使自己保持幾秒鐘。 (通常稱為“ 穩定振蕩”。)
如果您真的無法獲得穩定振蕩,則可能是物理原因造成的。某些可能的信號是:振幅不均勻(可能表示齒輪,質量或高度問題)或僅沿一個方向移動(可能是缺乏電機動力)
機器人在劇烈振動時(機器人向前和向后移動),并且移動變得越來越野,加速度太大,因為已經提供了太多的動力。
當機器人開始越來越快地運行時,在一個方向上以崩潰告終,由于電力供應不足,機器人無法充分加速。
穩定振蕩意味著不斷的超調,就像坐在秋千上一樣。添加 D (放大)后,過沖將減少(并最終消失)。
使用小步長,將值保持盡可能小,并徹底觀察效果。
當可以從外部調整增益時,生活會變得不那么艱難。草圖(否則必須一遍又一遍地編輯,重新編譯和重建草圖)。我從2個微調電位器開始調整增益。我發現它們很難使用。因為我一開始對增益值一無所知,所以我不得不多次編輯草圖以進行新的縮放(?。????:1024),并且在沒有直接視覺反饋的情況下,我不知道這些更改我是通過轉動花盆來做的。
Android應用最適合我:幾乎所有常量都可以通過輸入一個值來更改。屏幕頂部概述了所有當前值。在屏幕底部,可以得到誤差或角度本身的圖形顯示。請注意,這樣的顯示只是一個延遲的指示(串行和Wifi),而不是真實的實時反饋。該應用程序還可以用于測試一些命令(距離,速度,轉彎)。
一旦我達到了球場標準,我就需要一些半自動化的測試工具,因為幾乎所有更改機器人或其代碼或多或少需要重新調整。特別是在水平控制回路上工作需要多次。
我編寫了一個Python腳本,該腳本使用了通常稱為“旋轉”算法的協調上升算法。可以在這里找到Sebastian Thrun(Udacity,Google,Stanford)對算法的解釋
可以在此處找到腳本:twiddleVert.py
我嘗試在其中構建算法Arduino草圖。盡管它只是安裝在可用的32K內存中,但它使整體周期延遲太多。因此,該腳本旨在在Raspberry上運行,并使用其他一些Python腳本:
control.py,用于向Arduino和與UltraBorgs的I2C通信發送命令。如果未附加Ultraborg,則最好將導入和初始化注釋掉。否則,還需要UltraBorg.py。
messaging.py是用于與Arduino進行實際通信的線程類
linkingStorage.py,它充當主腳本與主腳本之間的共享內存。線程腳本
measurements.py,用于收集,顯示和保存所有測試數據。
注意:
Python腳本將根據進一步的實驗而更改。如果您想避免更改,請克隆存儲庫。
我認為現在已經涵蓋了所有基本知識,并有望幫助您構建自己的平衡器。
-
機器人
+關注
關注
211文章
28522瀏覽量
207531 -
Arduino
+關注
關注
188文章
6472瀏覽量
187347 -
樹莓派
+關注
關注
117文章
1710瀏覽量
105722
發布評論請先 登錄
相關推薦
評論