前言:2020的秋來得如此快,大一軍訓已穿上了外套,金桂也只殘存晚到的點點花朵,秋風不時吹過林間,樹梢翻滾著,鳥鳴穿梭其中,2020暑假參加了飛思卡爾智能車,全國數學建模,江蘇省電設,電設最后比賽延期到10月10日,也是對大二競賽的終結,10月16號去南京驗收完了無人機,實作了所有功能但撞桿一次扣5分,11月19日,成績出了,一等獎,這里記下我從8月19號到10月省電設的所有程序,程序大致分做3個階段:1.接觸飛機,閱讀飛控,魔改;2.校賽;3.省賽;4.感想,
接觸飛機,閱讀飛控,魔改
接觸飛機
為什么做無人機
學校2020屆的學長在2019電賽國賽無人機得了國一,學校為發揚無人機傳統,成立了電賽無人機大隊,2019大一的我也參加了電賽,做的無線充電小車,死在了沒用看門狗復位上,2020校無人機招新時,想到無人機可以提前準備,況且每年都有無人機題目都近似,覺得做無人機比賽的把握更大,于是入坑,(筆者以前也做過一些科技類競賽,會stm32,接觸過robomaster,大一參加過全國起重機創意大賽)
飛機選擇
lack of money,于是我們得到了上一屆的一個老飛機(當然不是國一那個),附帶一份飛控資料,記得機架有一處斷了的,沒攝像頭,到處都是熱熔膠,很是難看,經過兩天的打理,終于拼出了一個無人機,淘寶一查,飛機飛控是匿名的,遙控器是天地飛,帶有老版本光流,就這樣我們完成了飛機選擇,(后面我們意識到不應該使用舊的飛控與舊版本光流)
閱讀飛控
最初的想法
最初,想著飛機不過是幾個傳感器加四個電機,先看看別人的開源代碼,再自己寫一個出來飛控代碼,多輸入的系統大不了就串級pid嘛!但隨著飛控代碼的深入查看,我知道我太天真了,后來本著保護生命的原則,決定用匿名開源的飛控代碼,
飛控代碼的深入閱讀
1.匿名飛控程式在main函式中運用系統時鐘實作了代碼的分時呼叫,在"Ano_Scheduler.c"中設定了不同呼叫周期的函式,有實時性高的1ms執行一次,也有實時性低的500毫秒執行一次,運用函式指標對不同函式呼叫,這里我決定可以使用freertos或者至少使用定時中斷呼叫,這樣來保證強實時性,
2.在"Ano_Scheduler.c"中可以看見大多數執行的函式,也可見得四旋翼的控制是串級控制的,其中我覺得重要的有:
“Motor_Ctrl_Task(2)” 電機控制
"Swtich_State_Task(1)"根據傳感器狀態開關量選擇
"Flight_State_Task(1,CH_N)"飛行狀態任務,程控的pitch,roll控制要加在其中
"Att_2level_Ctrl(10e-3f,CH_N)"姿態控制,程控的yaw要加入其中
"Alt_2level_Ctrl(10e-3f)"高度控制,程控的alt要加入其中
"WCZ_Fus_Task(10)"高度資料融合,后期的高度魔改有必要
當然其它的可能也很重要,只是我的大多數代碼修改都放在這里面
3.上位機資料除錯,在"Ano_DT.c"中,可以通過usb串口以及匿名數傳傳回資料,其中我常用修改"ANO_DT_Send_RCData()"去查看飛控的一些資料,當然這個函式原本是產看的是遙控器通道值的,
4.初始化,在"BSP_init.c"中,其中的串口2用于上位機除錯,串口四用作光流,我們把串口一用于和k210通信,串口二用于和openmv通信,其余也有一些小的修改,
魔改
魔改遙控器通信
在飛控"Ano_RC.c"中,遙控器的通信有pwm通信(每個通道一根線,總之需要很多線),ppm 通信(慢),DBUS通信(信號加載到串口上,只要一根線),我們選擇了DBUS,但是當用上位機查看接收通道值時發現十分例外,延時也很大,再者天地飛的遙控器油門不可以自動歸中,以及一系列奇葩的解鎖操作,我們決定分析深入原始碼,修改遙控器為大疆ROBOMASTER中的遙控器:

