Неопределенная ссылка на производный класс - PullRequest
0 голосов
/ 19 июня 2019

редактировать после симуляции Возможно, что-то не так с моим деструктором.

Единственный шаг, который я использую "new" - это
«pcl :: PointCloud :: Ptr cloud_inbox (new pcl :: PointCloud);”Для создания данных pcl.

CoordinateTran.h выглядит следующим образом:

#ifndef COORDINATETRAN_H
#define COORDINATETRAN_H
#include...h file
namespace huskybot_arm
{

  class CoordinateTran
  {

    public:
    explicit CoordinateTran(ros::NodeHandle nh);
    virtual ~CoordinateTran()=default;

    protected:

    ...

  };


  class CoordinateTran3D :public CoordinateTran
  {
    public:
    explicit CoordinateTran3D(ros::NodeHandle nh);  
    ~CoordinateTran3D()=default;
    private:
    ...
  };
}
#endif

main.cpp выглядит так

#include "CoordinateTran.h"
int main(int argc, char **argv) 
{

  ros::init(argc, argv, "coord_tran");
  ros::NodeHandle nh("~"); 
  huskybot_arm::CoordinateTran3D coordTran3D(nh);
  ros::spin(); 
  return 0;
}

координатаTran.cpp выглядит следующим образом

#include "ros/ros.h"
#include "CoordinateTran.h"
namespace huskybot_arm
{ 

    CoordinateTran::CoordinateTran(ros::NodeHandle nh)
    :get_target(0)
    {
     ...
     ...
     ...
    }

        ...functions

}

координатаTran3D.cpp похожа на это

#include "ros/ros.h"
#include "CoordinateTran.h"

namespace huskybot_arm
{ 

     CoordinateTran3D::CoordinateTran3D(ros::NodeHandle nh):CoordinateTran(nh),viewer("cloud in box"){
      pcl_pub = nh.advertise<sensor_msgs::PointCloud2> ("pcl_output", 100);
    }


    void CoordinateTran3D::pointCouldCallback( const sensor_msgs::PointCloud2::ConstPtr &point_cloud_msg) 
    {


    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_inbox (new pcl::PointCloud<pcl::PointXYZ>);
    cloud_inbox->clear();
    sensor_msgs::PointCloud2 cloud_inbox_msgs;

    if (get_target == 1)
    {
        pcl::PointCloud<pcl::PointXYZ> point_pcl;
        pcl::fromROSMsg(*point_cloud_msg, point_pcl);
        //pcl::PointCloud<pcl::PointXYZ> cloud_inbox;

        if (point_pcl.isOrganized ())
        {

            cloud_inbox->width =x_max-x_min+1;
            cloud_inbox->height =y_max - y_min +1;
            std::cout << "cloud_inbox.width "<<cloud_inbox->width << "cloud_inbox.height  " << cloud_inbox->height <<std::endl;
            cloud_inbox->points.resize (cloud_inbox->width * cloud_inbox->height);
            std::cout << "new cloud" <<std::endl;
            for (int i=0; i< cloud_inbox->width&&i+x_min<640; ++i)
            {
               for (int j=0; j< cloud_inbox->height&&j+y_min<480; ++j)
               {
                   cloud_inbox->at(i,j).x =point_pcl.at(x_min+i,y_min+j).x;
                   cloud_inbox->at(i,j).y =point_pcl.at(x_min+i,y_min+j).y;
                   cloud_inbox->at(i,j).z =point_pcl.at(x_min+i,y_min+j).z;

               }
            }


            pcl::PointXYZ pt = point_pcl.at(u,v);
            camera_x = pt.x;
            camera_y = pt.y;
            camera_z = pt.z;
            std::cout << " coordnate get: " << " camera_x " <<camera_x <<" camera_y " <<camera_y <<" camera_z " <<camera_z <<std::endl;


        }
        else
        std::cout << " the pointcloud is not organized " << std::endl;
        //std::cout << "\033[2J\033[1;1H";     // clear terminal
    }
    viewer.showCloud(cloud_inbox);
    pcl::toROSMsg(*cloud_inbox, cloud_inbox_msgs);
    cloud_inbox_msgs.header.frame_id = "camera_color_optical_frame";
    pcl_pub.publish(cloud_inbox_msgs);

    }

}

показывает

/ home / qiuyilin / catkin_ws / src / Huskybot_arm /ordin_tran / координировать_тран / src / координировать_tran_node.cpp: 16: неопределенная ссылка на huskybot_arm::CoordinateTran3D::CoordinateTran3D(ros::NodeHandle)' CMakeFiles/coord_tran_node.dir/src/coord_tran_node.cpp.o: In function huskybot_arm :: CoordinateTran3D :: ~ CoordinateTran3D () ': /home/qiuyilin/catkin_ws/src/Huskybot_arm/coord_tran/coord_tran/include/CoordinateTran.h:91 :91:vtable для huskybot_arm :: CoordinateTran3D '

1 Ответ

3 голосов
/ 19 июня 2019

Ваша ошибка объявления pointCouldCallback связана с тем, что override находится не в том месте;он идет после списка параметров следующим образом:

void pointCouldCallback( const sensor_msgs::PointCloud2::ConstPtr &point_cloud_msg) override;
//                                                                                  ^^^^^^^^

Ваша ошибка CoordinateTran3D заключается в том, что, хотя конструктор ничего не делает, ему все равно нужно тело.

explicit CoordinateTran3D(ros::NodeHandle nh):CoordinateTran(nh) {};  
//                               can just be inlined like this   ^^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...