经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 职业生涯 » 查看文章
matlab练习程序(对应点集配准的四元数法)
来源:cnblogs  作者:MATLAB基于模型的设计  时间:2018/12/17 9:31:36  对本文有异议

这个算是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');

关注公众号: MATLAB基于模型的设计 (ID:xaxymaker) ,每天推送MATLAB学习最常见的问题,每天进步一点点,业精于勤荒于嬉

 打开微信扫一扫哦!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号