基于单目相机的2D地图构建

本文详细介绍了基于单目相机的2D地图构建方法,利用ORB-SLAM2算法生成3D点云并转换为2D栅格地图。研究内容包括相机内外参数分析、ORB特征与SIFT特征的比较,以及特征匹配和位姿求解。通过实验验证了ORB-SLAM2的性能和2D地图构建的实时性与准确性,为低成本的机器人导航提供了可能。

1.1 研究背景

同时定位和建图(SLAM)是机器人和自主导航中的一个重要领域。它是指机器人在未知环境中移动并使用其传感器和里程计信息构建环境地图并同时估计其在此地图中位置的过程。SLAM对于机器人系统的自动操作是不可或缺的,如室内的自动扫地机器人与室外复杂环境下的自动驾驶汽车。使用像LiDAR和Kinect这样的复杂3D传感器进行SLAM目前已经有了较为成熟的技术方案,尤其是在大多数的室内环境中进行SLAM已经有了比较完善的方法[1]。然而,这些3D传感器诸如LiDAR的高成本和Kinect的有限识别范围之类的限制,使得LiDAR不能用于低成本的SLAM系统而Kinect则难以用于户外场景。因此,视觉SLAM(一个或两个2D摄像机用作传感器)仍然是一个很受欢迎的研究领域。但同时这也是非常具有挑战性的,因为缺少直接的3D信息,所以场景的3D结构必须通过从不同视角拍摄的多个图像中提取特征来进行推断。但是有时即使在存在3D传感器的情况下也需要来自相机的丰富视觉信息进行环闭检测。所以如果通过相机获得的3D信息也可以用于地图生成和定位,则可能大大的提高系统的性能。

ORB-SLAM [2][3]是一种较为成熟的视觉SLAM方案,能够仅使用单目摄像机创建基于点云的地图,在复杂的室外环境下也能有较好效果。虽然ORBSLAM获得的稀疏点云可以用于获得环境的3D结构,但是对于使用需要2D栅格地图[4]作为输入的路径规划和导航算法而言,这种地图并不能起到作用。ORB SLAM产生的点云是稀疏的,这使得其难以生成包含大部分障碍的栅格图,这些栅格图可以在自由空间中为机器人提供足够的连续性,以保证路径规划的顺利进行。该项目旨在通过使用ORB SLAM产生的3D点云实时构建2D栅格图的方法来解决稀疏点云不能用于导航的问题。栅格地图应该足以使ROS [5]的标准导航包使用它来生成导航命令,该命令可以允许机器人(实体或虚拟)跟踪ORB SLAM生成的摄像机轨迹。

Santana等人基于颜色将图片中的区域分为不同的连通域,然后使用由SLAM产生的homograhy矩阵对同一个连通域进行建图。但是这种方法对计算资源的需求比较大,对于需要通过视觉实时建图的系统来说具有较大的困难。另外一种构建地图的方法是将3D的点云信息转化为3D的激光雷达数据,然后调用ROS包,将得到的数据输入到Gmapping节点中。但是这种方法会带来额外的不确定性,对于建图的稳定性具有较大的挑战。

Goeddel等人最近的一项工作[6]提出了一种从3D LiDAR数据中提取2D地图以进行定位的方法。它的工作原理是通过对估计点所在的平面斜率进行阈值处理,对每个点施加垂直度约束。为了区别出合适大小的障碍物,它使用两个不同的阈值,一个较小的阈值(15度)用于检测导航过程中是否有危险,而较大的一个(80度)用于检测是否会发生碰撞。对障碍检测施加了两个额外的限制以进一步减少错误概率:1.只考虑那些z轴长度在设置范围内的点;2.该点的垂直线中包含的点云的数量需要超过阈值。Huesman [7]在将3D点云转换为2D栅格图的过程中也是基于斜率阈值法确定障碍物这一核心思想,本次项目中也使用的方法也将此作为检测虚假障碍的方法之一。

1.2 主要研究内容

       本文首先分析了普通单目相机的内外参数,并对使用相机进行了标定。然后介绍了视觉SLAM中几种算法,接着在ORBSLAM2构建的3D点云图上实现了二维地图的构建。并通过实验验证了ORBSLAM2的效果以及构建2D地图的实时性以及准确性。

 

2.1 相机的内参与畸变

相机将3D世界中的真实点转换到二维图像平面上,为了从图像中复原出3D世界的真实点,我们需要用到相机模型。其中最常用的相机模型是针孔模型,如图2.1。

图2.1 相机针孔模型

 在图2.1中,右边为3D世界真实点,左边为相机获得的图像平面上的点。O为模型中的针孔[8]。由于图像是二维平面,因此还有Y坐标,根据相似三角形,有:

 在这里,图像平面不能表示图像的像素平面坐标,因此,定义像素坐标系o-u-v,而像素坐标是可以直接在图像文件中获得的。通常,像素平面的坐标原点为图像左上角,而图像平面的坐标原点为图像中心,因此两个坐标系存在一个尺度变换和一个平移变换,像素平面o-u-v和图像平面O-X’-Y’的转换关系为:

 

