Ubuntu 20.04.06 PCL C++学习记录(二十七)【附所用点云】

这篇具有很好参考价值的文章主要介绍了Ubuntu 20.04.06 PCL C++学习记录(二十七)【附所用点云】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

@[TOC]PCL中点云配准模块的学习

学习背景

参考书籍:《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,,PCL版本为1.10.0,CMake版本为3.16,可用点云下载地址

学习内容

使用正态分布算法来确定两个大型点云之间的刚体变换,正态分布变换算法是一个配准算法,它应用于三维点的统计模型,使用标准最优化技术来确定两个点云间的最优匹配,因为其在配准的过程中不利用对应点的特征计算和匹配,所以时间比其他方法比较快,本章点云下载room_scan1.pcd,room_scan2.pcd

源代码及所用函数

源代码

//使用正态分布变换进行配准的实验 。其中room_scan1.pcd  room_scan2.pcd这些点云包含同一房间360不同视角的扫描数据
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include<thread>//C++管理线程头文件
#include<pcl/registration/ndt.h>//用于执行正态分布变换(Normal Distributions Transform, NDT)配准算法的头文件
#include<pcl/filters/approximate_voxel_grid.h>//滤波头文件

using namespace std::chrono_literals;

int main()
{
    //********************************************加载房间的第一次扫描点云数据作为目标***************************//
    pcl::PointCloud<pcl::PointXYZ>::Ptr target_cloud(new pcl::PointCloud<pcl::PointXYZ>);
    if(pcl::io::loadPCDFile<pcl::PointXYZ>("/home/jojo/PointCloud/PCLB/Registration/03/room_scan1.pcd",*target_cloud) == -1)
    {
        //std::cout << " 加载文件失败" << std::endl;
        PCL_ERROR("加载文件room_scan1.pcd失败\n");
        return -1;
    }
    std::cout << "加载 " << target_cloud->size () << " 个点从room_scan1.pcd中" << std::endl;
    //*************************************加载从新视角得到的第二次扫描点云数据作为源点云***************************//
    pcl::PointCloud<pcl::PointXYZ>::Ptr input_cloud (new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile<pcl::PointXYZ> ("/home/jojo/PointCloud/PCLB/Registration/03/room_scan2.pcd", *input_cloud) == -1)
    {
        PCL_ERROR ("加载文件room_scan2.pcd失败\n \n");
        return (-1);
    }
    std::cout << "加载 " << input_cloud->size () << " 个点从room_scan2.pcd中" << std::endl;
    //************************将输入扫描内容过滤为原稿大小的 10%左右,以提高套准速度*********************//
    //以上的代码加载了两个PCD文件得到共享指针,后续配准是完成对源点云到目标点云的参考坐标系的变换矩阵的估计,得到第二组点云变换到第一组点云坐标系下的变换矩阵
    //因为在NDT算法中在目标点云对应的体素网格数据结构的统计计算不使用单个点,而是使用包含在每个体素单元格中的点的统计数据
    pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud (new pcl::PointCloud<pcl::PointXYZ>);
    pcl::ApproximateVoxelGrid<pcl::PointXYZ> approximate_voxel_filter;
    approximate_voxel_filter.setLeafSize(0.2,0.2,0.2);
    approximate_voxel_filter.setInputCloud(input_cloud);
    approximate_voxel_filter.filter(*filtered_cloud);
    std::cout << "过滤后的点云包含 " << filtered_cloud->size ()
            << " 个点从room_scan2.pcd中" << std::endl;
    //*****************************************************初始化正态分布变换************************//
    pcl::NormalDistributionsTransform<pcl::PointXYZ,pcl::PointXYZ> ndt;
    //设置与刻度相关的无损检测参数
    //为终止条件设置最小变换差。
    ndt.setTransformationEpsilon(0.01);
    //设置 More-Thuente 线搜索的最大步长
    ndt.setStepSize(0.1);
    //设置NDT网格网格结构的分辨率
    ndt.setResolution (1.0); 
    //以上参数在使用房间尺寸比例下运算比较好,但是如果需要处理例如一个咖啡杯子的扫描之类更小的物体,需要对参数进行很大程度的缩小

    //设置匹配迭代的最大次数,这个参数控制程序运行的最大迭代次数,一般来说这个限制值之前优化程序会在epsilon变换阀值下终止
    //添加最大迭代次数限制能够增加程序的鲁棒性阻止了它在错误的方向上运行时间过长
    ndt.setMaximumIterations(35);

    //设置要对齐的点云
    ndt.setInputSource(filtered_cloud);
    //设置对其目标点云
    ndt.setInputTarget(target_cloud);

    // 设置使用机器人测距法得到的粗略初始变换矩阵结果
    Eigen::AngleAxisf init_rotation(0.6931,Eigen::Vector3f::UnitZ());
    Eigen::Translation3f init_translation(1.79387, 0.720047, 0);
    //将平移矩阵init_translation与从四元数init_rotation获得的旋转矩阵相乘,初始化了一个4x4变换矩阵init_guess。
    Eigen::Matrix4f init_guess = (init_translation * init_rotation).matrix();
    // 计算需要的刚体变换以便将输入的源点云匹配到目标点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr output_cloud(new pcl::PointCloud<pcl::PointXYZ>);
    ndt.align(*output_cloud,init_guess);//点云配准
    //这个地方的output_cloud不能作为最终的源点云变换,因为上面对点云进行了滤波处理
    std::cout << "正态分布变换已收敛:" << ndt.hasConverged ()
            << " 分数为: " << ndt.getFitnessScore () << std::endl;
    //使用创建的变换对为过滤的输入点云进行变换
    pcl::transformPointCloud(*input_cloud,*output_cloud,ndt.getFinalTransformation());
    //保存转换后的源点云作为最终的变换输出
    pcl::io::savePCDFileASCII("/home/jojo/PointCloud/PCLB/Registration/03/room_scan2_transformed.pcd",*output_cloud);
    //***************************************可视化点云***********************************//
    pcl::visualization::PCLVisualizer::Ptr viewer_final (new pcl::visualization::PCLVisualizer ("3D Viewer"));
    viewer_final->setBackgroundColor (0, 0, 0);
    //着色和可视化目标云(红色)
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> target_color(target_cloud,255,0,0);
    viewer_final->addPointCloud<pcl::PointXYZ>(target_cloud,target_color,"target cloud");
    viewer_final->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,2,"target cloud");
    //对转换后的源点云着色 (green)可视化.
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> output_color (output_cloud, 0, 255, 0);
    viewer_final->addPointCloud<pcl::PointXYZ>(output_cloud,output_color,"output cloud");
    viewer_final->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,2,"output cloud");
    // 启动可视化
    viewer_final->addCoordinateSystem(1.0);//显示XYZ指示轴
    viewer_final->initCameraParameters();//使用默认摄像头参数
    while (!viewer_final->wasStopped ())
    {
        viewer_final->spinOnce (100);
        std::this_thread::sleep_for(100ms);
    }
    return (0);

}


