pcl 姿态变换 之 旋转平移

一、简介

最近在做一个点云的项目,姿态的变换是一个很重要的环节,从数学上需要彻底理解这些东西之前一直在使用,但是没有系统的总结过,接着三天放假时间好好学习一下。这几天打算从下面几个方向上来做

1、旋转平移矩阵(2D和3D)

2、欧拉角

PCL 欧拉角_Σίσυφος1900的博客-CSDN博客

3、欧拉角和四元数的转换

PCL 欧拉角_Σίσυφος1900的博客-CSDN博客

4、SVD 矩阵分解

奇异矩阵的判定_Σίσυφος1900的博客-CSDN博客

SVD 奇异值分解_Σίσυφος1900的博客-CSDN博客_svd的左奇异阵

5、矩阵的伪逆

伪逆矩阵 的使用_Σίσυφος1900的博客-CSDN博客

6、罗德里格斯公式

非常感谢这位老兄的博客,我们就是学习

旋转变换(一)旋转矩阵_csxiaoshui的博客-CSDN博客_旋转矩阵

二、2D旋转

1、旋转原理推导

 

 2、绕着一个定点旋转

上面说的是绕着原点O 来旋转的,那么如何将绕着一个定点R(x,y)来旋转呢,有如下步骤

1、将R点移动到原点O的位置

平移矩阵如下:

 2、绕着原点旋转

 3、将第一步平移的步骤也平移到原来的地方

那么最后的矩阵就是:

若绕着(2,2)点旋转angle=1/6*pi,

 matlab 验证:

>>  A=[1 0 2;0 1 2;0 0 1]

A =

     1     0     2
     0     1     2
     0     0     1

>> a=[1 0 -2;0 1 -2;0 0 1]

a =

     1     0    -2
     0     1    -2
     0     0     1

>> R=[cos(1/6*pi) -sin(1/6*pi) 0;sin(1/6*pi) cos(1/6*pi) 0;0 0 1]

R =

    0.8660   -0.5000         0
    0.5000    0.8660         0
         0         0    1.0000

>> M =A*R*a

M =

    0.8660   -0.5000    1.2679
    0.5000    0.8660   -0.7321
         0         0    1.0000

>> 

三、3D旋转

坐标系:

1、绕着x 轴旋转

2、绕着y 轴旋转

绕着y轴旋转,其平面是ZOX平面

3、绕着z 轴旋转

 记得在halcon中是旋转的顺序有大概12中之多,通常来说xyz和xyz以及zxy 的矩阵是不一样的,这里我们能使用matlab做个测试

angle=1/6*pi:

Rx=[1 0  0 0 ;
  0  cos(1/6*pi) -sin(1/6*pi) 0;
  0  sin(1/6*pi) cos(1/6*pi) 0;
  0 0  0 1]


Ry=[cos(1/6*pi)  0   sin(1/6*pi) 0;
   0 1 0 0 ;
 -sin(1/6*pi)  0  cos(1/6*pi) 0;
 0 0  0 1]



Rz=[cos(1/6*pi)  -sin(1/6*pi) 0  0;
sin(1/6*pi)  cos(1/6*pi)  0 0 ;
0  0  1 0;
0 0  0 1]
>> Rx=[1 0  0 0 ;0  cos(1/6*pi) -sin(1/6*pi) 0;0  sin(1/6*pi) cos(1/6*pi) 0;0 0  0 1]

Rx =

    1.0000         0         0         0
         0    0.8660   -0.5000         0
         0    0.5000    0.8660         0
         0         0         0    1.0000

>> Ry=[cos(1/6*pi)  0   sin(1/6*pi) 0; 0 1 0 0 ;-sin(1/6*pi)  0  cos(1/6*pi) 0;0 0  0 1]

Ry =

    0.8660         0    0.5000         0
         0    1.0000         0         0
   -0.5000         0    0.8660         0
         0         0         0    1.0000

>> Rz=[cos(1/6*pi)  -sin(1/6*pi) 0  0;sin(1/6*pi)  cos(1/6*pi)  0 0 ;0  0  1 0;0 0  0 1]

Rz =

    0.8660   -0.5000         0         0
    0.5000    0.8660         0         0
         0         0    1.0000         0
         0         0         0    1.0000

 C++程序:

