GTSAM 基本数据类型

本文详细介绍了GTSAM(Georgia Tech Smoothing and Mapping)库中的基本运动状态类型,包括平移、旋转、位姿、向量和导航状态。此外,还涉及了噪声模型、IMU模型,如ConstantBias和PreintegratedImuMeasurements,并概述了图模型的推理算法ISAM2、因子图、值结构和优化方法。文章通过实例展示了如何使用GTSAM进行双目里程计的优化计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、基本运动状态类型

1.1 平移和点坐标

gtsam::Point3

  • 常用构造方式
gtsam::Point3(x, y, z)

1.2 旋转

gtsam::Rot3

  • 常用构造方式在这里插入图片描述
    在这里插入图片描述
// 欧拉角,注意虽然函数名是RzRyRx,但实际是xyz顺序的
// static Rot3::RzRyRx(double x, double y, double z)
gtsam::Rot3::RzRyRx(roll, pitch, yaw)

//四元数  w,x,y,z
// Rot3(const Quaternion &q)
gtsam::Rot3(1, 0, 0, 0)
// 或者 gtsam::Rot3::Quaternion(double w, double x, double y, double z)
gtsam::Rot3::Quaternion(1, 0, 0, 0)

//旋转矩阵  Rot3(const Matrix3 &R)
gtsam::Matrix33 R;
gtsam::Rot3(R)

1.3 位姿(旋转+平移)

gtsam::Pose3

  • 常用构造方式
    在这里插入图片描述
// 旋转+平移构造
gtsam::Pose3(gtsam::Rot3(1, 0, 0, 0), gtsam::Point3(x,y,z));

// 变换矩阵构造
gtsam::Pose3(T)

1.4 向量Vector

(gtsam::Vector(6) << 1e-2, 1e-2, 1e-2, 1e-2, 1e-2, 1e-2).finished()
//或者
gtsam::Vector Vector3(3);
Vector3 << 1e-2, 1e-2, 1e-2;

1.5 导航状态(位姿+ 速度/向量 )

gtsam::NavState

  • 构造函数
    在这里插入图片描述
gtsam::NavState State_;
State_ = gtsam::NavState(Pose_, Vel_);

二、噪声(方差)模型

2.1 对角噪声模型

gtsam::noiseModel::Diagonal

float noiseScore = 0.5;
gtsam::Vector Vector3(3);
Vector3 << noiseScore, noiseScore, noiseScore;
//	A diagonal noise model created by specifying a Vector of sigmas
gtsam::noiseModel::Diagonal::Sigmas(Vector3);
// 等价于 
gtsam::noiseModel::Isotropic::Sigma(3, 0.5);

//A diagonal noise model created by specifying a Vector of variances
gtsam::noiseModel::Diagonal::Variances(Vector3);

//A diagonal noise model created by specifying a Vector of precisions,
gtsam::noiseModel::Diagonal::Precisions(Vector3);
  • 区别
#include <iostream>
#include <gtsam/geometry/Rot3.h>
#include <gtsam/slam/PriorFactor.h>

using namespace std;

int main()
{
   
   
    float noiseScore = 0.5;
    gtsam::Vector Vector3(3);
    Vector3 << noiseScore, noiseScore, noiseScore;
//	A diagonal noise model created by specifying a Vector of sigmas
    gtsam::noiseModel::Diagonal::shared_ptr SigmaNoise;
    SigmaNoise=gtsam::noiseModel::Diagonal::Sigmas(Vector3);
    SigmaNoise->print("SigmaNoise");
    cout<<"******************************************"<<endl;
//A diagonal noise model created by specifying a Vector of variances
    gtsam::noiseModel::Diagonal::shared_ptr VariancesNoise;
    VariancesNoise=gtsam::noiseModel::Diagonal::Variances(Vector3);
    VariancesNoise->print("VariancesNoise");
    cout<<"******************************************"<<endl;
//A diagonal noise model created by specifying a Vector of precisions,
    gtsam::noiseModel::Diagonal::shared_ptr PrecisionsNoise;
    PrecisionsNoise=gtsam::noiseModel::Diagonal::Precisions(Vector3);
    PrecisionsNoise->print("PrecisionsNoise");

    gtsam::noiseModel::Diagonal::shared_ptr IsotropicNoise;
    IsotropicNoise   = gtsam::noiseModel::Isotropic::Sigma(3, 0.5);
    IsotropicNoise->print("IsotropicNoise");
    return 0;
}

