在fishbot esp32板子上,同一个节点无法同时成功运行订阅者和发布者
-
我在esp32开发板里面创建了一个节点,这个节点里面有一个发布者和一个订阅者,当我同时开启订阅者与发布者,则用ros2 topic echo /XX 指令就无打印我发布的数据,但是通过ros2 topic pub /keybord_conorl std_msgs/msg/Int32 "{data: 200}" --once 可以观察到电机的转速是变化的说明发布的data被成功订阅了。也就是说这里的一个订阅者与发布者没有同时运行成功。如何解决呢,我需要订阅其他节点发布的速度指令,又要发布电机的转速。
-
@3258221348 microros确实无法做到,嵌入式资源有限,不支持自发布订阅
-
在ROS 2中,单个节点内同时拥有发布者和订阅者通常是可以正常工作的。然而,当你遇到问题时,可能是由于几个不同的原因导致的。以下是一些排查和解决问题的步骤:
-
检查节点是否正常运行:
首先,确保你的节点已经正确启动并且没有崩溃或遇到任何运行时错误。 -
检查QoS设置:
确保发布者和订阅者的QoS(服务质量)设置是兼容的。ROS 2中的QoS设置会影响消息传递的行为。 -
检查话题名称和数据类型:
确保你在ros2 topic echo
和ros2 topic pub
命令中使用的话题名称和数据类型与你的节点中发布和订阅的话题名称和数据类型完全一致。 -
检查回调函数:
如果你的订阅者回调函数中有任何阻塞或长时间运行的代码,它可能会阻止订阅者接收新的消息。确保回调函数能够快速地返回。 -
检查节点内通信:
在某些情况下,节点内的发布者和订阅者可能由于某些内部机制而无法正常工作。你可以尝试将发布者和订阅者拆分成两个单独的节点,然后看看它们是否可以正常通信。 -
检查ROS 2版本和配置:
确保你使用的ROS 2版本没有已知的与此类问题相关的bug。同时,检查你的ROS 2配置是否正确。 -
使用ROS 2的调试工具:
使用ros2 bag
、ros2 doctor
、ros2 node info
等ROS 2提供的调试工具来帮助你诊断问题。 -
检查网络问题:
虽然这在单个节点内部不太可能是问题所在,但确保你的ESP32板子和你的ROS 2网络之间没有网络连接问题。 -
查看日志和输出:
检查ESP32板子的日志输出以及ROS 2的终端输出,看是否有任何错误或警告信息。 -
简化代码:
尝试创建一个最简单的示例,其中只有一个节点同时发布和订阅一个话题。如果这个简单的示例可以正常工作,那么问题可能出在你的原始代码的某个特定部分。 -
考虑使用ROS 2的调试器:
如果你使用的是基于Linux的操作系统,你可以考虑使用GDB或其他调试器来调试你的ROS 2节点。 -
寻求社区帮助:
如果以上步骤都不能解决你的问题,你可以在ROS 2的社区论坛、GitHub问题跟踪器或相关邮件列表中寻求帮助。
最后,请注意,ROS 2是一个复杂的系统,其中涉及到许多不同的组件和配置。因此,解决问题可能需要一些时间和耐心。希望这些建议能帮助你找到问题的根源并解决它。
以上为生成回答,仅供参考~
-
-
@3258221348 microros确实无法做到,嵌入式资源有限,不支持自发布订阅
-
-
@小鱼感谢大佬的回复
我解决了,关键是 rclc_executor_init(&executor, &support.context, 2, &allocator); 这个函数,我最开始是把第3个参数写成1,实际上有发布者,和定时器,因此这里应该写成2