【自动驾驶】常见位姿估计算法的比较: 三角测量、PNP、ICP、

在这里插入图片描述

PnP问题 (3D-2D)

DLT(直接线性变换算法)

相机标定工程用到的是DLT(直接线性变换算法) ,它是一类PnP问题 (3D-2D) 。请参考【位姿估计 | 视觉SLAM | 笔记】常见位姿估计算法的比较

PnP(Perspective-n-Point)是根据图像中

  • 1.特征点的二维像素坐标
  • 2.特征点的三维空间坐标

来估计相机在参考坐标系中位姿。

PnP是一类问题,针对不同的情况有不同的解法,常见的算法有:P3P、DLT、EPnP、UPnP等。


ICP算法

imu两时刻的姿态变化,反应了车辆的姿态变化:
两个时间点之间imu的运动,我猜测应该是使用ICP算法求解出来的。
我猜测一下:
时间t1,imu姿态四元数为(a1,b1,c1,w1),观测到A障碍物的某角点P在imu坐标系下为P1(x1,y1,z1)
时间t2,imu姿态四元数为(a2,b2,c2,w2),观测到A障碍物的某角点P在imu坐标系下为P2(x2,y2,z2)

以车子拐弯为例,在这两个时刻,imu既平移了,也旋转了。障碍物A在imu坐标系下的两个坐标变化就比较大。通过联立方程,就能求出imu的姿态变化。

细节请参考【位姿估计 | 视觉SLAM | 笔记】常见位姿估计算法的比较
这里是以相机为例,把相机换成imu就可以了。对于障碍物A的点P在imu坐标系下的坐标,可通过激光雷达来获得。
在这里插入图片描述


在这里插入图片描述

PnP虽然写的是地图到图像的匹配,地图中的是3d点,图像是2d点,因此是从3d和2d的一个匹配,你要算相机的位姿,就叫PnP。不一定是地图,也可以是激光点云,因为激光点云也是3d点。

ICP是同一个深度相机的前后两帧深度图像的匹配,你要计算这前后两帧的时间段内相机的运动,就叫ICP。

1.对极几何:你有两个单目图像,通过特征点匹配后,你要算相机是怎么运动的,就是对极几何。

注意:对极几何是不是三角测量。
算法使用条件:一个相机,不同时刻。
已知:两张单目图像。
求解:相机在这段时间内的运动 R,t.
方法:将两张图进行特征点(像素坐标系下)匹配。然后重点就是假设出相机相对运动参数R,t,假设出点P在O1相机坐标系中的坐标。如下图:
在这里插入图片描述

2.三角测量:(不是对极几何)

算法使用条件:2个相机,同一时刻。
已知:
(1)两个相机同时拍摄的世界坐标系下的同一点P(未知),他们在各自像素坐标系下的坐标(u1,v1),(u2,v2)
(2)两个相机之间的相对位姿。

求解:世界坐标系下的点P。
只需要一个点,因为只求这个点P。但是怎么求呢?相对位姿怎么转化,需要把公式推导一下再分析。

3.DLT

算法使用条件:1个相机,激光雷达,同一时刻。
已知:
(1)世界坐标系的n个点的坐标
(2)这n个世界点在像素坐标系进行匹配,得到n个匹配点对,在像素坐标系下的坐标。
求解:相机的姿态:R(3x3),t(3x1),共3x3+3x1=12个未知量
提示:每个点对会提供2个约束,根据线性方程组性质可知,12个未知量需要12/2=6个点对。如果大于6个点就使用SVD最小二乘求解。

4.ICP

RGB-D深度相机,可使用ICP算法。
算法使用条件:1个深度相机,不同时刻。
已知:空间中同一点在不同时刻(一般是前后帧)的3D相机坐标系下的三维坐标值,通过RGB-D深度相机图像匹配找到这两个点。

"在ICP问题中,图像信息仅仅用来做特征点的匹配,而并不参与视图几何的运算。也就是说,ICP问题的求解用不到相机的内参与特征点的像素坐标。 "
注意,这里的图像信息是有深度的,做特征点匹配也是在这深度图像中进行匹配的。

求解:相机帧间运动,即,相机在这段时间内的运动 R,t。
提示:每一个点P可以得到3个约束,根据线性方程组性质可知,12个未知量需要12/3=4,那么理论上至少需要4个点就可以求得相机的运动R、T。如果大于4个点就使用最小二乘求解。

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PNP算法(Perspective-Point)是一种用于计算相机位姿估计算法,它可以通过已知的3D点和对应的2D图像点来计算相机的旋转和平移矩阵。 在OpenCV中,PNP算法的实现主要依赖于solvePnP函数。该函数可以通过不同的方法来解决PNP问题,包括EPnP、DLS、UPnP等。其中,EPnP是一种基于最小化重投影误差的方法,DLS是一种基于最小二乘法的方法,UPnP是一种基于非线性优化的方法。 使用OpenCV中的PNP算法进行位姿估计的步骤如下: 1. 准备3D点和对应的2D图像点数据。 2. 根据所选的PNP算法,调用solvePnP函数,并传入相应的参数。 3. 根据函数返回的结果,获取相机的旋转和平移矩阵。 以下是一个示例代码,演示了如何使用OpenCV中的PNP算法进行位姿估计: ```cpp #include <opencv2/opencv.hpp> int main() { // 准备3D点和对应的2D图像点数据 std::vector<cv::Point3f> objectPoints; std::vector<cv::Point2f> imagePoints; // 添加3D点和对应的2D图像点数据 // 定义相机内参矩阵 cv::Mat cameraMatrix = cv::Mat::eye(3, 3, CV_64F); // 定义畸变系数 cv::Mat distCoeffs = cv::Mat::zeros(5, 1, CV_64F); // 调用solvePnP函数进行位姿估计 cv::Mat rvec, tvec; cv::solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs, rvec, tvec); // 输出相机的旋转和平移矩阵 std::cout << "Rotation vector: " << rvec << std::endl; std::cout << "Translation vector: " << tvec << std::endl; return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值