引言
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_;
};