2013-12-09 3 views
5

Я разрабатываю приложение ROS Qt GUI, и у меня возникла проблема с ROS Hydro (у меня была такая же проблема при работе с ROS Fuerte). Мой проект не распознает мою библиотеку, как image_transport.h. Я добавил его в начало файла qnode.hpp, но это не решило проблему.undefined ссылка на image_transport

Моя главная проблема:

/home/attila/catkin_ws/src/arayuz/src/qnode.cpp:-1: error: undefined reference to `image_transport::ImageTransport::ImageTransport(ros::NodeHandle const&)'

Это код, который генерирует ошибку:

#include "ros/ros.h" 
#include "ros/network.h" 
#include "string" 
#include "std_msgs/String.h" 
#include "sstream" 
#include "../include/arayuz/qnode.hpp" 

namespace enc=sensor_msgs::image_encodings; 

static const char WINDOW[ ]="Kinect"; 

namespace arayuz { 

QNode::QNode(int argc, char** argv) : 
    init_argc(argc), 
    init_argv(argv) 
    {} 

QNode::~QNode() { 
    if(ros::isStarted()) { 
     ros::shutdown(); // explicitly needed since we use ros::start(); 
     ros::waitForShutdown(); 
    } 
    cv::destroyWindow(WINDOW); 
    wait(); 
} 

bool QNode::init() { 
    ros::init(init_argc,init_argv,"arayuz"); 

    if (! ros::master::check()) { 
     return false; 
    } 

    ros::start(); // explicitly needed since our nodehandle is going out of scope. 

    ros::NodeHandle n; 
    // Add your ros communications here. 

    image_transport::ImageTransport it(n); 
    imagesub = it.subscribe("/kinectCamera", 1,&QNode::chatterimage,this); 

    start(); 

    return true; 
} 


bool QNode::init(const std::string &master_url, const std::string &host_url) { 
    std::map<std::string,std::string> remappings; 

    remappings["__master"] = master_url; 
    remappings["__hostname"] = host_url; 

    ros::init(remappings,"arayuz"); 

    if (! ros::master::check()) { 
     return false; 
    } 

    ros::start(); // explicitly needed since our nodehandle is going out of scope. 

    ros::NodeHandle n; 
    // Add your ros communications here. 

    image_transport::ImageTransport it(n); 

    imagesub = it.subscribe("/kinectCamera",1,&QNode::chatterimage,this); 

    start(); 

    return true; 
} 

void QNode::chatterimage(const sensor_msgs::ImageConstPtr& msg) 
{ 
    rgbimage=cv_bridge::toCvCopy(msg,enc::BGR8); 

    Q_EMIT chatterimageupdate(); 
} 

void QNode::run() { 
    while (ros::ok()) { 
     ros::spin(); 
    } 

    std::cout << "Ros shutdown, proceeding to close the gui." << std::endl; 
    Q_EMIT rosShutdown(); // used to signal the gui for a shutdown (useful to roslaunch) 
} 
} 
+0

пожалуйста, добавьте код, который генерирует эту ошибку – Hilikus

ответ

9

Для того, чтобы связать против ROS библиотеки, которые вам необходимо добавить зависимость к файлу package.xml:

<build_depend>image_transport</build_depend> 

<run_depend>image_transport</run_depend> 

и к вашему CMakeLists.txt:

find_package(catkin REQUIRED COMPONENTS 
    ... 
    image_transport 
    ... 
) 
+0

I попытался добавить эти строки в мой пакет.xml, но ничего не изменилось :(Может эта проблема быть связана с automoc –

+1

Я решил это наконец .. Вы правы Я добавляю эти коды в package.xml, и я добавил также find package (. ... imagetransport ...) к моему CMakeList.txt Наконец проблема решена ... –

+0

Я отредактировал недостающую ноту на CMakeLists.txt в вашем ответе. Надеюсь, с тобой все в порядке. – luator

0

Просто добавить заголовок к вашей компиляции не является достаточным: сообщение об ошибке указывает, что вы успешно скомпилировал код, но не смог связать исполняемый файл. Вам также потребуется найти библиотеку, реализующую код image_transport, и связать ее с вашим исполняемым файлом. Я понятия не имею о ros, но here - это ссылка, которая, как представляется, описывает, как создать код, используя эту библиотеку.