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环境中传递矩阵和图像数据。下一章将带你探索更多高级话题。