我最近在工作中继承了一个使用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
但是我必须修改许多不同的区域,将它用作字符串,而不是整数。
答案 0 :(得分:4)
是的,有一个黑客。但是你需要输入一些工作。 要在ROS中使用发布者/订阅者方法,您需要为 .msg 文件中的所有主题定义消息。
从该文件中自动生成C ++类。但是你不想触摸那个自动生成的文件!您可以做的是定义您的类并将其与自动生成的类相关联。
查看here示例,了解如何操作。然后,您可以使用 isValid 等所需方法扩展自定义类。
另一种(也许更简单)的方法是声明一个帮助器类,它将为消息中的每个类型执行所需的工作。
或者您可以继续使用protobuf。如果不是在ROS中,它也至少在Gazebo中使用。
答案 1 :(得分:0)
前段时间我写了一些自动生成脚本,这些脚本使用Protobufs并生成ROS头(不 msg文件),以通过ROS通信传输Protobuf blob。这将满足您的需求,而无需复制具有支持ROS msg定义的Protobuf定义。 Code