BDDF 文件格式(BDDF file format)

動機

存儲在 Spot 機器人上的數據以 BDDF 格式下載。 BDDF 是由波士頓動力公司創建的一種文件格式,用於存儲帶時間戳的數據以及元數據。 它支持二進制 blob 和 POD(“plain old data”),例如整數或浮點數。

創建 BDDF 是為了滿足以下組要求:

寫起來安全又便宜Safe and cheap to write。 這種格式在機器人內部和外部使用。 因此,它旨在在將數據保存到磁盤的同時,將磁盤和 CPU 使用率降至最低、可預測。 此外,它的設計使得寫入文件的所有數據都是可恢復的(例如,當正在寫入文件時軟件死機或計算機電源被切斷)。

不需要額外的處理No additional processing required。 BDDF 旨在供用戶工具使用,而無需處理為其他格式。 因此,它包含一個索引,以便可以有效地訪問任意數據。 索引如下:

  • 可用於確定文件中包含的數據的種類和時間跨度。
  • 支持按種類和時間跨度高效提取數據。

安全的Secure。很少或沒有解析邏輯。讀取 BDDF 只需要處理簡單的成幀,並解析一些 protobuf 消息。

一般的General。 BDDF 可以存儲任何編碼的數據。

Streamable.可流式傳輸。數據是基於查詢以這種格式從機器人流式傳輸的,因此它的設計使得可以在不向流中向後查找的情況下寫入格式。這就是索引和校驗和位於文件末尾的原因。

組織

文件的結構是具有簡單框架的“區塊”序列。一些區塊存儲有關文件及其內容的描述性信息,而一些區塊存儲數據。

BDDF 可以存儲二進制“blob”和“普通舊數據plain old data”(POD)值,例如整數或浮點數。

存儲的數據被組織成“數據系列”。數據系列為:
  • 是消息類型或 POD 類型。
  • 由一系列帶時間戳的數據塊組成。
  • 有解釋數據塊內容的系列描述。
  • 有一個系列標識符來“命名name”文件中的數據系列。
  • 具有一組索引名稱,用於附加到系列中每個數據塊的索引值 (int64) 列表。
在數據文件中,數據系列使用系列索引進行尋址。 在一個數據系列中,一個數據塊由一個整數係列索引尋址。 在 BDDF 文件的末尾,一個文件索引列出了文件中所有的數據系列和系列索引的位置。

識別數據系列

根據可能存儲在數據系列中的內容的大類,可能以不同的方式描述該系列。 出於這個原因,我們不需要一個唯一的字符串名稱來標識一個系列,而是使用一個稍微靈活的標識符:{key -> value} 的唯一映射。

BDDF SeriesIdentifier 有一個 series_type,它描述了系列的種類,以及一個 規範spec,它是 {key -> value} 的映射,進一步標識了系列。 series_type 表示應該在規範中使用的一組鍵。

例如:

  • 因此,可以將包含 GRPC robot-id  請求消息的系列指定為:
    • series_type="bosdyn:grpc:requests" and spec={"bosdyn:grpc:service": "robot_id", "bosdyn:message-type": "bosdyn.api.RobotIdRequest"}.
  • 包含 OperatorComment 消息的系列可以指定為
    • series_type="bosdyn:message-channel" with spec={"bosdyn:channel": "bosdyn.api.OperatorComment"}

因為 BDDF SeriesIdentifier 是一個結構體,BDDF 格式提供了一種方法來對這個結構體進行哈希hash處理,以便於索引。 雜序hash是 SHA1(S K1 V1 K2 V2 ...) 的前 64 位,其中 S 是系列標識符文本,K1 V1 是第一個鍵和規範spec的值的鍵和值,K2 V2 是第二個 規範spec的鍵和值等……這裡,所有字符串都被編碼為 utf-8,並且鍵使用這種編碼從最小到最大排序。

數據系列註釋

應使用一組字符串鍵 => 值映射形式的註釋來表達有關數據系列的更多信息。 註釋鍵的格式應為 {project-or-organization}:{annotation-name}。 例如,‘bosdyn:channel-name’、‘bosdyn:protobuf-type’。 沒有 ":" 或以 ":" 開頭的註釋鍵是保留的。 保留命名空間中唯一的當前鍵是單位:例如,units: e.g., {'units': 'm/s2'}.