简化模型,转换坐标系,去掉式(2-1)中的负号,并代入式(2-2),有:

转化为矩阵形式有:

在式(2-4)中,中间的3×3的矩阵被称为相机的内参矩阵K,内参矩阵反映了3D真实点到图像像素平面的变换关系。通常,相机在出厂后就已经标定好内参了,但是,由于一些外力和机械因素,内参可能会有些许变化。另一方面,当选择让相机输出不同分辨率的时候,内参矩阵也会发生变化,这种变化一般是与分辨率成线性关系的。

2.2 相机外参

使用旋转矩阵R与平移矩阵t表示这一变化如式2.5。

         其中T表示旋转平移矩阵,也就是相机的外参。相机的外参也就是相对于世界坐标系的欧氏变换矩阵,它描述了相机相对于世界坐标系的相对位置和姿态,也就是平移和旋转量。我们要做的定位系统实际上就是为了实时求得相机的外参矩阵,如何求解这个矩阵是整个系统的核心问题。

 

2.3 相机标定

       相机标定已经有了较为成熟的方案,本文采用张氏标定法进行相机内外参数的标定。”张正友标定”是指张正友教授1998年提出的单平面棋盘格的摄像机标定方法[1]。文中提出的方法介于传统标定法和自标定法之间,但克服了传统标定法需要的高精度标定物的缺点,而仅需使用一个打印出来的棋盘格就可以。同时也相对于自标定而言,提高了精度,便于操作。因此张氏标定法被广泛应用于计算机视觉方面。

       本文基于opencv,采用张氏标定法对相机进行标定,最终得到相机内参如表2-1.其中fx,fy表示相机的焦距,cx和cy表示的是相机的几何光轴(反映在图像平面上就是图像原点)相对于像素平面的像素偏移量

### 单目相机测距原理及实现方法 单目相机测距的原理主要依赖于几何模型和已知的相机参数。单目相机无法直接获取深度信息,但可以通过几何关系和标定参数来估算目标的距离。具体来说,单目相机测距的核心在于利用相机的内参(如焦距和主点位置)和外参(相机相对于世界坐标系的位置和姿态),结合图像中的像素坐标和实际物体的尺寸信息进行计算。 在某些情况下,可以利用已知的物体尺寸或场景信息来辅助测距。例如,假设已知物体的实际宽度,通过测量该物体在图像中的像素宽度,结合相机的焦距,可以计算出物体到相机的距离。公式如下: $$ \text{距离} = \frac{\text{实际宽度} \times \text{焦距}}{\text{像素宽度}} $$ 此外,结合SLAM(同步定位与地图构建)技术,可以通过3D-2D位姿解算的方法实现测距。这种方法利用特征点匹配和几何约束,通过连续的图像帧估计相机的运动轨迹,并推算目标的深度信息。这种技术虽然无法达到双目或深度相机的精度,但在某些特定场景下仍然有效[^1]。 #### 单目相机测距的实现方法 1. **相机标定** 在测距之前,需要对相机进行标定以获取其内参和外参。标定过程通常包括以下步骤: - 拍摄多张标定板(如棋盘格)的图像。 - 提取标定板的角点坐标。 - 根据角点坐标和标定板的实际尺寸,计算相机的内参和外参。 - 通过重投影误差评估标定结果的准确性。 2. **基于已知尺寸的测距** 利用公式 $\text{距离} = \frac{\text{实际宽度} \times \text{焦距}}{\text{像素宽度}}$,可以通过已知物体的实际尺寸和图像中的像素尺寸进行测距。这种方法适用于物体尺寸已知的场景。 3. **基于SLAM的测距** SLAM技术通过连续的图像帧提取特征点,并利用特征点匹配和几何约束来估计相机的运动轨迹,从而推算目标的深度信息。这种方法通常需要较高的计算资源,但在动态场景中具有较好的适应性。 4. **基于深度学习的测距** 近年来,深度学习技术也被应用于单目相机测距。通过训练神经网络模型,可以从单张图像中直接预测深度图。这种方法在某些场景下表现出色,但需要大量的标注数据进行训练。 #### 示例代码 以下是一个简单的基于已知尺寸的测距实现示例: ```python def calculate_distance(actual_width, focal_length, pixel_width): """ 计算目标到相机的距离 :param actual_width: 物体的实际宽度(单位:米) :param focal_length: 相机的焦距(单位:像素) :param pixel_width: 物体在图像中的像素宽度 :return: 目标到相机的距离(单位:米) """ distance = (actual_width * focal_length) / pixel_width return distance # 示例参数 actual_width = 0.5 # 实际宽度为0.5米 focal_length = 800 # 焦距为800像素 pixel_width = 200 # 图像中的像素宽度为200像素 # 计算距离 distance = calculate_distance(actual_width, focal_length, pixel_width) print(f"目标到相机的距离为: {distance:.2f} 米") ``` ###
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值