“小強”——實驗機器人制作過程(圖文)_第1頁
“小強”——實驗機器人制作過程(圖文)_第2頁
“小強”——實驗機器人制作過程(圖文)_第3頁
“小強”——實驗機器人制作過程(圖文)_第4頁
“小強”——實驗機器人制作過程(圖文)_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、“小強”實驗機器人制作過程(圖文)  來源:Mindroid  時間:2008-05-24   評論 27 條(訪問論壇)RobotSky恭候您的投稿>>從對機器人感興趣開始,買了一堆書,也看了很多資料,決定先從最簡單的車輪機器人開始做。普通電腦雖然強大,但是不能直接采集外界環(huán)境的物理數(shù)據(jù),也不能直接控制電機。查找了下,雖然可以直接在電腦上接 USB 接口的數(shù)據(jù)采集器用于采集傳感器的數(shù)據(jù),也可以使用 PCI 的電機控制卡來驅(qū)動各種電機,不過成本有些高,暫時不考慮了。找了一圈,發(fā)現(xiàn)還是單片機方案廉價,順便可以學(xué)習(xí)下單片機控制和作一些電

2、路實驗。于是最終決定實驗方案采用單片機來做了。 零件 下面是采購的零件: 8 位單片機 Atmega168 開發(fā)板。 電路面包板和連線用于驅(qū)動車輪的兩個減速電機。沒有找到合適的齒輪,自己也沒有加工設(shè)備,圖簡單,所以直接用集成減速齒輪的電機代替了。距離傳感器,作為機器人的主要傳感器,用來探測障礙物的距離。使用的是常用的紅外距離傳感器作為機器人的眼睛。舵機,用來控制機器人“眼睛”的方向。一堆零件:下一步就可以驗證簡單的功能了 “小強一號”實驗機器人制作過程(圖文)  來源:Mindroid  時間:2008-05-24   評論 27 條(訪問論壇

3、)RobotSky恭候您的投稿>>從對機器人感興趣開始,買了一堆書,也看了很多資料,決定先從最簡單的車輪機器人開始做。普通電腦雖然強大,但是不能直接采集外界環(huán)境的物理數(shù)據(jù),也不能直接控制電機。查找了下,雖然可以直接在電腦上接 USB 接口的數(shù)據(jù)采集器用于采集傳感器的數(shù)據(jù),也可以使用 PCI 的電機控制卡來驅(qū)動各種電機,不過成本有些高,暫時不考慮了。找了一圈,發(fā)現(xiàn)還是單片機方案廉價,順便可以學(xué)習(xí)下單片機控制和作一些電路實驗。于是最終決定實驗方案采用單片機來做了。 零件 下面是采購的零件: 8 位單片機 Atmega168 開發(fā)板。 電路面包板和連線用于驅(qū)動車輪的兩個減速電機。沒有找到

4、合適的齒輪,自己也沒有加工設(shè)備,圖簡單,所以直接用集成減速齒輪的電機代替了。距離傳感器,作為機器人的主要傳感器,用來探測障礙物的距離。使用的是常用的紅外距離傳感器作為機器人的眼睛。舵機,用來控制機器人“眼睛”的方向。一堆零件:下一步就可以驗證簡單的功能了 實驗 接下來先搞清楚怎么用單片機。 Hello world 先讓單片機跑起來再說。習(xí)慣了操作系統(tǒng)下編程,第一次用單片機還真有些不習(xí)慣,擔(dān)心遇到問題,不過比較順利。這個程序用來點亮單片機上的一個 LED 。代碼: int ledPin = 13; / LED connected to digital pin 13 void setup() pi

5、nMode(ledPin, OUTPUT); / sets the digital pin as output void loop() digitalWrite(ledPin, HIGH); / sets the LED on delay(1000); / waits for a second digitalWrite(ledPin, LOW); / sets the LED off delay(1000); / waits for a second 以間隔 1000ms 的時間把單片機的第 13 個 Pin 腳循環(huán)輸出高低電平,從而達到點亮和熄滅 LED 功能。很簡單,就是驗證下單片機是否可

6、用。 控制舵機舵機就是遙控模型上用來控制的,其實就是一個帶閉環(huán)控制的電機,能轉(zhuǎn)動到指定的角度。工作原理是:控制信號由接收機的通道進入信號調(diào)制芯片,獲得直流偏置電壓。它內(nèi)部有一個基準電路,產(chǎn)生周期為 20ms ,寬度為 1.5ms 的基準信號,將獲 得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。 最后,電壓差的正負輸出到電機驅(qū)動芯片決定電機的正反轉(zhuǎn)。當(dāng)電機轉(zhuǎn)速一定時,通過級聯(lián)減速齒輪帶動 電位器旋轉(zhuǎn),使得電壓差為 0 ,電機停止轉(zhuǎn)動。 在程序中控制舵機的轉(zhuǎn)動角度,就是生成不同脈寬的 PWM 就行了。 上面的代碼簡單的生成一個 PWM 驅(qū)動舵機旋轉(zhuǎn),比較簡單。 代碼中用 delay 來實現(xiàn)延

