资讯专栏INFORMATION COLUMN

在 ROS 中使用 Protobuf 替代 ros msg

Cobub / 2121人阅读

摘要:在拥有更好的扩展性的同时,还能给对数据进行压缩,减少的体积。然而,的要求必须使用标准的,并不是很方便换成。如果将转成放在特定的中的话,则又失去了的类型信息。使用时,只要即可,完全符合的推荐使用方式。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41190.html

相关文章

  • ROS之Turtlebot:(1)安装

    摘要:当打开一个新的终端时,环境变量会自动生效。安装如果你采用我这种方式安装,那么会在安装时自动安装了。需要转换一个规则,以致于能够可靠的检测到工厂快速芯片。规则安装问题答疑 注意这里只给出我实验的安装方式,具体所有的安装方式请查看:http://wiki.ros.org/turtlebot... 1、安装 sudo apt-get install ros-indigo-turtlebot ...

    Berwin 评论0 收藏0
  • 实践指南-快速解锁Rancher v1.2

    摘要:引言已经发布,相信众多容器江湖的伙伴们正魔拳擦准备好好体验一番。为了更好的体验的完整特性,我们选取了测试比较严格的运行环境。 引言 Rancher v1.2已经发布,相信众多容器江湖的伙伴们正魔拳擦准备好好体验一番。由于Docker能够落地的操作系统众多,各种Docker版本不同的Graph driver,所以通常大版本的第一个release都会在兼容性上有一些小问题。为了更好的体验R...

    KavenFan 评论0 收藏0
  • 【物联网】33.物联网开发 - 机器人

    摘要:针对这点,人们将机器人需要的各类软件要素总结在一起,开发出了专门用于机器人的中间件。的开端要追溯到世纪初于斯坦福大学进行的一个个人机器人项目。 机器人的结构 其中还包括一些机器人特有的构成要素,例如驱动器和用于驱动的电机驱动等。控制的内容也并非单纯的信号控制,还需要实现运转控制乃至图像识别...

    olle 评论0 收藏0
  • sublime-text3和pycharm无法import-rospy等ros-Python库

    (转载请注明作者和出处: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 软件:...

    My_Oh_My 评论0 收藏0

发表评论

0条评论

Cobub

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<