ReUseX
0.0.5
3D Point Cloud Processing for Building Reuse
Toggle main menu visibility
Loading...
Searching...
No Matches
optimize.hpp
Go to the documentation of this file.
1
// SPDX-FileCopyrightText: 2026 Povl Filip Sonne-Frederiksen
2
//
3
// SPDX-License-Identifier: GPL-3.0-or-later
4
5
#pragma once
6
#include "
global-params.hpp
"
7
8
// Included for the sole purpose of MIRRORING the library defaults below
9
// (docs/STANDARDS.md §4): a CLI default that references the library's own
10
// value cannot silently drift away from it.
11
#include <reusex/slam/PlaneGraphOptimizer.hpp>
12
13
#include <CLI/CLI.hpp>
14
#include <filesystem>
15
#include <memory>
16
#include <string>
17
18
namespace
fs = std::filesystem;
19
23
struct
SubcommandOptimizeOptions
{
24
// Per-frame plane detection. Defaults are the "mid-density" sweet spot
25
// measured on the office + MuSHRoom-honka scans: with per-observation inlier
26
// weighting on, this beats the conservative (max=4/200/obs=5) defaults on
27
// BOTH GT-free flatness and laser GT F-score, and is the first pose stage to
28
// improve flatness without degrading GT (see docs/research/…). More/denser
29
// planes than this only help when combined with inlier weighting.
30
int
max_planes_per_frame
= 6;
31
int
min_plane_inliers
= 120;
32
float
ransac_distance
= 0.02f;
33
float
ransac_normal_angle
= 20.0f;
34
int
ransac_iterations
= 200;
35
36
// Cross-frame association.
37
float
assoc_normal_angle
= 10.0f;
38
float
assoc_distance
= 0.10f;
39
int
min_observations
= 4;
40
float
assoc_overlap_margin
= 0.30f;
41
float
min_landmark_spread_ratio
= 0.05f;
42
43
// Alternating rounds.
44
int
assoc_rounds
= 2;
45
float
assoc_round_tol
= 0.02f;
46
47
// Factor-graph noise.
48
float
odometry_sigma_rot
= 0.005f;
49
float
odometry_sigma_trans
= 0.01f;
50
float
underconstrained_odom_scale
= 0.25f;
51
std::string
odometry_noise
=
"fixed"
;
// fixed | motion
52
float
odometry_weight_min
= 0.5f;
53
float
odometry_weight_max
= 3.0f;
54
bool
odometry_robust
=
false
;
55
float
odometry_gnc_inlier_cost
= 8.41f;
56
float
plane_sigma_normal
= 0.24f;
57
float
plane_sigma_distance
= 0.19f;
58
std::string
plane_noise
=
"inliers"
;
// uniform | inliers | fit
59
bool
no_plane_inlier_weight
=
false
;
60
float
plane_weight_min
= 0.5f;
61
float
plane_weight_max
= 3.0f;
62
float
plane_sigma_scale
= 1.0f;
63
bool
no_plane_factors
=
false
;
64
float
prior_sigma_rot
= 0.001f;
65
float
prior_sigma_trans
= 0.001f;
66
67
// Solver.
68
bool
no_gnc
=
false
;
69
float
gnc_inlier_cost
= 5.67f;
70
int
iterations
= 100;
71
unsigned
seed
= 42;
72
73
// Wide-baseline loop closure (P2; off by default). Defaults mirror the
74
// LoopClosureOptions in the library header.
75
bool
loop_closure
=
false
;
76
std::string
loop_proposal
=
77
"auto"
;
// auto | spatial | appearance | exhaustive
78
int
loop_min_frame_gap
= 50;
79
float
loop_max_distance
= 2.5f;
80
float
loop_max_view_angle
= 45.0f;
81
int
loop_max_candidates
= 5;
82
int
loop_min_inliers
= 60;
83
int
loop_max_features
= 3000;
84
float
loop_ratio_test
= 0.85f;
85
float
loop_ransac_inlier_dist
= 0.10f;
86
float
loop_max_seed_disagreement
= 0.0f;
// 0 = disabled (correct drift)
87
float
loop_min_seed_disagreement
= 0.10f;
// absolute FLOOR of the gate (#339)
88
float
loop_min_seed_disagreement_fraction
=
89
0.00555f;
// scale-relative part: fraction of trajectory extent (#339)
90
// Trust loop edges: give them their own generous-but-finite GNC-TLS inlier
91
// threshold (Huber under --no-gnc) instead of the shared --gnc-inlier-cost.
92
bool
loop_trust
=
false
;
93
float
loop_trust_inlier_cost
=
94
reusex::geometry::PlaneGraphOptions
{}.
loop_trust_inlier_cost
;
95
bool
loop_no_pcm
=
false
;
// disable pairwise-consistency filtering
96
97
// Panorama-derived wide-baseline loop edges (#236; off by default). Defaults
98
// mirror reusex::geometry::PlaneGraphOptions::panorama_loops so the library
99
// stays the single source of truth (docs/STANDARDS.md §4).
100
bool
use_panoramas
=
false
;
101
int
pano_max_frames
=
102
reusex::geometry::PlaneGraphOptions
{}.
panorama_loops
.
max_frames
;
103
int
pano_min_inliers
=
104
reusex::geometry::PlaneGraphOptions
{}.
panorama_loops
.
min_frame_inliers
;
105
int
pano_max_edges
=
reusex::geometry::PlaneGraphOptions
{}
106
.
panorama_loops
.
max_edges_per_panorama
;
107
int
pano_n_yaw
=
reusex::geometry::PlaneGraphOptions
{}.
panorama_loops
.
n_yaw
;
108
int
pano_max_features
=
109
reusex::geometry::PlaneGraphOptions
{}.
panorama_loops
.
max_features
;
110
double
pano_max_distance
=
111
reusex::geometry::PlaneGraphOptions
{}.
panorama_loops
.
max_pano_distance
;
112
113
// External loop edges (license-clean learned-matcher bridge). Path to a JSON
114
// file (schema "reusex.loop_edges.v1") produced by an out-of-process matcher
115
// (XFeat / EfficientLoFTR / MapAnything, or an offline MASt3R ceiling
116
// oracle). Unioned with any internally-detected --loop-closure edges. Empty =
117
// none.
118
std::string
loop_edges_file
;
119
// Seed-disagreement gate for external edges (drop edges agreeing with the
120
// seed within this many m; keeps the bridge a no-op on a well-posed scan).
121
// Absolute FLOOR; the effective gate is max(fraction * extent, floor) (#339).
122
double
loop_edges_min_disagreement
= 0.0;
123
// Scale-relative part of that gate: fraction of the trajectory's extent.
124
// 0.0278 == 0.50 m on the 18.01 m office scan (#339).
125
double
loop_edges_min_disagreement_fraction
= 0.0278;
126
127
// Surfel extraction (shared with `rux register`).
128
float
surfel_voxel
= 0.03f;
129
float
min_distance
= 0.0f;
130
float
max_distance
= 4.0f;
131
// Mirrors the plane-graph override of the shared surfel default (8 -> 6).
132
int
sampling_factor
=
133
reusex::geometry::PlaneGraphOptions
{}.
surfel
.
sampling_factor
;
134
int
confidence_threshold
= 2;
135
136
bool
dry_run
=
false
;
137
};
138
139
void
setup_subcommand_optimize
(CLI::App &app,
140
std::shared_ptr<RuxOptions> global_opt);
141
int
run_subcommand_optimize
(
SubcommandOptimizeOptions
const
&opt,
142
const
RuxOptions
&global_opt);
global-params.hpp
setup_subcommand_optimize
void setup_subcommand_optimize(CLI::App &app, std::shared_ptr< RuxOptions > global_opt)
run_subcommand_optimize
int run_subcommand_optimize(SubcommandOptimizeOptions const &opt, const RuxOptions &global_opt)
RuxOptions
Definition
global-params.hpp:44
SubcommandOptimizeOptions
Options for the rux optimize subcommand (global plane-landmark pose-graph optimization).
Definition
optimize.hpp:23
SubcommandOptimizeOptions::assoc_distance
float assoc_distance
Definition
optimize.hpp:38
SubcommandOptimizeOptions::ransac_iterations
int ransac_iterations
Definition
optimize.hpp:34
SubcommandOptimizeOptions::plane_noise
std::string plane_noise
Definition
optimize.hpp:58
SubcommandOptimizeOptions::loop_max_features
int loop_max_features
Definition
optimize.hpp:83
SubcommandOptimizeOptions::odometry_sigma_rot
float odometry_sigma_rot
Definition
optimize.hpp:48
SubcommandOptimizeOptions::ransac_normal_angle
float ransac_normal_angle
Definition
optimize.hpp:33
SubcommandOptimizeOptions::loop_trust_inlier_cost
float loop_trust_inlier_cost
Definition
optimize.hpp:93
SubcommandOptimizeOptions::sampling_factor
int sampling_factor
Definition
optimize.hpp:132
SubcommandOptimizeOptions::loop_no_pcm
bool loop_no_pcm
Definition
optimize.hpp:95
SubcommandOptimizeOptions::max_planes_per_frame
int max_planes_per_frame
Definition
optimize.hpp:30
SubcommandOptimizeOptions::pano_min_inliers
int pano_min_inliers
Definition
optimize.hpp:103
SubcommandOptimizeOptions::confidence_threshold
int confidence_threshold
Definition
optimize.hpp:134
SubcommandOptimizeOptions::min_distance
float min_distance
Definition
optimize.hpp:129
SubcommandOptimizeOptions::underconstrained_odom_scale
float underconstrained_odom_scale
Definition
optimize.hpp:50
SubcommandOptimizeOptions::loop_max_seed_disagreement
float loop_max_seed_disagreement
Definition
optimize.hpp:86
SubcommandOptimizeOptions::iterations
int iterations
Definition
optimize.hpp:70
SubcommandOptimizeOptions::no_plane_inlier_weight
bool no_plane_inlier_weight
Definition
optimize.hpp:59
SubcommandOptimizeOptions::plane_sigma_distance
float plane_sigma_distance
Definition
optimize.hpp:57
SubcommandOptimizeOptions::use_panoramas
bool use_panoramas
Definition
optimize.hpp:100
SubcommandOptimizeOptions::no_plane_factors
bool no_plane_factors
Definition
optimize.hpp:63
SubcommandOptimizeOptions::ransac_distance
float ransac_distance
Definition
optimize.hpp:32
SubcommandOptimizeOptions::loop_edges_file
std::string loop_edges_file
Definition
optimize.hpp:118
SubcommandOptimizeOptions::plane_weight_min
float plane_weight_min
Definition
optimize.hpp:60
SubcommandOptimizeOptions::loop_edges_min_disagreement_fraction
double loop_edges_min_disagreement_fraction
Definition
optimize.hpp:125
SubcommandOptimizeOptions::prior_sigma_rot
float prior_sigma_rot
Definition
optimize.hpp:64
SubcommandOptimizeOptions::plane_weight_max
float plane_weight_max
Definition
optimize.hpp:61
SubcommandOptimizeOptions::loop_max_distance
float loop_max_distance
Definition
optimize.hpp:79
SubcommandOptimizeOptions::max_distance
float max_distance
Definition
optimize.hpp:130
SubcommandOptimizeOptions::loop_min_inliers
int loop_min_inliers
Definition
optimize.hpp:82
SubcommandOptimizeOptions::odometry_gnc_inlier_cost
float odometry_gnc_inlier_cost
Definition
optimize.hpp:55
SubcommandOptimizeOptions::loop_max_view_angle
float loop_max_view_angle
Definition
optimize.hpp:80
SubcommandOptimizeOptions::odometry_robust
bool odometry_robust
Definition
optimize.hpp:54
SubcommandOptimizeOptions::min_plane_inliers
int min_plane_inliers
Definition
optimize.hpp:31
SubcommandOptimizeOptions::loop_min_seed_disagreement
float loop_min_seed_disagreement
Definition
optimize.hpp:87
SubcommandOptimizeOptions::assoc_normal_angle
float assoc_normal_angle
Definition
optimize.hpp:37
SubcommandOptimizeOptions::odometry_weight_min
float odometry_weight_min
Definition
optimize.hpp:52
SubcommandOptimizeOptions::odometry_weight_max
float odometry_weight_max
Definition
optimize.hpp:53
SubcommandOptimizeOptions::loop_ransac_inlier_dist
float loop_ransac_inlier_dist
Definition
optimize.hpp:85
SubcommandOptimizeOptions::pano_max_frames
int pano_max_frames
Definition
optimize.hpp:101
SubcommandOptimizeOptions::odometry_noise
std::string odometry_noise
Definition
optimize.hpp:51
SubcommandOptimizeOptions::loop_trust
bool loop_trust
Definition
optimize.hpp:92
SubcommandOptimizeOptions::assoc_rounds
int assoc_rounds
Definition
optimize.hpp:44
SubcommandOptimizeOptions::no_gnc
bool no_gnc
disable Graduated Non-Convexity (plain LM)
Definition
optimize.hpp:68
SubcommandOptimizeOptions::pano_max_edges
int pano_max_edges
Definition
optimize.hpp:105
SubcommandOptimizeOptions::loop_min_frame_gap
int loop_min_frame_gap
Definition
optimize.hpp:78
SubcommandOptimizeOptions::odometry_sigma_trans
float odometry_sigma_trans
Definition
optimize.hpp:49
SubcommandOptimizeOptions::pano_max_features
int pano_max_features
Definition
optimize.hpp:108
SubcommandOptimizeOptions::assoc_round_tol
float assoc_round_tol
Definition
optimize.hpp:45
SubcommandOptimizeOptions::gnc_inlier_cost
float gnc_inlier_cost
Definition
optimize.hpp:69
SubcommandOptimizeOptions::prior_sigma_trans
float prior_sigma_trans
Definition
optimize.hpp:65
SubcommandOptimizeOptions::loop_edges_min_disagreement
double loop_edges_min_disagreement
Definition
optimize.hpp:122
SubcommandOptimizeOptions::dry_run
bool dry_run
Definition
optimize.hpp:136
SubcommandOptimizeOptions::pano_max_distance
double pano_max_distance
Definition
optimize.hpp:110
SubcommandOptimizeOptions::min_landmark_spread_ratio
float min_landmark_spread_ratio
Definition
optimize.hpp:41
SubcommandOptimizeOptions::plane_sigma_normal
float plane_sigma_normal
Definition
optimize.hpp:56
SubcommandOptimizeOptions::loop_min_seed_disagreement_fraction
float loop_min_seed_disagreement_fraction
Definition
optimize.hpp:88
SubcommandOptimizeOptions::surfel_voxel
float surfel_voxel
Definition
optimize.hpp:128
SubcommandOptimizeOptions::plane_sigma_scale
float plane_sigma_scale
Definition
optimize.hpp:62
SubcommandOptimizeOptions::assoc_overlap_margin
float assoc_overlap_margin
Definition
optimize.hpp:40
SubcommandOptimizeOptions::seed
unsigned seed
Definition
optimize.hpp:71
SubcommandOptimizeOptions::loop_max_candidates
int loop_max_candidates
Definition
optimize.hpp:81
SubcommandOptimizeOptions::loop_closure
bool loop_closure
Definition
optimize.hpp:75
SubcommandOptimizeOptions::min_observations
int min_observations
Definition
optimize.hpp:39
SubcommandOptimizeOptions::pano_n_yaw
int pano_n_yaw
Definition
optimize.hpp:107
SubcommandOptimizeOptions::loop_ratio_test
float loop_ratio_test
Definition
optimize.hpp:84
SubcommandOptimizeOptions::loop_proposal
std::string loop_proposal
Definition
optimize.hpp:76
reusex::geometry::PanoramaLoopOptions::max_pano_distance
double max_pano_distance
Reject a resection whose panorama centre sits further than this from the frame (m).
Definition
PanoramaLoopEdges.hpp:122
reusex::geometry::PanoramaLoopOptions::max_edges_per_panorama
int max_edges_per_panorama
Cap the edges contributed per panorama (highest joint inlier support first).
Definition
PanoramaLoopEdges.hpp:129
reusex::geometry::PanoramaLoopOptions::max_features
int max_features
ORB features per image.
Definition
PanoramaLoopEdges.hpp:95
reusex::geometry::PanoramaLoopOptions::max_frames
int max_frames
Panorama alignment matches a temporal window around the timestamp-seed frame (PanoramaAlignmentOption...
Definition
PanoramaLoopEdges.hpp:84
reusex::geometry::PanoramaLoopOptions::n_yaw
int n_yaw
perspective slices around the equator
Definition
PanoramaLoopEdges.hpp:90
reusex::geometry::PanoramaLoopOptions::min_frame_inliers
int min_frame_inliers
Accept a frame's independent resection above this many gated inliers.
Definition
PanoramaLoopEdges.hpp:112
reusex::geometry::PlaneGraphOptions
Parameters for plane-landmark pose-graph optimization.
Definition
PlaneGraphOptimizer.hpp:172
reusex::geometry::PlaneGraphOptions::panorama_loops
PanoramaLoopOptions panorama_loops
Panorama-derived wide-baseline loop edges (issue #236; off by default, --use-panoramas).
Definition
PlaneGraphOptimizer.hpp:363
reusex::geometry::PlaneGraphOptions::surfel
SurfelExtractionParams surfel
Surfel extraction settings.
Definition
PlaneGraphOptimizer.hpp:349
reusex::geometry::PlaneGraphOptions::loop_trust_inlier_cost
float loop_trust_inlier_cost
GNC-TLS inlier threshold applied ONLY to loop-edge factors when loop_edges_trusted is set (same units...
Definition
PlaneGraphOptimizer.hpp:390
reusex::geometry::SurfelExtractionParams::sampling_factor
int sampling_factor
per-pixel subsampling (1=all, 2=half, ...)
Definition
surfel_extraction.hpp:22
apps
rux
include
optimize.hpp
Generated by
1.17.0