5 “step”计算

参考《DSO windowed optimization 公式》,计算各个优化变量的增加量。

公式再写一下:

\[\begin{align} \begin{bmatrix} H_{\rho\rho} & H_{\rho X} \\ H_{X\rho} & H_{XX} \end{bmatrix} \begin{bmatrix} \delta \rho \\ \delta X \end{bmatrix} &= - \begin{bmatrix} J_{\rho}^T r \\ J_X^T r \end{bmatrix} \notag \\
\begin{bmatrix} H_{\rho\rho} & H_{\rho X} \\ 0 & H_{XX} - H_{X\rho} H_{\rho\rho}^{-1} H_{\rho X} \end{bmatrix} \begin{bmatrix} \delta \rho \\ \delta X \end{bmatrix} &= - \begin{bmatrix} J_{\rho}^T r \\ J_X^T r - H_{X\rho} H_{\rho\rho}^{-1} J_{\rho}^T r \end{bmatrix} \notag \end{align}\]

我们的目标是用上面的第二个方程

\[(H_{XX} - H_{X\rho} H_{\rho\rho}^{-1} H_{\rho X})\delta X = -(J_X^T r - H_{X\rho} H_{\rho\rho}^{-1} J_{\rho}^T r)
\]

计算出 \(\delta X\),再代回第一个方程

\[H_{\rho\rho}\delta\rho+H_{\rho X}\delta X = -J_{\rho}^T r
\]

计算 \(\delta \rho\)。

5.1 \(\delta X\) 计算

这里 ldlt 计算

\[(H_{XX} - H_{X\rho} H_{\rho\rho}^{-1} H_{\rho X})(-\delta X) = J_X^T r - H_{X\rho} H_{\rho\rho}^{-1} J_{\rho}^T r
\]

的结果\(-\delta X\)。少了一个负号,所以后面在函数 EnergyFunctional::resubstituteF_MT计算内参增量计算帧增量,加了一个负号。这里不要犯迷糊,一开始什么不懂的时候,认为这里 Engel 写错了。

这个计算还是很清晰的。

5.2 \(\delta \rho\) 计算

整理一下,我们要计算的方程是这个:

\[\delta\rho = -H_{\rho\rho}^{-1}(J_{\rho}^T r+H_{\rho X}\delta X)
\]

\(-H_{\rho\rho}^{-1}\) 是一个对角阵,如果看上面方程的一行,得到的结果是

\[\begin{align} {\delta \rho^{(j)}} = -\left( \sum_{i=1}^{N} {\partial r^{(i)} \over \partial \rho^{(j)}}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right)^{-1} \left( \sum_{i=1}^{N} {\partial r^{(i)} \over \partial \rho^{(j)}}^T r^{(i)} + \\ \sum_{i=1}^{N} {\partial r^{(i)} \over \partial \rho^{(j)}}^T \left( {\partial r^{(i)} \over \partial C} {\delta C} + {\partial r^{(i)} \over \partial X_t} {\delta X_t} + {\partial r^{(i)} \over \partial X_h} {\delta X_h} \right) \right) \notag \end{align}
\]

(如果 \(r^{(i)}\) 与 \(\rho^{(j)}\) 没有关系,导数 \({\partial r^{(i)} \over \partial \rho^{(j)}}\) 为 0。)

这个计算比较麻烦,计算过程在函数 EnergyFunctional::resubstituteFPt 中,首先在 EnergyFunctional::resubstituteF_MT的这里 准备xAd数组,这个数组的[h,t]是

\[-\delta X_h^T \frac{\partial X_{th}}{\partial X_h}^T - \delta X_t^T \frac{\partial X_{th}}{\partial X_t}^T
\]

嗯,事先把 adjoint 导数转换准备好。

接着在这里几行计算 \(\delta \rho^{(j)}\):

		float b = p->bdSumF;
b -= xc.dot(p->Hcd_accAF + p->Hcd_accLF); for(EFResidual* r : p->residualsAll)
{
if(!r->isActive()) continue;
b -= xAd[r->hostIDX*nFrames + r->targetIDX] * r->JpJdF;
} p->data->step = - b*p->HdiF;

p->bdSumF 对应 \(\sum_{i=1}^N {\partial r^{(i)} \over \partial \rho^{(j)}}^T r^{(i)}\)。

p->Hcd_accAF + p->Hcd_accLF 对应 \(\sum_{i=1}^N {\partial r^{(i)} \over \partial C}^T{\partial r^{(i)} \over \partial \rho^{(j)}}\)。

r->JpJdF 对应 \({\partial r^{(i)} \over \partial X_{th}}^T{\partial r^{(i)} \over \partial \rho^{(j)}}\)。

结果就出来了。