7、時,如果是同時控制多個舵機,用這樣的代碼是不行的,需要自己計算時間。因為用 delay 整個單片機都“休息”了,無法執(zhí)行任何代碼。在實際實現(xiàn)中,還需要不斷的讀取傳感器輸入和進行其他處理。紅外距離傳感器 傳感器介紹: SHARP 紅外距離傳感器,用于模型或機器人制作,可以用來測量距離。每個模塊贈送一根 15cm 長 PH2.0 的單頭排線 . 技術(shù)規(guī)格: 探測距離: 10-80cm 工作電壓: 4-5.5V 標準電流消耗: 33-50 mA 輸出量:模擬量輸出,輸出電壓和探測距離成比例 接好電源,把模擬信號輸出端接在單片機的模擬輸入 Pin 就行了。 測試代碼: int potPin = 2;

8、int ledPin = 13; int val = 0; void setup() pinMode(ledPin, OUTPUT); void loop() val = analogRead(potPin); digitalWrite(ledPin, HIGH); delay(val); digitalWrite(ledPin, LOW); delay(val); 運行結(jié)果, led 隨著傳感器距離的變化閃爍間隔也隨著變化。控制電機 常用的直流電機使用 L293D 來控制,使用 H293 的電路如下: 不過在驗證是發(fā)現(xiàn),對于小電機,直接用單片機的 PWM 端子來輸出不同電壓的來控制速度也是可

9、行的,雖然不太精確,但是對于實現(xiàn)運動特征是足夠了。單片機無法輸出真正的線性模擬電壓, PWM 是通過調(diào)整空占比間隔來模擬不同電壓值的。測量了電機在空載和負載情況下電流都只有幾十毫安,所以先采取這種簡單的辦法驗證。 直接把電機接到單片機的 Gnd 和 PWM Pin 9 接口,然后在程序中直接向 Pin 9 輸出就可以讓電機運轉(zhuǎn)了。 int value = 0; int ledpin = 9; void setup() / nothing for setup void loop() for(value = 0 ; value <= 255; value+=5) analogWrite(le

10、dpin, value); delay(30); for(value = 255; value >=0; value-=5) analogWrite(ledpin, value); delay(30); 上面的程序用不同的輸出值驅(qū)動電機,可以看到電機的旋轉(zhuǎn)效果。 單片機和主要部件的驗證基本就完成了,下一步要開始程序設(shè)計了。 軟件設(shè)計 思路 在進行代碼編寫之前,想找到一種簡介的實現(xiàn)低級智能機器人的方式。目前的工業(yè)機器人采用的是精確控制的方法,在程序中固化每種處理邏輯。用程序員的思維來完成對機器人的操作。對于程序員來說,機器人無非就是外接了物理傳感輸入和運動控制輸出的一臺電腦,不管是64位多

11、核CPU或者8位單片機,只是性能的不同而已。理論上,都能通過程序設(shè)計來達到預(yù)定的目標。如果按照計算機上的普通程序來設(shè)計,那么大量的功能代碼會相互耦合,每次為了增加一個新的運動功能或者任務(wù),都需要編制新的代碼,而新的代碼給原來的環(huán)路反饋系統(tǒng)帶來新的邏輯分支,所有的步驟都得經(jīng)過程序員的驗證和設(shè)計。這樣的設(shè)計對于精確計算的PC程序或者擅長固定場景精確動作的工業(yè)機器人來說,都沒有問題。但是對于這里要實現(xiàn)的“小強一號”機器人,是處在一個動態(tài)的變化環(huán)境當(dāng)中,如果按照傳統(tǒng)的軟件設(shè)計邏輯,會存在大量耦合的邏輯分支,導(dǎo)致程序擴展性很差。舉例來說,為了完成一個沿墻壁行走的功能,必須對各種傳感器輸入情況進行判斷,然

12、后做出預(yù)置的動作序列。如果要執(zhí)行的動作和需要判斷的情況很多,那么程序邏輯分支就比較復(fù)雜,擴展性也比較差,有沒有更好的適合機器人軟件設(shè)計的方法呢?換一種思維來思考的話,我們要做的不是電腦程序,只是一個實驗機器人。這個實驗機器人能做到自然界昆蟲級的“智能”就很不錯了。 試想,一只螞蟻,一只蟑螂會去思考這么復(fù)雜的邏輯分支嗎?去考慮各種情況下應(yīng)該采取的動作? 不太可能。我們用了復(fù)雜的想法去解決簡單的事情。機器人和計算機的主要區(qū)別在于,計算機是按照預(yù)先規(guī)劃的指令運行,而機器人需要根據(jù)變化的環(huán)境選擇合適動作。我們首先可以簡化動作模型,我把機器人的執(zhí)行任務(wù)分成3個層次:任務(wù)-行為-動作任務(wù)機器人完成的一個期