CMakeLists.txt

cmake_minimum_required(VERSION 3.16 FATAL_ERROR)#指定CMake的最低版本要求为3.16
project(project)#设置项目名称
find_package(PCL 1.10 REQUIRED)#查找PCL库,要求版本为1.10或更高。
include_directories(${PCL_INCLUDE_DIRS})#将PCL库的头文件目录添加到包含路径中
link_directories(${PCL_LIBRARY_DIRS})#将PCL库的库文件目录添加到链接器搜索路径中。
add_definitions(${PCL_DEFINITIONS})#添加PCL库的编译器定义
add_executable (normal_distributions_transform normal_distributions_transform.cpp)
target_link_libraries (normal_distributions_transform ${PCL_LIBRARIES})#将PCL库链接到可执行文件目标。

运行结果

Ubuntu 20.04.06 PCL C++学习记录(二十七)【附所用点云】,ubuntu,c++,学习Ubuntu 20.04.06 PCL C++学习记录(二十七)【附所用点云】,ubuntu,c++,学习文章来源地址https://www.toymoban.com/news/detail-859579.html

函数

  • Eigen::AngleAxisf init_rotation(0.6931, Eigen::Vector3f::UnitZ());
    这行代码创建了一个旋转向量init_rotation,表示绕Z轴旋转0.6931弧度(约39.7度)。
    Eigen::AngleAxisf是Eigen库中表示旋转的类,它接受一个旋转角度和一个旋转轴作为参数。
    Eigen::Vector3f::UnitZ()返回一个表示Z轴单位向量的向量,即(0, 0, 1)。
  • Eigen::Translation3f init_translation(1.79387, 0.720047, 0);
    这行代码创建了一个平移向量init_translation,表示在X轴方向平移1.79387,在Y轴方向平移0.720047,在Z轴方向不平移。Eigen::Translation3f是Eigen库中表示三维平移的类,它接受三个浮点数作为参数,分别表示在X、Y、Z轴方向上的平移量。

补充内容

