




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
《視機(jī)器》實(shí)驗(yàn)告
::
:二零一六年一月第1章
目錄背景和意第2章系統(tǒng)方案設(shè)計(jì).第3章硬件設(shè)計(jì).3.1電腦鼠基本硬件組成3.2電腦鼠基本動(dòng)作第4章軟件設(shè)計(jì).4.1電腦鼠軟件設(shè)計(jì)概要說明4.2等高圖制作模塊.............................................114.3沖刺模塊...................................................124.4轉(zhuǎn)彎模塊...................................................124.5搜索模塊...................................................134.6迷宮地圖相對方向與絕對方向的建立...........................134.7墻壁資料存儲(chǔ)...............................................154.8電腦鼠搜索策略.............................................16參考文獻(xiàn).附件第1章
背景和意義電腦鼠可看作是一種具有人工智能的小型機(jī)器人依照比賽規(guī)則當(dāng)電腦鼠放入“迷宮”起點(diǎn),按下啟動(dòng)鍵之后,它就必須自行決定搜尋法則并且在迷中前進(jìn)、轉(zhuǎn)彎、記憶迷宮墻壁資料、計(jì)算最短路徑、搜尋終點(diǎn)等功能。電腦鼠結(jié)合了機(jī)械、電機(jī)、電子、控制、光學(xué)、程序設(shè)計(jì)和人工智能等多方面的科技識(shí)。國際電工和電子工程學(xué)會(huì)(IEEE)每年都要舉辦一次國際性的電腦鼠走迷宮競賽。首場電腦鼠迷宮競賽年于紐約舉行年以來年都有世界級的比賽。2007,國內(nèi)開始舉行標(biāo)準(zhǔn)電腦鼠走迷宮邀請賽自舉辦以來高校參賽踴躍,許多大學(xué)還開設(shè)了“電腦鼠原理和制作”選修課程。電腦鼠走迷宮競賽具有一定難度是一項(xiàng)富有挑戰(zhàn)性和趣味性的比賽電腦鼠可看作一個(gè)集多項(xiàng)工程學(xué)科知識(shí)于一體的小型系統(tǒng)功的設(shè)計(jì)者通常都是合作團(tuán)體們必須考慮電子、電氣、機(jī)械以及計(jì)算機(jī)各方面的問題,重量、速度、功耗、傳感技術(shù)重心以及程序各方面都是設(shè)計(jì)中需要決定和綜合考慮的因素電腦鼠結(jié)合了多學(xué)科知識(shí)對于提升我們的動(dòng)手能力團(tuán)隊(duì)協(xié)作能力和創(chuàng)新能力促進(jìn)課堂知識(shí)的消化和擴(kuò)展自身的知識(shí)面都非常有幫助;另外成立小組合作參賽,不僅使我們學(xué)到了知識(shí),而且加強(qiáng)了同學(xué)之間的交流交際能力語言表達(dá)能力等也得到了鍛煉和提升最后電腦鼠走迷宮競賽極具趣味性容易得到學(xué)生的認(rèn)同及參與并能很好的激發(fā)和引導(dǎo)學(xué)生這方面的興趣和愛好,為繼續(xù)參加比賽和深入學(xué)習(xí)提供了良好的條件。第系統(tǒng)方案設(shè)計(jì)硬件部分設(shè)計(jì)概要:軟件部分結(jié)構(gòu)設(shè)計(jì):第硬件設(shè)計(jì)3.1腦基硬組電腦鼠的硬件大致分為以下幾部分:傳感器、執(zhí)行部件、微處理器、機(jī)械結(jié)構(gòu),如圖3-1所示電腦鼠傳感器紅外傳感器
執(zhí)行部件步進(jìn)電機(jī)
微處理器
機(jī)械結(jié)構(gòu)車身設(shè)計(jì)圖電鼠件結(jié)構(gòu)圖1.傳感器它是電腦鼠感知外界環(huán)境的窗口是電腦鼠的雙眼好的傳感器是電腦鼠準(zhǔn)確獲取外部環(huán)境信息以做出正確判斷的依據(jù)是電腦鼠靈敏快捷的保證紅外測距方式在電腦鼠上應(yīng)用最廣。常見的紅外如圖所示本次電腦鼠使用6組紅外傳感器組紅外傳感器由紅外發(fā)線射器和紅外線接收器組成用于檢測迷宮墻壁信息,分別用于檢測左、左前、前、前、右前和右六個(gè)方向的墻壁信息。我們用U1-U5表示紅外線接收頭傳感器,RF1-RF5發(fā)送紅外線裝置,使用6組可調(diào)電阻W1-W5控制紅外信號發(fā)射強(qiáng)度,調(diào)整可見距離。信號采用載波調(diào)制,增強(qiáng)抗干擾性。傳感器由高功率880nm紅外發(fā)射管和高靈敏度紅外接收管組成,傳感器返回?cái)?shù)據(jù)為模擬量,通過ADC讀取,通過數(shù)值,可估算障礙物的距離。圖紅外傳感器2.執(zhí)行部件電機(jī)是電腦鼠的動(dòng)力源是電腦鼠的四肢只有具備健壯且靈活的四肢的電腦鼠才有可能在比賽中高效的解開迷宮機(jī)不但要能輸出足夠的馬力還要便于控制在此基礎(chǔ)上再配以合適的控制算法就能使電腦鼠快速而精確的行走電腦鼠中常用的是步進(jìn)電機(jī)和直流電機(jī)步進(jìn)電機(jī)控制容易但直流電機(jī)使電腦鼠控制更加靈敏。本次電腦鼠上有兩個(gè)兩相四線制的步進(jìn)電機(jī)電機(jī)和右電機(jī)用來控制電腦鼠前進(jìn)左轉(zhuǎn)和右轉(zhuǎn)停止進(jìn)電機(jī)是一種將電脈沖轉(zhuǎn)化為角位移的執(zhí)行機(jī)構(gòu)。當(dāng)步進(jìn)驅(qū)動(dòng)器接收到一個(gè)脈沖信號就驅(qū)動(dòng)步進(jìn)電機(jī)按設(shè)定的方向轉(zhuǎn)動(dòng)一個(gè)固定的角度(稱為“步距角”)它的旋轉(zhuǎn)是以固定的角度一步一步運(yùn)行的可以通過控制脈沖個(gè)數(shù)來控制角位移量從而達(dá)到準(zhǔn)確定位的目的同時(shí)可以通過控制脈沖頻率來控制電機(jī)轉(zhuǎn)動(dòng)的速度和加速度從而達(dá)到調(diào)速的目的四相步進(jìn)電機(jī)如圖3-3所示,電機(jī)驅(qū)動(dòng)采用ROHM公司MOS全橋芯片驅(qū)動(dòng),壓降低,給電機(jī)提供較大的輸入電壓電機(jī)控制簡單每個(gè)電機(jī)采用三個(gè)控制信號個(gè)I/O控制電機(jī)的正反轉(zhuǎn)、剎車,一個(gè)PWM控制電機(jī)調(diào)速,PWM范圍20KHz~100KHz圖四相步進(jìn)電機(jī)3.微處理器微處理器是電腦鼠的核心部分是電腦鼠的大腦幾乎所有的信息包括墻壁信息位置信息角度信息和電機(jī)狀態(tài)信息等都需要經(jīng)過微處理器處理并做出相應(yīng)的判斷所有的數(shù)據(jù)分析算法實(shí)現(xiàn)和執(zhí)行指令的發(fā)出等都需要由微處理器來完成。主控芯片STM32F103RET6具有72MHz的主頻,512KFlash,64KRAM,加個(gè)外部Flash,足夠比較使用。4.機(jī)械結(jié)構(gòu)電腦鼠要能夠在迷宮里面靈活穿梭必須有一副好身板有適合在迷宮中快速運(yùn)行的身體結(jié)構(gòu)首先他必須結(jié)實(shí)擁有兩只東倒西歪的輪子的電腦鼠是很難不在迷宮中碰壁的其次身材嬌小的電腦鼠在迷宮里是會(huì)更靈活的它有更大的空間用于完成轉(zhuǎn)彎有更大的空間用于糾正姿最后體重太大和沒有平衡感的老鼠也是不適宜迷宮競賽的基于如此多的考慮一只學(xué)富五車而又嬌小玲瓏的電腦鼠要求我們從機(jī)械上面有更多創(chuàng)新。電腦鼠的機(jī)械結(jié)構(gòu)如圖所示。圖電腦鼠的機(jī)械結(jié)構(gòu)3.2腦基動(dòng)電腦鼠基本動(dòng)作包括路口檢測,行走控制和轉(zhuǎn)彎。路口檢測:由安裝在前、右、左的三個(gè)紅外線發(fā)射對管和接收部件實(shí)現(xiàn),利用時(shí)鐘中斷來控制,實(shí)現(xiàn)遠(yuǎn)紅外測距功能,探測前、右、左有無障礙。行走控制:由左、右45?個(gè)紅外線發(fā)射對管和接收部件實(shí)現(xiàn),利用時(shí)鐘中斷來控制實(shí)現(xiàn)近紅外測距功能保持電腦鼠在中軸線上行走免撞墻。轉(zhuǎn)彎由于電機(jī)采用的是步進(jìn)電機(jī)只要對一個(gè)電機(jī)的步數(shù)進(jìn)行設(shè)定電機(jī)采用PWM進(jìn)行驅(qū)動(dòng)另外一個(gè)電機(jī)停止或者反轉(zhuǎn)同樣的步數(shù)當(dāng)然這個(gè)步數(shù)要自己實(shí)際測量。第4章軟件設(shè)計(jì)4.1腦軟設(shè)概說電腦鼠的軟件主要可以分為等高圖制作模塊、沖刺模塊、轉(zhuǎn)彎模塊、搜索模塊相對方向與絕對方向轉(zhuǎn)變模塊墻壁資料存儲(chǔ)模塊和電腦鼠搜索策略模塊這七個(gè)模塊。如圖3-5所示。
電腦鼠軟件主要模塊等高圖制
沖刺模塊
轉(zhuǎn)彎模塊
搜索模塊
相對方向
墻壁資料
電腦鼠搜作模塊
與絕對方向
存儲(chǔ)模塊
索策略模塊轉(zhuǎn)變模塊圖4-1軟件主要模塊圖下面介紹一下電腦鼠運(yùn)行中必須要知道的一些參數(shù)其在程序運(yùn)行過程中的用途。電腦鼠在運(yùn)行中可以劃分為四個(gè)狀態(tài):等待,啟動(dòng),搜索迷宮和沖刺狀態(tài)。1.等待狀態(tài)在該狀態(tài)中電腦鼠靜止在起點(diǎn)等待開始命令同時(shí)實(shí)時(shí)顯示傳感器檢測結(jié)果和電池電壓,這樣方便調(diào)試傳感器的靈敏度和更換電池。當(dāng)控制啟動(dòng)的按鍵按下后,電腦鼠進(jìn)入啟動(dòng)狀態(tài)。2.啟動(dòng)狀態(tài)在該狀態(tài)中,電腦鼠根據(jù)第一次轉(zhuǎn)彎的方向判斷起點(diǎn)是在坐標(biāo)的00)點(diǎn)還是在(15,0)點(diǎn)。其程序流程圖見圖3-6示:圖4-2判起點(diǎn)坐標(biāo)程序流圖3.搜索迷宮狀態(tài)在該狀態(tài)中,電腦鼠的任務(wù)就是搜索并記憶迷宮地圖,以采用右手搜索法則為例搜索全迷宮,其流程圖如圖3-7所示。圖迷宮搜索流程圖4.沖刺狀態(tài)迷宮搜索完畢后根據(jù)算法找出一條最優(yōu)路徑?jīng)_刺到終點(diǎn)沖刺結(jié)束后返回到起點(diǎn)。等高制作模塊等高圖就是等高線地圖的簡稱,有如一般地圖可以標(biāo)出同一高度的地區(qū)范圍,或有如氣象報(bào)告時(shí)的等氣壓的范圍和大小。那么等高圖運(yùn)用在迷宮地圖上,可以標(biāo)出每個(gè)迷宮格到起點(diǎn)相等步數(shù)的關(guān)系多封閉路徑的逃脫與沖刺的關(guān)卡都可以在制作出等高圖后迎刃而解,使電腦鼠更容易逃脫,少走一些彎路。首先開辟一塊16的二維數(shù)組空間MapStep[16][16]),其中每一個(gè)元素代表迷宮的一個(gè)方格用以計(jì)算后儲(chǔ)存各方格至起點(diǎn)的最短路徑步(所謂步數(shù)即為路徑中經(jīng)過的方格數(shù)當(dāng)起點(diǎn)坐標(biāo)處標(biāo)識(shí)為1時(shí)可以直接達(dá)到的相鄰方格均為2,再遠(yuǎn)的方格的等高值依次遞增,這樣距離越遠(yuǎn)的地方等高值越大。沖刺塊沖刺函數(shù)的實(shí)現(xiàn)是建立在等高圖已經(jīng)建立好的基礎(chǔ)上的電腦鼠要進(jìn)行沖刺的時(shí)候調(diào)用沖刺函數(shù)時(shí)首先會(huì)調(diào)用等高圖制作函數(shù)將等高圖制作好然后該函數(shù)通過等高圖和墻壁信息來進(jìn)行電腦鼠的行進(jìn)控制當(dāng)然我們認(rèn)為電腦鼠在走直道的時(shí)候應(yīng)該會(huì)比走彎道的時(shí)候來的更快一點(diǎn)所以我們沒有進(jìn)行特殊的加權(quán),直接是走直道的。電腦鼠從起點(diǎn)開始,一直利用等高圖信息和墻壁信息進(jìn)行一格一格的對比,只有當(dāng)這一格在電腦鼠絕對方向上時(shí)這一格才算記錄到進(jìn)行直道沖刺同時(shí)直道格數(shù)加一當(dāng)遇到電腦鼠要轉(zhuǎn)彎的時(shí)候已經(jīng)將要走的步數(shù)記錄下來了接下來直接調(diào)用行進(jìn)函數(shù)控制電腦鼠走完記錄好的步數(shù)后即走到電腦鼠要轉(zhuǎn)彎的地方后,再進(jìn)行轉(zhuǎn)彎,然后接著繼續(xù)進(jìn)行上一步的動(dòng)作。轉(zhuǎn)彎塊轉(zhuǎn)彎也是電腦鼠運(yùn)行時(shí)必不可少一部分時(shí)轉(zhuǎn)彎也分為靜止轉(zhuǎn)彎和行進(jìn)中轉(zhuǎn)彎靜止轉(zhuǎn)彎要求電腦鼠首先要停止主要用在電腦鼠進(jìn)行搜索中這時(shí)要求電腦鼠要絕對的穩(wěn)定所以采用靜止轉(zhuǎn)彎比較好行進(jìn)中轉(zhuǎn)彎的特點(diǎn)是消除了靜止轉(zhuǎn)彎的要求電腦鼠停止的弊端可以節(jié)省一些時(shí)間主要用在電腦鼠進(jìn)行沖刺時(shí)這時(shí)要求電腦鼠要以竟可能短的時(shí)間從起點(diǎn)到達(dá)終點(diǎn)所以行進(jìn)中轉(zhuǎn)彎可以節(jié)省不少的時(shí)間。靜止轉(zhuǎn)彎時(shí),對兩個(gè)電機(jī)設(shè)置走相同的步數(shù),如當(dāng)要轉(zhuǎn)左轉(zhuǎn)90?置左電機(jī)向后走40右電機(jī)向前走步通過兩個(gè)電機(jī)走的方位不同來實(shí)現(xiàn)靜止轉(zhuǎn)彎但靜止轉(zhuǎn)彎的缺點(diǎn)就是在轉(zhuǎn)彎前首先要讓電機(jī)停止然后再對電機(jī)的要走的步數(shù)進(jìn)行賦值,這樣會(huì)浪費(fèi)一點(diǎn)時(shí)間。行進(jìn)中轉(zhuǎn)彎時(shí),讓一個(gè)輪子停止,一個(gè)輪子進(jìn)行運(yùn)轉(zhuǎn)來實(shí)現(xiàn)。如當(dāng)要左轉(zhuǎn)90?置左電機(jī)停止轉(zhuǎn)動(dòng),右電機(jī)轉(zhuǎn)動(dòng)80。與靜止轉(zhuǎn)彎區(qū)別開來的是,電機(jī)的步數(shù)在其他的函數(shù)中賦值好了轉(zhuǎn)彎函數(shù)中只要一開始將一個(gè)電機(jī)停止轉(zhuǎn)動(dòng)就可以了不用一開始就將兩個(gè)電機(jī)都停止后對電機(jī)的步數(shù)進(jìn)行賦值,這樣的話,就可以節(jié)省一些不必要的時(shí)間。搜索塊電腦鼠一開始進(jìn)行迷宮搜索時(shí)必須要用到這個(gè)模塊過這個(gè)模塊電腦鼠進(jìn)行迷宮的墻壁信息的采集,電腦鼠所走過的每個(gè)坐標(biāo)都會(huì)有一個(gè)相應(yīng)的墻壁信息,這些墻壁信息是電腦鼠后來進(jìn)行等高圖制作和沖刺的基礎(chǔ)。在進(jìn)行搜索時(shí)電腦鼠的紅外是在時(shí)鐘中斷下不停地被驅(qū)動(dòng)的這一連串的動(dòng)作有發(fā)射短波紅外發(fā)射長波紅外和接受紅外處理器通過讀取紅外接收器對應(yīng)引腳的信息來判斷四周的情況時(shí)將迷宮的信息進(jìn)行編碼后存儲(chǔ)在對應(yīng)坐標(biāo)的一個(gè)迷宮情況數(shù)組中。當(dāng)遇到岔路時(shí)程序跳出搜索函數(shù)回到主函數(shù)中將岔路坐標(biāo)進(jìn)行處理將這個(gè)坐標(biāo)進(jìn)行入棧回到搜索函數(shù)中所選用的搜索法則選擇好一條路后,繼續(xù)搜索,并這樣一直下去直到電腦鼠運(yùn)行到終點(diǎn)。迷宮圖相對方與絕對方向的立迷宮是用18cm?大小的方格組成的,其行列各有16個(gè)方格。為了讓電腦鼠記住所走過的各個(gè)迷宮格的信息們就坐標(biāo)的方法來對迷宮格進(jìn)行編號根據(jù)坐標(biāo)的的定義和比賽規(guī)則也為了把上下左右這四個(gè)方向參數(shù)轉(zhuǎn)換為微控制器能夠識(shí)別的符號,在本文中,將向上的方向定義為、向右為、向下為2向左為3,如圖所示。MOUSEMOUSE圖迷宮方向值定義只要有了迷宮的坐標(biāo)和方向后腦鼠在迷宮行走就可以隨時(shí)知道自己所處的位置和方位了然而對于電腦鼠而言紅外線傳感器的位置和方向是固定不變的但是對于迷宮紅外線傳感器的位置和方向是隨著老鼠前進(jìn)方向的變化而一起變化的是由于選擇參物的不同而引起的此引出了兩個(gè)方向的問題:相對方向和絕對方向。相對方向:以電腦鼠當(dāng)前行走方向?yàn)閰⒄盏姆较颉=^對方向:以迷宮絕對坐標(biāo)平面為參照的方向。那么傳感器所檢測到的信息如何才能更便于處理呢?周立功提到了如果以相對方向存儲(chǔ)的資料將是混亂的不僅要存儲(chǔ)麻煩而且要記錄起檢測時(shí)電腦鼠所處的方向存儲(chǔ)量比較大處理起來也非常麻煩而以絕對方向存儲(chǔ)就不需要考慮當(dāng)前電腦鼠的方向。這樣就會(huì)經(jīng)常遇到相對方向和絕對方向的互換。在本文中采取了以變量Dir記錄電腦鼠前進(jìn)方向上的絕對方向值,即前方的絕對方向值始終為Dir。這樣電腦鼠的相對方向轉(zhuǎn)換成絕對方向如表所示。表相對方向轉(zhuǎn)換成絕對方向相對方向電腦鼠前方電腦鼠右方電腦鼠后方電腦鼠左方
絕對方向Dir+1(Dir+1)(Dir+2)(Dir+3)有時(shí)候系統(tǒng)還需要根據(jù)絕對方向(Dir_dst)和當(dāng)前的絕對方向(Dir)求出方向偏差值(△),如式所示。△
式為了使△的值落在0~3的范圍內(nèi),計(jì)算式進(jìn)行式的轉(zhuǎn)換如下:△=(Dir_dst+4Dir)%4
式這時(shí)就可以根據(jù)方向偏差值求出電腦鼠的相對方向,如表所示。表絕對方向轉(zhuǎn)換成相對方向絕對方向差值eq\o\ac(△,())
相對方向電腦鼠前方電腦鼠右方電腦鼠后方電腦鼠左方假設(shè)電腦鼠已知當(dāng)前位置坐標(biāo)(X,),那么就可以求出在其某絕對方向上的相鄰坐標(biāo)值,如表3.3所示。該表是可逆的,即可以根據(jù)坐標(biāo)值的變化求出絕對方向。表3-3坐轉(zhuǎn)換絕對方向當(dāng)前位置上方()右方()下方()左方()
坐標(biāo)(X,)(XY+1)(,Y)(XY-1(,y)當(dāng)電腦鼠達(dá)到一方格坐標(biāo)時(shí)應(yīng)根據(jù)傳感器檢測結(jié)果記錄下當(dāng)前方格的墻壁資料為了方便管理和節(jié)省存儲(chǔ)空間每一個(gè)字節(jié)變量的低四位分別用來存儲(chǔ)一個(gè)方格四周的墻壁資料,如表3.4所示。因?yàn)槊詫m共有?個(gè)方格,所以可以定義一個(gè)16?的二維數(shù)組變量來保存整個(gè)迷宮墻壁資料。表3-4墻資料存儲(chǔ)方式變量位bit0bit1bit2bit3bit7~
代表的絕對方向上方(0)右方(1)下方(2)左方(3)
備注:路,0:有墻壁:路,0:有墻壁:路,0:有墻壁:路,0:有墻壁保留位迷宮墻壁資料全部初始化為0,表示走過迷宮格至少有一方?jīng)]墻壁,即墻壁資料不為0這樣就可以通過單元格存儲(chǔ)的墻壁資料是否為0來確定該單元格是否曾搜索過。墻壁料存儲(chǔ)為了記憶迷宮的詳細(xì)信息需要對迷宮單元的位置進(jìn)行線路標(biāo)記全迷宮共有16?個(gè)單元組成采用二維坐標(biāo)方式標(biāo)記用每個(gè)單元的XY標(biāo)表示,如起點(diǎn)可標(biāo)記為(0,),終點(diǎn)為7)。此外,還需要對迷宮單元的可行進(jìn)方向進(jìn)行標(biāo)記,可采用絕對方位或相對方位二種方式。絕對方位這是一種與電腦鼠行進(jìn)方向無關(guān)的標(biāo)記方式以一個(gè)四位的二進(jìn)制數(shù),分別表示“東”﹑“西”﹑“南”和“北”四個(gè)方向。1表示允許行進(jìn)(無墻壁),0表示不允許行進(jìn)(有墻壁)。相對方位這是一種與電腦鼠行進(jìn)方向有關(guān)的標(biāo)記方式以一個(gè)三位的二進(jìn)制數(shù)即可實(shí)現(xiàn)標(biāo)記,分別表示“前”“左”“右”,1表示允許(無墻壁),0表示不允許(有墻壁)。電腦搜索策略電腦鼠走迷宮可以采用全迷宮探索策略,即將迷宮的所有單元均搜索一次,從中找出最佳的行走路徑。這種策略需要有足夠的時(shí)間或探測次數(shù),但在IEEE競賽規(guī)則中每場競賽只有15分鐘的時(shí)間,因此是不可能的。另一種方法是部分迷宮探索策略即在有限的時(shí)間或探測次數(shù)下只探測迷宮的一部分從中找出次最佳的路徑,顯然只能采用這種策略。電腦鼠在一巷道內(nèi)行走如果最后無路可走則該巷為死巷電腦鼠在任一單元內(nèi),可能的行走方向最多只有三(前、左、),如果有二個(gè)或二個(gè)以上的可能行走方向,稱為交叉,遇有交叉時(shí),由于有多個(gè)可以行走的方向,在行走方向的選擇上,可有下面的幾種選擇法則:右手法則:遇有交叉時(shí),以右邊為優(yōu)先的前進(jìn)方向,然后是直線方向、左邊方向。左手法則:遇有交叉時(shí),以左邊為優(yōu)先的前進(jìn)方向,然后是直線方向、右邊方向。中左法則:遇有交叉時(shí),以直線為優(yōu)先的前進(jìn)方向,然后是左邊方向、右邊方向。與此類似的還有中右法則。亂數(shù)法則:遇有交叉時(shí),取隨機(jī)值作為前進(jìn)方向。向心法則:由于終點(diǎn)在迷宮的中心,遇有交叉時(shí),以向迷宮中心的方向?yàn)閮?yōu)先的前進(jìn)方向。參考文獻(xiàn)[1]金東勇.ZigBee技術(shù)在智能家居控制系統(tǒng)中的應(yīng)用研究[D].太原理工大學(xué)工學(xué)碩士學(xué)位論文2008:[2]郭天祥新概念51片機(jī)語言教程:入門、提高、開發(fā)、拓展全攻略(附光盤1張)2009-01-01[3]胡漢才單片機(jī)原理及其接口技術(shù)(第3版)(附CD-ROM光盤1張)2010-05-01[4]程國鋼51片機(jī)應(yīng)用開發(fā)案例手冊2011-11-01附:電腦鼠原理圖:電腦鼠單片機(jī)控制程序:Info---------------------------------------------------------------------------------FileLastDate:LastVersion:V1.0Description:
????2ìD?μ?μ??1?D??¢£??1y???ü??¨??μ??ò??′2¢?íí?2?ˉ3ìD?′DD?--------------------------------------------------------------------------------------------------------By:LiaoMaogangdate:2007/09/08V1.0--------------------------------------------------------------------------------------------------------ModifiedMovedMyModifiedDescription:?óo?"stm32f10x.h""BitBand.h""Mouse_Drive.h"?auint8=/o??aê
/uint8GucYStart/?Y?aê
/uint8GucXGoal0XDST0;/?aê£?óDá??
/uint8GucXGoal1XDST1;uint8GucYGoal0YDST0;/?aê£?óDá??
/uint8GucYGoal1YDST1;uint8=WAIT;/?′ò??′ay/uint8={0xff};/a′?e?aê?
/MAZECOORGmcStack[MAZETYPEMAZETYPE]={0};/?úmapStepEdit()?D?e?1ó?/MAZECOORGmcCrossway[MAZETYPEMAZETYPE]={0};/′′?§???aê///externuint8GucGoHead;name:
?óêaoˉinputuiD:?óêa2?′?a?outputReturned?TvoiddelayuiD){for(;uiD;uiD--);}/name:
?e?aêa?eμ?μμ??input?μμo??aêuiY:?μμ???aêoutput?e?aê?Returned?TvoidmapStepEdit(int8cY){uint8=
/aê
/uint8=1;
/
?
/uint8ucStat
/
í?????uint8i,j;
/=cX;/=cY;//3?ˉ?e?aê?/for(i=i<MAZETYPE;i++){for(j=j<MAZETYPE;j++){=}}/?e?£??a?óDêyY|àííêa/{
//=ucStep++;/?//
/?a??aê??à??????í3?ucStatif((GucMapBlock[cX][cY]&0x01)&&/
??óD??/(GucMapStep[cX][cY(ucStep))){?′??ˉ?¨/
/
????????ó1/}
/
?if((GucMapBlock[cX][cY]&0x02)&&
/
??óD??/+1][cY]>(ucStep))){?′??ˉ?¨/
/
óò???????ó1/}if((GucMapBlock[cX][cY]&0x04)&&(GucMapStep[cX][cY->{?????ó1/}if((GucMapBlock[cX][cY]&0x08)&&-1][cY]>(ucStep))){?????ó1/}/??óD???????a???óa(chǎn)??è???????????/if0){n--;===}{
///
???if1){?????a?aê/
/
???cX;/aê/cY;/?aê/}/????????/
o???if((GucMapBlock[cX][cY]&0x01)&&
/
é???óD??/(GucMapStep[cX][cY(ucStep))){′?óúˉ?¨/
/
é????
/
??aê
/continue;}if((GucMapBlock[cX][cY]&0x02)&&
/
??óD??/+1][cY]>(ucStep))){?′??ˉ?¨/
/
óò??
/
??aê
/continue;}if((GucMapBlock[cX][cY]&0x04)&&
/
????óD??/(GucMapStep[cX][cY->{′?óúˉ?¨/
/
?????cY--;
/
??aê
/continue;}if((GucMapBlock[cX][cY]&0x08)&&
/
???óD??/-1][cY]>(ucStep))){?′??ˉ?¨/
/
????cX--;
/
??aê
/continue;}}}}void(void)//3′?{uint8ucTemp=0xff;int8=0;/???aê?a?e?????ea?aê/if(GucMapBlock[GucXGoal0][GucYGoal0]&0x0c){/?aê??ú/mapStepEdit(GucXGoal0,GucYGoal0);?e?/
/
?D???if(ucTemp>{??aê/cXdstcYdstucTemp=GucMapStep[GucXStart][GucYStart];}}
/
aif(GucMapBlock[GucXGoal0][GucYGoal1]&{?aê??ú/
/
?D???mapStepEdit(GucXGoal0,GucYGoal1);?e?/
/
if(ucTemp>{??aê/cXdstcYdstucTemp=GucMapStep[GucXStart][GucYStart];}}
/
aif(GucMapBlock[GucXGoal1][GucYGoal0]&{?aê??ú/
/
?D???mapStepEdit(GucXGoal1,GucYGoal0);?e?/
/
if(ucTemp>{??aê/cXdstcYdstucTemp=GucMapStep[GucXStart][GucYStart];}}
/
aif(GucMapBlock[GucXGoal1][GucYGoal1]&{?aê??ú/
/
?D???mapStepEdit(GucXGoal1,GucYGoal1);/
?e?/if(ucTemp>{/??aê/cXdstcYdstucTemp=GucMapStep[GucXStart][GucYStart];}}objectGoTo_L(cXdst,cYdst);???¨?aê/}voidobjectGoTocXdst,int8cYdst){uint8=1;int8cNBlock=0,cDirTemp;int8cX,cY;=GmcMouse.cX;=GmcMouse.cY;e?//??????aê?ˉa???/((cX!={=/è?????aa????????/
/
a/?if((GucMapBlock[cX][cY]&0x01)&&
/
é???óD??
/(GucMapStep[cX][cY{
/
é??????
/cDirTemp=UP;
/
?????/if==GucMouseDir){?2ˉòa?a??/
/
ó??è?cNBlock++;
/
???????
/continue;
/
1a?′?
/}}if((GucMapBlock[cX][cY]&0x02)&&/
??óD??
/+1][cY]<ucStep)){/
óò????
/cDirTemp=
/
?????/if==GucMouseDir){?2ˉòa?a??/
/
ó??è?cNBlock++;
/
???????/continue;a?′?/}}if((GucMapBlock[cX][cY]&0x04)&&óD??/
//
1????(GucMapStep[cX][cY-<{
/
???????
/cDirTemp=DOWN;
/
???????/if==GucMouseDir){?2ˉòa?a??/
/
ó??è?cNBlock++;
/
???????/cY--;continue;a?′?/}}if((GucMapBlock[cX][cY]&0x08)&&óD??/
//
1???-1][cY]<{
/
???????
/cDirTemp=
/
?????/if==GucMouseDir){?2ˉòa?a??/
/
ó??è?cNBlock++;
/
???????
/cX--;continue;
/
1a?′?
/}}cDirTemp=+GucMouseDir)%4;/
????/cDirTemp;if(cNBlock){mouseGoahead(cNBlock);?cNBlock/}
/
??cNBlock=0;
/
/???a/switch{mouseTurnright();break;break;break;}GmcMouse.cX=cX;GmcMouse.cY=cY;}/?D?????/if(cNBlock){mouseGoahead(cNBlock);GmcMouse.cX=cX;GmcMouse.cY=cY;}}voidobjectGoTo_L(int8cXdst,{uint8=1;int8cNBlock=0,cDirTemp;int8cX,cY;=GmcMouse.cX;=GmcMouse.cY;e?//??????aê?ˉa???/((cX!={=/è?????aa????????/
/
?if((GucMapBlock[cX][cY]&0x01)&&
/
é???óD??
/(GucMapStep[cX][cY{
/
é??????
/cDirTemp=UP;
/
?????/if==GucMouseDir){?2ˉòa?a??/
/
ó??è?cNBlock++;
/
???????/continue;a?′?/}}if((GucMapBlock[cX][cY]&0x02)&&óD??/
//
1??+1][cY]<ucStep)){
/
óò????
/cDirTemp=
/
?????/if==GucMouseDir){?2ˉòa?a??/
/
ó??è?cNBlock++;
/
???????
/continue;
/
1a?′?
/}}if((GucMapBlock[cX][cY]&0x04)&&/
????óD??
/(GucMapStep[cX][cY-<{/
???????
/cDirTemp=DOWN;
/
???????/if==GucMouseDir){?2ˉòa?a??/
/
ó??è?cNBlock++;
/
???????/cY--;continue;a?′?/}}if((GucMapBlock[cX][cY]&0x08)&&óD??/
//
1???-1][cY]<{
/
???????
/cDirTemp=
/
?????/if==GucMouseDir){?2ˉòa?a??/
/
ó??è?cNBlock++;
/
???????
/cX--;continue;
/
1a?′?/}}cDirTemp=+GucMouseDir)%4;???/cDirTemp;if(cNBlock){mouseGoahead(cNBlock);?cNBlock/}
//
???cNBlock=0;
/
/???a/switch{mouseTurnright();break;break;break;break;}GmcMouse.cX=cX;GmcMouse.cY=cY;}/?D?????/if(cNBlock){mouseGoahead(cNBlock);GmcMouse.cX=cX;GmcMouse.cY=cY;}}name:mazeBlockDataGet
????????3????é??????μ??aú?inputμ??ê?μ?????output
Returned:?aú?/uint8mazeBlockDataGet(uint8ucDirTemp){int8cX=0,cY=??μ??????a???/switch{MOUSEFRONT:ucDirTemp=break;ucDirTemp=+%break;MOUSERIGHT:ucDirTemp=+%break;break;}/???Y?????????áú?aê/switch{=GmcMouse.cX;=break;==GmcMouse.cY;break;=GmcMouse.cX;=-break;=-=GmcMouse.cY;break;/}/
break;}return(GucMapBlock0[cX][cY]);?1??name:
/inputoutputReturned/void{
?¨£?ó??è?????T?Tif((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEWAY_R)&&μ??ê?μóòa?/
/=={
/μ??ê?μóòa?
/mouseTurnright();
/μ??ê?óò?areturn;}
/if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEWAY_F)&&μ??ê?????/
/==0x00)){
/μ??ê?????
/return;
/μ??ê?2?a}
/if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEW&&μ??ê???a?/
/)==0x00)){
/μ??ê???a?
/
/μ??ê????areturn;}}name:
/inputoutput
???¨£?ó??è?????ˉ?TReturned?TvoidleftMethod(void){if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEW&&/μ??ê???a?/)==0x00)){/μ??ê???a?
/
/μ??ê????areturn;}
/if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&AY_F)&&μ??ê?????/
/==0x00)){
/μ??ê?????
/return;
/μ??ê?2?a}
/if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEWAY_R)&&μ??ê?μóòa?/
/=={
/μ??ê?μóòa?
/mouseTurnright();
/μ??ê?óò?areturn;}}/
/name:frontRightMethodinputoutputReturned
?¨£?ó??è??′??óò?T?T/voidfrontRightMethod(void){if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEWAY_F)&&μ??ê?????/
/==0x00)){
/μ??ê?????
/return;
/μ??ê?2?a
/}if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEWAY_R)&&/μ??ê?μóòa?/=={/μ??ê?μóòa?
/mouseTurnright();
/μ??ê?óò?areturn;}
/if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEW&&μ??ê???a?/
/)==0x00)){
/μ??ê???a?
/
/μ??ê????areturn;}}/
/name:inputoutputReturned
?D???¨??′??????T?T/void(void){if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEWAY_F)&&μ??ê?????/
/==0x00)){
/μ??ê?????
/return;
/μ??ê?2?a}
/if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEW&&μ??ê???a?/
/)==0x00)){
/μ??ê???a?
/
/μ??ê????areturn;}
/if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEWAY_R)&&/μ??ê?μóòa?/=={/μ??ê?μóòa?
/mouseTurnright();
/μ??ê?óò?areturn;}}/
/name:centralMethod
?DD?????Yμ??ê???1??D?|μ???¨ó?oe?¨inputoutputReturned?T/void{if&{if&{/′a?1?/switch(GucMouseDir){UP:????é?/
/
aleftMethod();
/
???¨
/break;RIGHT:
/
a????óò
/rightMethod();
/?¨
/break;
/
a?????
//?¨/break;LEFT:???????/frontLeftMethod();/??¨/break;break;}}{/′a?1?μóò???/switch(GucMouseDir){UP:????é?/
//
a?D?afrontLeftMethod();
/
?D???¨
/break;RIGHT:
/
a????óò
/leftMethod();
/
???¨
/break;
/
a?????
/rightMethod();
/?¨
/break;LEFT:
/
a???????
/
/?¨
/break;break;}}}{if&{/′a?1???/switch(GucMouseDir){UP:????é?/
/
arightMethod();
/?¨
/break;RIGHT:
/
a????óò
/
/?¨
/break;
/
a?????/frontLeftMethod();??¨/break;
/
?D?LEFT:
/
a???????
/leftMethod();
/
???¨
/break;break;}}{/′a?1???/switch(GucMouseDir){UP:????é?//?¨/break;
/
aRIGHT:
/
a????óò
/frontLeftMethod();
/
?D???¨
/break;
/
a?????
/leftMethod();
/
???¨
/break;LEFT:
/
a???????
/rightMethod();
/?¨}}}/
break;break;}
/name:crosswayCheck
í3?aê′1?′?§??inputucX£?Dˉa?ì2o??aêòa?ì2??aêoutput
Returned′???/uint8crosswayCheck(int8cX,int8cY){uint8ucCtif((GucMapBlock[cX][cY]&0x01)&&/???1?é????/1])0x00){/???1?é???′?/?????ó1/}if((GucMapBlock[cX][cY]&0x02)&&/???1???/
/
???????(GucMapBlock0[cX+1][cY])0x00){???1???/
/
???????ó1/}
/
?if((GucMapBlock[cX][cY]&0x04)&&???1???/-0x00){???1?????′?/
//
?????????ó1/}
/
?if((GucMapBlock[cX][cY]&0x08)&&???1?????/(GucMapBlock0[cX-1][cY])==0x00){???1????′?/
//
?????????ó1/}ucCt;}/name:??§???e????input?ToutputReturned?T/voidcrosswayChoice{switch(SEARCHMETHOD){rightMethod();
/
?break;LEFTMETHOD:leftMethod();break;CENTRALMETHOD:break;FRONTRIGHTMETHOD:break;FRONTLEFTMETHOD
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房顫基礎(chǔ)知識(shí)試題及答案
- 育嬰員考試題及答案
- 藥學(xué)基礎(chǔ)知識(shí)普及試題及答案
- 藥物與食物相互作用研究試題及答案
- 單位招聘面試題及答案
- 色覺標(biāo)準(zhǔn) 測試題及答案
- 西醫(yī)臨床應(yīng)試策略與分析試題及答案
- 數(shù)控編程筆試題目及答案
- 文職轉(zhuǎn)崗測試題及答案
- 藥劑類考試分科試題及答案分析
- 綠色金融產(chǎn)品創(chuàng)新與風(fēng)險(xiǎn)管理-全面剖析
- 肝門部膽管癌診斷和治療指南(2025版)解讀
- 2025年廣東廣州市高三一模英語試卷試題及答案
- 山西省朔州市懷仁縣2025屆小學(xué)六年級第二學(xué)期小升初數(shù)學(xué)試卷含解析
- 東北三省三校2025屆高三下學(xué)期第二次聯(lián)合模擬考試物理試題及答案
- 2025年山東省濟(jì)南市萊蕪區(qū)中考一模地理試卷(原卷版+解析版)
- 2025陜西金融資產(chǎn)管理股份有限公司員工招聘(26人)筆試參考題庫附帶答案詳解
- 2025年中國經(jīng)緯儀行業(yè)市場調(diào)查研究及投資前景展望報(bào)告
- 杭州2025年浙江杭州余杭區(qū)余杭街道招聘編外勞務(wù)派遣人員25人筆試歷年參考題庫附帶答案詳解
- 2024-2025學(xué)年度四川省達(dá)州市達(dá)川區(qū)銘仁園學(xué)校高一第二學(xué)期3月月考?xì)v史試題(含答案)
- 2025年全球美容與美容個(gè)護(hù)趨勢報(bào)告:中國篇
評論
0/150
提交評論