All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Global-LVBA Export Mode: Body-frame PCD and image export for post-processing with Global-LVBA.
pcd_save.type: 0 = world frame (default), 1 = body frame (required for Global-LVBA).image_save.img_save_en/image_save.interval: Save undistorted camera images per VIO frame.- Per-frame pose files in TUM format:
Log/pcd/lidar_poses.txt,Log/image/image_poses.txt.
- Ouster OS1-128 Support: Updated point struct registration in
preprocess.hto match the currentouster-rosdriver format (uint16_t ring,signal,near_ir; removedintensityandambient). - ARM Build Flags:
CMakeLists.txtnow detects CPU architecture and applies optimized compiler flags:- aarch64 (Jetson Orin NX, RK3588):
-O3 -mcpu=native -mtune=native -ffast-math - ARM 32-bit: adds
-mfpu=neon - x86-64:
-O3 -march=native -mtune=native -funroll-loops
- aarch64 (Jetson Orin NX, RK3588):
- 2026 AGT Aussen Dataset Config:
config/2026_agt_aussen.yamlandconfig/camera_2026_agt_aussen.yamlfor Ouster OS1-128 + camera rig with iKalibr calibration. - IMU Init Retry Logic: Extended motion-detection during IMU initialization with configurable retry count (
max_init_retries_, default 5). After max retries, initialization proceeds regardless to avoid infinite init loops in dynamic environments. - Unit Test Infrastructure: GTest targets
test_imu_processingandtest_voxel_mapadded toCMakeLists.txt(test sources excluded from the repo via.gitignore).
- IMU Init Motion Detection: Welford's online algorithm now tracks per-axis variance throughout the full initialization window (previously only described, now fully implemented with retry loop).
- README: Added complete "About This Fork" section documenting bug fixes, new features, supported datasets, and build instructions.
.gitignore: Addeddocs/andtest/to prevent internal planning documents and development tests from being committed.
- Botanical Garden Support: New configuration files for the Botanic Garden dataset.
config/botanical.yaml: Dataset-specific parameters (Xsens IMU, Livox Avia).config/camera_botanical.yaml: Dalsa RGB0 (left color camera) calibration.
- Robust Gravity Alignment:
- Added variance-based static detection during IMU initialization to ensure stable gravity estimation.
- Extended initialization window via
imu_int_frameparameter (set to 100 for Xsens). - Re-triggerable gravity alignment after IMU resets via
reset_imuflag.
- Voxel Map Memory Optimization:
- Implemented
points_clear_thresholdinVoxelOctoTreeto clear point buffers once a plane is stabilized, reducing RAM for large maps. - Configurable
map_sliding_en/half_map_size/sliding_threshinbotanical.yaml.
- Implemented
- PCD Export Improvements:
- Added
save_raw_pointsparameter to optionally save the unfiltered raw point cloud in addition to the downsampled one (default:false). - Switched
savePCD()frompcl::VoxelGridtopcl::ApproximateVoxelGrid(hash-based) to handle high-resolution (0.15 m) filtering of large maps without 32-bit PCL integer-index overflow. - Added
incremental_pcd_save_enflag (currently disabled; accumulation and shutdown-filter is the active path).
- Added
- Vibration-Adaptive IMU Noise (disabled):
- Added
vibration_adaptive_en,vibration_scale_acc,vibration_scale_gyrparameters toIMU_Processingfor dynamic covariance scaling. - Disabled (
vibration_adaptive_en: false) inbotanical.yaml— untested on this dataset, kept as opt-in.
- Added
- Shutdown Grace Period:
mapping_avia.launch.pynow setssigterm_timeout='120'andsigkill_timeout='60'so the process has sufficient time to write PCD and COLMAP output on Ctrl+C.
- Launch Configuration: Default launch file
mapping_avia.launch.pynow points tobotanical.yamlandcamera_botanical.yaml. - Initialization Sequence:
LIVMappernow initializes beforeimage_transport::ImageTransportinmain.cppto ensure a valid node handle exists, preventing crashes during shutdown. - Data Handling:
- Switched from
cv_bridge::toCvSharetocv_bridge::toCvCopyingetImageFromMsgto fix use-after-free with multiple simultaneous camera topics. - Replaced
std::endlwith'\n'in the COLMAPpoints3D.txtwrite loop — avoids per-line stream flush, preventing SIGKILL on large maps.
- Switched from
- Mapping Robustness (reverted three Gemini regressions):
- Removed
getInterpolatedPosefromLIVMapperand the associated modifiedprocessFrame/updateFrameStatesignatures invio.h/vio.cpp. The IMU-pose lookup was non-deterministic (only populated on LIO frames), giving VIO a randomly wrong initial guess → photometric alignment divergence → EKF drift. - Removed EKF abort-guard (
rot_add.norm() > 0.5) fromvoxel_map.cpp::StateEstimation. The guard prevented LIO from correcting drift once it started, turning small errors into unrecoverable failures. - Disabled
vibration_adaptive_eninbotanical.yaml. The dynamic covariance scaling (up to 3×) was untested on this dataset and amplified the instability from the two items above.
- Removed
- Stability & Robustness:
- IMU Timestamp Jumps:
imu_cbknow resets buffers and recovers when timestamp jumps > 0.2 s occur. - VIO Projection Safety: Null-pointer guard for
VisualPointretrieval and bounds check for map-point projection invio.cppprevent SIGSEGV during EKF state degeneration.
- IMU Timestamp Jumps:
- Node Lifecycle:
LIVMapperconstructor now writes the internalrclcpp::Nodeback to the caller'sshared_ptr, fixing subscriber initialization after the node is created.