单目SLAM尺度问题

双目通过基线(单位mm)和特征点在两个像素平面上坐标的视差来确定空间点坐标(x,y,z),单目就不行了。

以ORB_SLAM2的单目初始化为例。

流程:(只介绍初始化时的跟踪)

在system.ccTracking::Tracking()创建一个tracking线程,传入词典向量、传感器类型、相机设置文件,以及绑定地图、关键帧数据库、地图绘制、帧绘制。

然后Tracking::GrabImageMonocular()将图片转为灰度图,根据系统状态mState是未被初始化还是别的,创建当前帧(初始帧的特征点提取数量比一般帧的数量多一倍)。

然后调用Tracking::Track():未初始化,则调用Tracking::MonocularInitialization(),初始化成功后mState=OK.

Tracking::MonocularInitialization():单目初始化需要连续的两帧,这两帧提取的特征点都要>100,且匹配的点数要>100,否则就接着读取下一帧。然后调用Initialize::Initialize(),判断能否初始化以及计算R,t(创建两个线程并行计算H和F矩阵,根据得分判断用哪个模型,然后用该模型进行三角化,验证模型是否合适)。经过这些操作,终于到靠题的一个函数了:Tracking::CreateInitialMapMonocular()。

Tracking::CreateInitialMapMonocular()创建初始关键帧pKFini和当前关键帧pKFcur,创建地图点并进行局部BA。然后就可以认为初始化结果是正确的,这个时候,尺度怎样确定呢?根据高博的SLAM14讲第152页的内容,单目尺度不确定性可以通过对初始两帧的平移向量t归一化作为后续的单位;也可以通过令初始化时所有特征点的平均深度为1固定一个尺度,这种方式可以控制场景规模大小,使计算在数值上更稳定。那么ORB-SLAM2单目初始化使用的是第二种固定尺度的方法(与书上略有不同):

    // step1:获取初始关键帧的地图点的深度中值Z
    float medianDepth = pKFini->ComputeSceneMedianDepth(2);
    float invMedianDepth = 1.0f/medianDepth;

    if(medianDepth<0 || pKFcur->TrackedMapPoints(1)<100)
    {
        cout << "Wrong initialization, reseting..." << endl;
        Reset();
        return;
    }

    //step2:相机位姿归一化x'/z,y'/z,z'/z
    cv::Mat Tc2w = pKFcur->GetPose();
    Tc2w.col(3).rowRange(0,3) = Tc2w.col(3).rowRange(0,3)*invMedianDepth;
    pKFcur->SetPose(Tc2w);

    //step3:地图点归一化
    vector<MapPoint*> vpAllMapPoints = pKFini->GetMapPointMatches();
    for(size_t iMP=0; iMP<vpAllMapPoints.size(); iMP++)
    {
        if(vpAllMapPoints[iMP])
        {
            MapPoint* pMP = vpAllMapPoints[iMP];
            pMP->SetWorldPos(pMP->GetWorldPos()*invMedianDepth);
        }
    }

综上,尺度固定是对于平移向量来说的,即一个形象表达式为c*t(c是尺度变换因子,即代码段中的invMedianDepth),和旋转矩阵R没有关系(常识也是这样,沿着方向,走的距离不同(1m还是1cm),造成的轨迹尺度也不一样,但是形状是一样的)。用ORB_SLAM2单目跑标准数据集,与gt比较,需要先进行尺度对齐,在SLAM评估软件evo中,通过指令--align --correct-scale实现,对应的代码段的原理论文《Least-SSquares Estimation of Transmation Parameters Between Two Point Patterns》中:

X,Y是两组对应的点(两组尺度、方向、不一致的轨迹),c、R、t分别对应尺度、旋转、平移变换参数。

以一个简单的2维,3点对齐问题为例,用该论文提出的最小化上述方差方法得到的变换参数,进行变换,效果如下:-[

——>

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
根据提供的引用内容,单目尺度不确定性原理是指在单目视觉中,无法准确确定物体在三维空间中的尺度大小。双目视觉通过基线和视差来确定空间点坐标,可以精确测量物体的尺寸。然而,单目视觉无法通过一个相机的图像来确定物体的实际尺寸,因为单目视觉只有一个视角。尺度固定是对于平移向量来说的,与旋转矩阵无关。这意味着,单目视觉可以捕捉到物体的形状和运动方向,但无法准确测量其实际尺寸。为了解决这个问题,需要进行尺度对齐的处理,以便在SLAM评估中与真实的尺度进行比较。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [扩展不确定性原理黑洞](https://download.csdn.net/download/weixin_38717574/12259670)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [单目SLAM尺度问题](https://blog.csdn.net/weixin_42269064/article/details/115691673)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值