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
相关产品推荐
相关产品推荐

