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上面。

18 則留言:

  1. 板大真是神人,小弟找了許多資源希望能將hdop值顯示出來,一直都找不到,想不到您還將修改過程分享出來,替您拍拍手!
    想必很多人不知道,仰賴GPS定位的APM系統,若是HDOP值大於2太多的話,隨時都會有失控炸雞的可能(除非只切回定高、自穩),只看衛星數量又難免忐忑不安,現在可以直接看到HDOP值的話,就可以放心的飛了!

    回覆刪除
    回覆
    1. 其實有一些論壇有人分享同樣功能,只是比較難搜尋,我只是分享比較詳細。其實有很多訊息都可以透過改code顯示在OSD上面,不難。

      刪除
  2. 請問能分享一下現在的r800 版本的修改嗎?我找不到source code...

    回覆刪除
    回覆
    1. source code在這裡,用SVN checkout
      https://code.google.com/p/minimosd-extra/source/checkout

      刪除
    2. 謝謝,我剛也找到了;另能告知應怎製作 hex 檔案嗎?是否應連 library 一拼整個下載呢?

      刪除
    3. 啊....不行.....arduino 1.6 內的 sketchbook 只找到 libraries 就是沒有 minimosd,我放棄了~~

      刪除
  3. 就checkout下來,然後把library include到arduino IDE,compile出來就是hex....
    基本上r808沒什麼有感的改進,所以刷我的hex就可以了,等我有空我在compile出r808版本

    回覆刪除
  4. 謝謝,我再試了一會也不行
    好像是r726 版本跟arducroper 3.2 有兼容問題吧?

    回覆刪除
    回覆
    1. 兼容??這我就不確定了,我沒去看log。不過我目前就是用3.2在飛,之前也很多人用3.3dev在飛也都沒問題,你這訊息是在哪看到?

      刪除
    2. 今天翻了很多網頁,不知道是否這個...
      https://github.com/diydrones/ardupilot/issues/1630

      刪除
    3. 其實我還沒有試是否可行的,要等集齊工具才能動手,目前只是找資料中
      不過你的r726 在我的 x350pro 是運行得很正常,謝謝大大!

      刪除
    4. 我想要先解釋一下,目前大多數人用的是MinimOSD_Extra,跟MinimOSD是不太一樣,我看那個討論串,大部分也都說extra是沒問題的。也許在這一兩週過年我比較有空我會更新到r808,謝謝。

      刪除
    5. 好的,麻煩你了!

      刪除
    6. CX-20和CUAV MinimOSD 裝了你的custom firmware 805也沒有問題,等待你的808。謝謝!

      刪除
  5. 大大,連結的檔案無法下載了...可以再提供一次嗎? 感恩

    回覆刪除
    回覆
    1. https://mega.nz/#!Ld1mAY5Y!chmp49iNMk8tHBfvWLf39NeAxQA1rjCCowltUHdZIdQ

      刪除
  6. 請問可以用 CT Tool 刷嗎? 我用CT Tool 刷完,並沒有你說的選項耶!
    感恩

    回覆刪除