将Protobuf转换为具有类似功能的ROS消息

时间:2017-11-01 16:09:19

标签: c++ protocol-buffers ros

我最近在工作中继承了一个使用MOOS&的大型代码库。 Protobuf消息。

根据我的项目负责人的要求,我将其移植到仅使用ROS,其中使用ROS消息而不是protobuf。代码库很大程度上依赖于使用protobuf功能,例如枚举器最小值/最大值,从变量字段中提取字符串, - > has_variable()函数, - > isValid()等。

到目前为止,我只能从wiki中找到非常基本的ROS消息功能。

是否有任何'黑客'等具有此类柔韧性?

示例:Protbufs支持枚举器,但ROS消息没有,所以我有:

  uint8 TYPE_FAILED        = 0
  uint8 TYPE_OPERATIONAL   = 1
  uint8 TYPE_INITIALIZING  = 2

  uint8 health_state_type

我的health_state_type是我的“枚举器”,但除非我对其进行硬编码,否则我没有最小值或最大值,我无法将TYPE_FAILED提取为字符串。我一直在使用

慢慢找到解决方法
my_message::custom_msg health;
health.health_state_type = health.TYPE_FAILED

但是我必须修改许多不同的区域,将它用作字符串,而不是整数。

2 个答案:

答案 0 :(得分:4)

是的,有一个黑客。但是你需要输入一些工作。 要在ROS中使用发布者/订阅者方法,您需要为 .msg 文件中的所有主题定义消息。

从该文件中自动生成C ++类。但是你不想触摸那个自动生成的文件!您可以做的是定义您的类并将其与自动生成的类相关联。

查看here示例,了解如何操作。然后,您可以使用 isValid 等所需方法扩展自定义类。

另一种(也许更简单)的方法是声明一个帮助器类,它将为消息中的每个类型执行所需的工作。

或者您可以继续使用protobuf。如果不是在ROS中,它也至少在Gazebo中使用。

答案 1 :(得分:0)

前段时间我写了一些自动生成脚本,这些脚本使用Protobufs并生成ROS头( msg文件),以通过ROS通信传输Protobuf blob。这将满足您的需求,而无需复制具有支持ROS msg定义的Protobuf定义。 Code

相关问题