A. 一文讀懂——Protobuf
Protocol Buffers(簡稱Protobuf),是Google為內部通信和數據存儲設計的一種高效輕量級的數據結構格式。全球已有超過48,162種報文格式定義和12,183個.proto文件應用於RPC系統和持久化存儲。它的優勢在於結構化數據的序列化與跨語言、平台的兼容性,適用於即時通訊和數據存儲等領域。
與XML和JSON相比,Protobuf體積更小,解析速度更快,特別適合像即時通訊這樣對數據傳輸效率要求高的場景。它的核心特性體現在簡化了服務端開發:服務端間通信只需關注介面方法(service)和參數(message),無需關注底層協議和欄位解析,大大降低了開發成本。
在Proto3版本中,相較於Proto2,語法更為簡潔,例如移除了"required"和"optional"等復雜的規則,強調約定而非語法。Proto3的repeated標量數值類型默認為packed編碼,而Proto2默認非packed,同時增加了Go、Ruby、JavaNano等更多語言支持。
定義數據結構時,Protobuf提供一套基礎數據類型,每個欄位都有唯一編號,用於二進制標識。雖然編號范圍廣,但要避免使用19000~19999的預留區間。為了優化編碼後的數據大小,高頻率的欄位建議使用1~15范圍的編號,但需留有擴展空間。
Proto3中repeated欄位的規則有所變化,而Proto2中的可擴展欄位規定有所不同。在編寫消息類型時,可以在一個.proto文件中定義多個相關消息,方便擴展和組織。
添加註釋支持C/C++風格,通過預留欄位處理更新後的兼容性問題。默認值根據欄位類型設定,如字元串、布爾值等。在枚舉定義上,需確保第一個枚舉值為0且無重復,除非啟用別名選項。
使用.proto文件定義的數據結構需通過protoc編譯器生成介面代碼,以支持序列化和反序列化。然而,使用CMake的execute_process命令可能存在重新生成源碼導致頻繁編譯的問題。
實例演示包括定義.proto文件、編寫讀寫函數以及配置文件的使用,展示了如何在實際項目中應用Protocol Buffers。更多詳細信息,請參考官方文檔。
B. Windows上玩轉ROS(二)想要傳遞一個矩陣,多維數組或者圖像試試std_msgs包或者自定義消息
上一章概述了在Windows上使用ROS的基本流程,但留有疑問——如何處理復雜的數據類型,如矩陣或自定義數據結構。本文將著重介紹std_msgs包和自定義消息的使用方法。
如果你的發布者需要傳輸的數據類型暫時未知,不必急於自定義消息。std_msgs包內已經提供了豐富的內置數據類型,如一維的int16數組。首先,確保你熟悉這些已有的選項,如在ROS wiki中查看它們的列表:
通過std_msgs傳遞一維數組的示例,例如在C++中:
cpp
// 在message/src目錄下創建pub_array.cpp
// 使用array_pool話題發布int16數組
Python同樣支持,例如:
python
// 在message/scripts中編寫pub_array.py
// 使用array_pool發布一維數組
對於圖像的傳遞,盡管std_msgs並非專門設計用於高效圖像處理,但可以作為傳遞二維數組的起點。例如,用opencv處理圖像並發布到image_pool。
自定義消息則允許你創建完全符合特定需求的數據結構。首先,創建一個msg文件夾並定義消息格式,如:
markdown
// 在msg文件中定義自定義圖像消息
然後在C++和Python中使用這些自定義消息,如在C++中:
cpp
// 在pub_image2.cpp中使用自定義圖像消息
Python同樣支持,但需要注意解碼比特流問題:
python
// 在pub_image2.py中使用自定義圖像消息
結論是,std_msgs提供了基本的數據類型支持,而自定義消息則允許處理復雜數據。通過這兩個工具,你已經能夠有效地在Windows上的ROS環境中傳遞矩陣和圖像數據。下一章將帶你探索更多高級話題。