-
Notifications
You must be signed in to change notification settings - Fork 551
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Question about removal of the Center Of Mass in Point-To-Plane ICP #507
Comments
Hi @YoshuaNava ,
Cheers! |
Hi @pomerlef, Thank you for your prompt reply 🙂 My motivation for digging into this topic is because I noticed (empirically) that libpointmatcher's Point-To-Plane ICP implementation shows a high degree of sensitivity to the position of the map origin relative to where we are localizing. During my investigations I implemented a rotation-only version of Point-To-Plane ICP, and I observed how, the closer to the origin (and the lower the norm of the reference CoM), the more accurate the rotations were estimated, and the larger rotations it could handle. Conversely, I also observed how, the farther we are from the origin, the higher the likelihood that the estimated rotation affects the translation component in an unexpected way. My hypothesis is that the CoM computation could be reducing the basin of convergence of P2P ICP the farther away from the origin the CoM is.
Sure thing 🤘 I made a short summary of different approaches, from libraries and papers. Review of Libraries (Click to display)LibrariesIn this section I'll include screenshots of the code and links to the code block, because GitHub does not support rendering Permalinks as code quotations across different repos. PCL ⛔The computation of the Point-To-Plane Error does not consider the CoM: Open3D ⛔The computation of the Point-To-Plane Error does not consider the CoM: KissICP ⛔The computation of the Point-To-Point Error does not consider the CoM: OpenCV Surface Matching module ✅The computation of the Point-To-Plane Error considers the CoM. Steps followed:
Cilantro ✅The computation of the Point-To-Plane Error considers the CoM. Steps followed:
Link to code from step 1 Trimesh2's implementation of Symmetric Point-To-Plane ICP ✅Trimesh2 is a library implemented by Szymon Rusinkiewicz, one of the authors of Normal-Space Sampling and Symmetric P2P ICP. It is hosted on his website, but I found a recent fork on Github. The computation of the Point-To-Plane Error considers the CoM. Steps followed:
Link to code from step 1 Review of Papers (Click to display)PapersGeometrically Stable Sampling for the ICP Algorithm - Gelfand et al (Link)In section 3.1 "A Measure of Stability", the mention that: "However, the part of the transformation vector Note that Trimesh2 implements the normalization proposed by this paper ❗ Improvements to the ICP Algorithm for Shape Registration in Manufacturing - Kwok et al (Link)In section 4.1 "Rotation center" they describe that: "As rotation is a geometric operation turning around a center, the analysis can give a correct result only when a correct center is given. The rotational component in Eq.(2) can be rewritten as where Analysis of Libpointmatcher (Click to display)Analysis of LibpointmatcherPoint-To-Point ICP ❓The computation of the Point-To-Point Error considers the CoM. Steps followed:
https://github.com/ethz-asl/libpointmatcher/blob/e45710b421f757d7eadbf03cd93cb12e698098f8/pointmatcher/ErrorMinimizers/PointToPoint.cpp#L70-L72 As mentioned in #507 (comment), subtracting the mean is part of the classic solution to this problem.
|
@pomerlef I implemented unit tests for ICP conditioning, as well as a fix. In order to test the conditioning of the registration pipeline I put together new code, and I would like to submit a PR. To do that, I would like to know your opinion on where we should store new functionality. I follow the practice of 'shifting discussions to the left' (discussing design before submitting PRs, the 'what'), so that reviews can focus on the implementation (the 'how') Some of the utilities I implemented are targeted to:
Would you like me to add these utilities? If yes, should I do so under the Thank you in advance. |
Background
I'm debugging some behavior of Point-To-Plane ICP, which seems to estimate large rotations much better when
This seems to increase the basin of convergence for rotations, and I can get up to 30-40° pure rotation estimations in one ICP call.
I checked different point cloud libraries such as PCL, Open3D, KissICP, OpenCV, as well as Cilantro, and every implementation seems to handle this aspect differently. I also digged a bit through Libpointmatcher's commit history, and found two mentions (1, 2) but no more details.
Questions
Thank you in advance 🙏
Best,
Yoshua Nava
The text was updated successfully, but these errors were encountered: