ROS_C++_涉及的代数以及C++代码库

Ceres、Eigen、Sophus、G2O
基本线性代数子程序,Basic Linear Algebra Subprograms,是一个API标淮,
    用以规范发布基础线性代数操作的数值库 
    Netlib用Fortran实现了BLAS的这些API接口,得到的库也叫做BLAS	
    Netlib BLAS	
    LAPACK 线性代数库,也是Netlib用fortran语言编写的,其底层是BLAS。LAPACK提供了丰富的工具函
    
    Blas、LAPACK
        Fortran编写的线性代数运算库,lapack以blas为基础
        suitesparse依赖lapack、blas
    Ceres
       含Eigen、gflags、glog、merit、suitesparse,解决优化问题
     开源社区及商业公司针对API实现了
        BLAS  (ATLAS、OpenBLAS)  ATLAS  BSD许可证开源的BLAS实现
       和LAPACK(MKL、ACML、CUBLAS)的针对性优化
    Eigen内部的Quaterniond的数据存储顺序不一样,存储顺序x,y,z,w	  

李群李代数学习

李代数可以用来描述物体在某个参考系下的状态(姿态或者位姿),可以用一个多维(三维或者六维)矢量来表示。
 说到李代数,就不得不提到李群,每个李群都有与之对应的李代数
 
 群(Group),则是一种集合,加上一种运算组成的结构。李群是连续(光滑)的群。上面的特殊正交群、特殊欧式群,都是对时间连续的群,
   都是李群的一种。
 李代数是一个代数结构,主要用于研究象李群和微分流形之类的几何对象。李代数因研究无穷小变换的概念而引入。
   每个李群都有与之对应的李代数,李代数描述了李群的局部性质  
 
 Lie algebra 一类重要的非结合代数
 01. Sophus 模块 
     SE(3): rigid motion (rotation and translation) in 3D space
     李群SE(3) 是旋转加上位移,也称欧式变换、刚体变换
     Eigen库是一个开源的C++线性代数库,它提供了快速的有关矩阵的线性代数运算,还包括解方程等功能。
     但是Eigen库提供了集合模块,但没有提供李代数的支持。
     一个较好的李群和李代数的库是Sophus库,它很好的支持了SO(3),so(3),SE(3)和se(3)。
     Sophus库是基于Eigen基础上开发的,继承了Eigen库中的定义的各个类。
     因此在使用Eigen库中的类时,既可以使用Eigen命名空间,也可以使用Sophus命名空间

02.manif --   dependency on Eigen
     artivis.github.io/manif
	 https://github.com/artivis/manif
	 Manif: A micro Lie theory library for state estimation in robotics applications
特殊正交群(special orthogonal group) 
  Get quickly started with manif following our 'quick start' guides for both C++ and Python
 
旋转矩阵 对应的  SO(3) 特殊正交群(Special Orthogonal Group) 
     它是一个行列式为1的正交矩阵。 它的逆就是它自身的转置
变换矩阵 对应的  SE(3) 特殊欧式群(Special Euclidean Group)	 
 
特殊正交群是李群的一种,因此我们可以将其映射为李代数,解决求解最小二乘优化时的问题。
 用李代数解决求导问题思路分为两种:
 1.用李代数表示姿态,然后根据李代数加法来对李代数求导。(李代数的求导模型)
 2.对李群左乘或右乘微小扰动,然后对该扰动求导。(扰动模型) 

Ceres库

 G2O函数库相对较为复杂,但是适用面更加广,可以解决较为复杂的重定位问题。
 Ceres库向通用的最小二乘问题的求解,定义优化问题,设置一些选项,可通过Ceres求解

卡尔曼滤波

状态估计(state estimation)
 模型定下来之后5个公式里还有3个参数(P、Q、R)
    R就是观测的方差(状态是1维的,协方差矩阵退化为方差),-- 观测噪声协方差矩阵
	Q就是预测的方差,-- 过程噪声协方差矩阵
	P就是融合后的高斯函数的方差--后验误差协方差矩阵
	H--观测矩阵
	K-- 卡尔曼增益系数
	
   系统的状态方程--观测方程
   卡尔曼滤波算法分为两步:预测和更新
   模型的F、P、Q、H、R矩阵
      滤波增益矩阵  状态转移矩阵  协方差矩阵  系统输入向量  测量矩阵
 estimation就包含三种处理信号的方法:filtering(滤波),smoothing(平滑) 和 prediciton(预测)。	   

ApolloAuto

Apollo选择了四元数作为各个传感器安装位置和角度的存储介
    传感器到车体坐标系的坐标转换原理及数学推导,
	该原理不仅用在无人车领域,同时在机器人、无人机、三维建模等领域也得到了广泛使用

Apollo使用osqp进行二次规划问题的求解。第一行为代价函数,第二行为约束条件。
  二次优化的目标就是在满足约束条件的基础上,找到优化变量使得代价函数的值最小

无人车领域,卡尔曼滤波器除了应用于障碍物跟踪外,
  也在车道线跟踪、障碍物预测以及定位等领域大展身手
  
数据对齐
    在进行关联操作之前,需要将信息统一到相同的坐标系以及时间节点,也就是时空间转换
     时间:fusion与measure必须在同一时间下,如果差了一个△t,就是用卡尔曼滤波中的运动学外推即可
	 空间: 后融合是目标级别融合,输入以及输出都是点	

数据关联模块


融合方法

融合应梳理不同场景传感器的性能基线,总结特性并在融合端更好的进行逻辑预埋

参考

https://github.com/ApolloAuto
https://zhuanlan.zhihu.com/p/435445206
你可能想看:
标签: c++代数
分享给朋友: