第七屆“飛思卡爾”杯全國大學生 智能汽車競賽 湖北文理學院攝像頭組 軟 件 類 技 術 報 告 隊伍名稱:黎明破浪號 參賽隊員:周 奇 胡 志 強 周 成 成 帶隊教師:程 昊 葉 建 明 目錄 一、寫在開始之前 1.1 第七屆團隊展示
上面左起分別是程昊老師和王宏達老師。 下面左起分別是光電二組的張潤、王輝。攝像頭組的周奇、胡志強。光電一組的汪穩、熊夢杰。 1.2 自我介紹 同學你好,很高興你報名參加了全國大學生“飛思卡爾杯”智能汽車競賽的攝像頭組,我是來自09級機械與汽車工程學院的周奇,是第七屆攝像頭組‘黎明破浪號’的隊長,也是‘黎明破浪號’的軟件主要負責人。首先,我以一個‘過來人’的身份代表‘黎明破浪號’,對你們本次的參賽表示熱烈的歡迎。其次,我希望你能認真的把我寫的報告讀完,雖然說黎明破浪號在競賽中沒有取得好的成績,可能是我使用的算法在我一個人的思路下已經進入死胡同,不足之處還希望指正后留給下一屆的同學。下面都是我就軟件這塊所做的總結,或多或少會對你們有些幫助。最后,預祝你們在本次競賽中取得好成績。 在第七屆“飛思卡爾杯”中,我們組所使用的有野火K60核心板(如果你使用32位的K60,我推薦購買野火的核心板,這家的核心板面積小,性能穩定,最主要的是他們提供有好的教程,好的底層驅動代碼,技術支持也非常到位),ov7620數字攝像頭,12864液晶等。采用的接線如下
1.3 必做的準備工作 A:拒絕醬油 我說這句話態度是很強硬的,比賽一起是3名隊員,最好的搭配是1個硬件2個軟件。硬件搭好后全部工作都靠軟件了,而算法這一塊是非常難的,一個人寫就非常容易陷入死胡同,而智能車的質量直接影響因素就是算法。 所以,如果你是醬油,就請你主動退出。原因很簡單。1:參加主要目的還是學習,我不敢保證你參加了就會有全國名次,因為攝像頭組本來就是非常難的一個組,但是我可以保證你會學習到很多很多。2:就算獲得了一個獎章,你去企業里面別人問一句比賽的問題馬上就原形畢露,不僅不能增加就業機會,放而帶來不誠信。3:這里也是很重要的,可能因為你是醬油,占了一個本應該做事的位置,那么也會大大削弱你們組的實力,拖后腿就成為必然。 B:準備好試車環境 作為攝像頭組過來人,我這里講一個有趣的事情。第七屆的比賽湖北文理學院一共派出3支隊伍參賽。分別是光電一組,光電二組和攝像頭組的黎明破浪號。在學校試車的時候,光電一組最穩定,光電二組不是很穩定,因為經常出現問題。而我們攝像頭組速度最快,穩定性介于兩個光電組之間。當時我們的速度為兩檔,慢速和中速。其中慢速的最穩定,不夸張的說黎明破浪號夜間在學校賽道上正反跑20圈兩個輪子同時出界才一兩次,白天拉開窗簾效果則比較差。后來去了廈門(第七屆在廈門大學嘉庚學院比賽)試車的時候我發現我的車在學校速度為慢速的居然在賽道上面動都動不起來,當時以為是電池沒電了,于是馬上換電池,結果發現還是動不起來。沒辦法,把速度提高到中速,車才開始緩緩前行,并且車前輪有明顯跳動,穩定性非常差。顯然,這是因為我們在學校試車時候的環境和比賽時候環境出入太大,賽道摩擦明顯大了很多。在試車完畢后,我們和三峽大學共用一個賽道,由于試車時候沒有背景,得到賽道后我們給背景加上了黑色背景,車的穩定性也比較差,后來才發現直接原因是閾值的問題,我們在實驗室時候閾值為180,經過修改,最后確定為130,整整一個晚上的調試,車速可以達到2米了,穩定性也非常不錯。結果第二題比賽時候背景為藍色,穩定性又下降了,連續幾次都是在同一個地方出去了。 差距怎么來的,從細微之處來的。上面提到的光電二組,在學校調試的時候一直出現問題,穩定性比較差,還一度因此而去不了廈門。兩支光電組都沒有使用算法,但是在加上背景后兩支光電組都表現除了非凡的穩定性。我這樣說不是夸張,光電二組的穩定性一下子和光電一組可以媲美了,速度也一下子提升了很多,只留下我們攝像頭組經常沖出賽道。所以,作為攝像頭組的你,一定要切記購買好的賽道和鋪上正確的背景顏色,不然你所調出的參數全是白調的。 這里附上兩張圖片,我們學校和別人學校的賽道上面差距就很明顯了 我校的賽道
PS:圖中最上面的是用紙貼在地上的賽道,下面的是用KT板鋪的,但是沒有背景顏色,于是找來一些木板作為背景。木板的高低不平給調試帶來了很大困難。 別人的賽道 PS:標準的賽道,KT板看上去和比賽用賽道一模一樣 最終比賽的賽道 PS:比賽前有60秒的試車時間,圖中在賽道上試車的正是本人。 所以,我這里建議,從一開始鋪賽道就按照組委會的標準來,包括賽道樣式,背景顏色等等,這樣就不會在后來走太多彎路。 C:堅持不懈 這句話可能是廢話,不過在寫代碼的時候出現大大小小的問題也是在所難免的,這時候就需要一股堅持不懈的干勁,有句話說:既然選擇了遠方,便只顧風雨兼程。當你選擇了“飛思卡爾杯”,就證明你比別人優秀了,不讓困難打敗你。加把勁,多付出,誰都會累,待到你獲得成功了,對你,對你家庭,對學校都是無上的榮光。 1.4 工具介紹 這里我介紹兩款除了編譯環境IAR外我常用的工具,一款Source Insight(簡稱SI),另外一款是UltraEdit(簡稱UE)。結合source insight使用教程和UE配合SI的使用方法(附加代碼移植教程)這兩個PDF文檔的教程都是我寫的,內容稍微有些簡潔,但主要方法還是已經提及,這兩款軟件在我學習飛思卡爾和ARM中確實有很大的幫助。沒有該教程的同學可以向你們指導老師要,關于所有的資料,我們都會上交給指導老師,這里,我希望它能對大家有所幫助。
二、圖像采集 2.1 圖像采集原理 圖像采集不需要硬件平臺的支持,所以當你的主控板沒有成型之前,用杜邦線連接,就可以開始圖像采集了。采集部分請自己查找相關資料,我們使用的是32位的K60系列,因為芯片的不一樣,代碼自然會有差別,不過萬變不離其宗,攝像頭也是一個傳感器,控制原理都是一樣的,所以最好還是看下攝像頭的原理后再根據別人寫的采集程序寫自己的,那樣就事半功倍。此處附上黎明破浪號的圖像采集代碼 場采集
行采集
DMA處理
2.2 圖像處理 A:前期 在得到圖像后,先從編譯環境的watch里面看圖像是否采集到了,如果采集到了圖像,那么可以發送到上位機觀看圖像,也可使用液晶等顯示器之間觀看。這里推薦一款上位機 這款上位機打開后
使用過程中可以直接實時觀察,功能非常強大。在使用的時候注意起始信號的識別問題。
在使用時候請仔細閱讀該上位機的使用手冊,如果不閱讀readme,將會出現采集不到圖像等等問題。 采集到圖像后要對圖像進行校正,梯形校正和對稱性校正。可能攝像頭的正中間不在圖像的正中間,那么就需要修改代碼。這一步要在上位機的輔助下完成,在調整好最佳圖像后方可進行下一步。 B:中期 在上位機里面觀察到正確的圖像后,我們就要對圖像進行處理了,圖像處理的時候就不能使用這款上位機了,只能通過串口或者液晶來查看了。鑒于進度,第一時間液晶寫不出來的同學可以先嘗試使用串口打印圖像,將所得到的圖像打印出來,并且描繪出中心線。
如果有能力的,可以將圖像處理后所得到的數據全部打印出來。其實這個不難(只是我沒有保存圖片,無法給與直觀圖)。 C:末期 在串口里面觀察到正常數據后,我們就需要使用液晶了,液晶在攝像頭組中是必不可少的。黎明破浪號使用了12864液晶,用來實時顯示賽道和PWM值,后期用來顯示其他需要觀察的重要信息。不過12864體積有些龐大,速度也有點慢,所以還是推薦使用高速液晶。 液晶在攝像頭組的調試和觀察中起著不可磨滅作用。做硬件的同學一定要在主控板上面加上液晶的引腳,液晶在正式比賽之前都會一直使用到。 下面附上我所使用液晶的代碼,可以自行找老師要到我的代碼后用我介紹的兩款軟件仔細閱讀。
三、舵機和電機測試 3.1 參數測試 在舵機和電機控制前首先要測得各種參數,比如舵機的中間值和左右最大的打角等等,正確的參數對于控制的準確性有很大的影響,另外,如果不測試,直接給與舵機值,有可能超出允許范圍,舵機則會打死并且燒毀。第七屆光電組就因為這個情況燒毀了兩個舵機。關于參數測試各院校的報告里面對于測試必要性和方法都有提及,故這里就不詳細說明。 這里附上我們舵機和電機測試代碼
電機測試
3.2 整體測試 整體測試在開始控制之前也非常的重要,首先要確定前輪直線,外八還是內八,根據個人情況而異。然后給與舵機中間值,電機給與一定速度,看車模能否正常的走直線。如果車模不能正常走直線,則要手動調節傳動機構。 四、軟件整體設計 4.1 編程思想 編程的時候盡量用模塊化編程,少用全局變量,這樣可以減少BUG的產生。每個需要使用的變量需要簡單易懂,便于他人閱讀代碼。每個模塊之間用注釋隔開 例如:
使用模塊化編程簡單易懂,而且便于BUG的查找。 4.2 多使用LED排查BUG 寫代碼的時候出現BUG是難免的,有時候可能因為一個小小的錯誤,整個語句都進入不了,那么就需要查找BUG了,查找BUG有兩種辦法,一種是單步調試,另外一種是使用直觀的現象查看。我經常使用的就是LED了,在可能出現問題的地方加入LED閃爍,如果LED不閃爍則說明語前面出問題了。野火的核心板上帶4個LED,寫好函數后多次調用,可以用來顯示很多信息了。
4.3 圖像中心線的提取 中心線提取根據論壇里面的資源,或者看我的代碼就可以理解,比較簡單。 4.4 液晶12864的使用 我的12864液晶是根據以前寫的51驅動直接移植過來的,上面還有明顯的移植痕跡
對應的的51上面則是
根據我的模塊,則可以非常簡單的使用12864了。 4.5 舵機PD控制 PD控制顧名思義,即比例、微分控制。 比例控制:就是對偏差進行控制,偏差一旦產生,控制器立即就發生作用即調節控制輸出,使被控量朝著減小偏差的方向變化,偏差減小的速度取決于比例系數Kp, Kp越大偏差減小的越快,但是很容易引起振蕩,尤其是在遲滯環節比較大的情況下,Kp減小,發生振蕩的可能性減小但是調節速度變慢。但單純的比例控制存在靜差不能消除的缺點,這里就需要積分控制。 積分控制:實質上就是對偏差累積進行控制,直至偏差為零。積分控制作用始終施加指向給定值的作用力,有利于消除靜差,其效果不僅與偏差大小有關,而且還與偏差持續的時間有關。簡單來說就是把偏差積累起來,一起進行運算。 微分控制:它能敏感出誤差的變化趨勢,可在誤差信號出現之前就起到修正誤差的作用,有利于提高輸出響應的快速性,減小被控量的超調和增加系統的穩定性。但微分作用很容易放大高頻噪聲,降低系統的信噪比,從而使系統抑制干擾的能力下降。因此,在實際應用中,應慎用微分控制。 在實際中,我們組采用的是模糊PD控制,也就是對于不同的情況采用了多組PD參數進行調節。此處附上我們部分舵機PD控制代碼
代碼中Ki不是積分的Ki,而是賽道邊界對舵機的影響因素,也就是說如果車模在直道上,車模又太靠右邊了,那么采集到的中心線也是直線的,而這樣對于突如其來的轉彎則是致命的。此時則賽道邊界Ki則起到一定控制作用,它使舵機左打一定角度,讓車模回到賽道正中間。 此處的參數最難調節,據三峽大學的朋友說,他們調節這幾個參數就花了4個月,而我們因為時間關系,調節時間半個月不到。參數調節有一定技巧,不能盲目賦值。這里我舉個簡單例子。上副圖像所得到PWM為正中間720,車跑直道。本次突來大S右轉,PWM為900。通過PD參數的調節,最終要得到的turn打角必須介于720和900之間。那么Kp和Kd就有了一定范圍。根據公式 turn=steer_middle+(int)((steer_value-steer_middle)*Kp+(turn1-steer_value)*Kd); Turn假如為800,那么就可以得到二元一次方程,再多給幾次值,便可得到最佳的Kp和Kd了。 我們就得到的turn進行分析。1:如果本次采集是正確的,那么舵機有一定打角,但是沒有打到那么大,下次如果還是大S右偏,PWM仍為900,那么在此經過算法所得到的turn則介于800和900之間了。很明顯,如果圖像正常,那么只需兩幅圖像的時間就打到正常角度,對正常的打角不會有太大影響。2:如果本次采集為錯誤,那么經過算法則對本次打角有一定緩沖,并沒有讓舵機一次性打到錯誤最大角度。這個就是算法的實現。 在算法實現后,切記一定要對turn進行校正,因為經過算法后的PWM有可能因為你參數的錯誤而變的超過舵機的正常范圍。防止舵機燒毀,則需要加上 if((turn<530)) turn=530; //左邊最大打角 if((turn>910)) turn=910; //右邊最大打角 4.6 電機PID控制和起始線識別 因為我們準備時間較晚,所以這兩個東西我都沒有用,對電機進行的開環控制,起始線則是直接延時3s后啟動,終點線則是直接沖過去了。這里就不能為你提供多大的幫助,你可以閱讀別人的技術報告,從中學取。 五、結論 5.1 心得 自報名參加“飛思卡爾杯”智能汽車競賽以來,我們小組成員從查找資料、設計機構、組裝車模、編寫程序一步一步的進行,最后終于完成了最初目標,定下了現在這個設計方案。在剛制作的初期我們遇到了很多困難,在選擇系統板時候,因為另外一個組選擇了xs128,而今年又新出規定,可以使用K60這款32位的單片機,以為自己學過一段時間的ARM就可以征服它,結果差點撞的頭破血流。在編寫軟件的時候,完全沒有上屆留下的資料,沒有老師的指導,全部靠自己一字一句的編寫。在最小系統、主板、電機驅動等模塊分別設計,經過不斷實驗,最后決定了我們最終的電路圖。在軟件設計方面,如攝像頭的采集數據,在寢室調節好的代碼放到實驗室里面總是不采集圖像,用手擋住或者用帽子蓋住才采集,后來歷經很久才發現是干擾問題。此類的問題層出不窮,就像我們說的,動則得咎,只要你在向前進,就會犯錯誤。這時候就要堅持不懈的客服,而不是放棄。本次小車作為我們組辛勤汗水的結晶,凝聚著我們小組每個人的心血和智慧,隨著它的誕生,這份經驗將永伴我們一生,成為我們最珍貴的回憶。 在這幾個月的備戰過程中,特別感謝葉建明老師給我的幫助,同樣,也感謝一直支持和關注智能車比賽的學院領導老師們。 現在,比賽結束了。歷時近四個月的準備,雖然我們沒有取得優異的成績,沒有給學校帶來光榮。但是我們也努力了。也許我們的知識還不夠豐富,考慮問題也不夠全面,但是這份技術報告凝聚了我們組所有的知識總結。希望對下屆的“飛思卡爾杯”攝像頭組有所幫助。同時,我們也希望下屆的你,在比賽完后寫下和我一樣的報告,作為資源留給你的下屆同學。 六、參考資料 三天入門M4——Kinetis(V2)————野火編寫 source insight使用教程————周奇編寫 UE配合SI的使用方法(附加代碼移植教程)————周奇編寫
當然還有很多有用的書籍,這里一時半會也想不起來具體信息了。更多的閱讀他人的報告,對你會有很大幫助。
|