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

ROS节点同时实现订阅与发布功能时catkin build报错怎么解决

问题原因

代码核心错误为变量作用域问题:ros::Publisher pub是main函数内的局部变量,自定义的laserCallBack回调函数无法访问该变量,编译时会直接报pub未定义的错误。另外原代码中访问指针类型的msg成员时误用了.运算符,正确写法为->。


解决方法

这里提供对新手最友好的全局变量实现方案,修改后的完整可编译代码如下:

#include <geometry_msgs/Twist.h>
#include <ros/ros.h>
#include <sensor_msgs/LaserScan.h>

// 把Publisher定义为全局变量,回调函数可直接访问
ros::Publisher pub;

void laserCallBack(const sensor_msgs::LaserScan::ConstPtr &msg) {
  geometry_msgs::Twist reply;
  if (msg->ranges[360] >= 1.0) {
    reply.linear.x = 0.5;
    reply.angular.z = 0.0;
  } else {
    reply.linear.x = 0.0;
    reply.angular.z = 0.5;
  }
  pub.publish(reply);
}

int main(int argc, char **argv) {
  ros::init(argc, argv, "topics_quiz_node");
  ros::NodeHandle nh;
  // 给全局Publisher初始化
  pub = nh.advertise<geometry_msgs::Twist>("/cmd_vel", 1000);
  ros::Subscriber sub = nh.subscribe("/kobuki/laser/scan", 1000, laserCallBack);

  ros::spin();
  return 0;
}

额外编译检查项

如果修改代码后仍然报错,需要确认工程配置是否正确:

  • package.xml中已添加roscpp、geometry_msgs、sensor_msgs依赖
  • CMakeLists.txt中已将上述依赖加入find_package和catkin_package配置段,且节点编译规则配置正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 22:06:03