1

I save the point clouds of a scene and its quaternion in a pcl file.

First, I've only used pose w.r.t to device start (see second image) to get the quaternion. I've discovered a drifting problem which I mentioned here.

  1. Therefore, I learned the scene with area learning (see first image) by walking around the table.
  2. After that, I'm loading the area description file (ADF) to overcome the drifting. I wait for the first loop closure/localization in the onPoseAvailable callback.
  3. Then in the onXyzIjAvailable callback I use its timestamp to get a valid pose w.r.t to the ADF origin (baseFrame = COORDINATE_FRAME_AREA_DESCRIPTION and targetFrame = COORDINATE_FRAME_DEVICE).
  4. And I save the poseAtTime(xyzIj.timestamp) and the xyzIj in a *.PCD file.

But, the drifting seems to get even worse (see third image). It's better oriented to the origin, but the point clouds aren't that close as in the image without adf.

Do I something wrong?

Is there any way to improve this?

scene origin

without adf

with adf

Community
  • 1
  • 1
bashbug
  • 556
  • 4
  • 16

1 Answers1

0

You should set up the pose callback such that only poses with respect to ADF base are returned - poses with respect to start of service should not be returned - drift will not go away, but it will become minimal and will autocorrect - the ADF needs to be well trained to keep up the pose return rate.

Mark Mullin
  • 1,340
  • 1
  • 9
  • 21
  • Of course, I go around the table until area learning recognizes almost always the scene. After that, I load that ADF, wait for one loop closure / localization in the onPoseAvailable callback. Then in the onXyzIjAvailable callback I use its timestamp to get a valid pose w.r.t to the ADF origin (baseFrame = COORDINATE_FRAME_AREA_DESCRIPTION and targetFrame = COORDINATE_FRAME_DEVICE) as mentioned. – bashbug Aug 01 '15 at 15:49
  • ah - thats the base and target I use, but I also force all poses to come back through onPoseAvailable - in other words, that call is not a signal to me that it has achieved localization, it is the only data channel over which I get poses – Mark Mullin Aug 01 '15 at 16:36
  • In the [area learning tutorial](https://developers.google.com/project-tango/apis/java/java-area-learning) is stated: "If an ADF was loaded, pose data is *only available after localization against the ADF* has occured and the origin will be the same as the loaded ADF. Otherwise, pose data will be available immediately after initialization and the origin will be the same as the start of service." Therefore I wait for the frist loop closure in the onPoseAvailable callback. And with getPoseAtTime(PointCloudTimestamp) I sync my point cloud with a pose. So, how do you sync a point cloud with a pose? – bashbug Aug 01 '15 at 18:56
  • I loose a couple but most come through fine - I understand the warning, and would add to it that with the mechanism I use pose return rate is a direct function of the quality of the ADF - I realize it may seem strange, but this is the exact mechanism I used to collect for data for this https://www.youtube.com/watch?v=gQgMh21X34k All other approaches had failed to control drift :-/ – Mark Mullin Aug 01 '15 at 19:14
  • What do you mean with "pose return rate"? I only ensure that the pose is valid with statusCode == TangoPoseData.POSE_VALID – bashbug Aug 02 '15 at 12:50
  • Evidence seems to show that the frequency of callbacks is dependent on the training quality - which makes sense, no training, no quality, no callbacks - I find, within a single room that a thorough training session leads to subsecond callbacks with minor, eventually corrected drift – Mark Mullin Aug 02 '15 at 14:36