personalrobotics / apriltags

ROS wrapper for the Apriltags visual fiducial tracker
BSD 2-Clause "Simplified" License
39 stars 37 forks source link

Evaluate Apriltags library implementations #19

Open psigen opened 8 years ago

psigen commented 8 years ago

(Continuation of @DavidB-CMU's analysis of #18)

This ROS node currently uses the SwatBotics implementation of the AprilTags algorithm. However, there are multiple implementations, with varying robustness and accuracy. @DavidB-CMU started an analysis of these different libraries, which we should use as the basis for a decision of which to support in our ROS wrapper.

psigen commented 8 years ago

From @DavidB-CMU's analysis at the PRL:

Spurious detections Our apriltags module detects phantom tags.

So I compared:

  1. apriltags (swatbotics / PRL) (old quad method)
  2. apriltags (swatbotics / PRL) (with CGAL)
  3. apriltags (M.Kaess / RIVeR-Lab)

Conclusions:

  • In our current setup, the tags "flash" (one type of jitter) due to using CGAL. However it is better at detecting tags that are almost perpendicular to the camera.
  • The "old method" gives smoother detections, but lots of crazy false detections.
  • 3 gives the best overall performance.

You can see that by watching these two videos together: https://vimeo.com/161911999 https://vimeo.com/161911998

...and for more amusing false detections: https://vimeo.com/161912000

psigen commented 8 years ago

From @DavidB-CMU's analysis at the PRL:

Flipped poses (another type of jitter) To solve the PNP problem, the apriltags module uses an OpenCV function that iteratively solves the homography using LM. It converges to a single solution.

  • I added an improved PNP method, being RPP (also called SP) by Schweighofer & Pinz. It does give more robust post detection (videos to come) but it's not perfect. There are still flipped/mirrored poses.
  • I noticed that the majority of the ambiguous poses are not adhering to a right-hand coordinate system w.r.t. to the tag. Maybe we can detect that situation?

@mkoval this is the problem we were discussing yesterday afternoon. The 4 corners of the tag are identified, but the z-axis is projected onto the 2D image plane in the wrong direction.

This video shows the pose flipping problem for one tag, and the result of filtering by enforcing the right-hand rule: https://vimeo.com/161912001

Here's the numbers from this tag's detection from two successive frames, where one detection is good, one is ambiguous due to only a 1 pixel difference.

image_pts = [577.5, 286.5; 606.5, 279.5; 584.5, 268.5; 556.5, 275.5]
rvec = [1.891421797227909; -0.4864662962491383; 0.2845612347145944]
x axis vector (normalized) = [0.971307, -0.23783]
y axis vector (normalized) = [-0.890488, -0.455006]
z axis vector (normalized) = [0.0339748, -0.999423]
--> axes are good
image_pts = [577.5, 286.5; 605.5, 279.5; 584.5, 268.5; 556.5, 275.5]
rvec = [-1.868579525379146; 0.7279747000248998; 0.6225501111304514]
x axis vector (normalized) = [0.970317, -0.241838]
y axis vector (normalized) = [-0.886224, -0.463257]
z axis vector (normalized) = [-0.0325935, 0.999469]
--> this violates the right-hand rule

Another video with multiple tags, showing 3 or 4 tags where the pose keeps flipping: https://vimeo.com/161912002

Lastly in this video I am trying to show that some tags appear to be more robust to large amounts of skew: https://vimeo.com/161914003

psigen commented 8 years ago

@DavidB-CMU: I think I extracted most of your experiments, did I miss anything?

YuehChuan commented 6 years ago

Thanks, the link is out of date. I am interested in this.