1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
#include <gtsam/slam/PriorFactor.h>
#include <gtsam/nonlinear/ISAM2.h>
#include <gtsam/nonlinear/Values.h>
#include <gtsam/slam/BetweenFactor.h>
#include <gtsam/inference/Symbol.h>
#include <gtsam/geometry/Pose3.h>
int main() {
// 1. 创建变量
gtsam::Key key1 = gtsam::symbol('x', 0);
gtsam::Key key2 = gtsam::symbol('x', 1);
gtsam::Pose3 pose1; // 单位位姿
gtsam::Pose3 pose2(gtsam::Rot3::Ypr(0.1, 0, 0), gtsam::Point3(1, 0, 0));
// 2. 创建噪声模型
auto priorNoise = gtsam::noiseModel::Isotropic::Sigma(6, 0.01);
auto odomNoise = gtsam::noiseModel::Isotropic::Sigma(6, 0.05);
// 3. 创建因子图
gtsam::NonlinearFactorGraph graph;
graph.add(gtsam::PriorFactor<gtsam::Pose3>(key1, pose1, priorNoise)); // 先验
graph.add(gtsam::BetweenFactor<gtsam::Pose3>(key1, key2, pose1.between(pose2), odomNoise)); // 里程计
// 4. 创建初始值
gtsam::Values initial_values;
initial_values.insert(key1, pose1);
initial_values.insert(key2, pose2);
// 5. ISAM2 优化
gtsam::ISAM2 isam;
isam.update(graph, initial_values);
gtsam::Values result = isam.calculateEstimate();
// 6. 读取结果
gtsam::Pose3 optimized_pose2 = result.at<gtsam::Pose3>(key2);
std::cout << "Optimized pose: " << optimized_pose2 << std::endl;
return 0;
}
|