2017-07-27 2 views
1

Ich möchte in der Lage sein, einen Rückruf über ein Lambda zu definieren, aber ich kann keine der Funktionssignaturen übereinstimmen.ROS: Verwenden Sie Lambda als Rückruf in nodehandle.subscribe

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) 

Ich kann das nicht funktionieren, da subscribe einen Funktionszeiger benötigt. Was versuche ich mit ROS zu erreichen? Das heißt, kann ich in die Subscribe-Methode ein Lambda mit einem Capture übergehen?

Antwort

1

verwaltet, um Lambda arbeiten zu bekommen. Konnte jedoch keine Möglichkeit zum Capturen finden. Stattdessen habe ich das Objekt als Parameter übergeben.

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

Die Teillösung in der Frage schien ein bisschen sauberer ohne eine statische Besetzung.

Dieser Code funktioniert (auch mit Timer, Dienstleistungen, etc.):

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

konnte ich diese Arbeit mit Capture erhalten.

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 Version: Indigo
C++ 14

Verwandte Themen