Odometry is the use of data from motion sensors to estimate change in position over time.
You might want to consult Reference Frame.
- When you first start up the robot, the
base_linkframe and the
odomframe are in the same position. As the robot moves, the
- The implementation of the Transformation can be found in
The coordinate frame called odom is a world-fixed frame. The pose of a mobile platform in the odom frame can drift over time, without any bounds. This drift makes the odom frame useless as a long-term global reference. However, the pose of a robot in the odom frame is guaranteed to be continuous, meaning that the pose of a mobile platform in the odom frame always evolves in a smooth way, without discrete jumps.
In a typical setup the odom frame is computed based on an odometry source, such as wheel odometry, visual odometry or an inertial measurement unit.
The odom frame is useful as an accurate, short-term local reference, but drift makes it a poor frame for long-term reference.
So the dead recknoning stuff directly publishes to
/odom. What happens you you use slam_toolbox or like a particle filter is not that they overwrite to the
/odomtopic. Rather, they update the tf2 tree between the
base_link. This is why when you open up Rviz, the laser scans seem to snap back, because the transforms are constantly updated.
Check out this article, which has some useful information.
In a world when there is no odometry drift, you would only need to publish a transform once between
It is important to note that the
odom frame is a local frame of reference and its position and orientation estimates are subject to drift over time due to errors in sensor measurements and the accumulation of noise in the odometry estimate.
For this reason, SLAM algorithms are often used to correct for the drift and obtain a more accurate estimate of the robot’s position and orientation in a global reference frame such as the
header: stamp: sec: 1681316339 nanosec: 427119036 frame_id: odom child_frame_id: base_link pose: pose: position: x: 7.3203229904174805 y: 7.190346717834473 z: 0.4300275146961212 orientation: x: 0.02042497508227825 y: -0.003127265488728881 z: 0.9927870631217957 w: 0.11809687316417694 covariance: '<array type: double>' twist: twist: linear: x: 0.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0 covariance: '<array type: double>' ---
At work, I had the Create3 publishing bad odometry information. Everything seemed inverted.
Differential Drive Odometry
For a Differential Drive, these are the equations that it boils down to for how we derive our positions: