以下均为简单笔记,如有错误,请多多指教。
-
证明式 K = P ‾ k C k T ( C k P ‾ k C k T + Q k ) − 1 K=\overline{P}_kC_k^T(C_k\overline{P}_kC_k^T+Q_k)^{-1} K=PkCkT(CkPkCkT+Qk)−1。
答:由于课本上已经推导了大部分的公式,则已知
P ^ k = ( 1 − K C k ) P ‾ k \widehat{P}_k=(1-KC_k)\overline{P}_k P k=(1−KCk)Pk
K = P ^ k C k T Q k − 1 K=\widehat{P}_kC_k^TQ_k^{-1} K=P kCkTQk−1
故而得到 K = ( 1 − K C k ) P ‾ k C k T Q k − 1 = P ‾ k C k T Q k − 1 − K C k P ‾ k C k T Q k − 1 K=(1-KC_k)\overline{P}_kC_k^TQ_k^{-1}=\overline{P}_kC_k^TQ_k^{-1}-KC_k\overline{P}_kC_k^TQ_k^{-1} K=(1−KCk)PkCkTQk−1=PkCkTQk−1−KCkPkCkTQk−1;
稍微处理一下得到 K ( 1 + C k P ‾ k C k T Q k − 1 ) = P ‾ k C k T Q k − 1 K(1+C_k\overline{P}_kC_k^TQ_k^{-1})=\overline{P}_kC_k^TQ_k^{-1} K(1+CkPkCkTQk−1)=PkCkTQk−1
方程两边同时乘以 Q k Q_k Qk,则 K ( Q k + C k P ‾ k C k T ) = P ‾ k C k T K(Q_k+C_k\overline{P}_kC_k^T)=\overline{P}_kC_k^T K(Qk+CkPkCkT)=PkCkT
故而 K = P ‾ k C k T ( Q k + C k P ‾ k C k T ) − 1 K=\overline{P}_kC_k^T(Q_k+C_k\overline{P}_kC_k^T)^{-1} K=PkCkT(Qk+CkPkCkT)−1
-
对比g2o和Ceres的优化后目标函数的数值。指出为什么两者在Meshlab中效果一样但数值却不同。
答:个人感觉这个是自然而然的,即便是同一个程序在不同的运行时间其数值都可能不太一样。
-
对Ceres当中的部分点云进行Schur消元,看看结果会有什么区别。
答:Schur消元后,Ceres运行的时间会得到一定程度的提高。本文使用了http://grail.cs.washington.edu/projects/bal/final.html中961张影像的数据,完全不边缘化的运行时间为1812s,边缘化所有点的运行时间为1629s。但是总体感觉似乎时间变化不多,具体原因还不太清楚。
部分点云进行消元要修改的代码也非常简单,即在ch10/ceres_custombundle中的SetOrdering稍微修改一下即可,例如只消元 1 / 3 1/3 1/3:
for(int i=0; i<bal_problem->num_points(); i++)
{
if(i%3==0)
{
ordering->AddElementToGroup(bal_problem->mutable_point_for_observation(i),0);
}
else
{
ordering->AddElementToGroup(bal_problem->mutable_point_for_observation(i),1);
}
}
- 证明
S
S
S矩阵为半正定矩阵。
答:待解决