GTSAM源码解析 第二讲:GTSAM中的各种基础类

本文详细介绍了GTSAM中各类因子及其衍生类,如Factor、GaussianFactor、JacobianFactor等的继承关系,以及噪声模型类如Gaussian、Diagonal等。重点展示了FactorGraph及其子类如GaussianFactorGraph、NonlinearFactorGraph和SymbolicFactorGraph在GTSAM框架中的作用。

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

引言

GTSAM中大量运用了模版、继承和多态,因此各种类之间的关系也是错综复杂。本篇文章主要是讲解GTSAM中各种类之间的关系,即各种类之间的继承关系。为了简化起见,各种模版信息被省略了,并且每个类只写了成员变量,没有详细介绍各个成员函数以及每个类的意义,这个坑留着以后再补。

基类:Factor

基类Factor,这个类是我们在GTSAM定义的各种因子的基类。其成员变量只有keys_;

class Factor
{
	using KeyVector = FastVector<Key>;
	KeyVector keys_;
};

派生类1:GaussianFactor

继承自Factor,没有多余的数据成员。高斯Factor是一种线性Factor,它可以有非线性Factor线性化得出。这个一个纯虚类,其中定义了各种纯虚函数,以后会详细介绍。

class GaussianFactor : public Factor
{
};
派生的派生: JacobianFactor

继承自GaussianFactor,相比基类多出来两个成员变量,Ab_和model,这个变量其实就是线性化后对应的增量雅可比矩阵以及噪声模型(一般就是协方差矩阵)。

class JacobianFactor : public GaussianFactor
{
    VerticalBlockMatrix              Ab_;     // the block view of the full matrix
    noiseModel::Diagonal::shared_ptr model_;  // Gaussian noise model with diagonal covariance matrix

};
派生的派生: HessianFactor

继承自GaussianFactor,相比基类多出来一个成员变量,info_,其实就是信息矩阵 J T H J J^THJ JTHJ

class HessianFactor : public GaussianFactor
{
    SymmetricBlockMatrix info_;  ///< The full augmented information matrix, s.t. the quadratic error is 0.5*[x< -1]'*H*[x -1]
};

派生类2:NonlinearFactor

继承自Factor,没有多余的数据成员

class NonlinearFactor : public Factor
{
};
派生的派生:NoiseModelFactor

继承自NonlinearFactor,多了一个noiseModel_的成员变量

class NoiseModelFactor : public NonlinearFactor
{
	SharedNoiseModel noiseModel_;
};
派生的派生的派生: NoiseModelFactorN
class NoiseModelFactorN : public NoiseModelFactor

最后我们自定义的Factor大多都是继承自NoiseModelFactorN

派生类3:SymbolicFactor

继承自Factor,没有多余的数据成员

class GTSAM_EXPORT SymbolicFactor : public Factor
{
};

基类:noiseMode::Base

噪声模型的基类,也就是各种协方差的基类。它的成员变量只有一个dim_,表示噪声模型维度;

class Base
{
	size_t dim_;
};

派生类1:Gaussian

高斯噪声模型继承自Base,成员变量多了一个sqrt_information_,是平方根信息矩阵。

class Gaussian : public Base
{
    /** Matrix square root of information matrix (R) */
	boost::optional<Matrix> sqrt_information_;
};

派生类2:Diagonal

对角噪声模型继承自Gaussian,表示协方差矩阵只有对角线上的变量有值,其余都为0。

class GTSAM_EXPORT Diagonal : public Gaussian
{
	 /**
     * Standard deviations (sigmas), their inverse and inverse square (weights/precisions).
     */
    Vector sigmas_, invsigmas_, precisions_;

};

派生类3:Isotropic

继承自Diagonal,并且对角线上的值都一样。

class GTSAM_EXPORT Isotropic : public Diagonal
{
    double sigma_, invsigma_;
};

基类:Conditional

这个类其实和factor差不多,它由factor生成,也可以转换为factor,它的成员变量只有一个nrFrontals_,表示前端变量的个数。

class Conditional
{
    /** The first nrFrontal variables are frontal and the rest are parents. */
    size_t nrFrontals_;
};

派生类1:GaussianConditional

继承自JacobianFactor和Conditional,它与基类Conditional的继承关系是用了一种奇异递归模版的方式来继承的,简单说就是基类的模版类型是派生类,感兴趣的小伙伴可以自行搜索学习。

class GaussianConditional : public JacobianFactor, public Conditional
{
};

派生类2: SymbolicConditional

继承自SymbolicFactor和Conditional,它与基类Conditional的继承关系也是用了一种奇异递归模版的方式来继承的。

class SymbolicConditional : public SymbolicFactor, public Conditional
{
};

基类:FactorGraph

因子图FactorGraph,这个是整个GTSAM的核心,GTSAM的整套算法就是在因子图上做推断求最大后验概率的。因子图是一个二分图,其中包括两种节点:因子节点和变量节点。但在这个类中,它的成员变量只有因子信息factors_。

class FactorGraph
{
    /** Collection of factors */
    FastVector<sharedFactor> factors_;
};

派生类1:GaussianFactorGraph

高斯因子图是一个线性因子图,它继承自FactorGraph和EliminateableFactorGraph,高斯因子图中所有的因子都是高斯因子并且变量类型也只是一个线性的向量,这一点与非线性因子图很不一样。大多数情况下,高斯因子图都是由非线性因子图线性化而来。相比基类,没有多的成员变量。

class GaussianFactorGraph : public FactorGraph, public EliminateableFactorGraph
{
};

派生类2:NonlinearFactorGraph

非线性因子图继承自FactorGraph,它的因子是继承自NonlinearFactor的非线性因子,变量也不再只是线性的向量,还可以是各种流行(Pose3, Rot3)。相比基类,没有多的成员变量。

class NonlinearFactorGraph : public FactorGraph
{
};

派生类3:SymbolicFactorGraph

符号因子图继承自FactorGraph和EliminateableFactorGraph,符号因子图使用符号或符号表达式来表示因子,而不是具体的数值。相比基类,没有多的成员变量。

class SymbolicFactorGraph : public FactorGraph<SymbolicFactor>, public EliminateableFactorGraph
{
};

Values的数据结构:

这个数据结构其实就是一个Key到Value的Map<key, Value>,Value可以是各种流行。

class Values
{
	boost::ptr_map<Key, Value> KeyValueMap;
	KeyValueMap values_; 
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值