版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、從對機(jī)器人感興趣開始,買了一堆書,也看了很多資料,決定先從最簡單的車輪機(jī)器人開始做。普通電腦雖然強(qiáng)大,但是不能直接采集外界環(huán)境的物理數(shù)據(jù),也不能直接控制電機(jī)。查找了下,雖然可以直接在電腦上接USB接口的數(shù)據(jù)采集器用于采集傳感器的數(shù)據(jù),也可以使用PCI的電機(jī)控制卡來驅(qū)動各種電機(jī),不過成本有些高,暫時不考慮了。找了一圈,發(fā)現(xiàn)還是單片機(jī)方案廉價,順便可以學(xué)習(xí)下單片機(jī)控制和作一些電路實(shí)驗。于是最終決定實(shí)驗方案采用單片機(jī)來做了。零件下面是采購的零件:8位單片機(jī)Atmega168開發(fā)板(Arduino)。電路面包板和連線用于驅(qū)動車輪的兩個減速電機(jī)。沒有找到合適的齒輪,自己也沒有加工設(shè)備,圖簡單,所以直接用
2、集成減速齒輪的電機(jī)代替了。距離傳感器,作為機(jī)器人的主要傳感器,用來探測障礙物的距離。使用的是常用的紅外距離傳感器作為機(jī)器人的眼睛。舵機(jī),用來控制機(jī)器人“眼睛”的方向。一堆零件:實(shí)驗接下來先搞清楚怎么用單片機(jī)。Hello world先讓單片機(jī)跑起來再說。習(xí)慣了操作系統(tǒng)下編程,第一次用單片機(jī)還真有些不習(xí)慣,擔(dān)心遇到問題,不過比較順利。這個程序用來點(diǎn)亮單片機(jī)上的一個LED。代碼:int ledPin = 13; / LED connected to digital pin 13void setup() pinMode(ledPin, OUTPUT); / sets the digital pin a
3、s outputvoid 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的時間把單片機(jī)的第13 個Pin腳循環(huán)輸出高低電平,從而達(dá)到點(diǎn)亮和熄滅LED功能。很簡單,就是驗證下單片機(jī)是否可用。 控制舵機(jī)舵機(jī)就是遙控模型上用來控制的,其實(shí)就是一個帶閉環(huán)控制的電機(jī),能轉(zhuǎn)動到指定的角度。>工作原理是
4、:控制信號由接收機(jī)的通道進(jìn)入信號調(diào)制芯片,獲得直流偏置電壓。它內(nèi)部有一個基準(zhǔn)電路,產(chǎn)生周期為20ms,寬度為1.5ms的基準(zhǔn)信號,將獲 得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最后,電壓差的正負(fù)輸出到電機(jī)驅(qū)動芯片決定電機(jī)的正反轉(zhuǎn)。當(dāng)電機(jī)轉(zhuǎn)速一定時,通過級聯(lián)減速齒輪帶動 電位器旋轉(zhuǎn),使得電壓差為0,電機(jī)停止轉(zhuǎn)動。在程序中控制舵機(jī)的轉(zhuǎn)動角度,就是生成不同脈寬的PWM就行了。上面的代碼簡單的生成一個PWM 驅(qū)動舵機(jī)旋轉(zhuǎn),比較簡單。 代碼中用delay來實(shí)現(xiàn)延時,如果是同時控制多個舵機(jī),用這樣的代碼是不行的,需要自己計算時間。因為用delay整個單片機(jī)都“休息”了,無法執(zhí)行任何代碼。在實(shí)際
5、實(shí)現(xiàn)中,還需要不斷的讀取傳感器輸入和進(jìn)行其他處理。紅外距離傳感器傳感器介紹:SHARP紅外距離傳感器,用于模型或機(jī)器人制作,可以用來測量距離。每個模塊贈送一根15cm長PH2.0的單頭排線.技術(shù)規(guī)格:探測距離:10-80cm工作電壓:4-5.5V標(biāo)準(zhǔn)電流消耗:33-50 mA輸出量:模擬量輸出,輸出電壓和探測距離成比例接好電源,把模擬信號輸出端接在單片機(jī)的模擬輸入Pin就行了。測試代碼:int potPin = 2; int ledPin = 13; int val = 0; void setup() pinMode(ledPin, OUTPUT); void loop() val = ana
6、logRead(potPin); digitalWrite(ledPin, HIGH); delay(val); digitalWrite(ledPin, LOW); delay(val); 運(yùn)行結(jié)果,led隨著傳感器距離的變化閃爍間隔也隨著變化。控制電機(jī)常用的直流電機(jī)使用L293D來控制,使用H293的電路如下:不過在驗證是發(fā)現(xiàn),對于小電機(jī),直接用單片機(jī)的PWM端子來輸出不同電壓的來控制速度也是可行的,雖然不太精確,但是對于實(shí)現(xiàn)運(yùn)動特征是足夠了。單片機(jī)無法輸出真正的線性模擬電壓,PWM是通過調(diào)整空占比間隔來模擬不同電壓值的。測量了電機(jī)在空載和負(fù)載情況下電流都只有幾十毫安,所以先采取這種簡單的
7、辦法驗證。直接把電機(jī)接到單片機(jī)的Gnd和 PWM Pin 9接口,然后在程序中直接向 Pin 9輸出就可以讓電機(jī)運(yùn)轉(zhuǎn)了。int value = 0; int ledpin = 9; void setup() / nothing for setup void loop() for(value = 0 ; value <= 255; value+=5) analogWrite(ledpin, value); delay(30); for(value = 255; value >=0; value-=5) analogWrite(ledpin, value); delay(30); 上面
8、的程序用不同的輸出值驅(qū)動電機(jī),可以看到電機(jī)的旋轉(zhuǎn)效果。單片機(jī)和主要部件的驗證基本就完成了,下一步要開始程序設(shè)計了。軟件設(shè)計思路: 在進(jìn)行代碼編寫之前,想找到一種簡介的實(shí)現(xiàn)低級智能機(jī)器人的方式。目前的工業(yè)機(jī)器人采用的是精確控制的方法,在程序中固化每種處理邏輯。用程序員的思維來完成對機(jī)器人的操作。對于程序員來說,機(jī)器人無非就是外接了物理傳感輸入和運(yùn)動控制輸出的一臺電腦,不管是64位多核CPU或者8位單片機(jī),只是性能的不同而已。理論上,都能通過程序設(shè)計來達(dá)到預(yù)定的目標(biāo)。如果按照計算機(jī)上的普通程序來設(shè)計,那么大量的功能代碼會相互耦合,每次為了增加一個新的運(yùn)動功能或者任務(wù),都需要編制新的代碼,而新的代碼
9、給原來的環(huán)路反饋系統(tǒng)帶來新的邏輯分支,所有的步驟都得經(jīng)過程序員的驗證和設(shè)計。這樣的設(shè)計對于精確計算的PC程序或者擅長固定場景精確動作的工業(yè)機(jī)器人來說,都沒有問題。但是對于這里要實(shí)現(xiàn)的“小強(qiáng)一號”機(jī)器人,是處在一個動態(tài)的變化環(huán)境當(dāng)中,如果按照傳統(tǒng)的軟件設(shè)計邏輯,會存在大量耦合的邏輯分支,導(dǎo)致程序擴(kuò)展性很差。舉例來說,為了完成一個沿墻壁行走的功能,必須對各種傳感器輸入情況進(jìn)行判斷,然后做出預(yù)置的動作序列。如果要執(zhí)行的動作和需要判斷的情況很多,那么程序邏輯分支就比較復(fù)雜,擴(kuò)展性也比較差,有沒有更好的適合機(jī)器人軟件設(shè)計的方法呢?換一種思維來思考的話,我們要做的不是電腦程序,只是一個實(shí)驗機(jī)器人。這個實(shí)驗
10、機(jī)器人能做到自然界昆蟲級的“智能”就很不錯了。 試想,一只螞蟻,一只蟑螂會去思考這么復(fù)雜的邏輯分支嗎?去考慮各種情況下應(yīng)該采取的動作? 不太可能。我們用了復(fù)雜的想法去解決簡單的事情。機(jī)器人和計算機(jī)的主要區(qū)別在于,計算機(jī)是按照預(yù)先規(guī)劃的指令運(yùn)行,而機(jī)器人需要根據(jù)變化的環(huán)境選擇合適動作。我們首先可以簡化動作模型,我把機(jī)器人的執(zhí)行任務(wù)分成3個層次:任務(wù)-行為-動作任務(wù)機(jī)器人完成的一個期望目標(biāo),比如“在一個范圍內(nèi)收集地面上的垃圾”可以界定為一個機(jī)器人的任務(wù)。行為行為是對任務(wù)的分解,行為是機(jī)器人根據(jù)環(huán)境變化選擇要做什么。比如碰到墻壁需要進(jìn)行躲避。電源不足需要充電,就可以劃分為一個行為。動作機(jī)器人最終控制
11、電機(jī)等輸出設(shè)備做出的動作,比如前進(jìn),后退,轉(zhuǎn)彎。轉(zhuǎn)動攝像頭都可以劃分成一個動作單元。說明:任務(wù)由一系列的行為構(gòu)成;行為有一個或者多個動作組成,動作是立即執(zhí)行的最小單元。在任意一個時刻,只有一個動作可以得到執(zhí)行。軟件實(shí)現(xiàn)的對象就是分解出簡單的行為,針對每個行為單獨(dú)實(shí)現(xiàn),互相之間無干涉、無耦合。當(dāng)多個行為要輸出互相矛盾的動作時,通過一個行為優(yōu)先級表來決定優(yōu)先級高的行為來做出動作。在這個思路中,參考了基于行為編程的理論,關(guān)于詳細(xì)的基于行為編程的描述,可以在網(wǎng)上搜索“Behavior-based robotics”。通過這種設(shè)計思路,可以實(shí)現(xiàn)對動物反射特性的模擬,不需要把精力放在復(fù)雜的邏輯處理上,只需
12、要根據(jù)分解出的基本行為實(shí)現(xiàn)一個一個小的行為單元。每個行為單元只關(guān)心自己的傳感輸入和需要輸出的控制動作就行了。確定了設(shè)計思路,下一部分開始針對小強(qiáng)一號來設(shè)計軟件了。參考資料,有興趣的可以閱讀:···· 基于行為的機(jī)器人實(shí)戰(zhàn)指南 中譯版 小強(qiáng)一號結(jié)構(gòu)非常簡單,傳感器只采用了個紅外距離傳感器作為機(jī)器人的“眼睛”,使用兩個電機(jī)進(jìn)行運(yùn)動,距離傳感器連接在一個舵機(jī)上,作為“頭部”可以左右范圍的轉(zhuǎn)動。機(jī)器人的行為最簡單的就是巡航行為,巡航行為就是給電機(jī)電流,電機(jī)轉(zhuǎn)動而已。那么發(fā)生碰撞怎么辦?在巡航行為中,不用考慮碰撞,否則又會變成復(fù)雜的判斷邏輯。為了避免碰撞,設(shè)計一個
13、獨(dú)立的避免碰撞的“逃離”行為。逃離行為從距離傳感器獲取障礙物距離信息,簡單的判斷前方是否有障礙,進(jìn)行避讓。由于多個行為都可能控制電機(jī),所以需要一個仲裁器根據(jù)優(yōu)先級來判斷到底執(zhí)行那個邏輯部分輸出的控制指令。下面用圖來說明這種情況:如果需要增加其他更加復(fù)雜的智能,那么只需要增加對應(yīng)的行為單元就行了,不用修改已有的邏輯結(jié)構(gòu)。每個行為單元只需要處理自己關(guān)心的傳感器和需要控制的動作執(zhí)行部分。這種方式的好處就是程序邏輯變得非常簡單,功能單元之間不會存在互相影響的弊端。 下面的代碼是“巡航”行為:class BhCruis:public Behavior public: BhCruis(const char
14、* name):Behavior(name) ; BhCruis(); void Run(); void Setup(); ; void BhCruis:Setup() void BhCruis:Run() int bid = GetId(); GO_speed_leftbid = 255; GO_speed_rightbid = 255; GT_beh_actionACTION_TYPE_MOTORbid = true; 上面的代碼很簡單,就是讓兩個電機(jī)以同樣的速度暈裝,其他都不用考慮。對于某些行為,需要引入稍微復(fù)雜一些的處理,比如發(fā)現(xiàn)障礙物,首先要停下來,然后判斷是應(yīng)該往左還是
15、往右,做出決定之后,再進(jìn)行具體的動作。針對這種不能在一個時刻完成,要經(jīng)過幾個不同的狀態(tài)才能處理完成的行為,可以用狀態(tài)機(jī)來解決。下圖是“逃離”行為的狀態(tài)機(jī):對于行為實(shí)現(xiàn)自己的狀態(tài)機(jī),在行為實(shí)現(xiàn)的代碼內(nèi)部實(shí)現(xiàn),而不影響其他行為。這種結(jié)構(gòu)可以讓每個行為子關(guān)心自己的實(shí)現(xiàn)方式,從而最大的降低軟件復(fù)雜度,方便功能添加和修改。逃離行為狀態(tài)機(jī)實(shí)現(xiàn)原型代碼: void BhEscape:Run() int bid = GetId(); / 狀態(tài)機(jī)實(shí)現(xiàn) switch(state) case 0: / 前方距離過小 if(GI_distanceDISTANCE_FORWORD < 30) GO_speed_l
16、eftbid = 0; GO_speed_rightbid = 0; GT_beh_actionACTION_TYPE_MOTORbid = true; 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
17、(); 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 > 1000) GO_eyeAnglebid = Angle_Center_90; GT_beh_actionACTION_TYPE_HEADbid = true; if(GI_distanceDISTANCE_LEFT_1 > GI_distanceDISTANCE_RIGHT_1) / 左轉(zhuǎn) GO_speed_leftbid = 0; GO_speed_rightbid = 255; else /右轉(zhuǎn) GO_speed_leftbid = 255; GO_speed_rightbid = 0; GT_beh_actionACTION_TYP
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年智慧城市建設(shè)信息化系統(tǒng)維護(hù)與安全保障合同2篇
- 2024版家庭裝修合同中的工程變更流程
- 2025年度洗滌房租賃及環(huán)保洗滌產(chǎn)品研發(fā)合同3篇
- 二零二五年度兒童撫養(yǎng)權(quán)變更及監(jiān)護(hù)責(zé)任轉(zhuǎn)移協(xié)議范本3篇
- 2024版建筑工程分包意向協(xié)議書3篇
- 二零二五年度口腔科線上線下融合服務(wù)合同2篇
- 垂直極化箔條相關(guān)項目投資計劃書范本
- 2024年綠化苗木交易協(xié)議:特定品種專用一
- 2025年度辣椒出口業(yè)務(wù)代理合同范本3篇
- 2024年設(shè)備購買合同標(biāo)的為50臺服務(wù)器設(shè)備
- 醫(yī)務(wù)人員外出進(jìn)修流程圖
- DB32∕T 2349-2013 楊樹一元立木材積表
- 昌樂二中271高效課堂培訓(xùn)與評價ppt課件
- 顫?。ㄅ两鹕。┲嗅t(yī)護(hù)理常規(guī)
- 豬場名詞及指標(biāo)講義
- 果膠項目商業(yè)計劃書(模板范本)
- 旋挖鉆成孔掏渣筒沉渣處理施工工藝
- T∕CHTS 10040-2021 公路無機(jī)結(jié)合料穩(wěn)定粒料基層振動法施工技術(shù)指南
- 集團(tuán)后備人才培養(yǎng)方案
- 腦卒中偏癱患者早期康復(fù)護(hù)理現(xiàn)狀(一)
- 國家開放大學(xué)電大本科《機(jī)電控制工程基礎(chǔ)》2023-2024期末試題及答案(試卷代號:1116)
評論
0/150
提交評論