如何在 ROS2 的 create_subscription 方法中使用 lambda 而不是 std::bind

How to use lambda intead of std::bind in create_subscription method in ROS2

我正在为点云创建一个小型欧氏聚类节点,利用 PCL 的 KD 树实现。

目前,我的订户定义如下所示,

ClusteringNode::ClusteringNode(const rclcpp::NodeOptions &options)
      : Node("clustering_node", options),
        cloud_subscriber_{create_subscription<PointCloudMsg>(
            "input_cloud", 10,
            std::bind(&ClusteringNode::callback, this,
                      std::placeholders::_1))},

KD-tree 方法的定义在回调方法中并且运行良好,

现在为了进一步改进,我想在这里使用 lambdas 代替 std::bind 函数,

这里的方法应该是什么?

你可以替换

std::bind(&ClusteringNode::callback, this, std::placeholders::_1)

[this](auto&& var){ return callback(std::forward<decltype(var)>(var)); }
// or if no return value
[this](auto&& var){ callback(std::forward<decltype(var)>(var)); }

如果不需要支持完美转发,可以缩短为

[this](const auto& var){ return callback(var); }
// or if no return value
[this](const auto& var){ callback(var); }

这对我有用,

ClusteringNode::ClusteringNode(const rclcpp::NodeOptions &options)
  : Node("clustering_node", options),
    cloud_subscriber_{create_subscription<PointCloudMsg>(
        "input_cloud", 10,
        [this] (const PointCloudMsg::SharedPtr msg){
          callback(msg);
        })},

std::bind()语句:

std::bind(&ClusteringNode::callback, this, std::placeholders::_1)

会翻译成这样的 lambda:

[this](const auto msg){ callback(msg); }

或者,如果 callback() 具有非 void return 值:

[this](const auto msg){ return callback(msg); }