2017-07-27 24 views
1

我希望能夠通過lambda來定義回調,但是我無法獲得任何匹配的函數簽名。ROS:使用lambda作爲nodehandle中的回調。訂閱

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做什麼?也就是說,我可以傳入訂閱方法lambda與捕獲?

回答

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