从原生 ePromisa DDS 程序订阅 ROS2 主题
Subscribe to ROS2 topic from native ePromisa DDS program
我正在尝试从另一个基于 ePromisa DDS 的程序中读取 ROS2 主题。我有一个 ROS2 发布者节点向主题发送数据。我想在非 ROS DDS 程序中阅读该主题。
我已经生成了合适的匹配 IDL 文件。但我无法让他们同时到达 运行。
据我了解,我需要明确地使用 FastDDS 服务器启动 ROS2。我尝试使用 ePromisa 文档中的 discovery config file 来做到这一点。
但是,我得到一个错误...
ROS2: RROR] [1625247859.663887254] [rcl]: 节点的 fini 发布者失败: 1 在抛出 'rclcpp::exceptions::RCLError' what() 的实例后终止调用: 无法初始化 rcl 节点: rcl 节点的 rmw 句柄无效,位于 /tmp/binarydeb/ros-foxy-rcl-1.1.11/src/rcl/node.c:428
有没有人有任何想法或知道在哪里可以找到从 DDS 阅读 ROS2 主题的权威指南?
解决方案比那更简单。
首先,请记住 Fast-DDS 实现了 DDS 标准 ,因此它与任何其他 DDS 解决方案兼容。
因此,您不必使用明确的 Fast-DDS 功能(如 +Discovery-Server*)来传达您的实体(您甚至不必明确使用 Fast-DDS)。
连接Fast-DDS与ROS2有两个要点:
主题名称
ROS2 破坏了 DDS 主题,因此 ROS2 节点无法与外部 DDS 实体匹配和通信(ups,这就是我们想要做的)。
这种处理通常是通过在主题名称前添加 rt/
来完成的。
也就是说,如果使用主题 chatter
,将在 DDS 中发送的真实主题名称是 rt/chatter
.
键入名称
DDS 中的每个主题都与一种数据类型相关。
此数据类型具有唯一的名称。
与在主题中一样,ROS2 也破坏了这个名称,为字符串数据类型创建了类似 std_msgs::msg::dds_::String_
的东西。
解决方案
为了 Fast-DDS 与 ROS2 通信,您需要使用 ROS2 中特定的主题和类型名称创建 Fast-DDS 的实体(DataWriters 和 DataReaders)。
如何知道哪个是ROS2节点使用的主题和类型的确切名称?
这是一个很好的问题,有时很难调查(由于包名包含在重整中,类型名称通常更难调查)。
对于这个提议,我建议使用 Fast-DDS-Monitor:一个允许监控 DDS 网络的开源 GUI。
通过使用此工具,您将发现网络中的每个主题,并且您可以在其中轻松找到 ROS2 实体正在使用的主题名称和类型。
检查 Fast-DDS-Monitor documentation to learn how to use it, and download it from eProsima site.
我正在尝试从另一个基于 ePromisa DDS 的程序中读取 ROS2 主题。我有一个 ROS2 发布者节点向主题发送数据。我想在非 ROS DDS 程序中阅读该主题。
我已经生成了合适的匹配 IDL 文件。但我无法让他们同时到达 运行。
据我了解,我需要明确地使用 FastDDS 服务器启动 ROS2。我尝试使用 ePromisa 文档中的 discovery config file 来做到这一点。
但是,我得到一个错误...
ROS2: RROR] [1625247859.663887254] [rcl]: 节点的 fini 发布者失败: 1 在抛出 'rclcpp::exceptions::RCLError' what() 的实例后终止调用: 无法初始化 rcl 节点: rcl 节点的 rmw 句柄无效,位于 /tmp/binarydeb/ros-foxy-rcl-1.1.11/src/rcl/node.c:428
有没有人有任何想法或知道在哪里可以找到从 DDS 阅读 ROS2 主题的权威指南?
解决方案比那更简单。
首先,请记住 Fast-DDS 实现了 DDS 标准 ,因此它与任何其他 DDS 解决方案兼容。 因此,您不必使用明确的 Fast-DDS 功能(如 +Discovery-Server*)来传达您的实体(您甚至不必明确使用 Fast-DDS)。
连接Fast-DDS与ROS2有两个要点:
主题名称
ROS2 破坏了 DDS 主题,因此 ROS2 节点无法与外部 DDS 实体匹配和通信(ups,这就是我们想要做的)。
这种处理通常是通过在主题名称前添加 rt/
来完成的。
也就是说,如果使用主题 chatter
,将在 DDS 中发送的真实主题名称是 rt/chatter
.
键入名称
DDS 中的每个主题都与一种数据类型相关。
此数据类型具有唯一的名称。
与在主题中一样,ROS2 也破坏了这个名称,为字符串数据类型创建了类似 std_msgs::msg::dds_::String_
的东西。
解决方案
为了 Fast-DDS 与 ROS2 通信,您需要使用 ROS2 中特定的主题和类型名称创建 Fast-DDS 的实体(DataWriters 和 DataReaders)。
如何知道哪个是ROS2节点使用的主题和类型的确切名称? 这是一个很好的问题,有时很难调查(由于包名包含在重整中,类型名称通常更难调查)。 对于这个提议,我建议使用 Fast-DDS-Monitor:一个允许监控 DDS 网络的开源 GUI。 通过使用此工具,您将发现网络中的每个主题,并且您可以在其中轻松找到 ROS2 实体正在使用的主题名称和类型。 检查 Fast-DDS-Monitor documentation to learn how to use it, and download it from eProsima site.