“月盈則虧,水滿則溢”。當博主編譯完成,以爲離成功更近一步準備下載的時候,殊不知陷阱也早已準備好,等待我的踏入。連上USB線,下載,timeout...,timeout...,timeout...,留下博主一臉懵逼,和一塊已然變磚的APM板。遂作此文,爲廣大APM開發者避開下載的坑。
下載環境:APM2.8,固件版本3.2.1,通過USB下載。
原因定位
刷寫Bootloader
雖然Bootloader被博主無意中破壞,但天無絕人之路,從哪裏弄壞,就從哪裏修好。當自己買電子元器件和電路板,根據開源的APM硬件焊接APM板時,也需要給APM板重新燒寫Bootloader。
硬件準備
AVR單片機的USBASP或USBISP下載器×1。
軟件準備
1. 下載器配套軟件,推薦progisp1.72。
2. AVR的USB自編程軟件:Flip。
3. 32u2的驅動程序。
4. 三個hex文件:Atmega2560的bootloader文件、32u2的bootloader文件和32u2的ppm程序文件。
燒寫過程概述:先給Atmega2560燒寫bootloader,然後給Atmega32u2燒寫bootloader,最後給32u2寫入PPM解碼通訊程序。按照視頻教程操作即可,可以不用轉接線,直接用幾根杜邦線連接,注意線序。
程序裁剪與下載
既然程序容量有限,就需要對程序進行裁剪,比如拿剪刀把APM板剪掉一角。好了正經一點,所謂裁剪,最簡單的就是將部分程序註釋或刪除,使編譯之後的程序容量變小。要想裁剪APM,首先需要對飛控程序的結構有個大致的瞭解,才能在註釋或刪除代碼的同時保證飛控的穩定性。先看看官網是怎麼介紹飛控程序的:“The ArduPilot code base is quite large (about 700k lines for thecore ardupilot git tree) and can be quite intimidating to a new user.”,翻譯過來就是飛控代碼太太太多了,足足70萬行估計你這小白搞不定。
“他強任他強,清風撫山崗。他橫由他橫,明月照大江。”雖然飛控代碼多,但是程序員有兩板斧子,一看代碼結構,二看主函數。
根據上篇博文所述,使用VS2012配合VM插件查看APM3.2.1工程代碼,其代碼主要由多個pde文件組成,可簡單理解爲cpp文件。根據pde文件的命名,博主將代碼分爲6類:(1)主函數ArduCopter;(2)各種飛行模式,佔了大部分程序,如control_acro、control_althold、control_auto等;(3)系統初始化system;(4)Mavlink通信GCS_Mavlink;(5)用戶程序UserCode;(6)其他雜項。既然飛行模式的程序最多,博主就準備拿它開刀。
要裁剪飛行模式,就得看主函數是如何調用各飛行模式的。看大型代碼一定要帶着目的去看,既然通過遙控可以切換飛行模式,那麼判斷處於飛行模式的代碼一定是在某個循環中。這樣一來就好辦了,從ArduCopter.pde的fast_loop()函數入手,可以看到其代碼不多,列出如下。
static void fast_loop()
{
// IMU DCM Algorithm
// --------------------
read_AHRS();
// run low level rate controllers that only require IMU data
attitude_control.rate_controller_run();
#if FRAME_CONFIG == HELI_FRAME
update_heli_control_dynamics();
#endif //HELI_FRAME
// write out the servo PWM values
// ------------------------------
set_servos_4();
// Inertial Nav
// --------------------
read_inertia();
// run the attitude controllers
update_flight_mode();
// optical flow
// --------------------
#if OPTFLOW == ENABLED
if(g.optflow_enabled) {
update_optical_flow();
}
#endif // OPTFLOW == ENABLED
}
細心的朋友可能注意到了,顧名思義,update_flight_mode()就是更新飛行模式的函數。右鍵轉到定義或按快捷鍵F12,可查看update_flight_mode()中是一串熟悉的switch-case語句,根據不同的case切換不同的飛行模式。以常見的自穩模式stabilize爲例,可一直追蹤下去,如高度控制,電機控制等。醉翁之意不在酒,在乎“飛行模式”也。