后來發現遙控器會接收大量資料,這飛控中竟然沒用DMA,用的回圈接收,也沒有用校驗,之后魔改了接收底層,采用DMA接收,采用大疆的遙控器與接收 機,采用CRC16校驗,從新定義了控制邏輯,也從新加了鎖(只要撥碼撥到最上就解鎖),發現遙控器的信號接收優異(后來我們學校有的組用天地飛遙控器除錯時出現失控,我決定和沒有校驗以及pwm接收信號線太多容易松動有關)
魔改串口,加舵機
我們把串口一用于和k210通信,串口二用于和openmv通信,都運用了CRC16校驗,之后家里一個云臺電機,占用了一個pwm引腳,
魔改加程控代碼
把alt,roll,pitch,yaw的程控變數控制加入其中,注意要放在光流環之前,后來發現新版代碼中自帶程控介面變數,
魔改去除接識訓,實作一鍵起飛
這個需要修改"Ano_RC.c"中大量內容,并且要關注:
flag.taking_off ; main_key_flag; flag.unlock_sta ; flag.unlock_cmd; flag.flying
等標志位,這是很需要注意的一個地方,其中還有一些偽看門狗程式,
校賽
題目:校賽考慮到我們的能力有限,題目設計較為簡單,如下:

方案1:既識別紅色十字也識別黑色圓,通過識別視野內最大黑色圓糾正roll,通過紅色十字降落,
方案2:起飛前攝像頭朝向對面的紅色十字,起飛后盲飛向前,直到攝像頭視野中識別到紅色十字,進行roll糾正,直到飛機飛到十字上方,降落,
由于飛行路徑簡單,識別物也簡單,場地光流優秀,我們選擇了方案2,同時,為了快速找到紅色十字,我們添加了一個pitch方向的舵機用于控制相機視野,如下圖所示:

沒有識別到時,打角為25度,識別到后離紅色十字越近,打角越小,就這樣我們最快20秒內完成了任務,
省賽
10月9日晚,題目意外提前發布,當然就4天4夜了:

繞桿方案1:設計雙軸舵機云臺,保持飛機yaw軸不懂,繞桿時僅pitch,roll軸轉動(光流建模的前提條件有坐標軸不旋轉),找下一根桿以及找下一個圓都通過云臺旋轉來找,
繞桿方案2:架設3個攝像頭,一個如同校賽中的舵機攝像頭,另外兩個用碳桿支出來架設,一前一后,先用前方相機繞一桿,當后方相機第二次看到另一桿后則跑向另一桿,下方舵機攝像頭用于找黑圓,
繞桿方案3:架設兩個攝像頭,一個如同校賽中的舵機攝像頭,另外一個用碳桿支出來架設,同時識別兩桿,先用相機繞一桿,當第二次看到兩根桿后避障飛向另一根桿,下方舵機攝像頭用于找黑圓,
繞桿方案4:架設兩個攝像頭,一個如同校賽中的舵機攝像頭,另外一個用碳桿支出來架設,一個時候只識別一根桿,延時與yaw角判斷是否繞完一周,繞完后,yaw軸旋轉,找下一根桿,下一根桿繞完后,也旋轉yaw角找黑圓,最后降落,
現在看來方案1 better than 方案2 better than 方案3 better than 方案4,但沒時間準備云臺,也只有兩個相機,我們選擇了方案3,
對于繞桿次序的選擇,我們選擇先遠后近,保證可以看到降落點,通過按鍵調節識別不同顏色桿的先后,
飛機飛行路徑示意圖如下:

對于繞桿,我們用的k210 maixpy中找顏色塊的函式,飛機與桿的距離通過對最大顏色快的像素值之和處以色塊高度得到,
對于降落,我們修改了校賽中的降落程式,我們把攝像頭反向打角,如下圖所示:

在繞最后一根桿的時,第二次看到降落點是進入降落程式,飛機上的舵機打角隨著靠近降落點不斷放平,
最先一次可以飛完全程時的視頻如下:
video
感想
1.頭不鐵不要做飛機,我做飛機之前參加過大大小小的各類比賽,至少可以保證2天之內看懂別人代碼的總體思路,
2.飛機飛行狀態和電池的狀態有很大關系,
3.前期做好防護措施,但真正做好飛機后是不需要防護的(你已經信任你的飛機了),
4.炸機一定要找到原因后再飛,否則一直炸機,
5.飛機在進行自動時,只要檢測到遙感操作,立即退出自動飛行模式,進入手動控制模式,并且一定要設計出穩健的遙控器一鍵斷電,
6.建議不用天地飛遙控器,
7.仰望星空,腳踏實地,力爭上游
歡迎批評指正
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/188775.html
標籤:其他
