美文网首页
ubuntu18.04安装PCL

ubuntu18.04安装PCL

作者: Vieta_Qiu人工智障 | 来源:发表于2020-03-27 20:52 被阅读0次

    安装 ros-melodic-desktop-full会自动把点云库安装配置好

    注意:先把电脑的软件源改为阿里云源,否则下载东西会慢到你崩溃!!!

    打开ubuntu菜单->“软件与更新”-> "下载自"-> "其他站点" ->"http://mirriors.aliyun.com/ubuntu"

    打开电脑菜单“软件与更新”-> "下载自"-> "其他站点" ->http://mirriors.aliyun.com/ubuntu

    1.来自中国的源:

    sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'
    

    2.增加key

    sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
    

    3.更新

    sudo apt-get update
    

    4.安装,这里介绍Desktop-Full安装: (Recommended) : ROS, rqt, rviz, robot-generic libraries, 2D/3D simulators, navigation and 2D/3D perception

    sudo apt-get install ros-melodic-desktop-full
    

    5.解决依赖

    sudo rosdep init
    rosdep update
    

    6.环境设置

    echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
    source ~/.bashrc
    

    7.解决依赖包,安装rosinstall,便利的工具

    sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essential
    

    8.安装一些依赖,不知道有没有用的

    sudo apt-get update  
    sudo apt-get install git build-essential linux-libc-dev
    sudo apt-get install cmake cmake-gui
    sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev
    sudo apt-get install mpi-default-dev openmpi-bin openmpi-common 
    sudo apt-get install libflann1.8 libflann-dev
    sudo apt-get install libeigen3-dev 
    sudo apt-get install libboost-all-dev
    sudo apt-get install libvtk7.1-qt libvtk7.1 libvtk7-qt-dev
    sudo apt-get install libqhull* libgtest-dev
    sudo apt-get install freeglut3-dev pkg-config
    sudo apt-get install libxmu-dev libxi-dev
    sudo apt-get install mono-complete
    sudo apt-get install openjdk-8-jdk openjdk-8-jre
    

    ROS已经下载好了VTK和QT了,不过我还是贴一下源码的下载地址吧
    qt的:
    http://download.qt.io/archive/qt/
    pcl的:
    https://gitee.com/3038628074/PointCloudLibrary

    然后贴3个官方源码:

    1. http://pointclouds.org/documentation/tutorials/iterative_closest_point.php
      iterative_closest_point.cpp
    #include <iostream>
    #include <pcl/io/pcd_io.h>
    #include <pcl/point_types.h>
    #include <pcl/registration/icp.h>
    
    int
     main (int argc, char** argv)
    {
      pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in (new pcl::PointCloud<pcl::PointXYZ>);
      pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out (new pcl::PointCloud<pcl::PointXYZ>);
    
    cloud_in->width =5; //设置点云宽度
    cloud_in->height=1; //设置点云为无序点云
    cloud_in->is_dense=false;
    cloud_in->points.resize(cloud_in->width*cloud_in->height);
      // Fill in the CloudIn data
      for (auto& point : *cloud_in)
      {
        point.x = 1024 * rand() / (RAND_MAX + 1.0f);
        point.y = 1024 * rand() / (RAND_MAX + 1.0f);
        point.z = 1024 * rand() / (RAND_MAX + 1.0f);
      }
      
      std::cout << "Saved " << cloud_in->points.size () << " data points to input:" << std::endl;
          
      for (auto& point : *cloud_in)
        std::cout << point << std::endl;
          
      *cloud_out = *cloud_in;
      
      std::cout << "size:" << cloud_out->points.size() << std::endl;
      for (auto& point : *cloud_out)
        point.x += 0.7f;
    
      std::cout << "Transformed " << cloud_in->points.size () << " data points:" << std::endl;
          
      for (auto& point : *cloud_out)
        std::cout << point << std::endl;
    
      pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;
      icp.setInputSource(cloud_in);
      icp.setInputTarget(cloud_out);
      
      pcl::PointCloud<pcl::PointXYZ> Final;
      icp.align(Final);
    
      std::cout << "has converged:" << icp.hasConverged() << " score: " <<
      icp.getFitnessScore() << std::endl;
      std::cout << icp.getFinalTransformation() << std::endl;
    
      for (auto& point : Final)
        std::cout << point << std::endl;
    
     return (0);
    }
    

    最重要的当然CMakeLists.txt了,新手啥都不懂,真的挺艰难的

    cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
    
    project(iterative_closest_point)
    
    find_package(PCL 1.2 REQUIRED)
    
    include_directories(${PCL_INCLUDE_DIRS})
    link_directories(${PCL_LIBRARY_DIRS})
    add_definitions(${PCL_DEFINITIONS})
    
    add_executable (iterative_closest_point iterative_closest_point.cpp)
    target_link_libraries (iterative_closest_point ${PCL_LIBRARIES})
    

    在cpp的目录下

    mkdir build 
    cd build
    cmake ..
    make
    ./iterative_closest_point
    
    1. http://pointclouds.org/documentation/tutorials/pcl_visualizer.php
      pcl_visualizer_demo.cpp
    /* \author Geoffrey Biggs */
    
    #include <iostream>
    #include <thread>
    
    #include <pcl/common/common_headers.h>
    #include <pcl/features/normal_3d.h>
    #include <pcl/io/pcd_io.h>
    #include <pcl/visualization/pcl_visualizer.h>
    #include <pcl/console/parse.h>
    
    using namespace std::chrono_literals;
    
    // --------------
    // -----Help-----
    // --------------
    void
    printUsage (const char* progName)
    {
      std::cout << "\n\nUsage: "<<progName<<" [options]\n\n"
                << "Options:\n"
                << "-------------------------------------------\n"
                << "-h           this help\n"
                << "-s           Simple visualisation example\n"
                << "-r           RGB colour visualisation example\n"
                << "-c           Custom colour visualisation example\n"
                << "-n           Normals visualisation example\n"
                << "-a           Shapes visualisation example\n"
                << "-v           Viewports example\n"
                << "-i           Interaction Customization example\n"
                << "\n\n";
    }
    
    
    pcl::visualization::PCLVisualizer::Ptr simpleVis (pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)
    {
      // --------------------------------------------
      // -----Open 3D viewer and add point cloud-----
      // --------------------------------------------
      pcl::visualization::PCLVisualizer::Ptr viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
      viewer->setBackgroundColor (0, 0, 0);
      viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud");
      viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
      viewer->addCoordinateSystem (1.0);
      viewer->initCameraParameters ();
      return (viewer);
    }
    
    
    pcl::visualization::PCLVisualizer::Ptr rgbVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)
    {
      // --------------------------------------------
      // -----Open 3D viewer and add point cloud-----
      // --------------------------------------------
      pcl::visualization::PCLVisualizer::Ptr viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
      viewer->setBackgroundColor (0, 0, 0);
      pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
      viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");
      viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
      viewer->addCoordinateSystem (1.0);
      viewer->initCameraParameters ();
      return (viewer);
    }
    
    
    pcl::visualization::PCLVisualizer::Ptr customColourVis (pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)
    {
      // --------------------------------------------
      // -----Open 3D viewer and add point cloud-----
      // --------------------------------------------
      pcl::visualization::PCLVisualizer::Ptr viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
      viewer->setBackgroundColor (0, 0, 0);
      pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);
      viewer->addPointCloud<pcl::PointXYZ> (cloud, single_color, "sample cloud");
      viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
      viewer->addCoordinateSystem (1.0);
      viewer->initCameraParameters ();
      return (viewer);
    }
    
    
    pcl::visualization::PCLVisualizer::Ptr normalsVis (
        pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals)
    {
      // --------------------------------------------------------
      // -----Open 3D viewer and add point cloud and normals-----
      // --------------------------------------------------------
      pcl::visualization::PCLVisualizer::Ptr viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
      viewer->setBackgroundColor (0, 0, 0);
      pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
      viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");
      viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
      viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals, 10, 0.05, "normals");
      viewer->addCoordinateSystem (1.0);
      viewer->initCameraParameters ();
      return (viewer);
    }
    
    
    pcl::visualization::PCLVisualizer::Ptr shapesVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)
    {
      // --------------------------------------------
      // -----Open 3D viewer and add point cloud-----
      // --------------------------------------------
      pcl::visualization::PCLVisualizer::Ptr viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
      viewer->setBackgroundColor (0, 0, 0);
      pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
      viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");
      viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
      viewer->addCoordinateSystem (1.0);
      viewer->initCameraParameters ();
    
      //------------------------------------
      //-----Add shapes at cloud points-----
      //------------------------------------
      viewer->addLine<pcl::PointXYZRGB> (cloud->points[0],
                                         cloud->points[cloud->size() - 1], "line");
      viewer->addSphere (cloud->points[0], 0.2, 0.5, 0.5, 0.0, "sphere");
    
      //---------------------------------------
      //-----Add shapes at other locations-----
      //---------------------------------------
      pcl::ModelCoefficients coeffs;
      coeffs.values.push_back (0.0);
      coeffs.values.push_back (0.0);
      coeffs.values.push_back (1.0);
      coeffs.values.push_back (0.0);
      viewer->addPlane (coeffs, "plane");
      coeffs.values.clear ();
      coeffs.values.push_back (0.3);
      coeffs.values.push_back (0.3);
      coeffs.values.push_back (0.0);
      coeffs.values.push_back (0.0);
      coeffs.values.push_back (1.0);
      coeffs.values.push_back (0.0);
      coeffs.values.push_back (5.0);
      viewer->addCone (coeffs, "cone");
    
      return (viewer);
    }
    
    
    pcl::visualization::PCLVisualizer::Ptr viewportsVis (
        pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals1, pcl::PointCloud<pcl::Normal>::ConstPtr normals2)
    {
      // --------------------------------------------------------
      // -----Open 3D viewer and add point cloud and normals-----
      // --------------------------------------------------------
      pcl::visualization::PCLVisualizer::Ptr viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
      viewer->initCameraParameters ();
    
      int v1(0);
      viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
      viewer->setBackgroundColor (0, 0, 0, v1);
      viewer->addText("Radius: 0.01", 10, 10, "v1 text", v1);
      pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
      viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud1", v1);
    
      int v2(0);
      viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);
      viewer->setBackgroundColor (0.3, 0.3, 0.3, v2);
      viewer->addText("Radius: 0.1", 10, 10, "v2 text", v2);
      pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color(cloud, 0, 255, 0);
      viewer->addPointCloud<pcl::PointXYZRGB> (cloud, single_color, "sample cloud2", v2);
    
      viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud1");
      viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud2");
      viewer->addCoordinateSystem (1.0);
    
      viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals1, 10, 0.05, "normals1", v1);
      viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals2, 10, 0.05, "normals2", v2);
    
      return (viewer);
    }
    
    
    unsigned int text_id = 0;
    void keyboardEventOccurred (const pcl::visualization::KeyboardEvent &event,
                                void* viewer_void)
    {
      pcl::visualization::PCLVisualizer *viewer = static_cast<pcl::visualization::PCLVisualizer *> (viewer_void);
      if (event.getKeySym () == "r" && event.keyDown ())
      {
        std::cout << "r was pressed => removing all text" << std::endl;
    
        char str[512];
        for (unsigned int i = 0; i < text_id; ++i)
        {
          sprintf (str, "text#%03d", i);
          viewer->removeShape (str);
        }
        text_id = 0;
      }
    }
    
    void mouseEventOccurred (const pcl::visualization::MouseEvent &event,
                             void* viewer_void)
    {
      pcl::visualization::PCLVisualizer *viewer = static_cast<pcl::visualization::PCLVisualizer *> (viewer_void);
      if (event.getButton () == pcl::visualization::MouseEvent::LeftButton &&
          event.getType () == pcl::visualization::MouseEvent::MouseButtonRelease)
      {
        std::cout << "Left mouse button released at position (" << event.getX () << ", " << event.getY () << ")" << std::endl;
    
        char str[512];
        sprintf (str, "text#%03d", text_id ++);
        viewer->addText ("clicked here", event.getX (), event.getY (), str);
      }
    }
    
    pcl::visualization::PCLVisualizer::Ptr interactionCustomizationVis ()
    {
      pcl::visualization::PCLVisualizer::Ptr viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
      viewer->setBackgroundColor (0, 0, 0);
      viewer->addCoordinateSystem (1.0);
    
      viewer->registerKeyboardCallback (keyboardEventOccurred, (void*)viewer.get ());
      viewer->registerMouseCallback (mouseEventOccurred, (void*)viewer.get ());
    
      return (viewer);
    }
    
    
    // --------------
    // -----Main-----
    // --------------
    int
    main (int argc, char** argv)
    {
      // --------------------------------------
      // -----Parse Command Line Arguments-----
      // --------------------------------------
      if (pcl::console::find_argument (argc, argv, "-h") >= 0)
      {
        printUsage (argv[0]);
        return 0;
      }
      bool simple(false), rgb(false), custom_c(false), normals(false),
        shapes(false), viewports(false), interaction_customization(false);
      if (pcl::console::find_argument (argc, argv, "-s") >= 0)
      {
        simple = true;
        std::cout << "Simple visualisation example\n";
      }
      else if (pcl::console::find_argument (argc, argv, "-c") >= 0)
      {
        custom_c = true;
        std::cout << "Custom colour visualisation example\n";
      }
      else if (pcl::console::find_argument (argc, argv, "-r") >= 0)
      {
        rgb = true;
        std::cout << "RGB colour visualisation example\n";
      }
      else if (pcl::console::find_argument (argc, argv, "-n") >= 0)
      {
        normals = true;
        std::cout << "Normals visualisation example\n";
      }
      else if (pcl::console::find_argument (argc, argv, "-a") >= 0)
      {
        shapes = true;
        std::cout << "Shapes visualisation example\n";
      }
      else if (pcl::console::find_argument (argc, argv, "-v") >= 0)
      {
        viewports = true;
        std::cout << "Viewports example\n";
      }
      else if (pcl::console::find_argument (argc, argv, "-i") >= 0)
      {
        interaction_customization = true;
        std::cout << "Interaction Customization example\n";
      }
      else
      {
        printUsage (argv[0]);
        return 0;
      }
    
      // ------------------------------------
      // -----Create example point cloud-----
      // ------------------------------------
      pcl::PointCloud<pcl::PointXYZ>::Ptr basic_cloud_ptr (new pcl::PointCloud<pcl::PointXYZ>);
      pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZRGB>);
      std::cout << "Generating example point clouds.\n\n";
      // We're going to make an ellipse extruded along the z-axis. The colour for
      // the XYZRGB cloud will gradually go from red to green to blue.
      std::uint8_t r(255), g(15), b(15);
      for (float z(-1.0); z <= 1.0; z += 0.05)
      {
        for (float angle(0.0); angle <= 360.0; angle += 5.0)
        {
          pcl::PointXYZ basic_point;
          basic_point.x = 0.5 * std::cos (pcl::deg2rad(angle));
          basic_point.y = sinf (pcl::deg2rad(angle));
          basic_point.z = z;
          basic_cloud_ptr->points.push_back(basic_point);
    
          pcl::PointXYZRGB point;
          point.x = basic_point.x;
          point.y = basic_point.y;
          point.z = basic_point.z;
          std::uint32_t rgb = (static_cast<std::uint32_t>(r) << 16 |
                  static_cast<std::uint32_t>(g) << 8 | static_cast<std::uint32_t>(b));
          point.rgb = *reinterpret_cast<float*>(&rgb);
          point_cloud_ptr->points.push_back (point);
        }
        if (z < 0.0)
        {
          r -= 12;
          g += 12;
        }
        else
        {
          g -= 12;
          b += 12;
        }
      }
      basic_cloud_ptr->width = (int) basic_cloud_ptr->points.size ();
      basic_cloud_ptr->height = 1;
      point_cloud_ptr->width = (int) point_cloud_ptr->points.size ();
      point_cloud_ptr->height = 1;
    
      // ----------------------------------------------------------------
      // -----Calculate surface normals with a search radius of 0.05-----
      // ----------------------------------------------------------------
      pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne;
      ne.setInputCloud (point_cloud_ptr);
      pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZRGB> ());
      ne.setSearchMethod (tree);
      pcl::PointCloud<pcl::Normal>::Ptr cloud_normals1 (new pcl::PointCloud<pcl::Normal>);
      ne.setRadiusSearch (0.05);
      ne.compute (*cloud_normals1);
    
      // ---------------------------------------------------------------
      // -----Calculate surface normals with a search radius of 0.1-----
      // ---------------------------------------------------------------
      pcl::PointCloud<pcl::Normal>::Ptr cloud_normals2 (new pcl::PointCloud<pcl::Normal>);
      ne.setRadiusSearch (0.1);
      ne.compute (*cloud_normals2);
    
      pcl::visualization::PCLVisualizer::Ptr viewer;
      if (simple)
      {
        viewer = simpleVis(basic_cloud_ptr);
      }
      else if (rgb)
      {
        viewer = rgbVis(point_cloud_ptr);
      }
      else if (custom_c)
      {
        viewer = customColourVis(basic_cloud_ptr);
      }
      else if (normals)
      {
        viewer = normalsVis(point_cloud_ptr, cloud_normals2);
      }
      else if (shapes)
      {
        viewer = shapesVis(point_cloud_ptr);
      }
      else if (viewports)
      {
        viewer = viewportsVis(point_cloud_ptr, cloud_normals1, cloud_normals2);
      }
      else if (interaction_customization)
      {
        viewer = interactionCustomizationVis();
      }
    
      //--------------------
      // -----Main loop-----
      //--------------------
      while (!viewer->wasStopped ())
      {
        viewer->spinOnce (100);
        std::this_thread::sleep_for(100ms);
      }
    }
    

    CMakeLists.txt

    cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
    
    set(CMAKE_CXX_STANDARD 14)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(CMAKE_CXX_EXTENSIONS OFF)
    
    project(pcl_visualizer_viewports)
    
    find_package(PCL 1.2 REQUIRED)
    
    include_directories(${PCL_INCLUDE_DIRS})
    link_directories(${PCL_LIBRARY_DIRS})
    add_definitions(${PCL_DEFINITIONS})
    
    add_executable (pcl_visualizer_demo pcl_visualizer_demo.cpp)
    target_link_libraries (pcl_visualizer_demo ${PCL_LIBRARIES})
    

    查看参数功能
    ./pcl_visualizer_demo -h

    1. http://pointclouds.org/documentation/tutorials/interactive_icp.php

    相关文章

      网友评论

          本文标题:ubuntu18.04安装PCL

          本文链接:https://www.haomeiwen.com/subject/gzsruhtx.html