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

ROS2 Foxy下RPLidar /scan话题订阅节点回调未触发求助

ROS2 Foxy订阅/scan话题回调未触发的排查思路
  • 核对话题与节点的命名空间
    执行ros2 node list查看订阅节点的完整名称,ros2 topic list确认/scan的绝对路径。如果节点运行在自定义命名空间下,代码中写的相对路径"scan"会被解析为/你的命名空间/scan,和实际的/scan不匹配,改成订阅绝对路径"/scan"即可。

  • 确认消息类型完全匹配
    用ros2 topic info /scan查看话题的消息类型(比如sensor_msgs/msg/LaserScan),检查代码中Sensor_msgs::msg::LaserScan的导入是否正确,注意大小写和命名空间拼写,ROS2要求订阅的消息类型必须和发布方完全一致。

  • 修复代码语法与访问权限问题
    你的回调函数代码存在语法错误:std::cout << "Received Message << std::endl;缺少闭合双引号,编译时会直接报错,导致节点无法正常运行。另外要确保callback函数是类的public成员,如果是private,std::bind无法访问会导致订阅失败。

  • 匹配QoS配置
    激光雷达这类传感器数据通常使用sensor_data类型的QoS配置,默认的订阅QoS可能和RPLidar发布方不匹配。用ros2 topic echo /scan --verbose查看发布方的QoS参数,然后在订阅时显式指定:

    rmw_qos_profile_t qos = rmw_qos_profile_sensor_data;
    _subscriber = create_subscription<Sensor_msgs::msg::LaserScan>(
        "/scan", qos, std::bind(&Minimal_sub::callback, this, std::placeholders::_1));
    
  • 检查节点运行状态与日志
    直接在终端运行节点,不要后台启动,查看是否有启动报错。用ros2 node info /minimal_sub查看节点的订阅列表,确认是否真的订阅了/scan话题。另外std::cout可能存在输出缓冲问题,换成ROS日志函数更可靠:

    void Minimal_sub::callback(const Sensor_msgs::msg::LaserScan::SharedPtr msg) {
        RCLCPP_INFO(this->get_logger(), "Received Message");
    }
    

    也可以用ros2 logs查看节点的运行日志,排查是否有订阅失败的提示。

  • 确保节点正确执行spin循环
    检查main函数是否正确初始化ROS2并启动spin循环,没有spin的话节点无法处理回调消息。正确的main函数示例:

    int main(int argc, char * argv[]) {
        rclcpp::init(argc, argv);
        auto node = std::make_shared<Minimal_sub>();
        rclcpp::spin(node);
        rclcpp::shutdown();
        return 0;
    }
    

内容的提问来源于stack exchange,提问作者questionator

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:20:24