You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 01:35:07