0


点云配准--gicp原理与其在pcl中的使用

文章目录

总结:gicp引入了概率信息(使用协方差阵),提出了icp的统一模型,既可以解释点到点和点到面的icp,也在新模型理论的基础上,提出了一种面到面的icp。

论文原文:《Generalized-ICP》

gicp统一模型(Generalized-ICP)

在概率模型中假设存在配准中两个点集,

  1. A
  2. ^
  3. =
  4. {
  5. a
  6. i
  7. ^
  8. }
  9. \hat{A}=\left\{\hat{a_{i}}\right\}
  10. A^={ai​^​} and
  11. B
  12. ^
  13. =
  14. {
  15. b
  16. i
  17. ^
  18. }
  19. \hat{B}=\left\{\hat{b_{i}}\right\}
  20. B^={bi​^​},并且假设
  21. A
  22. A
  23. A and
  24. B
  25. B
  26. B 分别服从
  27. a
  28. i
  29. N
  30. (
  31. a
  32. i
  33. ^
  34. ,
  35. C
  36. i
  37. A
  38. )
  39. a_{i} \sim \mathcal{N}\left(\hat{a_{i}}, C_{i}^{A}\right)
  40. ai​∼N(ai​^​,CiA​)and
  41. b
  42. i
  43. N
  44. (
  45. b
  46. ^
  47. i
  48. ,
  49. C
  50. i
  51. B
  52. )
  53. b_{i} \sim \mathcal{N}\left(\hat{b}_{i}, C_{i}^{B}\right)
  54. bi​∼N(b^i​,CiB​)正态分布.
  55. {
  56. C
  57. i
  58. A
  59. }
  60. \left\{C_{i}^{A}\right\}
  61. {CiA​} and
  62. {
  63. C
  64. i
  65. B
  66. }
  67. \left\{C_{i}^{B}\right\}
  68. {CiB​} 分别是点对应的协方差阵. 我们假设以及匹配完成,假设变换矩阵为
  69. T
  70. \mathbf{T}^{*}
  71. T∗, 因此:
  72. b
  73. ^
  74. i
  75. =
  76. T
  77. a
  78. ^
  79. i
  80. (1)
  81. \hat{b}_{i}=\mathbf{T}^{*} \hat{a}_{i}\tag{1}
  82. b^i​=Ta^i​(1)

对于变换矩阵,

  1. T
  2. \mathbf{T}
  3. T , 定义误差量
  4. d
  5. i
  6. (
  7. T
  8. )
  9. =
  10. b
  11. i
  12. T
  13. a
  14. i
  15. d_{i}^{(\mathbf{T})}= b_{i}-\mathbf{T} a_{i}
  16. di(T)​=bi​−Tai​, 因为假设
  17. a
  18. i
  19. a_{i}
  20. ai and
  21. b
  22. i
  23. b_{i}
  24. bi 服从正态分布(NDT也是假设服从正态分布), 因此
  25. d
  26. i
  27. (
  28. T
  29. )
  30. d_{i}^{\left(\mathrm{T}^{*}\right)}
  31. di(T∗)​ 也服从正态分布:
  32. d
  33. i
  34. (
  35. T
  36. )
  37. N
  38. (
  39. b
  40. ^
  41. i
  42. (
  43. T
  44. )
  45. a
  46. ^
  47. i
  48. ,
  49. C
  50. i
  51. B
  52. +
  53. (
  54. T
  55. )
  56. C
  57. i
  58. A
  59. (
  60. T
  61. )
  62. T
  63. )
  64. =
  65. N
  66. (
  67. 0
  68. ,
  69. C
  70. i
  71. B
  72. +
  73. (
  74. T
  75. )
  76. C
  77. i
  78. A
  79. (
  80. T
  81. )
  82. T
  83. )
  84. (2)
  85. \begin{aligned} d_{i}^{\left(\mathbf{T}^{*}\right)} & \sim \mathcal{N}\left(\hat{b}_{i}-\left(\mathbf{T}^{*}\right) \hat{a}_{i}, C_{i}^{B}+\left(\mathbf{T}^{*}\right) C_{i}^{A}\left(\mathbf{T}^{*}\right)^{T}\right) \\ &=\mathcal{N}\left(0, C_{i}^{B}+\left(\mathbf{T}^{*}\right) C_{i}^{A}\left(\mathbf{T}^{*}\right)^{T}\right) \end{aligned}\tag{2}
  86. di(T∗)​​∼N(b^i​−(T∗)a^i​,CiB​+(T∗)CiA​(T∗)T)=N(0,CiB​+(T∗)CiA​(T∗)T)​(2)

