具有奇怪类型的成员函数导致回调函数不匹配
Member function with strange type causing callback function mismatch
我有一个 class,其中声明和实现都在 .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 中使用的签名完全相同,如果有兴趣)
该签名意味着它是指向 成员函数 的指针,而不是指向函数的常规指针。为了调用 MonoOdometer::imageCallback
它需要 class MonoOdometer
的一个实例来调用它,但是你的 create_camera_subscription
只是希望它是一个独立的函数。两种解决方案是使 imageCallback
成为 static
方法,或者传递一个函子(如 lambda),它将在其自己的调用运算符中调用 imageCallback
。
静态:
static void imageCallback(...) {
// ...
}
拉姆达:
image_transport::create_subscription(this, "image",
[&](auto& msg) { this->imageCallback(msg); }, transport, 1);
我有一个 class,其中声明和实现都在 .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 中使用的签名完全相同,如果有兴趣)
该签名意味着它是指向 成员函数 的指针,而不是指向函数的常规指针。为了调用 MonoOdometer::imageCallback
它需要 class MonoOdometer
的一个实例来调用它,但是你的 create_camera_subscription
只是希望它是一个独立的函数。两种解决方案是使 imageCallback
成为 static
方法,或者传递一个函子(如 lambda),它将在其自己的调用运算符中调用 imageCallback
。
静态:
static void imageCallback(...) {
// ...
}
拉姆达:
image_transport::create_subscription(this, "image",
[&](auto& msg) { this->imageCallback(msg); }, transport, 1);