提问人:Mike 提问时间:1/30/2023 最后编辑:Mike 更新时间:1/30/2023 访问量:232
使用类方法的 ros NodeHandle.subscribe 出现问题
Issue with ros NodeHandle.subscribe with a class method
问:
我在 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);
...
}
我认为这可能是因为派生类,并且我调用了不正确的重载订阅者函数。有人可以帮我了解我做错了什么,以及如何解决吗?谢谢
答: 暂无答案
评论
get_transform
Scan_Matching