19 gtsam::NonlinearFactorGraph& factor_graph, gtsam::Values& graph_values,
20 [[maybe_unused]]
unsigned int pose_num, [[maybe_unused]]
unsigned int landmark_num) {
22 std::set<gtsam::Key> pose_keys;
23 std::set<gtsam::Key> landmark_keys;
24 gtsam::NonlinearFactorGraph sliding_window_graph;
25 gtsam::Values sliding_window_values;
27 i <= static_cast<int>(pose_num); ++i) {
28 pose_keys.insert(gtsam::Symbol(
'x', i));
32 for (
const auto& factor : factor_graph) {
33 auto involved_keys = factor->keys();
35 for (
const auto& key : involved_keys) {
36 if (gtsam::Symbol(key).chr() ==
'x' && pose_keys.count(key) == 0) {
41 }
else if (gtsam::Symbol(key).chr() ==
'x' && pose_keys.count(key) > 0) {
50 sliding_window_graph.add(factor);
55 for (
const auto& factor : sliding_window_graph) {
56 auto involved_keys = factor->keys();
57 for (
const auto& key : involved_keys) {
58 if (gtsam::Symbol(key).chr() ==
'l') {
59 landmark_keys.insert(key);
65 for (
const auto& factor : factor_graph) {
66 const auto& keys = factor->keys();
69 if (keys.size() == 1) {
70 gtsam::Symbol symbol(keys[0]);
71 if (symbol.chr() ==
'l' && landmark_keys.count(keys[0]) > 0) {
72 sliding_window_graph.add(factor);
78 for (
const auto& key : landmark_keys) {
79 sliding_window_values.insert(key, graph_values.at(key));
81 for (
const auto& key : pose_keys) {
82 sliding_window_values.insert(key, graph_values.at(key));
86 gtsam::LevenbergMarquardtParams lm_params;
87 gtsam::Ordering ordering;
88 for (
const auto& key : landmark_keys) {
89 ordering.push_back(key);
91 for (
const auto& key : pose_keys) {
92 ordering.push_back(key);
94 lm_params.setOrdering(ordering);
97 lm_params.setlambdaUpperBound(1e3);
107 rclcpp::Time start_time = rclcpp::Clock().now();
108 gtsam::LevenbergMarquardtOptimizer optimizer(sliding_window_graph, sliding_window_values,
110 graph_values.update(optimizer.optimize());
111 rclcpp::Duration optimization_time = rclcpp::Clock().now() - start_time;
113 rclcpp::get_logger(
"slam"),
114 "SlidingWindowLevenbergOptimizer - Optimized %d poses and %d landmarks, including %d factors",
115 static_cast<int>(pose_keys.size()),
static_cast<int>(landmark_keys.size()),
116 static_cast<int>(sliding_window_graph.size()));
117 RCLCPP_DEBUG(rclcpp::get_logger(
"slam"),
118 "SlidingWindowLevenbergOptimizer - Lambda at start: %lf, end: %lf",
119 lm_params.lambdaInitial, optimizer.lambda());
120 RCLCPP_DEBUG(rclcpp::get_logger(
"slam"),
121 "SlidingWindowLevenbergOptimizer - Number of iterations: "
122 "%ld\nOptimization time: %f",
123 optimizer.iterations(), optimization_time.seconds());