• MATLAB 对应点集配准的四元数法


    这个算是ICP算法中的一个关键步骤,单独拿出来看一下。

    算法流程如下:

    1.首先得到同名点集P和X。

    2.计算P和X的均值up和ux。

    3.由P和X构造协方差矩阵sigma。

    4.由协方差矩阵sigma构造4*4对称矩阵Q。

    5.计算Q的特征值与特征向量。其中Q最大特征值对应的特征向量即为最佳旋转向量q。

    6.通过四元数q得到旋转矩阵R。

    7.根据R计算最佳平移向量qr。

    具体公式我就不贴图了,可以参考这篇“ICP算法在点云配准中的应用”论文的3.1节。

    处理效果如下:

    原始点集:

    其中蓝点为原始点集,红点为旋转平移后的点集。

    配准后点集:

    计算得到的旋转平移矩阵,通过对蓝点集进行转换得到绿点集,比较红点集与绿点集是否基本一致。

    matlab代码如下:

     1 clear all;
     2 close all;
     3 clc;
     4 
     5 %生成原始点集
     6 X=[];Y=[];Z=[];
     7 for i=-180:2:180
     8     for j=-90:2:90
     9         x = i * pi / 180.0;
    10         y = j * pi / 180.0;   
    11         X =[X,cos(y) * cos(x)];
    12         Y =[Y,sin(y) * cos(x)];
    13         Z =[Z,sin(x)]; 
    14     end
    15 end
    16 P=[X(1:3000)' Y(1:3000)' Z(1:3000)'];
    17 
    18 %生成变换后点集
    19 i=0.5;j=0.3;k=0.7;
    20 Rx=[1 0 0;0 cos(i) -sin(i); 0 sin(i) cos(i)];
    21 Ry=[cos(j) 0 sin(j);0 1 0;-sin(j) 0 cos(j)];
    22 Rz=[cos(k) -sin(k) 0;sin(k) cos(k) 0;0 0 1];
    23 R=Rx*Ry*Rz;
    24 X=P*R + [0.2,0.3,0.4];
    25 
    26 plot3(P(:,1),P(:,2),P(:,3),'b.');
    27 hold on;
    28 plot3(X(:,1),X(:,2),X(:,3),'r.');
    29 
    30 %计算点集均值
    31 up = mean(P);
    32 ux = mean(X);
    33 
    34 P1=P-up;
    35 X1=X-ux;
    36 
    37 %计算点集协方差
    38 sigma=P1'*X1/(length(X1));
    39 sigma_mi = sigma - sigma';
    40 M=sigma+sigma'-trace(sigma)*[1,0,0;0,1,0;0,0,1];
    41 
    42 %由协方差构造4*4对称矩阵
    43 Q=[trace(sigma) sigma_mi(2,3) sigma_mi(3,1) sigma_mi(1,2);
    44    sigma_mi(2,3) M(1,1) M(1,2) M(1,3);
    45    sigma_mi(3,1) M(2,1) M(2,2) M(2,3);
    46    sigma_mi(1,2) M(3,1) M(3,2) M(3,3)];
    47 
    48 %计算特征值与特征向量
    49 [x,y] = eig(Q);
    50 e = diag(y);
    51 
    52 %计算最大特征值对应的特征向量
    53 lamda=max(e);
    54 for i=1:length(Q)
    55     if lamda==e(i)
    56         break;
    57     end
    58 end
    59 q=x(:,i);
    60 
    61 q0=q(1);q1=q(2);q2=q(3);q3=q(4);
    62 
    63 %由四元数构造旋转矩阵
    64 RR=[q0^2+q1^2-q2^2-q3^2 ,2*(q1*q2-q0*q3), 2*(q1*q3+q0*q2);
    65    2*(q1*q2+q0*q3), q0^2-q1^2+q2^2-q3^2, 2*(q2*q3-q0*q1);
    66    2*(q1*q3-q0*q2), 2*(q2*q3+q0*q1), q0^2-q1^2-q2^2+q3^2];
    67 
    68 %计算平移向量
    69 qr=ux-up*RR';
    70 
    71 %验证旋转矩阵与平移向量正确性
    72 Pre = P*RR'+qr;
    73 
    74 figure;
    75 plot3(P(:,1),P(:,2),P(:,3),'b.');
    76 hold on;
    77 plot3(X(:,1),X(:,2),X(:,3),'r.');
    78 
    79 plot3(Pre(:,1),Pre(:,2),Pre(:,3),'go');
  • 相关阅读:
    python-批量执行.py文件
    python-写入excel(xlswriter)
    python-读取excel(xlrd)
    python接口自动化测试-requests.post()
    python-读取配置文件
    python-mysql
    python-Redis的List操作
    python-Redis的String、Hash操作
    Elasitcsearch High Level Rest Client使用示例
    前端并发优化技巧
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13645640.html
Copyright © 2020-2023  润新知