2017-07-27 43 views
1

ラムダを介してコールバックを定義できるようにしたいが、機能シグネチャをすべて取得できない。ROS:nodehandle.subscribeでコールバックとしてlambdaを使用

std::function<void(const sensor_msgs::PointCloud2)> callback = 
[&mycapture](const sensor_msgs::PointCloud2 msg) { 
// do something with msg and capture 
}; 

auto sub = ros_node.subscribe("/sometopic", 1, callback) 

サブスクライブで関数ポインタが必要なので、これを動作させることはできません。私がROSでできることは何ですか?つまり、キャプチャを使用してサブスクライブするメソッドにラムダを渡すことはできますか?

答えて

1

lambdaが機能するように管理しました。しかし、キャプチャする方法を見つけることができませんでした。代わりに私はオブジェクトをパラメタとして渡しました。

auto *callback = static_cast<void (*)(const sensor_msgs::PointCloud2::ConstPtr &, CustomObject&)>([](const sensor_msgs::PointCloud2::ConstPtr &msg, CustomObject &o) { 
                ROS_INFO_STREAM("Received: \n"<<msg->header); 
               }); 

ros_node.subscribe<sensor_msgs::PointCloud2>(topic, 1, boost::bind(callback, _1, custom_object)) 
1

問題の部分的な解決策は、静的なキャストを使用しないで少し清潔に思えました。

このコードは(等もタイマー、サービス、との)正常に動作します:

boost::function<void (const sensor_msgs::PointCloud2&, CustomObject&)> callback = 
    [] (const sensor_msgs::PointCloud2& msg, CustomObject& obj) { 
    // do something with msg and obj 
    } 

ros::Subscriber = ros_nh.subscribe(topic, 1, boost::bind(callback, _1, obj)); 
0

私はキャプチャして、この作業を取得することができました。

T obj; 
boost::function<void (const sensor_msgs::PointCloud2&) callback = 
    [obj] (const sensor_msgs::PointCloud2& msg) { 
    // Do something here 
    } 
auto sub = ros_nh.subscribe(topic, 1, callback); 

ROSバージョン:インディゴ
C++ 14

関連する問題