ROS C++类成员作订阅回调时添加static仍无法解决静态链接错误
报错原因
你遇到的编译报错本质是ROS的subscribe接口和C++非静态类成员函数的调用规则不匹配:
- 非静态类成员函数默认携带隐式的
this指针参数,和回调要求的参数列表不一致,直接传入函数名无法匹配subscribe的接口要求 - 你第二次修改时没有给非静态成员函数加取地址符
&,不符合C++成员函数指针的语法要求 - 额外隐藏问题:你之前把
ros::Subscriber定义为构造函数的局部变量,构造函数执行结束后变量就会被销毁,订阅会直接失效,根本收不到GPS数据
正确修改方案
不需要给receiver函数加static修饰,只需要做两处调整即可:
- 在类的私有成员中添加
ros::Subscriber类型的成员变量,延长订阅器的生命周期 - 构造函数中调用
subscribe时,正确传入成员函数指针和当前实例的this指针
修改后的完整代码如下:
头文件部分
#pragma once #include <sensor_msgs/NavSatFix.h> #include <ros/ros.h> class Localization{ public: void receiver(const sensor_msgs::NavSatFixConstPtr& data); Localization(ros::NodeHandle); private: // 将订阅器设为类成员,避免被销毁 ros::Subscriber location_sub; double latitiude; double longitude; double altitude; const std::string topic {"/mavros/global_position/global"}; }; void Localization::receiver(const sensor_msgs::NavSatFixConstPtr& fix){ if (fix->status.status == sensor_msgs::NavSatStatus::STATUS_NO_FIX) { ROS_INFO("No fix."); return; } latitiude = fix->latitude; longitude = fix->longitude; altitude = fix->altitude; ROS_INFO("Latitude: %f | Longitude: %f | Altitude: %f", latitiude, longitude, altitude); };
构造函数部分
Localization::Localization(ros::NodeHandle nh){ // 加&取成员函数地址,传入this指针绑定当前实例 location_sub = nh.subscribe<sensor_msgs::NavSatFix>(topic, 1, &Localization::receiver, this); };
额外提示
你代码里的纬度变量名拼写为latitiude,正确拼写是latitude,后续业务逻辑调用变量时注意不要写错。
内容的提问来源于stack exchange,提问作者NotALolicon
相关产品推荐
相关产品推荐

