LiDAR–camera extrinsic calibration in cold storage environments

Thermal contraction shifts extrinsic parameters by 0.5–2mm over a 40°C range. Here's how the PathVynt fusion runtime handles this drift.

Checkerboard calibration target in a cold storage warehouse with LiDAR point cloud overlay

Cold storage warehouses run between -25°C and 0°C depending on the zone. Most robotics engineers designing for these environments think carefully about battery performance, motor lubrication, and display visibility. Fewer think carefully about what happens to the extrinsic calibration between their LiDAR and camera when the robot drives from a loading dock at 15°C into a -18°C freezer corridor and back again, six times a shift.

The answer, if you haven't measured it, is: more than you'd expect.

The thermal calibration problem

Extrinsic calibration defines the rigid-body transform between your LiDAR frame and your camera frame — the rotation matrix and translation vector that lets you project a 3D LiDAR point onto the camera image plane, or backproject a camera feature into LiDAR coordinates. It's typically computed once using a checkerboard target and stored as a static parameter in your launch configuration.

The problem: that calibration was measured at one temperature. At a different temperature, the bracket holding your LiDAR and camera has expanded or contracted. Aluminum has a coefficient of thermal expansion of approximately 23 µm/m·°C. A 200mm aluminum mounting arm spanning -25°C to +15°C — a 40°C swing — contracts by about 0.18mm. That's a 0.18mm lateral offset between the LiDAR and camera optical centers. Applied to a LiDAR-camera fusion at 5m range, 0.18mm of bracket contraction translates to roughly 0.2° of angular misalignment, which at 5m range produces a reprojection error of approximately 17mm.

17mm sounds small. For a warehouse AMR at 5m range trying to detect the legs of a loaded pallet jack (leg diameter ~40mm), it means your fused point cloud and your camera image are offset by nearly half the target width. Your pedestrian classifier is looking at the wrong patch of the image for depth information. Your occupancy grid cells near that detection boundary will have uncertain occupancy state, inflating your safety margin and reducing throughput.

Measuring the drift

To characterize the problem in a controlled way, we mounted an Ouster OS1-16 and an Intel RealSense D435 on a fixed aluminum bracket and drove the assembly through a temperature-controlled chamber from +20°C to -22°C and back in two-hour cycles. We extracted the extrinsic transform at each temperature checkpoint using a checkerboard target placed at 3m, and tracked translation error in the X and Y axes relative to the +20°C baseline.

Results: the X-axis (horizontal) translation error grew monotonically from 0 at baseline to 1.4mm at -22°C. The Y-axis error was smaller — about 0.6mm at the same temperature — due to the mounting geometry. The rotation component was negligible (under 0.05°). Total reprojection error at 5m range at the lowest temperature: approximately 14mm.

Importantly, the drift was hysteretic. After returning to +20°C, the calibration did not immediately recover. Residual stress in the bracket mounting screws held the assembly slightly off-center for 15–20 minutes. For a robot cycling in and out of a freezer every 20 minutes, this means the extrinsic is almost never at its baseline value in either thermal state.

Runtime correction approach

PathVynt's fusion engine handles this with a two-stage approach. First, during fusion initialization, the engine estimates a temperature-parameterized drift model if a thermal sensor is available on the robot chassis (common on Jetson platforms). The model is a simple linear function of temperature relative to calibration temperature, parameterized by the bracket's nominal thermal expansion coefficient and mounting arm length. You configure both values in FusionConfig.drift_model.

Second, at runtime, the engine maintains a continuously-estimated extrinsic correction on top of the static calibration. This correction is updated using a Kalman filter that observes feature correspondences between the fused LiDAR scan and the camera image. When a scene contains stable features — rack uprights, wall corners, floor reflectivity patterns — the filter converges quickly (typically within 3–5 scan cycles at 10Hz). In featureless corridors, the correction decays toward the thermal model estimate rather than toward zero, preventing cold-start drift from accumulating unchecked.

The correction output is available as FusionFrame.extrinsic_correction — a 4×4 SE(3) matrix. If your pipeline logs this value, you can build a thermal drift profile for your specific hardware without running a separate calibration campaign.

Configuration parameters

For a cold-storage deployment, the relevant FusionConfig parameters are:

  • drift_model: set to COLD_STORAGE for environments below -15°C. This pre-seeds the correction prior with a tighter temperature-expansion coefficient than the default WAREHOUSE_INDOOR model.
  • thermal_sensor_topic: if your Jetson publishes its SoC temperature, this lets the drift model track ambient thermal state as a proxy. Accuracy improves substantially when this is set.
  • correction_convergence_hz: default 10Hz. In extremely low-feature environments (empty freezer corridors), reduce to 5Hz to avoid false convergence on moving targets.
  • temporal_gap_tolerance_ms: widen from the default 15ms to 25ms for Jetson Orin NX deployments in cold environments, where LPDDR5 memory latency increases by ~8% below -10°C.

One thing PathVynt does not do: it does not automatically recalibrate using a checkerboard target in the scene. That capability exists in offline tools and requires a stationary robot in front of a known target. The runtime correction handles the incremental drift that accumulates between planned calibration events — not a replacement for proper initial calibration at operating temperature.

If you're planning a cold-storage deployment and haven't calibrated your sensors at the actual operating temperature, do that first. Bring the robot to temperature, let it sit for 20 minutes, then run your calibration procedure. PathVynt's runtime correction will then manage the residual drift with a much tighter prior — significantly improving convergence speed and accuracy.

Questions about configuring PathVynt for your specific cold-storage environment: email [email protected].