使用最大似然估计( MLE)计算

  1. T
  2. \mathbf{T}
  3. T
  4. T
  5. =
  6. argmax
  7. T
  8. i
  9. p
  10. (
  11. d
  12. i
  13. (
  14. T
  15. )
  16. )
  17. =
  18. argmax
  19. T
  20. i
  21. log
  22. (
  23. p
  24. (
  25. d
  26. i
  27. (
  28. T
  29. )
  30. )
  31. )
  32. (3)
  33. \mathbf{T}=\underset{\mathbf{T}}{\operatorname{argmax}} \prod_{i} p\left(d_{i}^{(\mathrm{T})}\right)=\underset{\mathbf{T}}{\operatorname{argmax}} \sum_{i} \log \left(p\left(d_{i}^{(\mathrm{T})}\right)\right)\tag{3}
  34. T=Targmaxi∏​p(di(T)​)=Targmaxi∑​log(p(di(T)​))(3)

进一步简化为:(这里从最大似然估计推导,具体过程需要研究)

  1. T
  2. =
  3. argmin
  4. T
  5. i
  6. d
  7. i
  8. (
  9. T
  10. )
  11. T
  12. (
  13. C
  14. i
  15. B
  16. +
  17. T
  18. C
  19. i
  20. A
  21. T
  22. T
  23. )
  24. 1
  25. d
  26. i
  27. (
  28. T
  29. )
  30. (4)
  31. \mathbf{T}=\underset{\mathrm{T}}{\operatorname{argmin}} \sum_{i} d_{i}^{(\mathbf{T})^{T}}\left(C_{i}^{B}+\mathbf{T} C_{i}^{A} \mathbf{T}^{T}\right)^{-1} d_{i}^{(\mathbf{T})}\tag{4}
  32. T=Targmini∑​di(T)T​(CiB​+TCiATT)−1di(T)​(4)

当:

  1. C
  2. i
  3. B
  4. =
  5. I
  6. C
  7. i
  8. A
  9. =
  10. 0
  11. (5)
  12. C_{i}^{B} = I \\ C_{i}^{A} = 0\tag{5}
  13. CiB​=ICiA​=0(5)

就得到标准ICP:

  1. T
  2. =
  3. argmin
  4. T
  5. i
  6. d
  7. i
  8. (
  9. T
  10. )
  11. T
  12. d
  13. i
  14. (
  15. T
  16. )
  17. =
  18. argmin
  19. T
  20. i
  21. d
  22. i
  23. (
  24. T
  25. )
  26. 2
  27. (6)
  28. \begin{aligned} \mathbf{T} &=\underset{\mathbf{T}}{\operatorname{argmin}} \sum_{i} d_{i}^{(\mathrm{T})^{T}} d_{i}^{(\mathrm{T})} \\ &=\underset{\mathbf{T}}{\operatorname{argmin}} \sum_{i}\left\|d_{i}^{(\mathrm{T})}\right\|^{2} \end{aligned}\tag{6}
  29. T​=Targmini∑​di(T)Tdi(T)​=Targmini∑​∥∥∥​di(T)​∥∥∥​2​(6)

当:

  1. C
  2. i
  3. B
  4. =
  5. P
  6. i
  7. 1
  8. C
  9. i
  10. A
  11. =
  12. 0
  13. (7)
  14. \begin{aligned} C_{i}^{B} &=\mathbf{P}_{\mathbf{i}}^{-1} \\ C_{i}^{A} &=0 \end{aligned}\tag{7}
  15. CiBCiA​​=Pi1​=0​(7)

得到点到面的ICP:

  1. T
  2. =
  3. argmin
  4. T
  5. {
  6. i
  7. P
  8. i
  9. d
  10. i
  11. 2
  12. }
  13. (8)
  14. \mathbf{T}=\underset{\mathbf{T}}{\operatorname{argmin}}\left\{\sum_{i}\left\|\mathbf{P}_{\mathbf{i}} \cdot d_{i}\right\|^{2}\right\}\tag{8}
  15. T=Targmin​{i∑​∥Pi​⋅di​∥2}(8)

plane to plane ICP(gicp:相对于点到点和点到面加入概率模型(协方差阵))

