水中機(jī)器魚大賽技術(shù)文檔.doc
參賽學(xué)校:某大學(xué)
參賽隊名:水中機(jī)器魚隊
參賽項目:水中機(jī)器人全局視覺水球2VS2
文檔內(nèi)容:
摘要
本文章是參加2015年中國水中機(jī)器人大賽。
本文描述了 軟件功能介紹,硬件介紹,基本操作,策略編寫,策略加載。
引言
今年來理工學(xué)院十分重視機(jī)器人比賽團(tuán)隊的建設(shè),訓(xùn)練和參賽,并特地提供了實驗室,給予了大量人力,物力和財力支持,以鼓勵有興趣的同學(xué)們投入到相關(guān)的學(xué)習(xí)和研究中。
我隊主要致力于機(jī)器智能的研究。在機(jī)器人的研究方面,著重于機(jī)器人編程軟件及組裝方面。在仿人形機(jī)器人中,我們隊主要熟悉MURobot大平臺(含小平臺),攝像頭驅(qū)動,CP210X驅(qū)動安裝及應(yīng)用,并用C++語言編寫策略,使仿真魚在水中完成各項任務(wù)。
機(jī)器魚的控制,相當(dāng)于參照一條真正魚的行動方式,需要“眼睛”來識別,需要“尾巴”來獲得動力,需要一個“腦子”做決策。我們針對實體魚來說明一下,“眼睛”就是我們魚池上方的攝像頭,動力就是魚體內(nèi)的舵機(jī),決策的“腦子”就是我們的程序
比賽規(guī)則如下:
裁判鳴哨開球后,所有的機(jī)器魚由各參賽隊員手動啟動。在裁判哨聲前搶先啟動的機(jī)器魚將被警告,二次警告后將被移離比賽場地,不得再參加比賽。
比賽分上下兩個半場。在上半場開場時,A隊機(jī)器魚從靠近水球點出發(fā),B隊機(jī)器魚從本方球門處出發(fā),以體現(xiàn)開球優(yōu)勢;同理,在下半場開場時,B隊機(jī)器魚從靠近水球點出發(fā),A隊機(jī)器魚從本方球門出發(fā)。
若有一方進(jìn)球后,則重新開球。被進(jìn)球方的機(jī)器魚從靠近水球點出發(fā),進(jìn)球方的機(jī)器魚則從本方球門出發(fā)。
機(jī)器魚要求:
機(jī)器魚游動方向定義為長度,擺動方向定義為厚度,兩者垂直方向定義為高度。
頭部長度:150-180mm
頭部高度:60-90mm
頭部厚度:30-50mm
尾部長度(不包括尾鰭):160-190mm,尾部高度厚度不得超過頭部
尾鰭長度:沿長度方向50-80mm,沿高度方向90-120mm
胸鰭尾鰭材料:采用較硬塑料材料,不得用金屬材料,以免比賽中刮壞
尾部材料:尾部統(tǒng)一使用橡膠皮套
機(jī)器魚顏色為黑色,可以在機(jī)器魚的尾鰭側(cè)面粘貼學(xué)校的名稱、標(biāo)志或編號,以區(qū)別不同球隊的機(jī)器魚。
每個機(jī)器魚重量不得超過2kg;在不受擠壓的情況下,機(jī)器魚必須能夠放進(jìn)一個底面半徑為75mm,高為450mm的圓筒里面。
一、軟硬件安裝
1.1水池的搭建
比賽場地為長方形水池,包括兩臺比賽電腦、一個支架、兩個個攝像頭,兩套球門、兩個無線通信模塊。
水池內(nèi)部矩形區(qū)域為最終的有效比賽場地,不包括水池壁及球門架兩側(cè)區(qū)域,有效比賽場地尺寸為2700 mm 2000 mm 300mm(長寬高)
1.2MURobot控制平臺安裝
①在U盤“軟件驅(qū)動”目錄下選擇“MURobot”安裝文件,例如上圖所示電腦系統(tǒng)為32位,在安裝文件時選擇32位安裝包,雙擊打開。(32位安裝包和64位安裝包區(qū)別:32位安裝包為X86,64位安裝包為X64)。如下圖
②打開32位“MURobot”安裝文件,雙擊運(yùn)行里面安裝包,根據(jù)下圖順序進(jìn)行安裝。
③正常安裝完成后桌面會出現(xiàn)三個快方式,此時MURobot控制平臺安裝完畢,如下圖所示(如不能正常安裝查閱附表1-001)
二、軟件功能介紹
2. 1、串口介紹
串行接口(Serialport)又稱“串口”,主要用于串行式逐位數(shù)據(jù)傳輸。
在全局視覺機(jī)器魚上我們利用串口來進(jìn)行數(shù)據(jù)交互。在使用全局魚平臺時,將無線發(fā)射模塊(參考硬件篇)通過USB與電腦連接,就會出現(xiàn)對應(yīng)串口的COM口。
接下來介紹串口端口號的查找,鼠標(biāo)右擊桌面“計算機(jī)”圖標(biāo),單機(jī)“屬性”,出現(xiàn)計算機(jī)屬性界面,單機(jī)打開左上角的設(shè)備管理器,按下圖操作來找到串口端口號,此串口端口號是為使用大平臺、小平臺時打開串口號做準(zhǔn)備的,在使用大平臺、小平臺時時會按照此端口號打開串口。
2.2、大平臺介紹
大平臺是對機(jī)器魚所在環(huán)境進(jìn)行分析處理另外處理程序代碼與機(jī)器魚互傳指令實現(xiàn)人機(jī)交互的一個操作平臺。雙擊桌面快捷方式,運(yùn)行大平臺,進(jìn)入大平臺主界面,如下圖
(1).通信參數(shù)設(shè)置
通過大平臺主界面的“通信參數(shù)設(shè)置”按鍵,單機(jī)打開,就可以進(jìn)入通信時各參數(shù)設(shè)置,功能如下圖所示
(2).圖像參數(shù)設(shè)置
通過大平臺主界面的“圖像參數(shù)設(shè)置”按鍵,單機(jī)打開,可以對攝像頭采集的圖像。
(3).目標(biāo)識別控制
通過大平臺主界面的“目標(biāo)識別”按鍵,單機(jī)打開,可對打開的原始圖像(Original)中目標(biāo)進(jìn)行識別控制。
選擇魚或球或環(huán)方法:點擊要選魚、球或環(huán)序號在原始圖像上框選要選擇的對象即可選擇,按住0框選需取消對象即可取消選擇。
選擇A隊1-8號魚的快捷鍵分別是:1、2、3、4、5、6、7、8;
選擇B隊1-8號魚的快捷鍵分別是:Q、W、E、R、T、Y、U、I;
選擇1-9號魚的快捷鍵分別是:A、S、D、F、G、H、J、K、L;
(4).原始圖像控制
通過大平臺主界面的“原始圖像”按鍵,單機(jī)打開,可以設(shè)置加載策略時使用的臨時目標(biāo)點或是障礙物。
(5).前景圖像
通過大平臺主界面的“前景圖像”按鍵,單機(jī)打開,能顯示捕捉的背景圖像。
(6).信息顯示
通過大平臺主界面的“信息顯示”按鍵,單機(jī)打開,能實時顯示攝像頭捕獲信息。
2.3.小平臺介紹
(1).小平臺打開方式
①通過大平臺主界面的“調(diào)試助手”按鍵,單機(jī)打開小平臺。
②在U盤“軟件驅(qū)動”目錄下,按下圖所示打開
(2).基本控制
通過基本控制可對機(jī)器魚進(jìn)行手動操控,連接檢測等操作。
(3).高級控制
頻率:單位時間內(nèi)完成周期性變化的次數(shù),單位赫茲(HZ)。通常在發(fā)射和接收頻率相同的情況下進(jìn)行信號傳遞、交互。本機(jī)器魚發(fā)射模塊和機(jī)器魚都有6個一一對應(yīng)的頻率,當(dāng)兩者頻率相同時可以進(jìn)行通訊。
ID:身份標(biāo)識號碼,也稱為序列號或帳號,是某個體系中相對唯一的編碼。在全局視覺機(jī)器魚中,當(dāng)發(fā)射模塊和機(jī)器魚頻率相同時利用不同的ID來區(qū)分不同的魚。
在更改機(jī)器魚時一定要辨清頻率和ID之間的關(guān)系。
(4).關(guān)節(jié)調(diào)直
當(dāng)打開魚的開關(guān)魚不能正??囍钡臅r候,需要用到“關(guān)節(jié)調(diào)直“功能。
(5).參數(shù)設(shè)置
當(dāng)機(jī)器魚游動效果不理想時,或在做科研時需通過“參數(shù)設(shè)置”修改一些參數(shù)。
(6).模式設(shè)置
對一條或多條編輯一些小命令,進(jìn)行自動執(zhí)行,可用于機(jī)器魚檢測或展示。
① 單機(jī)“模式設(shè)置”打開設(shè)置界面,保證機(jī)器魚與小平臺連接正常,如下圖操作
② 每條魚(每個ID)可以編輯10個不同時間段的動作指令。
三、硬件體系結(jié)構(gòu)
3.1機(jī)器魚
機(jī)器魚是多水下機(jī)器人平臺的執(zhí)行者,可以實時接收信息執(zhí)行相應(yīng)任務(wù),也可以實時反饋信息給大平臺或小平臺。機(jī)器魚在使用時注意避免與尖銳物品碰撞,不要使電池過放電。機(jī)器魚在不使用時氣孔打開,放在干燥蔭涼的環(huán)境中,保證機(jī)器魚電量在50%以上。下面是機(jī)器魚實物與結(jié)構(gòu)圖。
3.2無線發(fā)射模塊
大平臺發(fā)出的指令通過無線模塊傳遞給機(jī)器魚,同時可以接收機(jī)器魚反饋的信息通過串口傳遞給大平臺或小平臺。下圖為發(fā)射模塊和USB接口線
1、 攝像頭
攝像頭在工作時采集圖像信息相當(dāng)于一個傳感器,可獲得機(jī)器魚的各種信息傳遞給大平臺進(jìn)行處理,來分析魚的坐標(biāo),方向以及其他運(yùn)動信息。下圖是攝像頭以及攝像頭USB線
四、基本操作
4.1機(jī)器魚開機(jī)和充電
根據(jù)機(jī)器硬件介紹的開關(guān)位置撥動機(jī)器魚開關(guān)(開關(guān)在魚皮內(nèi)部),開關(guān)有三個檔位,當(dāng)機(jī)器魚不使用時將檔位撥到中間檔位,開關(guān)偏向魚身左方或右方時可進(jìn)行開啟或充電(具體檔位根據(jù)機(jī)器魚而定,如果偏左是開啟機(jī)器魚那么另一方即是充電)。
開機(jī):撥動開關(guān),機(jī)器魚會稍微顫動一下,然后尾部呈繃直狀態(tài)。(若不繃直請參考“燒寫底層”操作,如果仍然無法解決請查閱附表1-003)
充電:充電器有兩個輸出接頭,紅接口為正極,黑接口為負(fù)極。把開關(guān)撥至與機(jī)器魚開機(jī)相反方向,根據(jù)機(jī)器魚硬件介紹中俯視圖,充電器正極接機(jī)器魚正極,充電器負(fù)極接機(jī)器魚負(fù)極。充電器自帶充電保護(hù)功能,一般情況下充兩個小時就能充滿。(如果充不上電或不能充電,查閱附表1-004)
4.2小平臺連接機(jī)器魚
① 通過USB與發(fā)射模塊連接后,通過大平臺或直接打開小平臺兩種方式打開小平臺,選定對應(yīng)的com端口,并打開串口(串口號通過以上步驟已知道是COM3)
② 打開機(jī)器魚,當(dāng)機(jī)器魚繃直時,則表明機(jī)器魚已開啟。觀看小平臺接收區(qū)有沒有數(shù)據(jù)顯示(連接成功如下圖)。當(dāng)無數(shù)據(jù)時表示通訊模塊發(fā)射頻率和機(jī)器魚的接收頻率不配套,這時我們需要通過高級控制更改通訊模塊的頻率來找到機(jī)器魚的頻率(詳見“更改頻率和ID”)。
③ 根據(jù)小平臺介紹的功能來對機(jī)器魚進(jìn)行操作。以下是用鍵盤進(jìn)行手動操作。
速度鍵位:數(shù)字區(qū)1~9為速度1~9擋,鍵盤區(qū)0~5為速度10~15擋(注:1最小,15最大)
方向鍵位:鍵盤區(qū) Y~Q 為方向左鍵,小鍵盤區(qū) ← 為最大左轉(zhuǎn)向。
鍵盤區(qū) U~} 為方向右鍵,小鍵盤區(qū) → 為最大右轉(zhuǎn)向。
直游鍵位:Z
停止鍵位:空格鍵
4.3、更改頻率和ID
(1)修改無線發(fā)射模塊頻率
當(dāng)使用者不慎將機(jī)器魚的頻率弄混淆時導(dǎo)致機(jī)器魚和上位機(jī)無法通信時,此時就要用到更改無線發(fā)射模塊頻率了。首先,將無線模塊通過USB接口與電腦連接。
打開小平,然后將發(fā)射模塊上的J2排針跳帽,由右邊移到左邊啟動內(nèi)部工作模態(tài)如下圖所示,完成后打開小平臺“高級控制”,在“更改頻率”按鍵左邊,選擇頻率,單擊“更改頻率”,如果接收區(qū)出現(xiàn)一小段代碼,說明更改完成,點擊“返回當(dāng)前頻率”,將彈出對話框顯示現(xiàn)在頻率。此時再將跳帽恢復(fù)到右邊啟動外部工作模態(tài)就可以連接機(jī)器魚了,如果連接不上,繼續(xù)更改其他頻率。
4.4.修改機(jī)器魚ID
①多條魚使用一個頻率上完成不同任務(wù)時,需要對機(jī)器魚進(jìn)行修改ID。
②當(dāng)頻率修改正常時,使用小平臺連接機(jī)器魚,小平臺接收區(qū)有正常信號反饋,但使用小平臺無法控制機(jī)器魚,此時可以嘗試調(diào)節(jié)小平臺ID按下圖操作一次一次嘗試。
在小平臺中打開“高級控制”,再按下圖操作更改魚ID。
4.5.修改機(jī)器魚頻率
將小平臺連接和魚,小平臺與魚能正常通訊的情況下更改機(jī)器魚頻率。打開“高級控制”更改魚的頻率。
點擊“更改頻率”后,重啟機(jī)器魚機(jī)器魚的頻率更改完成。
4.6.對機(jī)器魚燒寫底層
對機(jī)器魚進(jìn)行無線燒寫需要用到超級終端,超級終端的版本有好多種,但用法都大同小異,下面選其中一種進(jìn)行講解。
在燒寫底層時發(fā)射模塊頻率要和機(jī)器魚頻率相同,所以使用機(jī)器魚的時候要養(yǎng)成良好習(xí)慣,每次記錄使用的魚的頻率。
(1)、在U盤“超級終端”中選擇“hypertrm”軟件雙擊打開,如下圖所示
(2)、如果電腦第一次使用超級終端會出現(xiàn)下面界面內(nèi)容,按圖中所示操作
(3)、點擊確定后需要創(chuàng)建連接按下圖操作
(4)、完成以上操作,打開機(jī)器魚,會出現(xiàn)如下界面
(5)、關(guān)掉機(jī)器魚,然后按住鍵盤按鍵“D”,同時打開機(jī)器魚,會出現(xiàn)以下界面,界面中不斷出現(xiàn)“C”。
(6)、單機(jī)窗口中的“傳送”鍵,進(jìn)入發(fā)送界面,選擇“發(fā)送文件”,按以下步驟操作。
(7)、等待發(fā)送完畢,機(jī)器魚出現(xiàn)繃直現(xiàn)象。此時先關(guān)閉機(jī)器魚,然后關(guān)閉超級終端窗口,燒寫底層完畢。
五、機(jī)器魚基本控制策略講解
5.1類函數(shù)的定義
程序中變量都定義為C++語言中“類”的方式。至于什么是“類”,簡單理解是定義的對象、變量包含同樣的特性,作為一種形式提供給我們使用的一種函數(shù)類型,定義一種類需要進(jìn)行實例化,說明類的具體內(nèi)容,包含的參數(shù),變量,對象是什么。更多的大家可以具體上網(wǎng)查,我們需要知道有這種東西,能用就行。
它的基本形式是:Cpoint+變量名;
通道
臨時目標(biāo)點:指所控制的魚在一定的區(qū)域范圍內(nèi)需要到達(dá)的位置。
5.2最基本的定義變量說明
1)程序的定義的最基本變量有四個:
1、魚中心坐標(biāo);2、球中心坐標(biāo);3、魚頭方向;4、球門中心坐標(biāo)
下面具體說明
定義魚中心坐標(biāo)是:
CPoint f_pt :
f是fish的簡寫,pt表示坐標(biāo),f_pt是魚的中心坐標(biāo),魚中心坐標(biāo) f_pt。
定義球的中心坐標(biāo)是:
CPoint b_pt :
b是Ball的簡寫,pt是坐標(biāo),b_pt就是球的中心坐標(biāo)。
定義球門中心坐標(biāo)是:
CPoint g_pt :
g是goal(球門)的簡寫,pt是坐標(biāo),所以g_pt代表球門坐標(biāo)。
定義魚頭方向是:
double f_dir :
f就是fish簡寫,dir是direction的簡寫,這是一個雙精度的變量。
絕對坐標(biāo)系中范圍是[-π,π],所以程序中魚頭方向的范圍就是[-π,π]。
大家或許有疑問,為什么魚頭方向是雙精度的變量而其他的三個是類呢。因為其他三個都是包含這x和y坐標(biāo),也就是類包含相同的參數(shù)(對象),而魚頭方向沒有包含這些,僅僅是一個[-π,π]的變化范圍。
2)基本變量在程序中的獲取
我們定義了最基本的四個變量,那么程序中是怎么獲得的呢,我們下面來說明。
針對三個類(魚中心坐標(biāo),球中心坐標(biāo),球門中心坐標(biāo)),我們大平臺已經(jīng)寫好對這些這些類的定義和例化函數(shù),具體我們不需要了解。獲取的函數(shù)也已經(jīng)寫好,就是簡單的調(diào)用一個函數(shù)就行。具體程序是
對魚中心坐標(biāo)的獲取 f_pt=m_FishInfo[0].GetCenterPt() ;
m_FishInfo[0].GetCenterPt()是一個類函數(shù),不需要具體了解函數(shù)具體內(nèi)容,只需要記住其實現(xiàn)的功能。功能是獲取魚的中心坐標(biāo)。
m_FishInfo[0]
m_是標(biāo)識作用,fish代表“魚”,info代表“輸入”[數(shù)字]數(shù)字代表魚的編號
這個獲取的是0號魚的,GetCenterPt() 代表獲得中心坐標(biāo)。
那么2 vs 2 程序獲取0號是:f_pt[0]=m_FishInfo[0].GetCenterPt() ;
程序獲取1號是;f_pt[1]=m_FishInfo[1].GetCenterPt() ;
對球中心坐標(biāo)的獲取是: b_pt=m_goalinfo.GetBallPt();
m_goalinfo.GetBallPt()是一個類函數(shù),功能是獲得球中心坐標(biāo)
m_goalinfo[0]同時在2013的新平臺上也需要輸入魚的編號
m_ 是標(biāo)識作用,goal代表球門,info是“輸入”,
GetBallPt() 代表球中心坐標(biāo)
對球門中心坐標(biāo)的獲取是:g_pt=m_Channel[0].center ;
[數(shù)字] 中括號內(nèi)部的數(shù)字代表獲取的是第幾個通道的坐標(biāo)。
如果很多個通道可以代替臨時目標(biāo)點的作用嗎?
對魚頭方向的獲取是: f_dir=m_FishInfo[0].GetDirection() ;
[數(shù)字]也是同樣的含義,代表獲取的方向是第幾條魚的。
5.3三個基本服務(wù)函數(shù)
程序中還有最簡單的三個服務(wù)函數(shù)。
1獲取角度函數(shù)Angle(CPoint point,CPoint aimer);
2獲取距離函數(shù)Distance(x,y);其中形參都是定義為“類”。
3轉(zhuǎn)換角度函數(shù)Checkangle(double dir)形參類型是雙精度。
大家有英文字母的含義應(yīng)該就了解函數(shù)的作用了。請記住三個函數(shù)的功能。
1)角度函數(shù) 此函數(shù)所測算的角度建立于絕對坐標(biāo)系基礎(chǔ)上
Angle(CPoint point,CPoint aimer)具體定義如下:
Angle(CPoint point,CPoint aimer) //聲明函數(shù),兩個類的形參point和aimer
{ double a;
a=atan2((double)(aimer.y-point.y),(double)(aimer.x-point.x));
//就是求一個反正切的角度
return a; //返回一個角度值范圍是[-π/2,π/2](這個很重要,記住范圍)
}
紅色為point 黑色為aimer
2)距離函數(shù)
Distance(CPoint point,CPoint aimer)函數(shù)具體定義如下:
Distance(CPoint point,CPoint aimer)
{
double a;
a=sqrt((double)(point.x-aimer.x)*(point.x-aimer.x)+
(double)(point.y-aimer.y)*(point.y-aimer.y));
// 就是一個求距離的平方根公式
return a; //返回距離值,雙精度類型
}
3)轉(zhuǎn)換角度函數(shù)
Checkangle(double dir) 具體定義如下:
Checkangle(double dir) //把dir換算成[-pi~pi]之間的數(shù)
{
if(dir>PI)
dir-=2*PI;
else if(dir<-PI)
dir+=2*PI;
return dir;
}
5.4點到點函數(shù)的講解
這是程序中核心的函數(shù),機(jī)器魚所執(zhí)行的動作都是調(diào)用這個函數(shù)來實現(xiàn)的,所以請大家一定要理解函數(shù)內(nèi)容,并且能夠修改優(yōu)化這個程序。
先給出函數(shù)功能說明。
點對點底層函數(shù)詳解
重在理解點對點函數(shù)是如何運(yùn)行的,底層函數(shù)研究根據(jù)自身能力酌情處理。
void Roundp2p(CPoint aimpt,CFishAction &action,int fishID,CFishInfo m_FishInfo)
{
//定義一個函數(shù),包含四個參變量,
第一個是aimpt作為目標(biāo)點的類,
第二個是魚的動作模式action(包括速度、方向以及運(yùn)動模式)
第三個是魚的ID,
第四個是魚的入口參數(shù)(包含魚中心坐標(biāo),魚頭方向等)。
其中,魚的ID是整數(shù)類型外,其他的都是“類”。
CPoint FishPt;// 魚中心的位置
double FishDir;// 魚頭的方向
CPoint FishHeadPt;//魚頭的位置
CPoint LastFishPt;
CPoint FishRotatePt;/;//魚的轉(zhuǎn)動位置,程序未用到,作為預(yù)留變量待開發(fā)使用。
CPoint FishTailPt; //魚尾巴的位置,程序未用到,作為預(yù)留變量待開發(fā)使用。
CPoint GoalPt1, GoalPt2;//臨時目標(biāo)點,GoalPt2沒有用到
CPoint Pt1, Pt2, Pt3, Pt4;
//CPoint f_headpt;//point of fishs head
//f_headpt=m_FishInfo[0].GetHeadPoint();
double dir1=0;
double dir0;
double dist0;
double dist1=0;
double dir2=0;
double dist2=0;//臨時用到的方向和距離
CPoint centerpt1,centerpt2;//作為魚要繞的中心來用
CPoint centerpt3,centerpt4,centerpt5,centerpt6;
CPoint centerpt0,centerpt00;
double dis1,dis2;
dis1=0;
dis2=0;
double radius;///需要游動的半徑,可以隨意的設(shè)置.
FishPt=m_FishInfo.GetCenterPt();//獲取魚的中心位置
FishDir=m_FishInfo.GetDirection();//獲取魚頭方向
dist1=Distance(FishPt,aimpt);//計算魚中心位置和所要游動目標(biāo)點的距離dist1變量
dir1=Angle(FishPt,aimpt);//計算魚中心位置和所要游動目標(biāo)點連線的夾角(絕對坐標(biāo)系)
dir1-=FishDir;//這個語句的作用是把絕對坐標(biāo)系表示的角度轉(zhuǎn)換為相對坐標(biāo)系
//就是以魚和目標(biāo)點的連線為參考軸,dir1代表此情況的魚頭方向
dir1=Checkangle(dir1)*180/PI;//調(diào)用函數(shù),把dir1的從弧度換為角度表示
action.speed=15;//定義魚的速度為最快的15執(zhí)行動作
m_FishInfo.SetAction(action);//發(fā)送動作設(shè)置狀態(tài)給魚
if(dist1>100) //下面是魚和目標(biāo)點的距離大于100像素的情況
{
if(dir1>-5&&dir1<5)
action.direction=7;
else if(dir1<-5&&dir1>-10)
action.direction=5;
else if(dir1<-10&&dir1>-30)
action.direction=4;
else if(dir1<-30&&dir1>-50)
action.direction=2;
else if(dir1<-50&&dir1>-70)
action.direction=1;
else if(dir1<-70&&dir1>-90)
action.direction=0;
else if(dir1<-90)
action.direction=0;
else if(dir1>5&&dir1<10)
action.direction=9;
else if(dir1>10&&dir1<20)
action.direction=10;
else if(dir1>20&&dir1<40)
action.direction=12;
else if(dir1>40&&dir1<50)
action.direction=12;
else if(dir1>50&&dir1<80)
action.direction=14;
else if(dir1>80&&dir1<90)
action.direction=14;
else
action.direction=14;
}
else //以下是魚和目標(biāo)點的距離小于100像素的情況。
{ if(dir1>-5&&dir1<5)
action.direction=7;
else if(dir1<-5&&dir1>-20)
action.direction=4;
else if(dir1<-20&&dir1>-40)
action.direction=1;
else if(dir1<-40&&dir1>-60)
action.direction=0;
else if(dir1<-60&&dir1>-70)
action.direction=0;
else if(dir1<-70&&dir1>-90)
action.direction=0;
else if(dir1<-120)
action.direction=0;
else if(dir1>5&&dir1<20)
action.direction=10;
else if(dir1>20&&dir1<30)
action.direction=12;
else if(dir1>30&&dir1<50)
action.direction=13;
else if(dir1>50&&dir1<70)
action.direction=14;
else if(dir1>70&&dir1<90)
action.direction=14;
else if(dir1<120)
action.direction=14;
else
action.direction=14;
}
m_FishInfo.SetAction(action);
}
六、策略編寫
策略編寫環(huán)境是Microsoft Visual Studio 2010及以上版本,此軟件屬于微軟公司推出的開發(fā)環(huán)境,可在網(wǎng)上下載和查找安裝過程。
安裝Visual Studio后圖標(biāo)會變成,在桌面找到,雙擊運(yùn)行。程序入口在程序中右上角的“解決方案與資源管理器”中能看到如下圖所示的一個函數(shù)名為“strategy.cpp”,這就是策略編寫的函數(shù),在函數(shù)里面有一個名為“BOOL CStrategy::Strategy0(……)”,的子函數(shù) 就是策略編寫的入口。
編寫策略時,程序的定義的最基本變量有四個。1、魚中心坐標(biāo)f_pt;2、球中心坐標(biāo)b_pt;3、魚頭方向g_pt;4、球門中心坐標(biāo)f_dir。其他函數(shù)名不知道什么意思可以通過其英文單詞含義大致推斷其含義,另外選中不清楚的函數(shù),鼠標(biāo)右擊,可以“轉(zhuǎn)到定義”或“轉(zhuǎn)到聲明”去具體了解函數(shù)的含義。
另外,如果想增加其他策略可在函數(shù)聲明中重新添加策略聲明然后在策略中調(diào)用,如果想添加一個策略1,按照下圖兩步操作。
1、 策略編譯(生成DLL代碼)
MURStrategy作為統(tǒng)一的策略入口函數(shù)(DLL導(dǎo)出的函數(shù)名),在Server端運(yùn)行的時候動態(tài)加載及策略調(diào)度運(yùn)算。傳入的參數(shù)數(shù)據(jù)包含策略計算必要的所有信息。所以編譯過程也就是將編寫的代碼按一定計算方式生成DLL代碼。
策略編譯首先確定要編譯哪個策略,例如,寫了5個策略想編譯策略1 頂球的策略,那么我們需要打開MURStrategy程序入口,指定編譯策略。如下圖
改好策略編譯入口后,單機(jī)“生成”選擇生成解決方案。如下圖操作
按照策略生成的路徑找到策略剪切或復(fù)制出來放在自己常用的位置,以便使用大平臺加載策略。
2、 策略加載
① 電腦連接無線發(fā)射模塊和攝像頭,雙擊打開桌面程序,會出現(xiàn)三個窗,如下圖
② 打開然后打開“通信參數(shù)設(shè)置”,串口號選擇COM3打開串口,打開后將通信參數(shù)設(shè)置窗口關(guān)閉。
③ 選擇MURClinet窗口中的圖像“參數(shù)設(shè)置”,單擊打開,在右下角失真處理前方進(jìn)行勾選,選擇確認(rèn)設(shè)置,關(guān)閉此窗口。
④單機(jī)打開MURClinet窗口中的“目標(biāo)識別”,單擊背景采樣,“RecogFrontImage”窗口中畫面由之前的黑白色變?yōu)楹谏?,此時說明背景采集完畢。
⑤操作完成后,將機(jī)器魚和球放入水池中,在“目標(biāo)選取”處選擇“球1”,并在“Original”窗口中勾選球圖像,在“A隊”處選擇“F1”,并在“Original”窗口中勾選魚圖像如下圖所示,或用快捷方式選擇。選擇完成后將此窗口最小化。
⑥加載策略,選擇MURClinet窗口中的“策略加載”找到U盤中“頂球進(jìn)門.dll”文件打開。步驟如下圖
⑦加載策略后單擊“裁判系統(tǒng)”,然后后單擊“開始執(zhí)行”,此時魚游向球,魚會根據(jù)程序所編寫的策略執(zhí)行(如有其它問題,請查閱附表1-005)
七、結(jié)論:
水中機(jī)器魚大賽是一個全國性的競賽。它不僅水準(zhǔn)高,難度大,綜合性強(qiáng),而且資巨大的新興學(xué)科。我們非常感謝學(xué)校老師給我們這次參加如此高水的競賽的機(jī)會,感謝學(xué)校領(lǐng)導(dǎo)的大力支持和所有指導(dǎo)老師的精心栽培以及全體參賽隊員的團(tuán)結(jié)努力。在這個過程中,我們將理論知識運(yùn)用到了實際操作中來,我們?nèi)齻€組員,我們分工合理,達(dá)到了默契十足,互相學(xué)習(xí),互相進(jìn)步,一起完成了組裝,調(diào)試。通過本次的大賽,讓我了解到如何將書本上的知識運(yùn)用到生產(chǎn)實踐,在參賽的過程中,我也發(fā)現(xiàn)了自己的不足,借鑒到了他人的經(jīng)驗,這會使我在機(jī)器魚 方面更加努力。。
同時讓我明白,任何好成績的取得都建立在充分的準(zhǔn)備之上,要反復(fù)練習(xí),修改策略,多多聽取隊友的建議,把自己的真實水平發(fā)揮出來。
這次比賽,讓我總結(jié)出四個字——越挫越勇,我還告訴自己:不要被自我感覺所蒙蔽,你還有許多要學(xué)習(xí)的地方,要多多努力,盡量多的抓住機(jī)會,提高自己的表現(xiàn)能力,從每一件事中找到進(jìn)步的目標(biāo),讓自己變得越來越優(yōu)秀。