DSO windowed optimization 代码 (3)
4 Schur Complement 部分信息计算
参考《DSO windowed optimization 公式》,Schur Complement 部分指 Hsc(\(H_{X\rho} H_{\rho\rho}^{-1} H_{\rho X}\))和 bsc(\(H_{X\rho} H_{\rho\rho}^{-1} J_{\rho}^T r\))。
4.1 AccumulatedSCHessianSSE::addPoint()优化的局部信息计算
最终得到的 Hsc 是 68x68 的矩阵,bsc 是 68x1 的矩阵。
4.1.1 局部变量
p->HdiF对应 \(\left( \sum_{i=1}^N {\partial r^{(i)} \over \partial \rho^{(j)}}^T{\partial r^{(i)} \over \partial \rho^{(j)}} \right)^{-1}\),1x1。在前面的 AccumulatedTopHessianSSE::addPoint() 已经进行了累加,而这个是一个 Scalar 量,现在只需要求一个倒数就行了。
Hcd对应 \(\left( \sum_{i=1}^N {\partial r^{(i)} \over \partial C}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right)\),4x1。
p->bdSumF对应当前点下,所有 \({\partial r_{21} \over \partial \rho_1}^T r_{21}\) 的求和,即 \(\left( \sum_{i=1}^N {\partial r^{(i)} \over \partial \rho^{(j)}}^T r^{(i)} \right)\),1x1。
r1->JpJdF对应当前residual下,所有 \({\partial r_{21} \over \partial X_{21}}^T {\partial r_{21} \over \partial \rho_1} = \begin{bmatrix} {\partial r_{21} \over \partial \xi_{21}}^T{\partial r_{21} \over \partial \rho_1} \\ {\partial r_{21} \over \partial l_{21}}^T{\partial r_{21} \over \partial \rho_1}\end{bmatrix}\) 的和。\(\left( {\partial r^{(i)} \over \partial X_{tj}}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right)\),8x1。\(t\) 表示 target,也就是 \(r^{(i)}\) 联系的另外一个 frame。
4.1.2 成员变量更新
accHcc[tid].update(Hcd,Hcd,p->HdiF)是在accHcc中加上了针对当前点的Hcc,对应 \(\left( \sum_{i=1}^N {\partial r^{(i)} \over \partial C}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right) \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 C}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right)^T\)。
accbc[tid].update(Hcd, p->bdSumF * p->HdiF)是在accbc中加上了针对当前点的bc,对应 \(\left( \sum_{i=1}^N {\partial r^{(i)} \over \partial C}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right) \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)} \right)\)。
注意accE, accEB, accD都是数组。
accE[tid][r1ht].update(r1->JpJdF, Hcd, p->HdiF)是在accE[r1ht]中加上了针对当前residual(target, host)的 \(\left( {\partial r^{(k)} \over \partial X_{th}}^T {\partial r^{(k)} \over \partial \rho^{(j)}} \right) \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 C}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right)^T\)。注,当前residual的 index 是 k,联系 t, h 两个 frame。对当前点的所有 residual 求和完成之后,accE[t, h]对应 \(\left( \sum_{i=1}^N {\partial r^{(i)} \over \partial X_{th}}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right) \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 C}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right)^T\)。
accEB[tid][r1ht].update(r1->JpJdF,p->HdiF*p->bdSumF)是在accEB中加上了针对当前residual的 \(\left( {\partial r^{(k)} \over \partial X_{th}}^T {\partial r^{(k)} \over \partial \rho^{(j)}} \right) \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)} \right)^T\)。注,当前residual的 index 是 k,联系 t, h 两个 frame。对当前点的所有 residual 求和完成之后,accEB[t, h]对应 \(\left( \sum_{i=1}^N {\partial r^{(i)} \over \partial X_{th}}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right) \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)} \right)^T\)。
accD[tid][r1ht+r2->targetIDX*nFrames2].update(r1->JpJdF, r2->JpJdF, p->HdiF)对应当前residual``r1与相同点下所有residual``r2(r1, r2可相同),即 h2 == h1 两个 residual 同 host。单个更新是在accD[t2,t1,h1]加上的东西是 \(\left( {\partial r_1 \over \partial X_{t_1h_1}}^T {\partial r_1 \over \partial \rho^{(j)}} \right) \left( \sum_{i=1}^N {\partial r^{(i)} \over \partial \rho^{(j)}}^T{\partial r^{(i)} \over \partial \rho^{(j)}} \right)^{-1} \left( {\partial r_2 \over \partial X_{t_2h_1}}^T {\partial r_2 \over \partial \rho^{(j)}} \right)^T\)。在对当前residual``r1累加完成之后,accD[t2,t1,h1]加上的东西是 \(\left( {\partial r_1 \over \partial X_{t_1h_1}}^T {\partial r_1 \over \partial \rho^{(j)}} \right) \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 X_{t_2h_1}}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right)^T\)。 在对当前点累加完成之后,accD[t2,t1,h1]加上的东西是 \(\left( \sum_{i=1}^N {\partial r^{(i)} \over \partial X_{t_1h_1}}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right) \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 X_{t_2h_1}}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right)^T\)。
4.1.3 更新完成后成员变量的意义
这个更新完成是指遍历了所有点之后,请结合 AccumulatedTopHessianSSE::stitchDouble 看。
所以accHcc对应 \(\sum_{j=1}^M \left( \sum_{i=1}^N {\partial r^{(i)} \over \partial C}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right) \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 C}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right)^T\),4x4。
所以accbc对应 \(\sum_{j=1}^M \left( \sum_{i=1}^N {\partial r^{(i)} \over \partial C}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right) \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)} \right)\),4x1。
所以accE[t,h](t 行 h 列)对应 \(\sum_{j=1}^M \left( \sum_{i=1}^N {\partial r^{(i)} \over \partial X_{th}}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right) \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 C}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right)^T\),8x4。
所以accEB[t,h]对应 \(\sum_{j=1}^M \left( \sum_{i=1}^N {\partial r^{(i)} \over \partial X_{th}}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right) \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)} \right)^T\),8x1。
所以accD[t2,t1,h1]对应 \(\sum_{j=1}^M \left( \sum_{i=1}^N {\partial r^{(i)} \over \partial X_{t_1h_1}}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right) \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 X_{t_2h_1}}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right)^T\)。
4.2 AccumulatedSCHessianSSE::stitchDoubleInternal()优化信息统计
下面该乘 Adj(adHost, adTarget) 就乘,为了方便,我下面就不说了。
accHcc加到Hsc.block<CPARS, CPARS>(0,0)。
accbc加到bsc.head<CPARS>()。
accE[t,h]加到Hsc.block<8, CPARS>(0,t*8), Hsc.block<8, CPARS>(0,h*8),以及转置后加到对角对称位置Hsc.block<CPARS, 8>(t*8,0), Hsc.block<CPARS, 8>(h*8,0)。
accEB[t,h]加到bsc.segment<8>(t*8), bsc.segment<8>(h*8)。
accD[t2,t1,h1]加到Hsc.block<8,8>(h1*8, h1*8), Hsc.block<8,8>(t1*8, t2*8), Hsc.block<8,8>(t1*8, h1*8), Hsc.block<8,8>(h1*8, t2*8)。
Hsc.block<8,8>(t, h)对应公式 \(\sum_{j=1}^M \left( \sum_{i=1}^N {\partial r^{(i)} \over \partial X_{t}}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right) \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 X_{h}}^T {\partial r^{(i)} \over \partial \rho^{(j)}} \right)^T\)。
DSO windowed optimization 代码 (3)的更多相关文章
- DSO windowed optimization 代码 (2)
3 非 Schur Complement 部分信息计算 参考<DSO windowed optimization 公式>,非Schur Complement 部分指 \(H_{XX}\) ...
- DSO windowed optimization 代码 (4)
5 "step"计算 参考<DSO windowed optimization 公式>,计算各个优化变量的增加量. 公式再写一下: \[\begin{align} \b ...
- DSO windowed optimization 代码 (1)
这里不想解释怎么 marginalize,什么是 First-Estimates Jacobian (FEJ).这里只看看代码,看看Hessian矩阵是怎么构造出来的. 1 优化流程 整个优化过程,也 ...
- DSO windowed optimization 公式
这里有一个细节,我想了很久才想明白,DSO 中的 residual 联系了两个关键帧之间的相对位姿,但是最终需要优化帧的绝对位姿,中间的导数怎么转换?这里使用的是李群.李代数中的Adjoint. 参考 ...
- Adjoint of SE(3)
以前看的书都提到 SE(3) 和 se(3) 的 Adjoint,但是并没有讲这个东西是干什么用的,只是给了一堆性质.这东西来自群论. 参考 Lie Groups for 2D and 3D Tran ...
- Paper Reading: Stereo DSO
开篇第一篇就写一个paper reading吧,用markdown+vim写东西切换中英文挺麻烦的,有些就偷懒都用英文写了. Stereo DSO: Large-Scale Direct Sparse ...
- Omnidirectional DSO: Direct Sparse Odometry with Fisheye Cameras 论文摘要
1. Abstract 通过一种Unified Omnidirectional Model作为投影方程. 这种方式可以使用图像的所有内容包括有强畸变的区域,而现存的视觉里程计方案只能修正或者切掉来使用 ...
- OD: GS Bypasing via SEH / .data
通过 SEH 绕过 GS 保护 GS 机制没对 SEH 提供保护,所以可心通过攻击异常来绕过 GS. 实验环境为: VMware : Windows sp4, 此版本无 SafeSEH 的影响 Vis ...
- [翻译] JFDepthView 给view提供3D景深
JFDepthView 给view提供3D景深 https://github.com/atljeremy/JFDepthView This is an iOS project for presenti ...
随机推荐
- Heaven of Imaginary(PKUSC2018)
Day-4 巨佬一个星期前就停了课,而蒟蒻还在教室里,收拾一地学科的烂摊子. 蒟蒻为什么要停课呢?真的有\(1\%\)的可能,成功报名PKUSC吗? 真的有. 蒟蒻滚回了机房. 三天,能做些什么呢?可 ...
- 洛谷 P2292 [HNOI2004] L语言 解题报告
P2292 [HNOI2004] L语言 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章\(T\)是由若干小写字母构成.一个单词 ...
- 做一个懒COCOS2D-X程序猿(一)停止手打所有cpp文件到android.mk
前言:”懒”在这里当然不是贬义词,而是追求高效,拒绝重复劳动的代名词!做一个懒COCOS2D-X程序猿的系列文章将教会大家在工作中如何偷懒,文章篇幅大多较短,有的甚至只是几行代码,争取把懒发挥到极致! ...
- Holiday、Vacation、Days off、Leave、Break
http://write.scu.edu.tw/view.php?bd=mistake&no=25 這些字在英文的用法中都有放假.休息的意思,但用法卻不太一樣,接下來就來看看它們的不同吧. 『 ...
- 迅雷thunder://协议解密
echo -n 'thunder://''Cg==' | sed 's?thunder://??' | base64 -d | sed 's/^AA//; s/ZZ$//' 将thunder://替换 ...
- 洛谷 P1083 借教室
传送门:Probem 1083 https://www.cnblogs.com/violet-acmer/p/9721160.html 一.暴力简述 首先我们不难看出,这道题--并不是一道多难的题,因 ...
- springboot集成mybatis-generator时候遇到的问题
今天在集成mybatis自动生成内容的时候,出现了几个问题,解决了一个小时才搞完,都怪之前没有好好研究研究: 1.mysql-connector-java新驱动带来的问题? 当用比较新的sql驱动的时 ...
- Yosimite10.10(Mac os)安装c/c++内存检测工具valgrind
1.下载支持包m4-1.4.13.tar.gz $ curl -O http://mirrors.kernel.org/gnu/m4/m4-1.4.13.tar.gz 2. 解压m4-1.4.13.t ...
- https和server-status配置案例
https和server-status配置案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.https协议 我们知道http协议是明文的,所以,你的数据发送不管是请求报文(r ...
- Spark记录-SparkSql官方文档中文翻译(部分转载)
1 概述(Overview) Spark SQL是Spark的一个组件,用于结构化数据的计算.Spark SQL提供了一个称为DataFrames的编程抽象,DataFrames可以充当分布式SQL查 ...