文章转载自:经典手眼标定算法之Navy的OpenCV实现 :http://blog.csdn.net/yunlinwang/article/details/51871520

在我的上一篇博客中已经介绍了Tsai的手眼标定算法,下面主要介绍Frank C. Park and Bryan J. Martin在文献Robot sensor calibration: solving AX=XB on the Euclidean group中提出的手眼标定算法,该算法也被称为Navy手眼标定算法,该算法的主要创新点为利用李群理论的知识来求解手眼标定经典方程。该算法基于OpenCV的C++版本程序可去CSDN资源下载,MATLAB版本作者为苏黎世理工的Christian Wengert,也可在此处下载。

  1. void Navy_HandEye(Mat Hcg, vector<Mat> Hgij, vector<Mat> Hcij)
  2. {
  3. CV_Assert(Hgij.size() == Hcij.size());
  4. int nStatus = Hgij.size();
  5. Mat Rgij(3, 3, CV_64FC1);
  6. Mat Rcij(3, 3, CV_64FC1);
  7. Mat alpha1(3, 1, CV_64FC1);
  8. Mat beta1(3, 1, CV_64FC1);
  9. Mat alpha2(3, 1, CV_64FC1);
  10. Mat beta2(3, 1, CV_64FC1);
  11. Mat A(3, 3, CV_64FC1);
  12. Mat B(3, 3, CV_64FC1);
  13. Mat alpha(3, 1, CV_64FC1);
  14. Mat beta(3, 1, CV_64FC1);
  15. Mat M(3, 3, CV_64FC1, Scalar(0));
  16. Mat MtM(3, 3, CV_64FC1);
  17. Mat veMtM(3, 3, CV_64FC1);
  18. Mat vaMtM(3, 1, CV_64FC1);
  19. Mat pvaM(3, 3, CV_64FC1, Scalar(0));
  20. Mat Rx(3, 3, CV_64FC1);
  21. Mat Tgij(3, 1, CV_64FC1);
  22. Mat Tcij(3, 1, CV_64FC1);
  23. Mat eyeM = Mat::eye(3, 3, CV_64FC1);
  24. Mat tempCC(3, 3, CV_64FC1);
  25. Mat tempdd(3, 1, CV_64FC1);
  26. Mat C;
  27. Mat d;
  28. Mat Tx(3, 1, CV_64FC1);
  29. //Compute rotation
  30. if (Hgij.size() == 2) // Two (Ai,Bi) pairs
  31. {
  32. Rodrigues(Hgij[0](Rect(0, 0, 3, 3)), alpha1);
  33. Rodrigues(Hgij[1](Rect(0, 0, 3, 3)), alpha2);
  34. Rodrigues(Hcij[0](Rect(0, 0, 3, 3)), beta1);
  35. Rodrigues(Hcij[1](Rect(0, 0, 3, 3)), beta2);
  36. alpha1.copyTo(A.col(0));
  37. alpha2.copyTo(A.col(1));
  38. (alpha1.cross(alpha2)).copyTo(A.col(2));
  39. beta1.copyTo(B.col(0));
  40. beta2.copyTo(B.col(1));
  41. (beta1.cross(beta2)).copyTo(B.col(2));
  42. Rx = A*B.inv();
  43. }
  44. else // More than two (Ai,Bi) pairs
  45. {
  46. for (int i = 0; i < nStatus; i++)
  47. {
  48. Hgij[i](Rect(0, 0, 3, 3)).copyTo(Rgij);
  49. Hcij[i](Rect(0, 0, 3, 3)).copyTo(Rcij);
  50. Rodrigues(Rgij, alpha);
  51. Rodrigues(Rcij, beta);
  52. M = M + beta*alpha.t();
  53. }
  54. MtM = M.t()*M;
  55. eigen(MtM, vaMtM, veMtM);
  56. pvaM.at<double>(0, 0) = 1 / sqrt(vaMtM.at<double>(0, 0));
  57. pvaM.at<double>(1, 1) = 1 / sqrt(vaMtM.at<double>(1, 0));
  58. pvaM.at<double>(2, 2) = 1 / sqrt(vaMtM.at<double>(2, 0));
  59. Rx = veMtM*pvaM*veMtM.inv()*M.t();
  60. }
  61. //Computer Translation
  62. for (int i = 0; i < nStatus; i++)
  63. {
  64. Hgij[i](Rect(0, 0, 3, 3)).copyTo(Rgij);
  65. Hcij[i](Rect(0, 0, 3, 3)).copyTo(Rcij);
  66. Hgij[i](Rect(3, 0, 1, 3)).copyTo(Tgij);
  67. Hcij[i](Rect(3, 0, 1, 3)).copyTo(Tcij);
  68. tempCC = eyeM - Rgij;
  69. tempdd = Tgij - Rx * Tcij;
  70. C.push_back(tempCC);
  71. d.push_back(tempdd);
  72. }
  73. Tx = (C.t()*C).inv()*(C.t()*d);
  74. Rx.copyTo(Hcg(Rect(0, 0, 3, 3)));
  75. Tx.copyTo(Hcg(Rect(3, 0, 1, 3)));
  76. Hcg.at<double>(3, 0) = 0.0;
  77. Hcg.at<double>(3, 1) = 0.0;
  78. Hcg.at<double>(3, 2) = 0.0;
  79. Hcg.at<double>(3, 3) = 1.0;
  80. }

