使用ros2 launch启动时ROS2订阅节点无法接收指定主题求助
问题解决:ROS2 Launch启动订阅节点无法接收消息的原因及修复
核心问题
你的订阅节点采用了手动线程启动的非标准写法,且未处理Launch传递的节点参数,导致Launch启动时节点上下文与ros2 run环境不一致,订阅无法正常注册到主题总线。
修复步骤
1. 修正订阅节点代码,改用ROS2标准写法
移除手动线程逻辑,直接在main函数中完成rclpy初始化、节点创建与spin,并接收args参数以支持Launch的配置传递:
import rclpy from std_msgs.msg import String def callback(msg): print('Received: %s' % msg.data) def main(args=None): rclpy.init(args=args) node = rclpy.create_node('subscriber_node') # 保持绝对路径主题,不受命名空间配置影响 subscriber = node.create_subscription(String, '/my_namespace/my_topic', callback, 10) try: rclpy.spin(node) except KeyboardInterrupt: pass node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main()
2. 保留现有Launch文件配置
你的Launch文件已正确设置节点的包、可执行文件及名称参数,无需修改:
from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( package='my_ros2_pkg_w_node', namespace='', executable='my_node_sub', name='my_launch_test_sub' ), ])
原因说明
- Launch启动节点时,会通过命令行参数传递配置(如你指定的
name='my_launch_test_sub'),标准写法中rclpy.init(args=args)会接收这些参数,确保节点按Launch的配置运行。 - 原代码的手动线程启动方式会绕过Launch的参数传递逻辑,且独立线程内的rclpy初始化可能导致节点上下文异常,使得订阅无法正确关联到系统主题总线。
内容的提问来源于stack exchange,提问作者user45573
相关产品推荐
相关产品推荐

