将 Protobuf 转换为具有类似功能的 ROS 消息
Converting Protobuf to ROS messages with similar functionality
我最近在工作中继承了一个使用 MOOS 和 Protobuf 消息的大型代码库。
应我的项目负责人的要求,我将其移植为仅使用 ROS,其中使用 ROS 消息而不是 protobuf。代码库严重依赖于使用 protobuf 功能,例如枚举器最小值/最大值、从变量字段中提取字符串、->has_variable() 函数、->isValid() 等
到目前为止,我只能从 wiki 中找到非常基本的 ROS 消息功能。
有'hacks'之类的有这种柔韧性吗?
示例:Protbufs 支持枚举器,但 ROS 消息不支持,所以我有:
uint8 TYPE_FAILED = 0
uint8 TYPE_OPERATIONAL = 1
uint8 TYPE_INITIALIZING = 2
uint8 health_state_type
我的 health_state_type
是我的 'enumerator',但我没有最小值或最大值,除非我硬编码一个,而且我无法将 TYPE_FAILED
提取为字符串。我一直在通过使用
慢慢找到解决方法
my_message::custom_msg health;
health.health_state_type = health.TYPE_FAILED
但我不得不修改许多将它用作字符串而不是整数的不同区域。
是的,有黑客攻击。但是你需要输入一些工作。
要在 ROS 中使用 publisher/subscriber 方法,您需要在 .msg 文件中为所有主题定义消息。
然后从该文件自动生成 C++ class。但是您不想触摸那个自动生成的文件!您可以做的是定义您的 class 并将其与自动生成的 class 相关联。
查看 here 示例,了解如何操作。然后,您可以使用 isValid 等所需方法扩展您的自定义 class。
另一种(也许更简单)的方法是声明一个助手 class 来为消息中的每种类型完成所需的工作。
或者您可以继续使用 protobuf。如果不是在 ROS 中,它也至少在 Gazebo 中使用。
前段时间我写了一些自动生成脚本,这些脚本使用 Protobuf 并生成 ROS headers(不是 msg 文件)以通过 ROS 通信传输 Protobuf blob。这将满足您的需求,而无需使用支持的 ROS 消息定义复制 Protobuf 定义。 Code.
我最近在工作中继承了一个使用 MOOS 和 Protobuf 消息的大型代码库。
应我的项目负责人的要求,我将其移植为仅使用 ROS,其中使用 ROS 消息而不是 protobuf。代码库严重依赖于使用 protobuf 功能,例如枚举器最小值/最大值、从变量字段中提取字符串、->has_variable() 函数、->isValid() 等
到目前为止,我只能从 wiki 中找到非常基本的 ROS 消息功能。
有'hacks'之类的有这种柔韧性吗?
示例:Protbufs 支持枚举器,但 ROS 消息不支持,所以我有:
uint8 TYPE_FAILED = 0
uint8 TYPE_OPERATIONAL = 1
uint8 TYPE_INITIALIZING = 2
uint8 health_state_type
我的 health_state_type
是我的 'enumerator',但我没有最小值或最大值,除非我硬编码一个,而且我无法将 TYPE_FAILED
提取为字符串。我一直在通过使用
my_message::custom_msg health;
health.health_state_type = health.TYPE_FAILED
但我不得不修改许多将它用作字符串而不是整数的不同区域。
是的,有黑客攻击。但是你需要输入一些工作。 要在 ROS 中使用 publisher/subscriber 方法,您需要在 .msg 文件中为所有主题定义消息。
然后从该文件自动生成 C++ class。但是您不想触摸那个自动生成的文件!您可以做的是定义您的 class 并将其与自动生成的 class 相关联。
查看 here 示例,了解如何操作。然后,您可以使用 isValid 等所需方法扩展您的自定义 class。
另一种(也许更简单)的方法是声明一个助手 class 来为消息中的每种类型完成所需的工作。
或者您可以继续使用 protobuf。如果不是在 ROS 中,它也至少在 Gazebo 中使用。
前段时间我写了一些自动生成脚本,这些脚本使用 Protobuf 并生成 ROS headers(不是 msg 文件)以通过 ROS 通信传输 Protobuf blob。这将满足您的需求,而无需使用支持的 ROS 消息定义复制 Protobuf 定义。 Code.