ROS2 Foxy下RPLidar /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