13、望目標,比如“在一個范圍內(nèi)收集地面上的垃圾”可以界定為一個機器人的任務(wù)。行為行為是對任務(wù)的分解,行為是機器人根據(jù)環(huán)境變化選擇要做什么。比如碰到墻壁需要進行躲避。電源不足需要充電,就可以劃分為一個行為。動作機器人最終控制電機等輸出設(shè)備做出的動作,比如前進,后退,轉(zhuǎn)彎。轉(zhuǎn)動攝像頭都可以劃分成一個動作單元。說明:任務(wù)由一系列的行為構(gòu)成;行為有一個或者多個動作組成,動作是立即執(zhí)行的最小單元。在任意一個時刻,只有一個動作可以得到執(zhí)行。軟件實現(xiàn)的對象就是分解出簡單的行為,針對每個行為單獨實現(xiàn),互相之間無干涉、無耦合。當(dāng)多個行為要輸出互相矛盾的動作時,通過一個行為優(yōu)先級表來決定優(yōu)先級高的行為來做出動作。在這

14、個思路中,參考了基于行為編程的理論,關(guān)于詳細的基于行為編程的描述,可以在網(wǎng)上搜索“Behavior-based robotics”。通過這種設(shè)計思路,可以實現(xiàn)對動物反射特性的模擬,不需要把精力放在復(fù)雜的邏輯處理上,只需要根據(jù)分解出的基本行為實現(xiàn)一個一個小的行為單元。每個行為單元只關(guān)心自己的傳感輸入和需要輸出的控制動作就行了。確定了設(shè)計思路,下一部分開始針對小強一號來設(shè)計軟件了。參考資料,有興趣的可以閱讀:    如果需要增加其他更加復(fù)雜的智能,那么只需要增加對應(yīng)的行為單元就行了,不用修改已有的邏輯結(jié)構(gòu)。每個行為單元只需要處理自己關(guān)心的傳感器和需要控制的動作執(zhí)行部分

15、。這種方式的好處就是程序邏輯變得非常簡單,功能單元之間不會存在互相影響的弊端。下面的代碼是“巡航”行為:class BhCruis:public Behavior public: public: BhCruis(const char* name):Behavior(name) ; BhCruis(); void Run(); void Setup();   ;   void BhCruis:Setup()     void BhCruis:Run() int bid = GetId(); GO_speed_leftbid = 255; GO_speed_

16、rightbid = 255;   GT_beh_actionACTION_TYPE_MOTORbid = true;     上面的代碼很簡單,就是讓兩個電機以同樣的速度暈裝,其他都不用考慮。對于某些行為,需要引入稍微復(fù)雜一些的處理,比如發(fā)現(xiàn)障礙物,首先要停下來,然后判斷是應(yīng)該往左還是往右,做出決定之后,再進行具體的動作。針對這種不能在一個時刻完成,要經(jīng)過幾個不同的狀態(tài)才能處理完成的行為,可以用狀態(tài)機來解決。下圖是“逃離”行為的狀態(tài)機:    對于行為實現(xiàn)自己的狀態(tài)機,在行為實現(xiàn)的代碼內(nèi)部實現(xiàn),而不影響其他行為。這種結(jié)構(gòu)可

17、以讓每個行為子關(guān)心自己的實現(xiàn)方式,從而最大的降低軟件復(fù)雜度,方便功能添加和修改。逃離行為狀態(tài)機實現(xiàn)原型代碼:   void BhEscape:Run() int bid = GetId();   / 狀態(tài)機實現(xiàn)  switch(state) case 0: / 前方距離過小  if(GI_distanceDISTANCE_FORWORD < 30) GO_speed_leftbid = 0; GO_speed_rightbid = 0;   GT_beh_actionACTION_TYPE_MOTORbid = true; &#

18、160; timestart = millis(); state+; / 狀態(tài)變化  else GT_beh_actionACTION_TYPE_MOTORbid = false; break; case 1: / 觀察左右距離  if(millis() - timestart > 1000) GO_eyeAnglebid = 0; GT_beh_actionACTION_TYPE_HEADbid = true; timestart = millis(); state+; case 2: / 觀察左右距離  if(millis() - timestart > 1000) GO_eyeAnglebid = 180; GT_beh_actionACTION_TYPE_HEADbid = true; timestart = millis(); state+; case 3: / 決定往哪邊轉(zhuǎn)彎  if(millis() - timestart

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論