Repository navigation
aqua_localization v0.2 — pose graph backend + sonar covariance calibration
aqua_localization v0.2 — pose graph backend + sonar covariance calibration
Three-PR slice on top of v0.1, all merged via squash to main:
-
#4 Chi-square calibration of sonar pose covariance.
Newaqua_localization/scripts/calibrate_sonar_covariance.py
offline tool (Umeyama-aligned, reports d^2 distribution and
suggested scale factors). MBES-SLAMbeach_pondcalibrated:
pre-tune position_scale=1.0 produced d^2 mean=1834 vs target 3
(single-fan multibeam is geometrically degenerate, real residuals
~10 m vs floor-clamped sigma 0.10 m^2). Profile now ships
position_floor=25 m^2 / scale=100 / cap=400 m^2 to make the
published uncertainty honest. -
#5 New
aqua_pose_graphament_cmake package: SE(3) keyframe graph
on g2o. Subscribes to upstream odometry, extracts keyframes when
relative motion exceeds configurable thresholds, connects them
with EdgeSE3 constraints whose information matrix is read from
the upstream pose.covariance, runs g2o LM optimization on demand
or every N keyframes, publishes the optimised trajectory as
nav_msgs/Path on/aqua_pose_graph/path. The
add_loop_constraint(...)API is the entry point for a future
place-recognition / submap-matching / visual loop closure front
end. Five gtests cover seed, threshold trigger, chain-noop,
loop-constraint pull-in, reset. -
#6 Wires aqua_pose_graph into the top-level launch (off by default
since loop closures are not yet generated). Smoke-tested on
Tank Dataset short_test: 361 keyframes, populated path.
Build/test status:
- 134 unit + runtime tests on the canonical packages, 0 failures.
- 5 new gtests on aqua_pose_graph, 0 failures.
- All 5 packages (aqua_msgs, aqua_imu_loc, aqua_sonar_loc,
aqua_fusion, aqua_pose_graph, aqua_localization) build clean on
ROS 2 Jazzy with libg2o-dev / Eigen3.
Loop closure detection (place recognition, bathymetric submap matching
or visual BoW) remains the headline next milestone.