[Ubuntu + PCL]fatal error: pcl/visualization/pcl_visualizer.h: 没有那个文件或目录

        同样《视觉slam十四讲》第五讲安装pcl时出现的问题,感谢@Eminbogen的文章中遇到过相似问题,并提出了思考方向,为解决这个问题提供了帮助。之前在这里反复卸载安装opencv和pcl很多次,尽管在安装过程中并没有任何报错。我出现问题的情况就是在usr/pcl1.9/pcl中找不到visualization文件夹及其头文件。

        文章:Ubuntu系统安装PCL 1.9及以上版本  中提到,是因为cmake版本过低无法支持更高版本的pcl,因此根据其所说的下载并安装了cmake-3.13.4。 安装方法参考:Ubuntu16.04下安装最新版本的CMake 。经过检验已经成功安装了cmake。按照如上方法尝试并重新安装pcl,发现还是没有visualization文件夹。

        根据文章:Ubuntu16.04 安装配置 PCL1.9  得知,可能是vtk出了问题,因为vtk会影响可视化。于是下载了vtk7.1.1安装,但是查看vtk版本的时候还是总是提示没有安装vtk。

        因此进行了两个操作,第一个:

 sudo apt install tcl-vtk

这个方法有时候会出现联网问题,但是安装完成后查看vtk的版本的时候明显有反应了。

第二个操作,根据 Ubuntu16.04 安装配置 PCL1.9  建议,安装了vtk6.2版本。

sudo apt-get install libvtk6.2 libvtk6.2-qt libvtk6-dev

然后按照文中所述重新编译安装pcl1.9

     cd pcl
     mkdir release
     cd release
     cmake -DCMAKE_BUILD_TYPE=None -DCMAKE_INSTALL_PREFIX=/usr \
           -DBUILD_GPU=ON -DBUILD_apps=ON -DBUILD_examples=ON \
           -DCMAKE_INSTALL_PREFIX=/usr ..
     make -j8 #根据性能/-j4或不加,否则可能相当卡

     sudo make install

结果终于在头文件中找到了visualization文件夹!

但是在make过程中也出现了visualization相关的warning提示,一度十分担心是否会成功:

最终测试效果:

运行joinMap时,遇到以下问题

还是vtk出了问题,完蛋。重新安装vtk。

安装了vtk-7.1之后,发现cmake链接的还是vtk-6.2。于是查找所有安装软件,发现其中安装了三个版本到vtk,因此删掉了5.10和6.2版本,重新编译安装vtk、pcl。然后运行joinMap结果如下:

恭喜解锁新的报错:找不到PCL_COMPONENT

按照PCL官方给出的方法改写了原来的cmakelists(灰色为原来部分),参考:用CMake链接PCL

重新cmake不报错:

这下应该可以运行了吧:

真的很难保持微笑了,经过调试,发现问题出现在代码段:

    for ( int i=0; i<5; i++ )
    {
        boost::format fmt( "./%s/%d.%s" ); //图像文件格式
        colorImgs.push_back( cv::imread( (fmt%"color"%(i+1)%"png").str() ));
        depthImgs.push_back( cv::imread( (fmt%"depth"%(i+1)%"pgm").str(), -1 )); // 使用-1读取原始图像
        
        double data[7] = {0};
        for ( auto& d:data )
            fin>>d;
        Eigen::Quaterniond q( data[6], data[3], data[4], data[5] );
        Eigen::Isometry3d T(q);
        T.pretranslate( Eigen::Vector3d( data[0], data[1], data[2] ));
        poses.push_back( T );
    }

 