DSO windowed optimization 代码 (4)的更多相关文章

  1. DSO windowed optimization 代码 (2)

    3 非 Schur Complement 部分信息计算 参考<DSO windowed optimization 公式>,非Schur Complement 部分指 \(H_{XX}\) ...

  2. DSO windowed optimization 代码 (3)

    4 Schur Complement 部分信息计算 参考<DSO windowed optimization 公式>,Schur Complement 部分指 Hsc(\(H_{X\rho ...

  3. DSO windowed optimization 代码 (1)

    这里不想解释怎么 marginalize,什么是 First-Estimates Jacobian (FEJ).这里只看看代码,看看Hessian矩阵是怎么构造出来的. 1 优化流程 整个优化过程,也 ...

  4. DSO windowed optimization 公式

    这里有一个细节,我想了很久才想明白,DSO 中的 residual 联系了两个关键帧之间的相对位姿,但是最终需要优化帧的绝对位姿,中间的导数怎么转换?这里使用的是李群.李代数中的Adjoint. 参考 ...

  5. Adjoint of SE(3)

    以前看的书都提到 SE(3) 和 se(3) 的 Adjoint,但是并没有讲这个东西是干什么用的,只是给了一堆性质.这东西来自群论. 参考 Lie Groups for 2D and 3D Tran ...

  6. Paper Reading: Stereo DSO

    开篇第一篇就写一个paper reading吧,用markdown+vim写东西切换中英文挺麻烦的,有些就偷懒都用英文写了. Stereo DSO: Large-Scale Direct Sparse ...

  7. Omnidirectional DSO: Direct Sparse Odometry with Fisheye Cameras 论文摘要

    1. Abstract 通过一种Unified Omnidirectional Model作为投影方程. 这种方式可以使用图像的所有内容包括有强畸变的区域,而现存的视觉里程计方案只能修正或者切掉来使用 ...

  8. OD: GS Bypasing via SEH / .data

    通过 SEH 绕过 GS 保护 GS 机制没对 SEH 提供保护,所以可心通过攻击异常来绕过 GS. 实验环境为: VMware : Windows sp4, 此版本无 SafeSEH 的影响 Vis ...

  9. [翻译] JFDepthView 给view提供3D景深

    JFDepthView 给view提供3D景深 https://github.com/atljeremy/JFDepthView This is an iOS project for presenti ...

随机推荐

  1. ansible系列2-常用命令

    copyansible oldboy -m copy -a "src=/etc/hosts dest=/tmp/ mode=0600 owner=oldboy group=oldboy &q ...

  2. BZOJ1115[POI2009]石子游戏——阶梯Nim游戏

    题目描述 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必 ...

  3. BZOJ4502串——AC自动机(fail树)

    题目描述 兔子们在玩字符串的游戏.首先,它们拿出了一个字符串集合S,然后它们定义一个字 符串为“好”的,当且仅当它可以被分成非空的两段,其中每一段都是字符串集合S中某个字符串的前缀. 比如对于字符串集 ...

  4. Maven项目读取resources下文件的路径问题(getClassLoader的作用)

    读取resources下文件的方法 网上有问答如下:问: new FileInputStream("src/main/resources/all.properties") new ...

  5. MT【211】保序同构

    设$S,T$是$R$的两个非空子集,如果存在一个从$S$到$T$的函数$y=f(x)$满足:$1)T=\{f(x)|x\in S\};$2)对任意$x_1,x_2\in S$,当$x_1<x_2 ...

  6. 线段树分治总结(线段树分治,线段树,并查集,树的dfn序,二分图染色)

    闲话 stO猫锟学长,满脑子神仙DS 网上有不少Dalao把线段树分治也归入CDQ分治? 还是听听YCB巨佬的介绍: 狭义:只计算左边对右边的贡献. 广义:只计算外部对内部的贡献. 看来可以理解为广义 ...

  7. 架构师成长之路7.1 CDN理论

    点击返回架构师成长之路 架构师成长之路7.1 CDN理论 CDN,Content Distribute Network,内容分发网络:CDN解决的是如何将数据快速可靠从源站传递到用户的问题.用户获取数 ...

  8. Linux 常用命令——df, du, ln

    1. df 列出文件系统的整体磁盘使用量 2. du 评估文件系统的磁盘使用量(常用在推估目录所占容量),也可以计算文件或文件夹大小 3. ln 创建实体连接(hard link) 或 符号连接(Sy ...

  9. C# 面向对象零碎知识点

    obgect: 所有数据类型都是obgect类型: 万能类型 var :原来的变量不变,替换成var: 动态类型 dynamic :类似object,遍历需要转: is  as: 类型转换运算符: ( ...

  10. C#反射遍历/查询类中的属性以及值

    遍历一个类/或类对象的属性/值,很有用,看个例子 using System; using System.Collections.Generic; using System.Linq; using Sy ...