点到平面算法的做法是,假设点云具有平面特征,这意味着在3D空间处理采样2D流形。
由于现实世界的曲面至少是分段可微的,我们可以假设我们的数据集是局部平面的。此外,由于我们从两个不同的角度对流形进行采样,因此通常不会对完全相同的点进行采样(即,对应关系永远不会是精确的)。
本质上,每个测量点仅提供沿其曲面法线的约束。为了对这种结构进行建模,我们考虑每个采样点沿其局部平面以高协方差分布,而在曲面法线方向(垂直于平面方向)以极低协方差分布(即点云分布在局部平面上)。假设局部拟合平面上某一点的法向量e1是沿X轴的,链接1,则该点协方差矩阵变为:

  1. (
  2. ϵ
  3. 0
  4. 0
  5. 0
  6. 1
  7. 0
  8. 0
  9. 0
  10. 1
  11. )
  12. (9)
  13. \left(\begin{array}{lll} \epsilon & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array}\right)\tag{9}
  14. ⎝⎛​ϵ00010001​⎠⎞​(9)
  15. ϵ
  16. \epsilon
  17. ϵ是沿着法线方向极小的常数。

因为实际上法向量并不一定是沿x轴方向,所以需要进行坐标转换。假设

  1. b
  2. i
  3. ,
  4. a
  5. i
  6. b_i,a_i
  7. bi​,ai​对应的法向量分别为
  8. u
  9. i
  10. ,
  11. v
  12. i
  13. u_i,v_i
  14. ui​,vi​,则它们对应的协方差阵为:
  15. C
  16. i
  17. B
  18. =
  19. R
  20. μ
  21. i
  22. (
  23. ϵ
  24. 0
  25. 0
  26. 0
  27. 1
  28. 0
  29. 0
  30. 0
  31. 1
  32. )
  33. R
  34. μ
  35. i
  36. T
  37. C
  38. i
  39. A
  40. =
  41. R
  42. ν
  43. i
  44. (
  45. ϵ
  46. 0
  47. 0
  48. 0
  49. 1
  50. 0
  51. 0
  52. 0
  53. 1
  54. )
  55. R
  56. ν
  57. i
  58. T
  59. \begin{array}{l} C_{i}^{B}=\mathbf{R}_{\mu_{i}} \cdot\left(\begin{array}{ccc} \epsilon & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array}\right) \cdot \mathbf{R}_{\mu_{i}}^{T} \\ C_{i}^{A}=\mathbf{R}_{\nu_{i}} \cdot\left(\begin{array}{ccc} \epsilon & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array}\right) \cdot \mathbf{R}_{\nu_{i}}^{T} \end{array}
  60. CiB​=Rμi​​⋅⎝⎛​ϵ00010001​⎠⎞​⋅RμiTCiA​=Rνi​​⋅⎝⎛​ϵ00010001​⎠⎞​⋅RνiT​​
  61. R
  62. ν
  63. i
  64. \mathbf{R}_{\nu_{i}}
  65. Rνi​​为e1vi旋转矩阵。

上述协方差计算过程可以表述如下图,链接2:

确定协方差阵后利用公式(4)即为plane to plane ICP或者叫GICP。
这里其实就是怎么确定协方差阵。
显然可以通过pca计算协方差阵(代替上述求解过程):

  1. C
  2. =
  3. 1
  4. N
  5. i
  6. =
  7. 1
  8. N
  9. (
  10. p
  11. i
  12. p
  13. ˉ
  14. )
  15. (
  16. p
  17. i
  18. p
  19. ˉ
  20. )
  21. T
  22. C=\frac{1}{N} \cdot \sum_{i=1}^{N} \cdot\left(p_{i}-\bar{p}\right) \cdot\left(p_{i}-\bar{p}\right)^{T}
  23. C=N1​⋅i=1N​⋅(pi​−pˉ​)⋅(pi​−pˉ​)T

pca求解时要注意公式(4)对协方差有个求逆过程,需要注意当协方差阵奇异时,用微小量替代0值(类似NDT中处理方式)。

PCL中GICP代码应用

  1. #include<pcl/point_types.h>#include<pcl/point_cloud.h>#include<pcl/registration/gicp.h>intgicp(const pcl::PointCloud<pcl::PointXYZ>::Ptr src_cloud,const pcl::PointCloud<pcl::PointXYZ>::Ptr tgt_cloud,
  2. pcl::PointCloud<pcl::PointXYZ>::Ptr transformed_source){
  3. pcl::GeneralizedIterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> gicp;
  4. gicp.setInputSource(src_cloud);
  5. gicp.setInputTarget(tgt_cloud);//gicp.setMaximumIterations(max_iter);
  6. gicp.align(*transformed_source);return1;}

本文转载自: https://blog.csdn.net/xinxiangwangzhi_/article/details/125236953
版权归原作者 xinxiangwangzhi_ 所有, 如有侵权,请联系我们删除。

“点云配准--gicp原理与其在pcl中的使用”的评论:

还没有评论