0

我有一个类,其中声明和实现在 .cpp 文件中。它有一个名为 的成员函数imageCallback(),在构造函数中使用,如下所示

namespace viso2_ros {

class MonoOdometer : public rclcpp::Node, public OdometerBase
{
MonoOdometer(const std::string& transport, const rclcpp::NodeOptions& options)
  {
    camera_sub_ = image_transport::create_subscription(this, "image", &MonoOdometer::imageCallback, transport, 1);
  }

protected:
  void imageCallback(
      const sensor_msgs::msg::Image::ConstSharedPtr& image_msg) {
      // implementation of the image callback function
    }
}

} // end namespace

对我来说,这看起来不错,但它不起作用。

期待回调的create_camera_subscription这个签名:

const function<void (const shared_ptr<const sensor_msgs::msg::Image_<allocator<void> > > &)>

但它得到了这个签名

void (viso2_ros::MonoOdometer::*)(const sensor_msgs::msg::Image::ConstSharedPtr &)

这个签名是什么意思?namespace::classname::pointer? 为什么不是函数?

(回调签名与他们在文档https://github.com/ros-perception/image_common/wiki/ROS2-Migration中使用的完全相同,如果有兴趣)

4

1 回答 1

2

该签名意味着它是指向成员函数的指针,而不是指向函数的常规指针。为了MonoOdometer::imageCallback被调用,它需要一个类的实例MonoOdometer来调用它,但你create_camera_subscription只是希望它是一个独立的函数。两种解决方案是要么创建imageCallback一个static方法,要么传递一个仿函数(如 lambda),它将调用imageCallback它自己的调用运算符。

静止的:

static void imageCallback(...) {
  // ...
}

拉姆达:

image_transport::create_subscription(this, "image",
  [&](auto& msg) { this->imageCallback(msg); }, transport, 1);
于 2019-08-17T04:45:15.507 回答