运行结果如下图:
在这里插入图片描述

三、IMU模型

3.1 ConstantBias

gtsam::imuBias::ConstantBias

//由加速度和角速度的xyz组成的6维向量
gtsam::imuBias::ConstantBias prior_imu_bias((gtsam::Vector(6) << 0, 0, 0, 0, 0, 0).finished());


//结构如下
acc = [0, 0, 0]' gyro = [0, 0, 0]'

3.2 PreintegratedImuMeasurements

gtsam::PreintegratedImuMeasurements

gtsam::PreintegratedImuMeasurements *imuIntegratorOpt_;

boost::shared_ptr<gtsam::PreintegrationParams> p = gtsam::PreintegrationParams::MakeSharedU(imuGravity);
p->accelerometerCovariance  = gtsam::Matrix33::Identity(3,3) * pow(imuAccNoise, 2); // acc white noise in continuous
p->gyroscopeCovariance      = gtsam::Matrix33::Identity(3,3) * pow(imuGyrNoise, 2); // gyro white noise in continuous
p->integrationCovariance    = gtsam::Matrix33::Identity(3,3) * pow(1e-4, 2); // error committed in integrating position from velocities
gtsam::imuBias::ConstantBias prior_imu_bias((gtsam::Vector(6) << 0, 0, 0, 0, 0, 0)
### GTSAM 中 Noise Model 的基本概念 在 GTSAM 库中,`noiseModel` 是用于定义测量噪声模型的核心组件之一。这些噪声模型通常被用来表示传感器数据中的不确定性,并通过概率分布的形式来建模误差向量的行为[^1]。 #### 噪声模型的关键功能 每个 `noiseModel` 类都必须实现两个核心函数: - **`whiten` 函数**:该函数的作用是对输入的误差向量进行标准化处理,使其服从标准正态分布。 - **`unwhiten` 函数**:此函数则负责将经过标准化后的误差向量还原为其原始形式。 这种设计使得开发者能够灵活地应用不同的统计假设到实际的数据拟合过程中。 #### Gaussian 模型的具体实例化方式 以高斯噪声为例,在 GTSAM 中可以通过如下代码创建一个基于协方差矩阵 R 的高斯噪声模型: ```cpp // 创建一个对角线上的方差分别为 sigma_x^2 和 sigma_y^2 的二维高斯噪声模型 gtsam::Vector sigmas(2); sigmas << std::pow(sigma_x, 2), std::pow(sigma_y, 2); auto model = gtsam::noiseModel::Diagonal::Sigmas(sigmas); ``` 上述代码片段展示了如何利用 `noiseModel::Diagonal::Sigmas()` 方法快速构建一个多维独立同分布 (i.i.d.) 高斯随机变量集合对应的噪声模型。 另外值得注意的是,如果遇到某些特定场景下需要自定义复杂结构化的噪声特性,则可以继承基础类并重写必要成员方法来自行扩展新的类型支持。 --- ### 解决 PCL-VTK 编译错误的相关建议 当面对类似于 “PCL 连接 VTK 库失败”的情况时,可以从以下几个方面入手排查问题根源[^2]: 1. 确认目标平台上是否存在指定名称及路径下的共享对象文件(.so),即验证第一步提到的可能性——缺失依赖项; 2. 如果确认存在相应动态链接库但仍报错,则进一步核查当前使用的VTK版本号是否符合最低兼容需求;如果不满足条件的话就需要升级或者降级至适配范围内的发行版次序再尝试重新执行整个流程操作步骤直至成功完成部署为止。 最后附上一段典型的手动清理旧环境重建新项目的脚本供参考: ```bash cd /path/to/pcl/source/ rm -rf build/ # 彻底移除之前残留下来的中间产物目录及其内容物 mkdir build && cd $_ # 新建干净的工作区准备接收后续指令集成果产出 cmake .. make -j$(nproc) # 并行加速编译过程充分利用多核资源提升效率 sudo make install # 安装最终生成的目标二进制程序包进入系统全局可用区域位置处 ``` 以上命令序列旨在确保任何潜在冲突都被有效消除掉之后才继续推进下一步骤动作从而保障整体稳定性表现达到预期效果水平线上去运行良好无误。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值