使用类方法的 ros NodeHandle.subscribe 出现问题

Issue with ros NodeHandle.subscribe with a class method

提问人:Mike 提问时间:1/30/2023 最后编辑:Mike 更新时间:1/30/2023 访问量:232

问:

我在 Ubuntu18.04 和 C++14 上使用 ros 旋律,并尝试使用派生类中的回调函数订阅主题。我知道这是可能的基类,如 ros wiki 的 2.3.2 类方法部分所示,但我正在尝试为派生类修改它。我希望能够为不同的算法提供多个Scan_matching派生类,并且主类能够选择一个。这是我所拥有的:

class Scan_Matching
{
public:
    void get_transform(const sensor_msgs::PointCloud2ConstPtr& cloud_msg);
};

class ICP : public Scan_Matching
{
public:
    void get_transform(const sensor_msgs::PointCloud2ConstPtr& cloud_msg);
};


int main(){
    ...
    ScanMatching* scan_matching;
    scan_matching = new ICP(...);
    ros::Subscriber sub = nh.subscribe(topic, 100, &Scan_Matching::get_transform, scan_matching);
    ...
}

我相信这是可能的,但我不确定我是否正确地实现了这一点,因为我 从 Catkin 获取链接错误:

[ 14%] Linking CXX executable /home/mike/documents/autonomous_sim/devel/lib/mike_av_stack/localization
CMakeFiles/mike_av_stack_node.dir/scripts/localization/localization.cpp.o: In function `main':
localization.cpp:(.text.startup+0x718): undefined reference to `Scan_Matching::get_transform(boost::shared_ptr<sensor_msgs::PointCloud2_<std::allocator<void> > const> const&)'
collect2: error: ld returned 1 exit status
mike_av_stack/CMakeFiles/mike_av_stack_node.dir/build.make:392: recipe for target '/home/mike/documents/autonomous_sim/devel/lib/mike_av_stack/localization' failed
make[2]: *** [/home/mike/documents/autonomous_sim/devel/lib/mike_av_stack/localization] Error 1
CMakeFiles/Makefile2:2493: recipe for target 'mike_av_stack/CMakeFiles/mike_av_stack_node.dir/all' failed
make[1]: *** [mike_av_stack/CMakeFiles/mike_av_stack_node.dir/all] Error 2
Makefile:145: recipe for target 'all' failed
make: *** [all] Error 2
Invoking "make -j12 -l12" failed

对我来说,这似乎是订阅函数正在向我的get_transform函数发送一个不是类型的参数

常量 sensor_msgs::P ointCloud2ConstPtr& cloud_msg

(或换句话说)

const boost::shared_ptr<sensor_msgs::P ointCloud2 const>& cloud_msg

而是类型

boost::shared_ptr<sensor_msgs::P ointCloud2_std::allocator<void > const> const&

我通过尝试以下编译良好的代码来测试这一点。

void callback(const boost::shared_ptr<sensor_msgs::PointCloud2 const>& cloud_msg){
}

int main(){
    ...
    ros::Subscriber sub = nh.subscribe(topic, 100, callback);
    ...
}

我认为这可能是因为派生类,并且我调用了不正确的重载订阅者函数。有人可以帮我了解我做错了什么,以及如何解决吗?谢谢

C++ ROS 派生 基类

评论

4赞 Igor Tandetnik 1/30/2023
您已在类中声明了一个方法。错误消息指出您尚未实际实现此方法。你有吗?get_transformScan_Matching
1赞 Mike 1/31/2023
这就是解决方案!感谢您抽出宝贵时间。毕竟,我不敢相信这是一个看似简单的解决方案。我是C++继承的新手,我认为它类似于java接口,我不需要实际实现这些方法。我现在也开始深入研究虚拟函数和类,所以我肯定从中学到了东西。我可以向你保证,下次我看到这个错误时,我会知道这意味着什么!

答: 暂无答案