應使用統一的度量單位代碼指定單位  Unified Code for Units of Measure

檔案結構

文件中有三種基本類型的塊:

描述符塊DescriptorBlocks。它們描述了整個文件、數據系列或文件索引。

數據描述符DataDescriptors。這些描述了下面的數據塊,包括它的時間戳和它屬於哪個系列。

數據Data。這些是原始二進制消息數據塊。

所有二進制值都是小端的 little-endian。

<File>     ::= <Magic> <FileFormatDescriptor> <blocks> \
               <FileIndex> <end-header> <Offset> <CheckSum> <EndMagic>
<Magic>    ::= 4 bytes: "BDDF" class="border"<Offset>   ::= 64-bits: unsigned int
<EndMagic> ::= 4 bytes: "FDDB"
<CheckSum> ::= 160-bits: SHA1 digest of all data up until this point in the file/stream.

<blocks> ::= <block> <blocks> | ""

><block> ::= <block-header><block-body>
<block-header> ::= <block-type><block-size>
<block-type> ::= 8 bit unsigned integer
<block-size> ::= 56 bit unsigned integer
<block> ::= <block-header (type=0x00)> <DescriptorBlock>
           | <block-header (type=0x01)r><descriptor-size> <DataDescriptor> <Data>
<end-header> :: <block-header (block-type=0x02, block-size=20)>

<DescriptorBlock> 是序列化的 bosdyn.api.data.DescriptorBlock protobuf,大小為 <block-size> 字節。

<FileFormatDescriptor> 是包含 bosdyn.api.data.FileFormatDescriptor 子消息的序列化 bosdyn.api.data.DescriptorBlock protobuf。

<FileIndex> 是一個序列化的 bosdyn.api.data.DescriptorBlock protobuf,包含一個 bosdyn.api.data.FileIndex 子消息。

<Da​​taDescriptor> 是序列化的 bosdyn.api.data.DataDescriptor protobuf,大小為 <descriptor-size> 字節。

<Da​​ta> 是表示塊數據內容的二進制數據,大小為 <block-size> - <descriptor-size>

<bit-zero> ::= 1 bit: 0
<bit-one>  ::= 1 bit: 1

<block-size> ::= 63-bit unsigned int
<descriptor-size> ::= 32-bit unsigned int

文件中的第一個 <block> 應該是一個包含 FileFormatDescriptor DescriptorBlock。這指定了文件格式版本(當前為 1.0.0)和一個 {key -> value} (string -> string) 列表,用於機器人日誌可用於指定日誌來自哪個機器人,正在運行的版本,等等…。註釋鍵的格式應為 {project-or-organization}:{annotation-name}。例如,bosdyn:robot-serial-number。

文件中的最後一個 <block> 應該是一個包含 FileIndexDescriptorBlock。此結構列出了每個消息系列的 SeriesIdentifier 以及該系列中每個消息的 (timestamp_nsec, file_offset) 對列表。如果 <Offset> 為零,則表示該文件沒有索引塊。

索引有助於更輕鬆地在文件中查找數據。文件末尾的偏移量顯示索引塊的開始位置。因此,您可以從文件末尾查找 20 個字節,讀取索引偏移量,查找索引塊並讀取它,然後您就有了到文件中其餘數據的映射。索引偏移位於文件的末尾,以允許將文件純粹作為流寫入。因此,您永遠不需要尋找開頭來插入偏移量。


參考資料

特色、摘要,Feature、Summary:

關鍵字、標籤,Keyword、Tag:

留言

這個網誌中的熱門文章

Ubuntu 常用指令、分類與簡介

iptables的觀念與使用

網路設定必要參數IP、netmask(遮罩)、Gateway(閘道)、DNS

了解、分析登錄檔 - log

Python 與SQLite 資料庫

Blogger文章排版範本

Pandas 模組

如何撰寫Shell Script

查詢指令或設定 -Linux 線上手冊 - man

下載網頁使用 requests 模組