AX=XB李群李代数知识求解方程相关推荐

  1. opencv4.2中求解手眼标定方程AX=XB

    opencv函数: void cv::calibrateHandEye (InputArrayOfArrays R_gripper2base, InputArrayOfArrays t_gripper ...

  2. 手眼标定AX=XB求解方法(文献总结)

    本人在看论文时碰到了手眼标定问题,看了几篇论文,顺便来总结一下关于公式AX=XB的解决方法和论文的内容. 在手眼标定问题中,AX=XB公式的求解方法很关键,手眼即机器人末端和相机,两者有两种组合形式: ...

  3. 手眼标定eye-in-hand(一)AX=XB方程推导

    1. 前言 本文主要介绍eye-in-hand的手眼标定,引用OpenCV的文档原话和原图1:"The following picture describes the Hand-Eye ca ...

  4. Matlab求解AX=XB(手眼标定用)

    描述 使用matlab求解AX=XB的问题 可以正确求出X的值,我已经成功验证了 至于说X具体代表什么,要结合你自己推导出的公式AX=XB之中,A.X.B分别代表什么 代码 main.m 包含我做手眼 ...

  5. SLAM中相机位姿求解(李群李代数)

    前言 slam中一个关键问题之一就是求解相机的位姿,人们找了很多以相机位姿为变量的误差函数,比如光度误差,重投影误差,3D几何误差等等,希望使得误差最小,进而求得比较准确的相机位姿.举一个重投影例子: ...

  6. 手眼标定算法---Navy算法(Robot sensor calibration: solving AX=XB on the Euclidean group)

    本文主要介绍Frank C. Park and Bryan J. Martin在文献Robot sensor calibration: solving AX=XB on the Euclidean g ...

  7. 数学小抄: 李群李代数再回顾 [SLAM十四讲]

    前言 最近阅读了高翔老师的视觉SLAM十四讲, 也算是了解了当下机器人领域最炙热的机器人领域前沿研究问题大概是怎么样的数学问题. 不得不说视频与书籍真的是深入浅出. 所有第三库无痛安装教程: 知乎链接 ...

  8. 李群李代数 简明教程

    李群李代数 简明教程 slam算法中往往需要用到李群李代数的一些知识,最近看到一个李群李代数的简明教程,就翻译下来,有些地方翻译的可能不准,主要是作为一个学习记录. 文章目录 李群李代数 简明教程 2 ...

  9. 多视图几何的数学基础知识的掌握(2)--李群李代数

    文章目录 前言 多视图几何的数学基础知识的掌握(2)--李群李代数 三维重建的起源 三维欧式空间 叉乘与反对称阵 刚体运动 刚体运动的表示 旋转的指数坐标 李群$SO(3)$ 李群与李代数 李群定义 ...

最新文章

  1. Linux centos6.5 64下oracle10g_静默安装完整版
  2. 英文句子改写在线软件_试完这些英文论文写作辅助神器,你会发现新大陆der~...
  3. 统计消息总数_和公牛一战,库里创三个记录,耀眼的还是三分球总数
  4. python中的loop啥意思_python怎么进行loop
  5. python人工智能——深度学习——TensorFlow——图和会话
  6. CRM_ORGMAN_CHECK_OW
  7. P2261-[CQOI2007]余数求和【数论,约数】
  8. easyui动态显示和隐藏表头
  9. 12000.PAC19XX电源监测芯片
  10. Linux文件系统概述:硬盘驱动>通用块设备层>文件系统>虚拟文件系统(VFS)
  11. SystemCenter2012SP1实践(12)服务器、网络和存储配置
  12. 苹果的哪个软件能测试游戏帧率,王者荣耀90帧率差别不太大,苹果手机竟然可以体验90帧率...
  13. SpringBoot31 整合SpringJDBC、整合MyBatis、利用AOP实现多数据源
  14. 中图分类法----S 农业科学
  15. 大数据开发工程师招聘要求高吗?
  16. Python新手入门指导
  17. 【算法图解】第七章:7.5(狄克斯特拉算法优化版)
  18. js中如何遍历对象属性
  19. oracle新建用户并授权视图
  20. Spring Data MongoDB 多个条件或查询

热门文章

  1. c语言姚英语好吗,姚老师互动问答会 # 问题006:根据种子法则,我要学好英语就要先去教别人英语,那我自己还要不要继续学习呢?...
  2. 细胞计数原理matlab,细胞计数实验
  3. 〖Python自动化办公篇⑦〗- word文件自动化 - 实操之筛选简历
  4. c语言输入半径求扇形面积,怎么做扇形图表?
  5. 学会Zynq(5)GPIO中EMIO的使用方法
  6. 三菱MC协议_QnA-3E
  7. screen模式无法翻页,鼠标无法滚动问题
  8. Pocket英语语法---一、形容词性物主代词和名词性物主代词
  9. myeclipse的JS出现红叉叉解决方法
  10. release debug