如何在MB-System中新建I/O模塊

    本文檔根據官方文檔《Developer's Guide to Coding an MBSystem I/O Module》編寫。主要內容爲基於文檔中新建一個MB-System的I/O模塊的範例,理解MB-System如何處理側掃聲納xtf格式文件。官方文檔中的範例,即如何新建一個I/O模塊處理WASSP多波束聲納數據已經說明非常詳細,十分推薦仔細閱讀。鑑於文檔內容爲我個人的理解,可能有錯誤。

    文檔中新建MB-System的I/O模塊的範例爲P17~P98,P17之前的部分爲MB-System的架構介紹及數據處理流程說明,亦是值得花時間學習。

    新建I/O模塊具體流程如下(操作均在src/mbio/目錄下進行)。

    

STEP 1 設立聲納系統名稱、數據格式及ID

    1.聲納系統的名稱可爲任意25字符,例如BENTHOS代表Benthos1624側掃聲納,記爲MB_SYS_BENTHOS;

    2.數據格式的名稱限定8個字符,對於新假如的格式,需加上前綴“MBF_”,例如:MBF_XTFB1624;

    3.數據格式擁有唯一的ID,例如:#define MBF_XTFB1624 211;

 

STEP 2 使用源碼的模板構建新模塊

     1.拷貝mbsys_templatesystem.h,重命名爲:mbsys_benthos.h;

   拷貝mbsys_templatesystem.c,重命名爲:mbsys_benthos.c;

   拷貝mbr_tempform.c,重命名爲:mbr_xtf1624.c;

     2.在以上文件中進行全局替換:

   templatesystem->benthos

   TEMPLATESYTEM->BENTHOS

   tempform->xtfb1624

   TEMPFORM->XTFB1624

   我們將在以上三個文件中處理xtf格式側掃聲納文件。

 

STEP 3 定義存儲新聲納數據結構體

      1.在mbsys_benthos.h中添加記錄側掃聲納數據的結構體:struct mbsys_benthos_struct

     注:結構體的模板已由mbsys_templatesystem.h中的mbsys_templatesystem_struct中定義,而mbsys_benthos_struct爲結合模板與xtf格式官方文檔的產物,可以只根據我們需要的信息進行構建;(手冊中的範例參考mbsys_wassp.h)

      2.要使用真實數據對定義的結構體進行驗證,實際情況常出現構建的結構體與實際的聲納數據不符而導致數據讀取的錯誤;

      注:以xtf側掃聲納數據文件爲例,以十六進制數據解析軟件(在此我使用GNOME HEX EDITIOR)讀取聲納數據文件,然 後結果與xtf格式官方文檔XTFFILEHEADER進行對比,可以觀察FileFormat、SystemType、REcordingProgramName、RecordingProgram Version、SonarName、SonarType等在程序中是否一致;

      注:手冊中範例說得比較詳細;

      3.基於對比的結構,合理調整1中構建的結構體,根據實際數據與數據格式文檔確定解碼方式;

      4.每個MBIO的結構體的通用項:int kind、double time_d、int time_i[7],MOIO模塊中的函數mb_get_time()、mb_get_date()等與此相關聯;

      5.MB_DATA_DATA--Survey data

    MB_DATA_NAV--Navigation data

    MB_DATA_COMMENT--Comment string

      6.在手冊中的範例裏,構建記錄聲納數據的結構體時引入了子結構體;

 

STEP 4 (a) mbr_xxx.c的初始化工作

     1.初始化:

    Mbr_register_xxx()、mbr_info_xxx()、mbr_dem_xxx()直接關聯mb_read_init()及mb_write_init();

    Mbr_dem_xxx()直接關聯mb_close();

      2.mbr_registem_xxx()註冊管理指針,使得mbr_xxx.c及mbsys_xxx.c中的各模塊能由MBIO中更高級的I/O模塊調用;

      3.①MBF_XTFB1624初始化完成之後:mb_extract()->mbsys_xxx_extract();

    ②

 

         ③mbr_register_xxx()做好以上管理,但只有MBIO其他模塊需要調用的部分需要註冊;

      4.mbr_xxx.c中主要處理數據的函數爲:mbr_rt_xxx()(讀)、mbr_wt_xxx()(寫);

      5.mbr_info_xxx()主要爲構建的結構體進行初始化賦值;

      6.文件訪問方式:

         ①fopen()、fread()、fwrite()、fclose();

         ②(推薦)mb_fileio_open()、mb_fileio_read()、mb_fileio_write()、mb_fileio_close()

         ③調用外部第三方I/O庫讀取某些特殊格式文件,如XDR、SURF等;

 

