【问题标题】:How to use lambda intead of std::bind in create_subscription method in ROS2如何在 ROS2 的 create_subscription 方法中使用 lambda inteaad of std::bind
【发布时间】:2021-12-03 03:19:04
【问题描述】:

我正在为点云创建一个小的欧几里得聚类节点,利用 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 和 lambdas 只是导致相同功能的两种不同语法。
  • 我发现一些资源声明不应该使用 bind abseil.io/tips/108
  • 虽然我同意任何关于优化的讨论都需要“性能或它没有发生”,@Frank,我认为可以公平地说 lambdas 更容易受到 inling 的影响。
  • @SumeshThakur - 那篇文章中有很多很好的理由,但没有一个与优化有关。如果您的代码按原样运行,并且没有解决任何问题,请不要修复它。该指南是关于新代码的。

标签: c++ ros point-cloud-library ros2


【解决方案1】:

std::bind() 声明:

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

会转换成这样的 lambda:

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

或者,如果callback() 有一个非void 返回值:

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

【讨论】:

  • 即使 if 它也有一个非 void 返回类型。
【解决方案2】:

你可以替换

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); }

【讨论】:

    【解决方案3】:

    这对我有用,

    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);
            })},
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多