Odom/map tf seems to be moving alone when magni is stopped => is it the expected behavior?

I noticed in rviz that magni seems to be “floating” even though zero Twist commands are issued and magni does not move at all.

Looking at rosrun tf tf_echo odom map i see that it is indeed changing…

ubuntu@magni02:~$ rosrun tf tf_echo odom map
At time 1535981571.745
- Translation: [0.032, 0.164, 0.000]
- Rotation: in Quaternion [0.000, 0.000, 1.000, 0.021]
            in RPY (radian) [-0.000, -0.000, 3.100]
            in RPY (degree) [-0.000, -0.000, 177.594]
At time 1535981572.146
- Translation: [0.050, 0.166, 0.000]
- Rotation: in Quaternion [0.000, 0.000, 1.000, 0.022]
            in RPY (radian) [-0.000, -0.000, 3.098]
            in RPY (degree) [-0.000, -0.000, 177.516]
At time 1535981572.999
- Translation: [0.050, 0.169, 0.000]
- Rotation: in Quaternion [0.000, 0.000, 1.000, 0.021]
            in RPY (radian) [-0.000, -0.000, 3.099]
            in RPY (degree) [-0.000, -0.000, 177.536]
...

Assuming translation units are meters, that seems to be significant. typically values on X/Y seems to be randomly moving in a 5cm window.
theta (z angular) seems to be flying in a 0.1~0.2 degree windows. i’ve often heard that precision on theta was basically making or killing the deal in odometry.

Is this the expected behavior ?

This is expected behavior, as there is no filtering on the output of fiducials.

The map->odom tf is published from fiducial_slam as an adjustment to wheel odometery (odom->base_link).

+/-5cm noise is pretty normal behavior, with as high as +/-10cm being the ‘expected’ range.
± 0.5 degree noise is also in this expected range.

i’ve often heard that precision on theta was basically making or killing the deal in odometry.

This is true for accumulative odometery systems (like wheel encoder based), where if you move 10m with a 1 degree error, you are now ~20cm off.

For fiducial based slam, new position estimates don’t accumulate error from previous measurements, so as you move with that angular error the system will continuously compute the new position of the robot. This means that accumulated positional error due to angular error never develops.

Of course with no smoothing or filtering, any noise from camera measurements directly creates noise in pose estimates. Adding filtering is a next step for us, and we hope to implement it soon.

Rohan

ok. so once i get the navigation to work with fiduciuals, I should be fine.

In order to get current position of the robot (so that I can create my own waypoints for later replay)

Should I then use rosrun tf tf_echo odom map and then read the x,y,theta from there?
Or should i use another ros command? which one then?

You want rosrun tf tf_echo map base_link as base_link is the central frame of the robot. Odom is an intermediary frame that is only useful for short local referencing that cannot tolerate jump discontinuities (like moving 50cm forward).

Rohan