pcl::getTranslationAndEulerAngles精度缺失问题

2023-11-01

pcl::getTranslationAndEulerAngles的功能是根据仿射矩阵计算x,y,z,roll,pitch,yaw

但发现这种计算的rpy有一定的精度问题,于是进行了实验。

一个是从一个四元数,根据eulerAngles计算rpy,再根据rpy与下述公式计算回四元数,发现误差极小。

    Eigen::Quaternionf q;
    q = Eigen::Quaternionf ( r_matrix );
    std::cout<<"q0 = "<<q.w()<<" "<<q.x()<<" "<<q.y()<<" "<<q.z()<<std::endl;
    Eigen::Matrix3f rx = q.toRotationMatrix();
    Eigen::Vector3f ea = rx.eulerAngles(2,1,0);
    std::cout<<"rpy1 = "<<ea[2]<<" "<<ea[1]<<" "<<ea[0]<<std::endl;
    
    double cy = cos(double(ea[0]) * 0.5);
    double sy = sin(double(ea[0]) * 0.5);
    double cp = cos(double(ea[1]) * 0.5);
    double sp = sin(double(ea[1]) * 0.5);
    double cr = cos(double(ea[2]) * 0.5);
    double sr = sin(double(ea[2]) * 0.5);
 
    double q_n[4];
    q_n[0] = cy * cp * cr + sy * sp * sr;
    q_n[1] = cy * cp * sr - sy * sp * cr;
    q_n[2] = sy * cp * sr + cy * sp * cr;
    q_n[3] = sy * cp * cr - cy * sp * sr;
    std::cout<<"q_n = "<<q_n[0]<<" "<<q_n[1]<<" "<<q_n[2]<<" "<<q_n[3]<<std::endl;

 基本可以认定全过程无误。

之后根据常见的计算轴角公式,再累乘轴角的方式计算四元数。

    Eigen::Quaterniond q1;
    Eigen::AngleAxisd rollAngle1(double(ea[2]), Eigen::Vector3d::UnitX());
    Eigen::AngleAxisd yawAngle1(double(ea[0]), Eigen::Vector3d::UnitZ());
    Eigen::AngleAxisd pitchAngle1(double(ea[1]), Eigen::Vector3d::UnitY());
    q1 =  yawAngle1 * pitchAngle1*rollAngle1;
    std::cout<<"q1 = "<<q1.w()<<" "<<q1.x()<<" "<<q1.y()<<" "<<q1.z()<<std::endl;

说明这种方法精度也正常。

