摘要:在擁有更好的擴展性的同時,還能給對數據進行壓縮,減少的體積。然而,的要求必須使用標準的,并不是很方便換成。如果將轉成放在特定的中的話,則又失去了的類型信息。使用時,只要即可,完全符合的推薦使用方式。
Background
做 ROS 相關開發的,應該都知道 ros msg 有個非常大的槽點:
ros msg 擴展性較差,即如果 msg 的字段發生變化,則程序前后版本不兼容
因此,google 的 protobuf 相對就是一個更好的選擇。在擁有更好的擴展性的同時,還能給對數據進行壓縮,減少 rosbag 的體積。
然而,ROS 的 topic 要求必須使用標準的 ros message,并不是很方便換成 protobuf。如果將 protobuf 轉成 str 放在特定的 ros msg 中的話,則又失去了 msg 的類型信息。
在各種嘗試下,我找了一種更好的方法,將 msg 替換成 protobuf,同時與 ROS 盡可能的兼容。
注意:本文只探討 python 環境下的實現,c++ 版的實現由于是其他同事做的,因此不在本文的探討范圍內。
Solution 1. 通過 catkin_make 自動生成 protobuf 對應的代碼可以利用 catkin 的 add_custom_command, 來自動生成代碼。這樣會自動 install 到相應的目錄。使用時,只要 source setup.bash 即可,完全符合 ROS 的推薦使用方式。
# 只節選最核心的部分 set(proto_dir ${PROJECT_SOURCE_DIR}) file(GLOB proto_files "${proto_dir}/*.proto") message(STATUS "Proto Source Dir: ${proto_dir}") message(STATUS "Proto Source Files: ${proto_files}") catkin_destinations() # 設置生成目標代碼文件的路徑 set(proto_gen_py_dir ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_PYTHON_DESTINATION}) file(MAKE_DIRECTORY ${proto_gen_py_dir}) # 這步很重要,讓目標路徑變為 python 的 package # 否則的話,會出現 import 異常 file(WRITE ${proto_gen_py_dir}/__init__.py) # Create lists of files to be generated. set(proto_gen_py_files "") foreach(proto_file ${proto_files}) get_filename_component(proto_name ${proto_file} NAME_WE) list(APPEND proto_gen_py_files ${proto_gen_py_dir}/${proto_name}_pb2.py) endforeach(proto_file ${proto_files}) message(STATUS "Generated proto files: ${proto_gen_py_files}") # Run protoc and generate language-specific headers. add_custom_command( OUTPUT ${proto_gen_py_files} COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} --proto_path=${proto_dir} --python_out=${proto_gen_py_dir} ${proto_files} DEPENDS ${PROTOBUF_PROTOC_EXECUTABLE} ${proto_files} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) set_source_files_properties(${proto_gen_py_files} PROPERTIES GENERATED TRUE) # 將生成的 py 文件拷貝到 install 對應的路徑下 install(DIRECTORY ${proto_gen_py_dir}/ DESTINATION ${CATKIN_PACKAGE_PYTHON_DESTINATION} FILES_MATCHING PATTERN "*.py" )2. 實現一個 Adapter 類,來實現標準的 ROS message
隨便找一個簡單的 ros msg 所生成的 python 對應的代碼,會發現其實主要做了以下幾件事:
繼承了 genpy.Message。在使用時會強制校驗是否是 genpy.Message 的子類
實現了 serialize 方法,對內容進行序列化
實現了 deserialize 方法,對內容進行反序列化
因此,我們只要按照這種標準的方式,將 protobuf 格式的消息進行序列化或反序列化即可
Summary Reference文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41190.html
摘要:當打開一個新的終端時,環境變量會自動生效。安裝如果你采用我這種方式安裝,那么會在安裝時自動安裝了。需要轉換一個規則,以致于能夠可靠的檢測到工廠快速芯片。規則安裝問題答疑 注意這里只給出我實驗的安裝方式,具體所有的安裝方式請查看:http://wiki.ros.org/turtlebot... 1、安裝 sudo apt-get install ros-indigo-turtlebot ...
摘要:引言已經發布,相信眾多容器江湖的伙伴們正魔拳擦準備好好體驗一番。為了更好的體驗的完整特性,我們選取了測試比較嚴格的運行環境。 引言 Rancher v1.2已經發布,相信眾多容器江湖的伙伴們正魔拳擦準備好好體驗一番。由于Docker能夠落地的操作系統眾多,各種Docker版本不同的Graph driver,所以通常大版本的第一個release都會在兼容性上有一些小問題。為了更好的體驗R...
摘要:針對這點,人們將機器人需要的各類軟件要素總結在一起,開發出了專門用于機器人的中間件。的開端要追溯到世紀初于斯坦福大學進行的一個個人機器人項目。 機器人的結構 其中還包括一些機器人特有的構成要素,例如驅動器和用于驅動的電機驅動等??刂频膬热菀膊⒎菃渭兊男盘柨刂?,還需要實現運轉控制乃至圖像識別...
(轉載請注明作者和出處:https://yangningbocn.github.io 未經允許請勿用于商業用途) 背景 筆記本型號:聯想Y500 CPU : Intel? Core? i7-3630QM CPU @ 2.40GHz × 8 內存:7.7 GiB 顯卡:GeForce GT 750M/PCIe/SSE2 系統版本:ubuntu 14.04 LTS 64bit 軟件:...
閱讀 2664·2021-11-24 09:38
閱讀 1979·2019-08-30 15:53
閱讀 1234·2019-08-30 15:44
閱讀 3229·2019-08-30 14:10
閱讀 3579·2019-08-29 16:29
閱讀 1800·2019-08-29 16:23
閱讀 1099·2019-08-29 16:20
閱讀 1472·2019-08-29 11:13