ROS2中create_subscription如何用lambda替代std::bind绑定回调
替换std::bind为lambda的实现代码
你可以直接把构造函数中create_subscription的第三个参数替换为lambda表达式,修改后的完整代码如下:
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); })}
实现说明
- lambda的捕获列表使用
[this]捕获当前类实例指针,和原来std::bind绑定this的作用完全一致,不会影响回调内部KD树、欧式聚类的原有逻辑 - lambda入参
const PointCloudMsg::SharedPtr msg对应原来std::placeholders::_1传递的消息参数,类型完全匹配 - 如果你的回调函数参数签名是const引用形式(比如
void ClusteringNode::callback(const PointCloudMsg& msg)),只需要对应修改lambda的入参类型即可,不需要调整其他逻辑 - 相比
std::bind,lambda写法可读性更强,后续如果需要在消息传入回调前增加过滤、统计等预处理逻辑,直接写在lambda内部即可,不需要修改回调函数签名
内容的提问来源于stack exchange,提问作者pandarulez
相关产品推荐
相关产品推荐

