A LiDAR tf2 extrapolation error means the requested transform time falls outside the usable transform history for the required frame chain. Record the requested timestamp and the earliest or latest available timestamp before changing anything. Then determine whether the sensor and transform producers use comparable clocks, or whether correct transforms simply reach the listener too late.
Do not begin by increasing every queue or replacing stamped lookups with the latest transform. Those changes can suppress a visible error while applying a pose from the wrong time. A useful correction preserves the relationship between the LiDAR acquisition and the robot pose used to interpret it.
The sensor clock-check guide covers the broader synchronization problem. This diagnostic focuses on one narrower decision: whether an extrapolation comes from inconsistent time, unavailable transform history, or delivery and scheduling at the listener.

Turn the error into a timestamp worksheet
Keep the complete error text, source and target frames, sensor message stamp, lookup time, and the process reporting the failure. Record the relevant transform chain rather than only the sensor-to-base mounting transform. A valid static mounting relationship does not establish that the changing odometry or map relationship exists at the requested time.
The official tf2 time tutorial distinguishes a lookup at a specified time from a request for the latest available transform. A lookup at the current clock time can briefly ask for information newer than the listener has received. Treat that possibility as a hypothesis to test, not the explanation for every future-extrapolation error.
| Observation | Question to answer | Evidence to retain |
|---|---|---|
| Requested time is newer than available history | Wrong clock, future sensor stamp, or transform arrival delay? | Requested time, latest time, clock settings and arrival observations |
| Requested time is older than retained history | Delayed input, insufficient history, or replay mismatch? | Sensor age, oldest usable time and processing backlog |
| Frame chain is missing | Wrong names, disconnected frames, or absent publisher? | Frame graph and publisher identities |
| Failure follows replay reset | Did time jump while old state remained? | Playback mode, clock events and restart sequence |
Use the table to choose the next observation. Avoid assigning a universal acceptable gap: a small delay can matter to one consumer while another deliberately waits. Define the deadline and allowable data age from the robot application’s requirements before deciding that a timing difference is harmless.
Confirm clock domains before subtracting timestamps
Record the clock source for the LiDAR stamp, odometry or localization producer, transform broadcaster, and consuming node. Check whether device time is converted to host time, and whether the stamp refers to the first point, last point, or another acquisition event. A large apparent gap may be a unit or epoch mismatch rather than network latency.
The ROS 2 clock-and-time design distinguishes system, steady, and ROS time, including simulated time and time jumps. Inspect effective use_sim_time settings on the participating nodes and the intended /clock source. One replay consumer using wall time while another follows recorded time cannot be repaired by simply waiting longer.
Write down which comparisons are valid. Host-local elapsed measurements can characterize processing delay, but they do not automatically establish the relationship between a sensor’s internal clock and an estimator’s stamp. Preserve raw timestamps and document any conversion. Do not silently add an offset until the error disappears; explain how the offset was obtained and which clock relationship it represents.
Inspect the chain at the listener
The official tf2 debugging tutorial introduces tools including tf2_echo, tf2_monitor, and view_frames. Use their output to identify names, connectivity, update behavior, and timing clues. Check the command syntax for the installed distribution, and retain the commands alongside the results.
Observe the required frame pair from the environment where the consumer runs. A diagnostic tool on another host or container may receive a different stream or start with different history. Record domain, namespace, remapping, process startup order, and the identity of each transform publisher. Unexpected duplicate authorities deserve investigation before tuning timing parameters.
The tf2 introduction explains the relationship between frames over time. Use a complete chain worksheet to locate the first unavailable dynamic link. A successful latest lookup confirms something useful about connectivity, but does not prove that the chain is available at the sensor message’s historical timestamp.
Separate transport delay from callback delay
Compare when the sensor message and relevant transforms become observable with when the application attempts its lookup. If possible, instrument receipt, queue entry, callback start, and lookup result using clearly identified clocks. Keep the instrumentation lightweight and record its overhead limitations. Do not label a callback’s late execution as delayed network delivery without evidence at the transport boundary.
Inspect endpoint compatibility using the official ROS 2 QoS reference. Delivery depends on compatible offered and requested policies. If the sensor subscriber itself is silent, the LiDAR QoS diagnostic addresses that earlier boundary; it is distinct from receiving a cloud and failing to transform it.
Repeat a bounded run with the required workload, then remove one optional consumer if a scheduling hypothesis justifies that experiment. Preserve both results. The publish-rate workflow helps distinguish reception and publication from downstream use. An unchanged average rate does not establish that every message reaches the lookup before its deadline.

Choose a correction that matches the evidence
When clocks disagree, correct their documented relationship or configuration first. When transforms arrive shortly after a valid request, evaluate a bounded wait or transform-aware message gating appropriate to the consumer. When messages arrive older than retained history, investigate backlog and history requirements together. Each intervention should have a stated expected effect and a recorded result.
Keep buffer history, message queue depth, and lookup wait distinct. More retained history can help a legitimate older lookup but cannot produce future transforms. A larger queue may retain useful messages or merely deliver stale ones later. A longer wait must still fit the application’s deadline and execution model. Test the resulting behavior instead of declaring success because one log line vanished.
For replay, preserve sensor messages, dynamic and static transforms, clock behavior, and the launch sequence required by the test. The recording checklist helps retain acquisition context. Include a restart or time-reset trial when the failure originally followed that event, and distinguish live-hardware acceptance from replay acceptance.
Repeat the startup sequence as well as an already-running test. Record when the listener begins receiving transforms and when the first sensor callback requests them. A correction that works after the buffer fills may still leave the original cold-start failure unresolved.
What closes the investigation?
Retain the original failing worksheet, the one controlled correction, and a repeatable passing run under the required workload. Define success as correct stamped transforms and acceptable application behavior, not just an empty error log. Package the evidence using the reproducible support bundle if the failing boundary remains uncertain.
Should every lookup use the latest transform?
No. Latest-time lookups are useful for specific tasks and connectivity tests. They change the question asked; they do not demonstrate that a cloud was interpreted using the pose corresponding to its acquisition time.
Does future extrapolation prove the LiDAR clock is wrong?
No. A future sensor stamp is one possibility. Delayed transforms, startup timing, inconsistent replay clocks, and listener scheduling can create a similar observation. Compare the requested time with the available chain before choosing a correction.