到了这里,关于Ubuntu 20.04.06 PCL C++学习记录(二十七)【附所用点云】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【PCL】ubuntu20.04安装 VTK7.1与PCL1.8(PCL依赖VTK,要先装且最好源码安装)

    Ref: 源码安装 (apt安装的方式会出现.so文件缺失的情况!!!)) ubuntu16.04 安装Qt5 + VTK7.1.1 + PCL1.8.0 第二部分 Ubuntu20.04安装VTK 下载 下载地址 依赖安装 VTK安装 方法一出现的错误: make过程中出现的 错误: Could not find  a package configuration file provided by \\\"Qt5X11Extras\\\" with any of the followi

    2024年02月03日
    浏览(40)
  • 解决PCL和OpenCV中flann库冲突的问题(Ubuntu20.04+VSCode)

    做视觉处理,尤其是三维视觉和点云处理等,基本都离不开这俩大库,以前要么单独用OpenCV做二维,要么纯用PCL做点云后处理。因为准备把学习期间的代码整合起来,所以需要同时使用两个库,结果发现 flann库冲突 的问题🤪 查阅了一下网上的方案,基本有几种方案 1.建议改

    2024年02月15日
    浏览(44)
  • ubuntu20.04 直接安装vpp23.06 测试双 VPP Tunnel Ike2

    环境信息:VMware® Workstation 17 Pro + ubuntu20.04 (清华源) ubuntu 源点进去选:ubuntu-22.04.3-desktop-amd64.iso   如果之前装过VPP,用以下命令确定是否卸载干净: 卸载: 下载链接: fdio/release - Results for ubuntu/focal in fdio/release 下载选项:focal(ubuntu20.04)  选中要下载的包双击进入  找到wg

    2024年02月11日
    浏览(28)
  • Ubuntu20.04安装Unity踩坑记录

    链接:https://docs.unity3d.com/hub/manual/InstallHub.html?_ga=2.264734605.30268629.1678763370-652752773.1678763370#install-hub-linux step1 一切顺利 结果: step2 开始报错了!! E: 仓库 “https://ppa.launchpadcontent.net/jonathonf/ffmpeg-4/ubuntu jammy Release” 没有 Release 文件。 解决办法: 参考教程:apt-get update时提示仓

    2024年02月04日
    浏览(33)
  • 【记录】ubuntu20.04安装nvidia显卡驱动

    新安装的Ubuntu20.04系统,如果想进行人工智能相关的学习,需要配置一系列的环境,这里我记录下具体的安装过程。 Nvidia显卡驱动的安装 1 安装前需要安装依赖(必须执行) 2 查看自己的GPU型号,这个如果自己知道,其实没必要,如果不确定,可以用下面的命令进行查看 3 Nvid

    2024年02月13日
    浏览(41)
  • 【记录】Ubuntu20.04如何使用中文输入法

    安装完Ubuntu系统,发现中文输入法不能用,这里记录下使用中文输入法的过程。 1 打开 setting 2 页面左侧的导航栏中选择“RegionLanguage”,然后在右侧页面中点击“Manage Install Languages”。 如果弹出下面这个窗口,单击 Install,然后等待安装完毕。 单击“Install/Remove Languages”。

    2024年02月16日
    浏览(36)
  • Ubuntu-base(20.04/22.04) armhf / aarch64移植记录

    根文件系统官网 进入如下图选择版本-进入release 版本下载界面-下载armhf/arm64文件。 在/home/zynq/linux/rootfs/下建立mount.sh 在/home/zynq/linux/rootfs/下建立unmount.sh 给两个文件赋权限 运行mount.sh 挂载文件系统 adduser 和useradd的区别: adduser 和useradd的区别:

    2024年02月11日
    浏览(54)
  • 记录Ubuntu20.04系统安装后立刻安装无线网驱动

    ubuntu安装无线网卡驱动 查看电脑对应版本的网卡型号 查找驱动及对应内核版本 安装驱动 我的电脑显卡为RTX 3070Ti。在安装好Ubuntu20.04系统后,因为是镜像安装,遇到过两种情况: 安装的系统内核为5.13.0(不自带无线网卡驱动),Settings没有WIFI。 安装的系统内核为5.15.0(自带

    2024年02月16日
    浏览(44)
  • django-vue-admin ubuntu 20.04 环境准备 记录

    django-vue-admin 运行记录 https://django-vue-admin.com/document/hjbs.html https://django-vue-admin.com/document/hjbs.html https://bbs.django-vue-admin.com/article/9.html https://gitee.com/liqianglog/django-vue-admin/tree/demo_project 1. 安装 ubuntu-20.04.6 桌面版 ubuntu-20.04.6-desktop-amd64.iso 桌面版本 桌面版的目的是 有浏览器可以看

    2024年02月11日
    浏览(71)
  • 记录Ubuntu20.04的NVIDIA显卡驱动安装和CUDA安装

    我的电脑显卡是RTX 3070Ti。 在安装Ubuntu系统的时候选择的也是Mini安装。 而且对比了官方的NVIDIA驱动安装和系统自带的“软件和更新”附加驱动安装。我这边选择了更加稳定的官方的NVIDIA驱动安装。 由于课题的原因,并没有在CUDA之后安装相关的cudnn的补丁。 进入终端后,运行

    2024年02月05日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包