已标记关键词 清除标记
代码是:#include<iostream> #include<pcl/io/pcd_io.h> #include<pcl/point_types.h> using namespace std; int main() { pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>); //if(pcl::io::loadPCDFile<pcl::PointXYZRGBA>("frame_00000.pcd", *cloud) == -1); sensor_msgs::PointCloud2 cloud_blob; pcl::io::loadPCDFile("rabbit",cloud_blob); pcl::fromROSMsg(cloud_blob,*cloud); for(size_t i=0;i<cloud->points.size();++i) cout<<" "<<cloud->points[i].x<<" "<<cloud->points[i].y<<" "<<cloud->points[i].z<<endl; return 0; } 错误是: >d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\point_traits.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\point_cloud.h(1021): warning C4521: “pcl::PointCloud<Eigen::MatrixXf>”: 指定了多个复制构造函数 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\point_traits.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\point_traits.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1008): warning C4996: 'pcl::SHOT': USE SHOT352 FOR SHAPE AND SHOT1344 FOR SHAPE+COLOR INSTEAD 1> d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1003) : 参见“pcl::SHOT”的声明 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1009): warning C4996: 'pcl::SHOT': USE SHOT352 FOR SHAPE AND SHOT1344 FOR SHAPE+COLOR INSTEAD 1> d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1003) : 参见“pcl::SHOT”的声明 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1012): warning C4996: 'pcl::SHOT::rf': USE SHOT352 FOR SHAPE AND SHOT1344 FOR SHAPE+COLOR INSTEAD 1> d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1005) : 参见“pcl::SHOT::rf”的声明 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1013): warning C4996: 'pcl::SHOT::descriptor': USE SHOT352 FOR SHAPE AND SHOT1344 FOR SHAPE+COLOR INSTEAD 1> d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1004) : 参见“pcl::SHOT::descriptor”的声明 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1014): warning C4996: 'pcl::SHOT::descriptor': USE SHOT352 FOR SHAPE AND SHOT1344 FOR SHAPE+COLOR INSTEAD 1> d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1004) : 参见“pcl::SHOT::descriptor”的声明 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1014): warning C4996: 'pcl::SHOT::descriptor': USE SHOT352 FOR SHAPE AND SHOT1344 FOR SHAPE+COLOR INSTEAD 1> d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1004) : 参见“pcl::SHOT::descriptor”的声明 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\point_cloud.h(603): warning C4521: “pcl::PointCloud<PointT>”: 指定了多个复制构造函数 1> with 1> [ 1> PointT=pcl::PointXYZRGB 1> ] 1> g:\c++\icp\icp\main.cpp(7): 参见对正在编译的类 模板 实例化“pcl::PointCloud<PointT>”的引用 1> with 1> [ 1> PointT=pcl::PointXYZRGB 1> ] 1>main.obj : error LNK2019: 无法解析的外部符号 "public: int __thiscall pcl::PCDReader::read(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,struct sensor_msgs::PointCloud2 &,int)" (?read@PCDReader@pcl@@QAEHABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AAUPointCloud2@sensor_msgs@@H@Z),该符号在函数 "int __cdecl pcl::io::loadPCDFile(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,struct sensor_msgs::PointCloud2 &)" (?loadPCDFile@io@pcl@@YAHABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AAUPointCloud2@sensor_msgs@@@Z) 中被引用 1>main.obj : error LNK2001: 无法解析的外部符号 "public: virtual int __thiscall pcl::PCDReader::readHeader(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,struct sensor_msgs::PointCloud2 &,class Eigen::Matrix<float,4,1,0,4,1> &,class Eigen::Quaternion<float,0> &,int &,int &,unsigned int &,int)" (?readHeader@PCDReader@pcl@@UAEHABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AAUPointCloud2@sensor_msgs@@AAV?$Matrix@M$03$00$0A@$03$00@Eigen@@AAV?$Quaternion@M$0A@@8@AAH4AAIH@Z) 1>main.obj : error LNK2001: 无法解析的外部符号 "public: virtual int __thiscall pcl::PCDReader::read(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,struct sensor_msgs::PointCloud2 &,class Eigen::Matrix<float,4,1,0,4,1> &,class Eigen::Quaternion<float,0> &,int &,int)" (?read@PCDReader@pcl@@UAEHABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AAUPointCloud2@sensor_msgs@@AAV?$Matrix@M$03$00$0A@$03$00@Eigen@@AAV?$Quaternion@M$0A@@8@AAHH@Z) 1>main.obj : error LNK2019: 无法解析的外部符号 "void __cdecl pcl::console::print(enum pcl::console::VERBOSITY_LEVEL,char const *,...)" (?print@console@pcl@@YAXW4VERBOSITY_LEVEL@12@PBDZZ),该符号在函数 "public: void __thiscall pcl::detail::FieldMapper<struct pcl::PointXYZRGB>::operator()<struct pcl::fields::x>(void)" (??$?RUx@fields@pcl@@@?$FieldMapper@UPointXYZRGB@pcl@@@detail@pcl@@QAEXXZ) 中被引用 1>G:\C++\icp\Debug\icp.exe : fatal error LNK1120: 4 个无法解析的外部命令 1> 1>生成失败。 1> 1>已用时间 00:00:12.70 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页