Changelog
This page summarizes the most important changes on the main branch of Holistic Fusion, newest first.
Smaller fixes are not listed here; see the commit history for details.
2026
October 2026: Remove the holistic yaw factor (PR #56)
addUnaryYawAbsoluteMeasurement()is again the classic yaw factor. It constrains the yaw of the sensor frame in the world frame and ignores the fixed frame of the measurement. The holistic variant through the fixed-frame alignment andaddUnaryYawAbsoluteClassicMeasurement()are removed. A yaw in a tilted fixed frame has no clear meaning. For an orientation measurement in a fixed frame, useaddUnaryHeadingAbsoluteMeasurement().
October 2026: Heading factor (PR #55)
New
addUnaryHeadingAbsoluteMeasurement()(holistic interface). It takes the measured orientation of the sensor frame and constrains only the rotation about the z-axis of the world, read from the rotation vector of the offset between the estimated and the measured orientation in the world. Unlike the yaw factor, it stays defined when the x-axis of the sensor frame is vertical (e.g. a robot lying on its back), and to first order it leaves roll and pitch to gravity.
September 2026: Switch to GTSAM 4.3.0 (PR #46)
GTSAM 4.3.0 is now the required version.
holistic_fusionusesfind_package(GTSAM 4.3 REQUIRED); GTSAM 4.2 is no longer supported. The Docker images (docker/submodules/gtsam.sh) and the installation instructions build GTSAM 4.3.0 (tests and examples disabled to speed up the build). GTSAM 4.3 needs CMake >= 3.20, Eigen >= 3.4, a compiler newer than gcc 9 and (if enabled) oneTBB; the Noetic (Ubuntu 20.04) Docker image therefore installs a newer CMake (pip), Eigen 3.4.0 (into/usr/local) and gcc-10 (now the default compiler of that image) and builds GTSAM without TBB. Ubuntu 22.04 (Humble) already ships suitable versions.No more Boost in
holistic_fusion. Allboost::optional,boost::shared_ptrandboost::filesystemusages were replaced by their C++17 standard-library counterparts, following GTSAM’s own move away from Boost. Public signatures affected (only if you call them from your own code):UnaryMeasurementAbsolute/UnaryMeasurementXDAbsolute: the optional alignment noise arguments are nowstd::optional<Eigen::Matrix<double, 6, 1>>(passstd::nulloptinstead ofboost::none).FileLogger::writePose3ToCsvFileandholistic_fusion::writePose3ToCsvFile: the optional covariance argument is now astd::optional<Eigen::Matrix<double, 6, 6>>.
gtsam_unstableis no longer needed. The fixed-lag smoothers used byholistic_fusionmoved into the stable GTSAM library in 4.3, soholistic_fusion,holistic_fusion_catkinand the exported CMake config only depend ongtsamnow.All ROS 1 packages compile as C++17. GTSAM 4.3 headers require C++17;
pure_imu_integrationandexcavator_holistic_graphwere still built as C++14 and now use C++17 like the other packages.Custom factors use the new GTSAM factor API.
YawFactor,PitchFactorandRollFactorderive fromgtsam::NoiseModelFactorN<gtsam::Pose3>and implementevaluateError(const Pose3&, gtsam::OptionalMatrixType).Config change (breaking): Earth-rotation / Coriolis parameters. The IMU noise parameters
use2ndOrderCoriolisandomegaCorioliswere removed and replaced byearthRotationCompensation(bool): use GTSAM’s exact rotating-frame IMU model,latitudeDeg(double): geodetic latitude, from which the Earth-rate vector is computed (Ω = 7.2921159e-5 rad/s),worldFrameNorthAligned(bool): set totrueonly if the y-axis of the world frame points north (ENU); then the horizontal Earth-rate component Ω·cos(lat) is used in addition to the vertical one Ω·sin(lat).
Reasons: with GTSAM 4.3,
use2ndOrderCoriolishas no effect anymore (the exact model is used whenever a rotation rate is set), and the previous example valueomegaCoriolis: 1.07e-04was the meteorological Coriolis parameter 2·Ω·sin(lat), i.e. twice the vertical Earth-rate component that GTSAM expects (5.4e-05 rad/s for Zurich). Since GTSAM 4.3 also compensates the Earth rate in the attitude integration, the old value would have acted like a 0.003 deg/s yaw-rate bias. Old config files fail to load until the two parameters are replaced.Behavioural notes (from GTSAM itself, no change in Holistic Fusion needed):
BetweenFactor/PriorFactornow use the Lie-group (local) Jacobians by default, the SO(3)/SE(3) exponential and logarithm maps have been reworked, and iSAM2 /IncrementalFixedLagSmootherreceived marginalization fixes. Expect slightly different (generally better) numerical results compared to GTSAM 4.2.IMU preintegration: whenever a navigation-frame rotation rate is set (see the config change above), GTSAM 4.3 uses the exact rotating-frame dynamics (Coriolis and centrifugal accelerations and Earth-rate compensation of the attitude).
Noise models are validated more strictly (e.g. negative sigmas throw).
September 2026: T-RO publication and new project page
Paper published in IEEE Transactions on Robotics (T-RO), new project page and updated links (PR #44, #45).
Bugfix: the optimization thread is now properly terminated on destruction (PR #43).
July 2026: Local velocity factors for moving sensor frames
The local velocity unary factor supports moving (non-rigid) sensor frames (PR #39) and makes the gyroscope bias observable through the lever-arm term (PR #38).
2025
Summer 2025: ROS 2 support and build-system separation
holistic_fusionbecame a pure CMake library, independent of the build system. Thin wrapper packages (holistic_fusion_catkinfor ROS 1, ament/colcon support for ROS 2) expose it to the respective workspaces.New ROS 2 (Humble) integration layer
holistic_fusion_ros2and thesmb_estimator_graph_ros2example (PR #12 and follow-ups).Docker images and CI for both ROS 1 Noetic and ROS 2 Humble.