BDDF 文件格式(BDDF file format)
動機
存儲在 Spot 機器人上的數據以 BDDF 格式下載。 BDDF 是由波士頓動力公司創建的一種文件格式,用於存儲帶時間戳的數據以及元數據。 它支持二進制 blob 和 POD(“plain old data”),例如整數或浮點數。創建 BDDF 是為了滿足以下組要求:
寫起來安全又便宜Safe and cheap to write。 這種格式在機器人內部和外部使用。 因此,它旨在在將數據保存到磁盤的同時,將磁盤和 CPU 使用率降至最低、可預測。 此外,它的設計使得寫入文件的所有數據都是可恢復的(例如,當正在寫入文件時軟件死機或計算機電源被切斷)。
- 可用於確定文件中包含的數據的種類和時間跨度。
- 支持按種類和時間跨度高效提取數據。
一般的General。 BDDF 可以存儲任何編碼的數據。
組織
BDDF 可以存儲二進制“blob”和“普通舊數據plain old data”(POD)值,例如整數或浮點數。
- 是消息類型或 POD 類型。
- 由一系列帶時間戳的數據塊組成。
- 有解釋數據塊內容的系列描述。
- 有一個系列標識符來“命名name”文件中的數據系列。
- 具有一組索引名稱,用於附加到系列中每個數據塊的索引值 (int64) 列表。
識別數據系列
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,並且鍵使用這種編碼從最小到最大排序。
數據系列註釋
應使用統一的度量單位代碼指定單位 Unified Code for Units of Measure。
檔案結構
描述符塊DescriptorBlocks。它們描述了整個文件、數據系列或文件索引。
數據Data。這些是原始二進制消息數據塊。
<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 子消息。
<Data> 是表示塊數據內容的二進制數據,大小為 <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> 應該是一個包含 FileIndex 的 DescriptorBlock。此結構列出了每個消息系列的 SeriesIdentifier 以及該系列中每個消息的 (timestamp_nsec, file_offset) 對列表。如果 <Offset> 為零,則表示該文件沒有索引塊。
索引有助於更輕鬆地在文件中查找數據。文件末尾的偏移量顯示索引塊的開始位置。因此,您可以從文件末尾查找 20 個字節,讀取索引偏移量,查找索引塊並讀取它,然後您就有了到文件中其餘數據的映射。索引偏移位於文件的末尾,以允許將文件純粹作為流寫入。因此,您永遠不需要尋找開頭來插入偏移量。
參考資料
- BDDF data format
- BDDF : Boston Dynamic Data Format
留言
張貼留言
Aron阿龍,謝謝您的留言互動!