点云技术相关产学研社区

 找回密码
 立即注册加入PCL中国点云技术相关产学研社区

扫一扫,访问微社区

查看: 4784|回复: 7

ubuntu12.04编译PCL1.6源码

[复制链接]
发表于 2013-3-8 19:06:42 | 显示全部楼层 |阅读模式
本帖最后由 古♂月 于 2013-3-9 14:59 编辑

         已经在Ubuntu12.04上成功编译了openni的库,为了研究点云数据,还需要安装PCL库。按照官网上的说法(http://pointclouds.org/downloads/linux.html)使用apt-get的方式安装,但是总是提示安装所依赖的其他库未安装,纠结了许久未安装成功,所以决定使用源码进行编译安装。

        

         一、下载源代码

        可以直接从官网上下载:http://pointclouds.org/downloads/

        也可以使用svn进行下载:

                        svn co http://svn.pointclouds.org/pcl/trunk pcl-trunk

        注:现在官网上的最稳定版本是1.6,用svn下载的是处于开发阶段的1.7版本

      

         二、安装依赖库

         根据官网的说明,PCL必须要依赖以下库:

                                    

          所以必须要确定PC上已经安装了这些库,如果没有安装,使用以下命令进行安装

                            sudo apt-get install lib*   //(*代表所需要安装的库)       
   

          三、编译安装

          编译安装的方法在官网上都有介绍(http://pointclouds.org/downloads/source.html)。

          解压代码,创建编译文件夹:

                           cd PCL-1.6.0 && mkdir build && cd build            
             使用cmake生成makefile
                           cmake -DCMAKE_BUILD_TYPE=Release ..            
             在这一步,cmake会自动检测PCL的依赖包是否已经安装,而且可以检测出这些依赖包的版本。如果检测没有问题,会自动生成makefile。
                            make         
              一开始,我在这一步总是编译失败(见http://www.pclcn.org/bbs/forum.php?mod=viewthread&tid=67&extra=page%3D1),后来发现是boost库的问题,我是用的是1.53的,可能是太新了。使用apt-get的方法安装boost1.46.1也不行,cmake检测出来的boost版本还是1.53的。最后在网上(http://packages.ubuntu.com/precise/libs/ )直接下载的deb包安装就没有问题了。不过boost的包很多,不许要全部安装,根据make的错误提示安装就行了。

         编译通过以后就可以安装了。

                            sudo make install      
     

          四、测试

          安装完毕后,默认在/usr/local/share/doc/pcl_1.6/sources路径下有例程。进入openni_grabber文件夹,里面有代码和cmake文件。进行编译:

                            sudo cmake .
                                   sudo make
                                   ./openni_grabber          
            编译没有问题,PCL安装应该没有问题,但是运行结果如下:

                              

         这个是不是有问题呀,我试了openni_narf_keypoint_extraction和openni_range_image_visualization两个例程,也没有kinect的数据,是不是什么地方有问题,还请高手赐教~~多谢


           五、测试修改
        终于发现了前边kinect数据显示错误的问题,原来是那些例程包里cmake文件中链接的pcl版本不对,pcl1.6的例程链接的竟然是1.2和1.3的,真是bug~~~所以在编译之前,修改cmake文件中的链接版本:
                            find_package(PCL 1.6 REQUIRED)

        然后再进行编译就没有问题了。几个例程的显示效果如下:

         1、openni_viewer:

         2、openni_narf_keypoint_extraction:

        3、openni_range_image_visualization:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册加入PCL中国点云技术相关产学研社区

x
回复

使用道具 举报

发表于 2013-3-8 21:11:54 | 显示全部楼层
我这边没搭建ubuntu下面的环境,不过你说的openni_grabber例程,我打开看了下源码,如下面,
好像需要交互才能保存pcd文件,并不能直接显示。
不知道咱俩说的是否同一个例子,你的输出信息不过有点少,应该还有基线距离之类的信息。
至于你说的后面两个例子,我这边编译的版本没有,ros下的好像的确有你的那两个例子,我是在win7下从上年年末的源码编译的,具体忘了,好久没玩kinect了。我建议你使用kinect_viewer_cuda_release.exe 对应的测试,应该没问题的。无需要参数和交互,如果正常,即可实时获取显示rgbd数据,我刚测试的测试结果如图:
祝好运!!!
void
    cloud_cb_ (const pcl:ointCloud<pcl:ointXYZRGBA>::ConstPtr &cloud)
    {
      static unsigned count = 0;
      static double last = pcl::getTime ();
      if (++count == 30)
      {
        double now = pcl::getTime ();
        std::cout << "distance of center pixel :" << cloud->points [(cloud->width >> 1) * (cloud->height + 1)].z << " mm. Average framerate: " << double(count)/double(now - last) << " Hz" <<  std::endl;
        count = 0;
        last = now;
      }

      if (save)
      {
        std::stringstream ss;
        ss << std::setprecision (12) << pcl::getTime () * 100 << ".pcd";
        pcl:CDWriter w;
        w.writeBinaryCompressed (ss.str (), *cloud);
        std::cout << "wrote point clouds to file " << ss.str () << std::endl;
      }
    }

    void
    imageDepthImageCallback (const boost::shared_ptr<openni_wrapper::Image>&, const boost::shared_ptr<openni_wrapper:epthImage>& d_img, float constant)
    {
      static unsigned count = 0;
      static double last = pcl::getTime ();
      if (++count == 30)
      {
        double now = pcl::getTime ();
        std::cout << "got synchronized image x depth-image with constant factor: " << constant << ". Average framerate: " << double(count)/double(now - last) << " Hz" <<  std::endl;
        std::cout << "Depth baseline: " << d_img->getBaseline () << " and focal length: " << d_img->getFocalLength () << std::endl;
        count = 0;
        last = now;
      }
    }

    void
    run ()
    {
      save = false;

      // create a new grabber for OpenNI devices
      pcl::OpenNIGrabber interface;

      // Set the depth output format
      interface.getDevice ()->setDepthOutputFormat (mode);

      // make callback function from member function
      boost::function<void (const pcl:ointCloud<pcl:ointXYZRGBA>::ConstPtr&)> f =
        boost::bind (&SimpleOpenNIProcessor::cloud_cb_, this, _1);

      // connect callback function for desired signal. In this case its a point cloud with color values
      boost::signals2::connection c = interface.registerCallback (f);

      // make callback function from member function
      boost::function<void (const boost::shared_ptr<openni_wrapper::Image>&, const boost::shared_ptr<openni_wrapper:epthImage>&, float constant)> f2 =
        boost::bind (&SimpleOpenNIProcessor::imageDepthImageCallback, this, _1, _2, _3);

      // connect callback function for desired signal. In this case its a point cloud with color values
      boost::signals2::connection c2 = interface.registerCallback (f2);

      // start receiving point clouds
      interface.start ();

      std::cout << "<Esc>, \'q\', \'Q\': quit the program" << std::endl;
      std::cout << "\' \': pause" << std::endl;
      std::cout << "\'s\': save" << std::endl;
      char key;
      do
      {
        key = static_cast<char> (getchar ());
        switch (key)
        {
          case ' ':
            if (interface.isRunning ())
              interface.stop ();
            else
              interface.start ();
          case 's':
            save = !save;
        }
      } while (key != 27 && key != 'q' && key != 'Q');

      // stop the grabber
      interface.stop ();
    }
};
回复 支持 反对

使用道具 举报

发表于 2013-3-8 21:16:34 | 显示全部楼层
kinect_viewer_cuda_release.exe 对应的测试截图,谢谢你的分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册加入PCL中国点云技术相关产学研社区

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-3-8 21:30:40 | 显示全部楼层
guohaolys 发表于 2013-3-8 21:16
kinect_viewer_cuda_release.exe 对应的测试截图,谢谢你的分享!

kinect_viewer_cuda_release.exe 请问这个是哪里的例程了?我编译的代码例没有呀
回复 支持 反对

使用道具 举报

发表于 2013-3-8 22:01:01 | 显示全部楼层
古♂月 发表于 2013-3-8 21:30
kinect_viewer_cuda_release.exe 请问这个是哪里的例程了?我编译的代码例没有呀

你cmake时配置可能和我区别挺大的,直接有从kinect获取并显示的例子,有个openni_viewer吧,你试一试这个,你的里面应该有吧。
祝好运!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-3-9 14:48:27 | 显示全部楼层
guohaolys 发表于 2013-3-8 22:01
你cmake时配置可能和我区别挺大的,直接有从kinect获取并显示的例子,有个openni_viewer吧,你试一试这个 ...

多谢,已经找到了,运行正常,成功显示了kinect的数据。而且我找到了之前那些例子显示不成功的问题所在,原来是那些例程包cmake文件中链接的pcl版本不对,pcl1.6的例程链接的竟然是1.2和1.3的,真是bug~~~
回复 支持 反对

使用道具 举报

发表于 2013-3-9 15:36:02 | 显示全部楼层
兄弟很帅气啊,谢谢分享!
回复 支持 反对

使用道具 举报

发表于 2013-3-9 18:29:41 | 显示全部楼层
古♂月 发表于 2013-3-9 14:48
多谢,已经找到了,运行正常,成功显示了kinect的数据。而且我找到了之前那些例子显示不成功的问题所在, ...

一台机子上装多个版本时的确比较容易乱,谢谢分享!
回复 支持 反对

使用道具 举报

本版积分规则

QQ|小黑屋|点云技术相关产学研社区 ( 陕ICP备13001629号 )

GMT+8, 2024-5-8 08:02 , Processed in 3.699475 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表