2017-10-10 34 views
2

J'essaie d'utiliser tf2_ros :: Buffer dans un code simple. Quand je le mets dans la fonction principale, tout fonctionne bien. Mais lorsqu'il est placé dans une classe, une erreur de construction se produit. Le code est comme ceci:Erreur de construction lors de la déclaration tf2_ros :: Buffer dans la classe

#include <ros/ros.h> 
#include <tf2_ros/buffer.h> 
#include <tf2_ros/transform_listener.h> 
#include <geometry_msgs/TransformStamped.h> 
#include <geometry_msgs/Twist.h> 

class test_class 

{ 
private: 
    double start; 
    double duration; 
    ros::Time start_time; 
    ros::Time end_time; 
    std::string robot_name; 

    tf2_ros::Buffer tf_buffer; // problem line 
    tf2_ros::TransformListener* tfListener; 
    geometry_msgs::TransformStamped transformStamped; 

public: 
    std::string space_name; 
    std::string node_name; 

    test_class() 
    { 
     space_name = ros::this_node::getNamespace(); 
     node_name = ros::this_node::getName(); 
    } 

    ~test_class() 
    {} 

    bool initialize(const ros::NodeHandle& n) 
    { 
     ROS_INFO("Class auto_mav_flight initialized done!"); 
     return true; 
    } 
    void timer_callback(const ros::TimerEvent& event) 
    { 
     ROS_INFO("Timer Callback triggered."); 
     return; 
    } 
}; 

int main(int argc, char** argv) 
{ 
    ros::init(argc, argv, "auto_mav_node"); 
    ros::NodeHandle node; 
    ROS_WARN("The node is initilized and started."); 
    test_class amf = test_class(); 
    amf.initialize(node); 
    ros::Timer timer_1 = node.createTimer(ros::Duration(0.5), &test_class::timer_callback, &amf); 
    ros::spin(); 
    return EXIT_SUCCESS; 
} 

et les informations d'erreur de construction est:

/home/arkin/ros_code/sandbox/auto_mav_sandbox/src/auto_mav_flight/src/node_main.cpp: In function ‘int main(int, char**)’: 
/home/arkin/ros_code/sandbox/auto_mav_sandbox/src/auto_mav_flight/src/node_main.cpp:73:44: error: no matching function for call to ‘test_class::test_class(test_class)’ 
    test_class amf = test_class(); 
              ^
/home/arkin/ros_code/sandbox/auto_mav_sandbox/src/auto_mav_flight/src/node_main.cpp:73:44: note: candidates are: 
/home/arkin/ros_code/sandbox/auto_mav_sandbox/src/auto_mav_flight/src/node_main.cpp:26:2: note: test_class::test_class() 
    test_class() 
^
/home/arkin/ros_code/sandbox/auto_mav_sandbox/src/auto_mav_flight/src/node_main.cpp:26:2: note: candidate expects 0 arguments, 1 provided 
/home/arkin/ros_code/sandbox/auto_mav_sandbox/src/auto_mav_flight/src/node_main.cpp:9:7: note: test_class::test_class(test_class&) 
class test_class 
    ^
/home/arkin/ros_code/sandbox/auto_mav_sandbox/src/auto_mav_flight/src/node_main.cpp:9:7: note: no known conversion for argument 1 from ‘test_class’ to ‘test_class&’ 
make[2]: *** [auto_mav_flight/CMakeFiles/auto_mav_flight_node.dir/src/node_main.cpp.o] Error 1 
make[1]: *** [auto_mav_flight/CMakeFiles/auto_mav_flight_node.dir/all] Error 2 
make: *** [all] Error 2 

Je trouve que si je commente la ligne de code qui déclare le tf2_ros :: tampon:

tf2_ros::Buffer tf_buffer; 

l'erreur disparaît.

Pourquoi le tampon tf2_ros :: peut-il causer des problèmes de construction de classe même si je le déclare comme membre de la classe?

Toute aide sera appréciée.

Merci d'avance.

Répondre

1

De ceci:

/home/arkin/ros_code/sandbox/auto_mav_sandbox/src/auto_mav_flight/src/node_main.cpp:26:2: Note: 0 candidat attend des arguments, 1 a fourni /Accueil/Arkin/ros_code/bac à sable/auto_mav_sandbox/src/auto_mav_flight/src/node_main.cpp: 9: 7: Note: test_class :: test_class (test_class &)

Il semble que vous appelez le constructeur de copie test_class (peut être caché dans la couche de ROS, en essayant de passer test_class comme arguments de fonction ou lors de l'utilisation de conteneurs).

De tf2_ros::Buffer en-tête, il hérite de BufferCore, qui contient une boost::mutex (entre autres - il pourrait y avoir plus de 1 attribut non copiable) qui n'est pas la copie constructible. Cela fait tf2_ros::Buffer pas copie-constructible. Puisque test_class ne définissent pas un constructeur de copie et contient un attribut non-copiable, le compilateur ne peut pas générer de constructeur de copie et échoue à compiler lorsque vous essayez d'appeler un constructeur de copie.

Pour référence: http://en.cppreference.com/w/cpp/language/copy_constructor

+0

Merci pour votre réponse. Oui, la classe a besoin d'un constructeur de copie pour faire l'initialisation de la classe: 'test_class amf = test_class();' Si je remplace cette ligne de code par 'test_class amf;' cela fonctionne. Bien sûr, il sera nécessaire de supprimer l'opération du constructeur de classe défini par l'utilisateur. Une alternative est de définir un constructeur de copie (même un constructeur vide) comme: 'test_class (const test_class & right_side)'. Cela résout également le problème. Il semble que réaliser 'tf2_ros :: Buffer' ne soit pas copié-constructif est la clé pour résoudre ce problème. Merci encore. – Arkin

+0

S'il vous plaît envisager d'accepter la réponse :) – Clonk