ORB-SLAM3的对于状态量RPV的优化,添加的残差块主要是:
(1)IMU残差(预积分论文)
(2)视觉残差(SLAM14讲-P187)

状态量优化:RPV = RPV + J*△RPV
更新状态是通过J(e/RPV)*△RPV,其中雅可比J(e/RPV)是残差e对于状态量(RPV)的导数

那么优化的状态量RPV究竟是body坐标系的还是camera坐标系的呢?
答案:body系

优化的状态变量是在body坐标系下,从以下几个方面得以验证:

1. 关于状态变量的更新

对于优化变量VertexPose* VP,其更新函数Update()如下
可以看出是Twb进行直接更新的,Tbw以及Tcw是通过Twb进行间接更新的

void ImuCamPose::Update(const double *pu)
{Eigen::Vector3d ur, ut;ur << pu[0], pu[1], pu[2];ut << pu[3], pu[4], pu[5];// Update body posetwb += Rwb * ut;Rwb = Rwb * ExpSO3(ur);// Update camera posesconst Eigen::Matrix3d Rbw = Rwb.transpose();const Eigen::Vector3d tbw = -Rbw * twb;for(int i=0; i<pCamera.size(); i++){Rcw[i] = Rcb[i] * Rbw;tcw[i] = Rcb[i] * tbw + tcb[i];}}

2. IMU残差计算

残差计算都是关于Rwb或者twb的,也就是body坐标系

const Eigen::Vector3d er = LogSO3(dR.transpose()*VP1->estimate().Rwb.transpose()*VP2->estimate().Rwb);
const Eigen::Vector3d ev = VP1->estimate().Rwb.transpose()*(VV2->estimate() - VV1->estimate() - g*dt) - dV;
const Eigen::Vector3d ep = VP1->estimate().Rwb.transpose()*(VP2->estimate().twb - VP1->estimate().twb- VV1->estimate()*dt - g*dt*dt/2) - dP;

雅可比也是关于body坐标系下求导

    // Jacobians wrt Pose 1//顺序: er ev ep 分别对 VPk(VP1)求导 _jacobianOplus[0].setZero();                   // er/Pi = 0  全部设置为0// rotation                                    // ev/Pi = 0  _jacobianOplus[0].block<3,3>(0,0) = -invJr * Rwb2.transpose() * Rwb1; _jacobianOplus[0].block<3,3>(3,0) = Sophus::SO3d::hat(Rbw1*(VV2->estimate() - VV1->estimate() - g*dt));// er/Ri = -J(dR)'*Rj_T*Ri_jacobianOplus[0].block<3,3>(6,0) = Sophus::SO3d::hat(Rbw1*(VP2->estimate().twb - VP1->estimate().twb  // ev/Ri = (Ri_T*(Vj-Vi-g*t))^- VV1->estimate()*dt - 0.5*g*dt*dt));                   // ep/Ri = (Ri_T*(Pj-Pi-Vi*t-1/2*g*t*t))^// translation                                 _jacobianOplus[0].block<3,3>(6,3) = -Eigen::Matrix3d::Identity();        // ep/Pi = -I(3x1)

3. 视觉重投影误差计算

void EdgeMonoOnlyPose::linearizeOplus()
{const VertexPose* VPose = static_cast<const VertexPose*>(_vertices[0]);const Eigen::Matrix3d &Rcw = VPose->estimate().Rcw[cam_idx];const Eigen::Vector3d &tcw = VPose->estimate().tcw[cam_idx];const Eigen::Vector3d Xc = Rcw*Xw + tcw;//相机坐标系转换为body坐标系const Eigen::Vector3d Xb = VPose->estimate().Rbc[cam_idx]*Xc + VPose->estimate().tbc[cam_idx];const Eigen::Matrix3d &Rcb = VPose->estimate().Rcb[cam_idx];//(残差)对(相机坐标系下的P)求导Eigen::Matrix<double,2,3> proj_jac = VPose->estimate().pCamera[cam_idx]->projectJac(Xc);//(body坐标系下的P)对(旋转李代数)求导Eigen::Matrix<double,3,6> SE3deriv;double x = Xb(0);double y = Xb(1);double z = Xb(2);SE3deriv << 0.0,  z , -y , 1.0, 0.0, 0.0,-z , 0.0,  x , 0.0, 1.0, 0.0,y , -x , 0.0, 0.0, 0.0, 1.0;//链式法则:(残差)对(旋转李代数)求导 = (残差)对(相机坐标系下的P)求导 * (相机坐标系下的P)对(body坐标系下的P)求导 * (body坐标系下的P)对(旋转李代数)求导_jacobianOplusXi = proj_jac * Rcb * SE3deriv; // symbol different becasue of update mode
}

雅可比公式(2x6维)_jacobianOplusXi = proj_jac * Rcb * SE3deriv的推导

orb-slam3:优化状态量是camera坐标系下RPV还是body坐标系下RPV探究相关推荐

  1. ORB SLAM3——IMU优化部分精读-VertexPose(ImuCamPose)的更新量到底是什么?

    ORB SLAM3--IMU优化部分精读-VertexPose(ImuCamPose)的更新量到底是什么? 先说答案 void ImuCamPose::Update(const double *pu) ...

  2. ORB SLAM3论文大致翻译,手动整理

    ORB-SLAM3: An Accurate Open-Source Library for Visual, Visual-Inertial and Multi-Map SLAM I. INTRODU ...

  3. ORB SLAM3加载Vocabulary更快ORBvoc.bin

    最近ORB SLAM3刚开源,跑了跑,发现源代码加载词袋还是ORBvoc.txt,加载时间比较慢,这里教你修改成ORBvoc.bin加载,1秒内完成加载. 1. 将ORBvoc.bin拷贝到Vocab ...

  4. Android camera (12)---camera ap在特殊的应用场景下额外使用一套独立的camera tuning参数

    camera ap在特殊的应用场景下额外使用一套独立的camera tuning参数 解决方案: 1, nvram_drv.h core\featureio\drv\inc 中添加下面的interfa ...

  5. Part-1 ORB SLAM3初始化-1

    初始化 ORB SLAM3的初始化主要是创建ORB词袋.关键帧数据库.多地图等对象,其步骤如下: 检测配置文件能否打开 加载ORB词袋(ORBVocabulary) 创建关键帧数据库(KeyFrame ...

  6. 【Java代码】坐标系说明+WGS84\GCJ02\BD09坐标系转换工具+Java坐标系转换及验证源代码分享(粘贴可用)

    1. 坐标系说明 开发地图应用服务时,一定会接触到各种坐标系,而保证坐标系的正确与合理是一切数据分析的前提,总的来说,坐标系可以分为两大类:地理坐标系GCS(Geographic Coordinate ...

  7. 【自动驾驶】33.【图像坐标系】 到 【像素坐标系】 的度量单位变换、【英寸】、【感光芯片】

    我们理论分析的时候,使用小孔成像模型来分析. 其中,(u,v)(u,v)(u,v)为像素坐标,(cx,cy)(c_x, c_y)(cx​,cy​)表示相机主点(principal point),即相机 ...

  8. Windows的三种坐标系:屏幕坐标系,非客户区坐标系,客户区坐标系

    1. 屏幕坐标系:以屏幕的左上角为原点,如图所示 GetWindowRect() 函数获得的 RECT 就是以屏幕坐标系算的. 2. 非客户区坐标系(窗口坐标系) 包括标题栏的部分.GetWindow ...

  9. 【机器人】关键问题:动捕原点坐标系到机械臂基坐标系的转换

    前言:在动作捕捉系统标定与机械臂各坐标系的说明这篇文章中已经对动捕系统原点坐标系和机械臂基坐标系两个坐标系的转换有过一些尝试,但仍到现在,这个坐标系的转换问题仍未解决.   11月4日,在今天下午的实 ...

最新文章

  1. oracle9i安装不上,终于成功安装oracle9i了(Cent OS 4.0+oracle9204)
  2. 【iCore2双核心板】SRAM 读写实验(基于Verilog语言)
  3. 【DIY】光剑(一):炽焰长剑的诞生
  4. loj 300 [CTSC2017]吉夫特 【Lucas定理 + 子集dp】
  5. 蝴蝶优化算法_算法|FFT基础及各种常数优化,5万字笔记:公式推导+代码模板...
  6. Python打断点(亲测)
  7. 后台系统可扩展性学习笔记(十一)Database Denormalization
  8. rsyslod服务配置
  9. 【SpringBoot】Spring boot 测试类 找到不到MySQL 驱动
  10. noip2013——提高组——花匠(flower)
  11. C# 操作List集合报错:集合被修改,枚举操作可能不会执行(Collection was modified, enumeration operation may not execute)
  12. android从本地服务器新浪云,GitHub - SinaCloudStorage/SinaStorage-SDK-Android: Android SDK For 新浪云存储...
  13. 赶紧学会--特别好玩的系统小游戏
  14. RTKlib源码解析:ppp和rtkpost中的周跳检测函数
  15. 【读论文】基于深度学习的铁路道岔转辙机故障诊断(3DESIGN)
  16. yolo3各部分代码(超详细)
  17. 成功将不支持网络的USB打印机变成网络打印机
  18. 网页错误详细信息 用户代理: Mozilla/4.0 (compatible; MSIE 8.0;
  19. 《程序员的自我修养-Ch7_动态链接》
  20. Boston_House_Price经典例子分析

热门文章

  1. linux文件大小查看
  2. php 翻转180度,怎么把视频旋转90度、180度
  3. python什么意思v_vpython是什么
  4. 小程序发送订阅消息,微信公众号发送消息模板
  5. Python:阿基米德棋盘放米问题
  6. 程序员经典电子书下载(超全)
  7. Linux 系统编程 -进程概念篇
  8. 轮毂(电机控制)运用中米每秒和转每分的单位换算
  9. Invalid bound statement (not found)异常解决
  10. 月入四万的程序员生活如同5000工资一样窘迫,钱都去哪了?