PIXHAWK進行二次開發
既然要做開發,第一步就是搭好開發環境,根據我的經驗,最好是在linux環境下編譯,這樣效率會很快,以前在windows下編譯,經常40分鐘以上,這樣就太影響開發了;
第二步,大概瞭解下韌體的架構,
<img src="https://pic4.zhimg.com/11ad316fe65f69c396552fa422a68b57_b.png" data-rawwidth="708" data-rawheight="533" class="origin_image zh-lightbox-thumb" width="708" data-original="https://pic4.zhimg.com/11ad316fe65f69c396552fa422a68b57_r.png">如果只涉及應用層的開發,那底層的nuttx系統就可以繞過去了,一般,最好先把uorb模組的機制整明白就好了,從uorb入手,瞭解每個話題的來源以及作用,整理資料流,清楚每個模組之間的關係即可,比如,要實現手動模式,哪些模組互相互動,auto模式,又有哪些模組起作用,
如果涉及相應演算法的開發,要學會定位到相應的演算法模組,甚至具體到哪些程式碼,比如,你想試驗你的姿態估計演算法,那你就將姿態估計模組替換掉即可,不過相應的介面仍需要和px4環境一樣,以姿態估計為例,最後要釋出你的vehicle_attitude話題,不然無法與其他模組互動;
另外,不要試圖在程式碼中找main函式,那是微控制器思維,你只需看啟動指令碼即可,\ROMFS\px4fmu_common\init.d\rcs;
第三步,針對你的具體情況,定位相應的模組,進行精讀研究,雖然模組基本是用C++寫的,但是不會C++也沒關係,畢竟又不是讓你寫,本人倒目前為止,也不會C++,配合註釋,看明白就好了,比如,整理下mavlink的控制流程;
<img src="https://pic2.zhimg.com/50464e16d6e2e2ac974bb3955e4a6879_b.png" data-rawwidth="584" data-rawheight="780" class="origin_image zh-lightbox-thumb" width="584" data-original="https://pic2.zhimg.com/50464e16d6e2e2ac974bb3955e4a6879_r.png">px4原生韌體模組列表:
系統命令程式
mavlink –通過串列埠傳送和接收mavlink資訊
sdlog2 –儲存系統日誌/飛行資料到SD卡
tests –測試系統中的測試程式
top –列出當前的程序和CPU負載
uORB – 微物件請求代理器-分發其他應用程式之間的資訊
驅動
mkblctrl–blctrl電子模組驅動
fmu –FMU引腳輸入輸出定義
gps –GPS接收器驅動
pwm –PWM的更新速率命令
飛行控制的程式
飛行安全和導航
navigator –任務,失效保護和RTL導航儀
估計姿態和位置
multirotor姿態和位置控制器
fixedwing姿態和位置控制器
垂直起降姿態控制器
最後提一句,多看看官網的說明,另外根據本人的經驗來看,由於大框架,程式碼人家都寫好了,通常你要加功能,所修改的也就幾行程式碼而已,舉例說明,比如px4韌體只能在手動模式解鎖,假如我要修改成定高模式解鎖:
<img src="https://pic3.zhimg.com/1e322fe90f28945a2b0f08862126e67e_b.png" data-rawwidth="1529" data-rawheight="853" class="origin_image zh-lightbox-thumb" width="1529" data-original="https://pic3.zhimg.com/1e322fe90f28945a2b0f08862126e67e_r.png"><img src="https://pic1.zhimg.com/942b756cce2393c73c283fd65f1fbcc8_b.png" data-rawwidth="1554" data-rawheight="857" class="origin_image zh-lightbox-thumb" width="1554" data-original="https://pic1.zhimg.com/942b756cce2393c73c283fd65f1fbcc8_r.png">將MAIN_STATE_MANUAL替換成MAIN_STATE_ALTCTL即可。