Sudden Position Jumps in Odometry Output During Mapping (ROS2 / S3E Dataset)
Environment
- ROS2 Jazzy (Ubuntu 24.04)
- LIO-SAM (latest
ros2 branch)
- Dataset: S3E Campus Road 1 — Scout Mini UGV (stereo + LiDAR + IMU)
- IMU: internal UGV IMU, 200 Hz
- LiDAR: 3D spinning LiDAR, 10 Hz
- CPU-only inference, no GPU involvement in SLAM
Description
When running LIO-SAM on the S3E Campus Road 1 sequence, the estimated trajectory exhibits sudden discontinuous position jumps — instantaneous large displacements in the published /lio_sam/mapping/odometry topic that do not correspond to any real motion in the sequence.
These jumps are distinct from gradual drift: the pose is stable for extended periods (tens of seconds), then snaps by several meters in a single publish cycle, before continuing to track normally.
Observed Behavior
- Odometry publishes normally at expected frequency (~10 Hz, tied to LiDAR scan rate)
- At unpredictable intervals, a single frame produces a position delta inconsistent with IMU-predicted motion (e.g., >1.5 m in a single step at low vehicle speed)
- The jump is not corrected in subsequent frames — the trajectory continues from the new (incorrect) pose
- The covariance published in the odometry message does not inflate to reflect the jump
- Behavior persists regardless of
mappingSurfLeafSize, surroundingKeyframeSize, or loop closure settings
Suspected Cause
The jumps appear correlated with moments of degenerate scan-matching — featureless or repetitive LiDAR environments (long straight corridors, open plazas) where the point cloud registration becomes under-constrained. In these regions, the optimization likely converges to a local minimum far from the IMU-predicted prior, and the result is accepted without sufficient rejection logic.
Additionally, when two independent nodes subscribe to /odometry/imu_incremental (e.g., in multi-node launch configurations), a race condition can cause the IMU preintegration buffer to desynchronize, weakening the IMU prior that should constrain scan matching. This was observed when running a duplicate imuPreintegration node inadvertently — the /odometry/imu_incremental topic intermittently dropped, removing the IMU constraint entirely at critical moments.
Steps to Reproduce
- Launch LIO-SAM with the S3E Campus Road 1 rosbag (Alpha/UGV namespace)
- Play the bag at 1× speed
- Monitor
/lio_sam/mapping/odometry via ros2 topic echo or rviz2
- Observe the trajectory around t ≈ 80–120 s where the environment becomes geometrically repetitive
- Sudden jumps of 1–3 m appear with no corresponding IMU spike
Expected Behavior
Odometry should degrade gracefully in degenerate scan-matching conditions — either by:
- Increasing pose covariance to signal low confidence, or
- Falling back to IMU-only propagation when the point cloud registration residual exceeds a threshold
A jump of >N cm/frame (tunable) at a given speed should trigger a degeneracy flag rather than being silently accepted.
Suggested Fix / Feature Request
- Degeneracy detection: expose the eigenvalue-based degeneracy flag (already partially computed internally in
mapOptimization.cpp) as a published topic (e.g., /lio_sam/mapping/degenerate) so downstream nodes can react
- Jump rejection: add a configurable
maxPositionJumpMeters parameter; if the scan-matching result exceeds this threshold relative to the IMU prior, reject the result and propagate IMU only for that frame
- Covariance inflation: inflate the output odometry covariance when degeneracy is detected, making the signal meaningful for fusion pipelines
Additional Context
This was encountered in the context of a multi-modal SLAM fusion pipeline (LIO-SAM + ORB-SLAM3 + attention-based transformer fusion) where undetected LIO-SAM jumps corrupt the cross-modal consistency metric used by the fusion layer. A downstream health monitor had to be implemented to catch these jumps heuristically, which ideally should not be necessary.
Any guidance on whether jump rejection is planned, or if there is an existing parameter to tune this behavior, would be appreciated.

Sudden Position Jumps in Odometry Output During Mapping (ROS2 / S3E Dataset)
Environment
ros2branch)Description
When running LIO-SAM on the S3E Campus Road 1 sequence, the estimated trajectory exhibits sudden discontinuous position jumps — instantaneous large displacements in the published
/lio_sam/mapping/odometrytopic that do not correspond to any real motion in the sequence.These jumps are distinct from gradual drift: the pose is stable for extended periods (tens of seconds), then snaps by several meters in a single publish cycle, before continuing to track normally.
Observed Behavior
mappingSurfLeafSize,surroundingKeyframeSize, or loop closure settingsSuspected Cause
The jumps appear correlated with moments of degenerate scan-matching — featureless or repetitive LiDAR environments (long straight corridors, open plazas) where the point cloud registration becomes under-constrained. In these regions, the optimization likely converges to a local minimum far from the IMU-predicted prior, and the result is accepted without sufficient rejection logic.
Additionally, when two independent nodes subscribe to
/odometry/imu_incremental(e.g., in multi-node launch configurations), a race condition can cause the IMU preintegration buffer to desynchronize, weakening the IMU prior that should constrain scan matching. This was observed when running a duplicateimuPreintegrationnode inadvertently — the/odometry/imu_incrementaltopic intermittently dropped, removing the IMU constraint entirely at critical moments.Steps to Reproduce
/lio_sam/mapping/odometryviaros2 topic echoorrviz2Expected Behavior
Odometry should degrade gracefully in degenerate scan-matching conditions — either by:
A jump of >N cm/frame (tunable) at a given speed should trigger a degeneracy flag rather than being silently accepted.
Suggested Fix / Feature Request
mapOptimization.cpp) as a published topic (e.g.,/lio_sam/mapping/degenerate) so downstream nodes can reactmaxPositionJumpMetersparameter; if the scan-matching result exceeds this threshold relative to the IMU prior, reject the result and propagate IMU only for that frameAdditional Context
This was encountered in the context of a multi-modal SLAM fusion pipeline (LIO-SAM + ORB-SLAM3 + attention-based transformer fusion) where undetected LIO-SAM jumps corrupt the cross-modal consistency metric used by the fusion layer. A downstream health monitor had to be implemented to catch these jumps heuristically, which ideally should not be necessary.
Any guidance on whether jump rejection is planned, or if there is an existing parameter to tune this behavior, would be appreciated.