2014年11月13日 星期四

新手的多軸飛行器 - 改minimOSD-extra

Update: 目前有一新版本minimosd持續在更新與進行 https://github.com/night-ghost/minimosd-extra
本文新增功能已經在這版本支援,大家可直接使用該版本。

最近北部開始進入冬季,所以飛場常常有東北風或者下雨,所以我就會宅再家裡想可以搞什麼。
在FPV過程中,很多訊息是有價值值得參考的,例如現在高度、離HOME多遠、GPS衛星數量、電量等等...但其實還有很多有用訊息沒被顯示出來,但這些隱藏訊息其實又非常有價值值得參考。
例如Pixhawk中的HDOP(水平精度),但在minimOSD韌體裡面沒有顯示出來,但其實在它的原始碼稍微修改一下就可以顯示出來,所以這一篇就大概教學一下如何修改minimosd。
我用的OSD是minimosd-extra Pre-release 2.4_r726版本,韌體下載位置在這,裡面也有原始碼下載位置。
原始碼主要結構就大概是這幾個檔案,那Pixhawk用的是Mavlink protocol,在minimosd-extra原始碼中使用的library已經有完整的Mavlink protocol parser,所以大概trace一下就知道整個呼叫流程。
PastedGraphic-2014-11-13-21-11.png
管理OSD的顯示,是OSD_Panels.ino這檔案,那我希望在GPS的衛星數量下面同時顯示HDOP訊息,如下圖左上角,顯示”H 01.72”。
%25255BUNSET%25255D.png
因為minimosd-extra有一個Windows設定工具,原始工具沒有支援HDOP這欄位,所以我就從code裡面去修改,把HDOP一起顯示在GPS的panel裡面,所以首先工作先找到OSD_Panels.ino掌管顯示GPS衛星數量的function在哪,panGPSats這個function裡面就輕易找到一行osd.printf("%c%2i", gps_str, osd_satellites_visible);
所以很快可以理解,gps_str這變數是衛星符號,osd_satellites_visible這變數是衛星數量。
PastedGraphic1-2014-11-13-21-11.png
找到顯示GPS數量的code之後,那接下就是塞入要顯示HDOP的變數。透過osd_satellites_visible這變數去反trace出這一行:
MAVLink.ino:93: osd_satellites_visible = mavlink_msg_gps_raw_int_get_satellites_visible(&msg);
可以得知osd_satellites_visible是透過mavlink_msg_gps_raw_int_get_satellites_visible這個function parse出來的,那在透過mavlink_msg_gps_raw_int_get_satellites_visible這個關鍵字去trace,找到在libraries裡面有一個檔案
mavlink/include/common/mavlink_msg_gps_raw_int.h:338:        gps_raw_int->satellites_visible = mavlink_msg_gps_raw_int_get_satellites_visible(msg);
那我在透過mavlink_msg_gps_raw_int.h裡面去看,發現裡面有一塊定義非常有趣
PastedGraphic2-2014-11-13-21-11.png
我們可以看到這個header file裡面倒數第二行”satellites_visible”定義了衛星數量,同時我也看到一行
uint16_t eph; ///< GPS HDOP horizontal dilution of position in cm (m*100)
賓果!!! 所以我可以知道eph這個變數代表HDOP水平精度!!! 而且也知道這個單位是公分(cm),而且垂直精度也有定義在epv..
那我知道eph就代表是我要的HDOP後,那我就可以拿這個變數回到掌管OSD顯示的檔案,把eph放進去code裡面,以下是我改的code,主要邏輯是:
1.當GPS達到3D Fix的水準時,HDOP就開始顯示,不然就都顯示為 H 00.00
2.因為單位是cm,所以我都除以100變成公尺
PastedGraphic3-2014-11-13-21-11.png
以上就是修改後的code,改完後的顯示畫面如下左上角,衛星數量10顆符合3D Fix,HDOP水平精度1.72米,我自己習慣是,如果水平精度開始飄,例如超過5米跳動,那我就會趕快降落檢查,避免提控。
1__%252524%252521%252540%252521__.png
那講這麼多code,對很多人來說可能頭昏腦脹,最乾脆就是提供韌體檔案,直接刷吧!
這是我修改後的韌體下載位置 (2015/02/20 Update:更新到SVN Revision 808),這是適用於多軸版本,不適用於Plane版本。
燒錄方法可以用XLoader,下載位置 http://www.hobbytronics.co.uk/arduino-xloader
或者使用minimOSD的CT tool刷最快。

刷我的韌體後,GPS衛星數量下方要把保持一行供HDOP顯示,如果你看的懂code,想要顯示其他訊息,例如垂直精度、AccX、ACCY、震動值等等,你都可以透過改code方式顯示在OSD上面。