但使用pcl::getTranslationAndEulerAngles函数时,发现rpy和q都不精确,但累乘轴角的方式计算四元数的方式没问题,所以pcl::getTranslationAndEulerAngles函数存在一定的精度问题,从输出的rpy上也可以看出p.z()上有较大的误差。

    double x,y,z,roll,pitch,yaw;
    pcl::getTranslationAndEulerAngles(tCorrect_s, x, y, z, roll, pitch, yaw);
    Eigen::AngleAxisd rollAngle(double(roll), Eigen::Vector3d::UnitX());
    Eigen::AngleAxisd yawAngle(double(yaw), Eigen::Vector3d::UnitZ());
    Eigen::AngleAxisd pitchAngle(double(pitch), Eigen::Vector3d::UnitY());
    std::cout<<"rpy2 "<<roll<<" "<<pitch<<" "<<yaw<<std::endl;
    Eigen::Quaterniond q2;
    q2 = yawAngle * pitchAngle*rollAngle;
    std::cout<<"q2 "<<q2.w()<<" "<<q2.x()<<" "<<q2.y()<<" "<<q2.z()<<std::endl;

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pcl::getTranslationAndEulerAngles精度缺失问题 的相关文章

  • PCL点云库学习笔记(搜索方法)

    PCL点云库学习笔记 搜索方法 一 k d tree 二 八叉树 一 k d tree 我们所有的k d树都是三维空间的 k d树的每个级都使用特定维度拆分所有子级 在树的根部 所有子项都将根据第一维进行拆分 即 如果第一维坐标小于根 则它
  • PCL系列笔记——(滤波)Filter

    目录 直通滤波 PassThrough filter 体素滤波 VoxelGrid filter 离群点滤波器 StatisticalOutlierRemoval filter 直通滤波 PassThrough filter 这个滤波很直接
  • 自定义速腾激光雷达点云XYZIRT格式并调用PCL库进行滤波

    目录 一 试验程序源代码 1 1需要包含的头文件 1 2定义点云结构 1 3主函数 1 4 CMake文件 二 学习pcl PCLPointCloud2 Ptr 2 1区别 2 2转换 2 3心得 Windows 10 Ubuntu 20
  • pointCloudsLibrary视频资料

    pointCloudsLibrary视频资料 版权 边缘疯狂试探 https www bilibili com video BV1JV411C7f3 前言 目前pointCloudsLibrary的资料很少 只有官网的文档 下面介绍一个点云
  • PCL分割:Conditional Euclidean Clustering官方历程,在自己配置环境上调错

    本人环境 VS2015 PCL1 8 1 1 首先遇到遇到了 无法解析的外部符号 提示和normal estimation等错误 解决办法 打开项目属性页 gt C C gt 预处理器 添加 PCL NO PRECOMPILE 2 erro
  • 【PCL】基于法线的差异来分割点云

    基于法线差异来分割点云 1 法向量的计算及可视化 法线又称法向量 因为在三维的点云中 根据一个点的K近邻点或者一个点的radius半径范围内的点拟合一个平面 而垂直这个平面且经过改点的线称之为法向量 法向量是点云点到另一个点的有方向的线段
  • 不使用PCL库,C++保存PLY文件

    输入文件名和TriangulatePoints的结果 void savePLY const std string ply3D filename cv Mat pnts time t t time 0 char tmp1 64 strftim
  • 点云边界提取及可视化

    include
  • PCL点云库的架构

    1 输入 输出 PCL中所有的处理都是基于点云展开的 利用不同的设备获取点云 存储点云等都是点云处理前后必须做的流程 PCL中有自己设计的内部PCD文件格式 为此 设计读写该格式以及与其他3D文件格式之间进行转化的接口类都是很必要的 目前P
  • 点云边界提取方法总结

    目录 经纬线扫描法 网格划分法 法线估计法 alpha shapes算法 原始点云 经纬线扫描法 经纬线扫描法的基本思想是 将经过坐标变换后的二维数据点集按照 x值的大小排序后存储在一个链表中 在二维平面建立点集的最小包围盒并分别计算出 x
  • vs2022配置pcl1.13.1

    1 下载 打开GitHub网站 搜索pcl 选择第一个结果打开 按照下图步骤操作 下载PCL预编译安装程序PCL 1 13 1 AllInOne msvc2022 win64 exe 和要安装的PCL组件 例如pcl 1 13 1 pdb
  • CloudCompare和PCL体素滤波:优化点云数据处理

    CloudCompare和PCL体素滤波 优化点云数据处理 介绍 点云数据处理在计算机视觉和机器人领域扮演着重要角色 然而 原始的点云数据可能包含噪声 离群点和冗余信息 这可能对后续的分析和应用造成负面影响 为了解决这些问题 我们可以使用体
  • PCL-获取点云体素中的所有点的索引的方法

    使用 octree 将点云体素化之后 获取体素中所有点的方法 即OctreeContainerBase中的三个方法的介绍 getPointIndex getPointIndicesVector getPointIndices 这三个方法都是
  • python-pcl安装和使用

    安装 因为工作中要进行点云数据的显示 因此要安装python pcl 网上搜了很多教程 但是安装中还是遇到很多问题 这里把自己遇到的和可能遇到的问题总结一下 环境 Ubuntu 14 04 python 2 7 6 pcl 1 7 0 网上
  • PCL调错:合集

    1 error C4996 pcl visualization PointCloudColorHandler
  • win10环境下PCL安装和配置回顾(一)

    2020年博主有写过几篇关于PCL的博客 这边想先回顾下 再增加点新内容 之前写的博客专栏如下链接 https blog csdn net jiugeshao category 11993239 html spm 1001 2014 300
  • pcl make failed - libSM.so:

    usr lib x86 64 linux gnu libSM so undefined reference to uuid generate UUID 1 0 usr lib x86 64 linux gnu libSM so undefi
  • PCL调错:(3)error C2589“(“:“::“右边的非法标记

    错误提示 造成该错误的原因是 pcl库中的函数模板max与Visual C 中的全局的宏max冲突 百度了以下看了一共有两种解决方案 第一种不用修改库里边的源代码 设置项目属性 在预定义处理器中添加定义NOMINMAX来禁止使用Visual
  • 点云Las文件是什么?

    点云Las文件是什么 1 LIDAR数据 2 LAS点云规格 3 LAS Header头文件 4 LAS Header版本与LAS点格式 5 点云Header与点格式对应关系 6 示例 查看点云文件的规格和格式 7 LAS读取可参考 pyl
  • PCL测试程序(兔子)

    程序 include

随机推荐