Eigen::Matrix4f   RotateMatrix3D(int  axis,float  angle)
{
    // 使用eigen  定义一个单位矩阵
    Eigen::Matrix4f  _rotateMatrix = Eigen::Matrix4f::Identity();
    angle = angle / M_1_PI / 180;
    switch (axis)
    {
    case 0:  // 绕着x轴旋转
        _rotateMatrix(1, 1) = cos(angle);
        _rotateMatrix(1, 2) = -sin(angle);
        _rotateMatrix(2, 1) = sin(angle);
        _rotateMatrix(2, 2) = -cos(angle);
        cout << "绕着x轴旋转矩阵: " << endl;
        cout << _rotateMatrix << endl;
        break;
    case 1:  // 绕着x轴旋转
        _rotateMatrix(0, 0) = cos(angle );
        _rotateMatrix(0, 2) = sin(angle );
        _rotateMatrix(2, 0) = -sin(angle );
        _rotateMatrix(2, 2) = cos(angle );
        cout << "绕着y轴旋转矩阵: " << endl;
        cout << _rotateMatrix << endl;
        break;
    case 2:
        _rotateMatrix(0, 0) = cos(angle );
        _rotateMatrix(0, 1) = -sin(angle );
        _rotateMatrix(1, 0) = sin(angle);
        _rotateMatrix(1, 1) = cos(angle );
        cout << "绕着z轴旋转矩阵: " << endl;
        cout << _rotateMatrix << endl;
        break;
    default:
        break;
    }
    return _rotateMatrix;
}

四、3D绕任意轴旋转

绕任意轴旋转,我们可以将这个旋转分解为一些基本的旋转,然后旋转,案例如下:

我们将绕着U轴从P点旋转到Q点,求出Q点的坐标:

 

 1、将U轴旋转到XOZ平面,绕着X轴旋转

Rx矩阵 

2、将U轴绕y轴旋转,使得U轴与Z轴重合

 绕y轴旋转 负的 β角,就是上图中

同理,我们可以计算得出β的相关计算:

3、将Z 轴旋转

 1,2中已经吧U轴和Z轴重合了,最后就是Z轴分量的旋转,

4、求2的逆过程,就是求逆矩阵

5、求步骤1的逆过程,求逆矩阵

详细过程:

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PCL点云处理库是一个功能强大的点云处理工具,支持旋转平移等操作,并提供了多种粗配准算法,如PFH、FPFH、ICP、NDT和3DSC等。这些算法最终目的是将两个不同位置的点云进行匹配,实现点云3D重建等应用。 旋转平移点云位置可以使用PCL提供的Transformations模块实现。其中,旋转矩阵可以通过Eigen::Quaterniond或Eigen::AngleAxisd实现,平移矩阵可以使用Eigen::Affine3f实现,从而实现点云的旋转平移。使用这些方法完成旋转平移后,可以进行下面几种粗配准算法: 1. PFH(Point Feature Histograms)算法 PFH算法通过计算点云中每个点的特征直方图并对其进行匹配来计算两个点云之间的相似性。这种算法在处理具有复杂形状或不规则边界的点云时表现良好。 2. FPFH(Fast Point Feature Histograms)算法 FPFH算法是PFH算法的优化,能够提高匹配速度和准确性,同时还支持噪声过滤和配准的完全自动化。 3. ICP(Point-to-Point Iterative Closest Point)算法 ICP算法是使用最广泛的粗配准算法之一,它尝试通过迭代比对点云中每个点的最近邻点来计算两个点云之间的转换。ICP算法对初始位置的精度要求较高。 4. NDT(Normal Distributions Transform)算法 NDT算法基于高斯分布模型,通过优化高斯分布参数来计算两个点云之间的转换。NDT算法对初始位置的要求较低,适用于处理含噪声或不规则分布的点云。 5. 3DSC(3D Shape Context)算法 3DSC算法通过计算点云中每个点周围几何结构的一种描述符并进行匹配来计算两个点云之间的相似性。3DSC算法对于具有明显几何结构的点云具有很好的效果。 总之,PCL点云处理库提供了多种粗配准方法,可以根据不同场景和需求选择合适的方法来完成点云的匹配和重建。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值