STEP 4(b)mbr_xxx.c中實現讀寫函數

一、1、主要的函數爲mbr_rt_xxx()和mbr_wr_xxx()

             其中主要參數如下:

            ①verbose:輸出log的詳細程度?;

            ②mbio_ptr:指向通過MBIO定義的讀/寫文件的mb_io structure

            ③store_ptr:指向primary data structure(通常在mb_io structure中獲得);

            ④error:指向error的ID,可據此判斷error可能的原因;

        2、mbio_ptr和store_ptr指針由mb_read_init()/mb_write_init()獲得,verbose值由MB-System Program設定,error值返回具體的error狀態信息;

        3、mbr_rt_xxx()從mbio_ptr指向的文件數據中讀取數據並轉換成store_ptr指向的數據structure;

        4、status和*error返回值分別表示成功與失敗;

        5、store->kind的值表示讀取的數據類型;

        6、mbr_wt_xxx()主要將當前store_ptr指向的數據按需求轉換記錄於mbio_ptr指向的的文件;

二 、1、mbr_rt_xxx():讀取文件->驗證數據起點和size->將數據導入buffer->子函數解析處理具體數據、存儲數據;

        2、mbr_xxx_rd_data()較爲複雜:

①需要找到文件數據起點;

②處理文件頭文件,如xtf文件中的XTFFILEHEADER的前端字節(起點、長度、同步、類型等);

③讀取多使用mb_fileio_get(),代碼中的體現爲:mb_io_ptr->filetype,參數設定爲MB_FILETYPE_SINGLE,且允許對I/O文件進行優化系統的設置;

④buffer內存分配根據存儲記錄的數據增加而增加,buffer的指針和分配給它的內存都存儲在mb_io_struct中;

⑤採用mb_get_binary_xxx()等讀取不同類型的單個值,同類型還有mb_get_int()、mb_get_float()等;

⑥verbose>=2時,MB-System打印the entry並返回values

    verbose>=5時,函數將打印所有信息;

三、 1、異步即時插值(手冊說明內容較少)

有些場景中缺少導航、姿態等信息,此時需要依靠異步記錄的信息進行插值(處理各傳感器時間同步問題?);

 

四、 mbr_wt_xxx()及其子函數:

1、於mbr_rt_xxx()非常類似、調用函數將需要輸出的數據導入buffer,然後輸出於mbio_prt指向的文件中;

2、採用mb_put_binary_xxx()等將不同類型的數據單個值導入buffer中,同類型還有mb_put_int()、mb_put_float();

 

STEP 5 在mbsys_xxx.c中構建數據接口

  1. 實現mbr_register_xxx()中註冊的用於mbio_struct的接口,如側掃聲納中mbsys_benthos.c中的mbsys_benthos_xxx()等函數;

  2. 代碼中需要注意文件數據格式與MBIO API中數據格式的相互轉換;

  3. 關鍵函數:mbsys_xxx_extract(),數據提取;

 

STEP 6 將新構建的I/O模塊集成與MBIO中:

     1.信息I/O模塊構建完成後,應在以下文件中修改信息:mbsystem/src/mbio/mb_format.h、mb_format.c,以將新的模塊導入MBIO庫中;

     2.聲納名稱定義於mb_format.h中,如:#define MB_SYS_BENTHOS 33;

     3.聲納數據格式及其ID定義於mb_format.h中,如:#define MBF_XTFB1624 211

     4.函數mbr_register_xxx()及mbr_info_xxx()在mb_format.h中定義;

     5.新格式的引用必須要在mb_format.c中的mb_format_register()中進行聲明:

如:

     6.新格式的引用必須要在mb_fomat.c中的mb_format_info()中進行聲明:

如:

      7.新格式的引用必須要做mb_format.c中的mb_get_format()中進行聲明:

如:

STEP 7 更新MB-System的編譯配置文件

  1. 在mbsystem/src/mbio/Makefile.am中聲明新模塊:mbsys_xxx.h、mbsys_xxx.c、mbr_xxx.c;

如:include_HEADERS += mbsys_benthos.h

libmbio_la_SOURCES += mbsys_benthos.c

libmbio_la_SOURCES += mbr_xtfb1624.c

2、重新編譯。

 

參考文獻:

1、MB-System官網:

      https://www.mbari.org/products/research-software/mb-system/

2、《Developer's Guide to Coding an MBSystem I/O Module》:

      https://www.mbari.org/wp-content/uploads/2016/03/codinganmb-systemiomodulev4.pdf

3、Triton Imaging, Inc. eXtended Triton Format (XTF) Rev. 41:

       http://ge0mlib.com/papers/File_Formats/Xtf_rev41.pdf

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章