终于讲清楚自动驾驶中的坐标变换了...

作者 | 小侠  编辑 | 3D视觉之心

原文链接:https://zhuanlan.zhihu.com/p/597089263

点击下方卡片,关注“自动驾驶之心”公众号

戳我-> 领取自动驾驶近15个方向学习路线

>>点击进入→自动驾驶之心技术交流群

本文只做学术分享,如有侵权,联系删文

写在前面

本文对线性代数中的坐标变换、基变换两个概念的引入、性质进行了详细推导,并以自动驾驶中的传感器外参标定验证场景举例,介绍了坐标变换和基变换在实际工程中的应用,相信看完本文大家能对坐标变换和基变换有更深的理解。

本文默认读者具备基础的线性代数知识,包括基、线性组合、线性变换等概念。

应用背景

首先引入相机外参,相机外参描述的是车辆系下的三维坐标与相机系下的三维坐标之间的转换关系,用 来表示, 是一个 的矩阵,左上角 的矩阵描述了坐标的旋转,描述了坐标的平移。

车辆系和相机系都是右手坐标系,一般情况下:车辆系的X轴指向车辆前方,Y轴指向车辆左方,Z轴指向天空;相机为前视相机,其坐标系为X轴指向车辆右方,Y轴指向地面,Z轴指向车辆前方。

119548260ff4aa6ad573332a67dc3dda.png
车辆坐标系和相机坐标系

为什么需要坐标转换矩阵 T 呢,假设我们在图像中检测到一个行人,此时我们可以通过相机内参并结合其他测距传感器,得出该行人在相机系下的位置,但我们并不知道这个人距离车辆有多远,在车辆的正前方还是左前方。因此就需要一个坐标转换矩阵,将相机系下的三维点转换到车辆系下,供下游任务使用。

问题引入

好了,基础应用背景已经介绍完毕,现在步入正题。假设我们已经通过某种标定方法,得到了一个坐标转换矩阵 ,新需求来了,由于前视相机在安装的时候并不像刚才那张图像中一样其Z轴平行于车辆系的X轴,可能会略微偏向天空、地面,也有可能偏向左侧(左前视)、右侧(右前视),我现在想看看相机到底偏向哪个方向,即车辆系三个坐标轴如何旋转至相机坐标系。

刚才提到过,坐标转换矩阵 左上角 的矩阵描述了坐标的旋转关系,称其为旋转矩阵 。

对这个矩阵求逆得到 ,定义好旋转顺序,对 进行分解,可以得到3个按照指定旋转顺序的欧拉角(具体如何分解旋转矩阵可以参考[1]),这3个按照指定旋转顺序的欧拉角就描述了如何将车辆系旋转至相机系

先总结一下我们的结论:外参是坐标变换矩阵,左乘车辆坐标系下的三维点得到相机坐标系下的三维点;外参左上角 矩阵块的逆是基变换矩阵,对其进行欧拉角分解可以得知如何从车辆坐标系旋转到相机坐标系

为什么要对 R^{-1} 进行分解才能得知如何从车辆坐标系旋转到相机坐标系?为什么这么巧刚好是 R^{-1} ?先别懵,我们先验证这个结论对不对,再来解释为什么。

实验验证

为了实验能更加直观和真实,我们先做出如下设置:

  1. 车辆坐标系原点设置在车辆前保险杠的中心处,车辆系的X轴指向车辆正前方,Y轴指向车辆正左方,Z轴指向天空;

  2. 将相机系原点设置在挡风玻璃后的上方处,相机系的X轴指向车辆正右方,Y轴指向地面,Z轴指向车辆正前方,相对于车辆坐标系的原点,相机系原点相对于相机系X、Y、Z方向上的平移分别为-1.25、0.1、0.65,直观理解为相机位于车辆前保险杠的后上方,并且偏左一点点;

  3. 车辆系前保险杠前方有一个行人,其中心点相对于车辆系X、Y、Z方向上的平移分别为1、-0.2、0.6,即该行人在车辆坐标系下的坐标为 ,,,直观看就是这个行人在车辆的右前方。上述位置关系如下图所示:

210f414a12a14ce10bcf5705cc6fd648.png
车辆、相机与人的位置关系

假设我们事先通过标定,已经知道了坐标转换矩阵 。

那么车辆坐标系下的一个三维点 ,, 在相机坐标系下的位置计算如下所示,结合图中的位置关系不难验证计算正确。

关键的地方来了,按照上一部分文章所述,我们取坐标转换矩阵 左上角的 矩阵,并对其求逆,得到

我们采用Eigen对旋转矩阵 进行分解,按照X、Y、Z轴的顺序得到3个欧拉角0°、90°、-90°,旋转方式为内旋,即绕着旋转后的自身相应轴进行旋转。

#include <eigen3/Eigen/Core>

int main(){
  float pi = 3.14159265358979;
  Eigen::Matrix3f R_inv;
  R_inv << 0, 0, 1, -1, 0, 0, 0, -1, 0;
  Eigen::Vector3f euler_angle = R_inv.eulerAngles(0, 1, 2); // 0: X轴,1: Y轴,2: Z轴,前后顺序代表旋转顺序,旋转方式为内旋
  std::cout << "先绕X轴旋转: " << euler_angle[0] * 180 / pi <<std::endl;
  std::cout << "再绕Y轴旋转: " << euler_angle[1] * 180 / pi << std::endl;
  std::cout << "最后绕Z轴旋转: " << euler_angle[2] * 180 / pi << std::endl;
}

// Console Output:
// 先绕X轴旋转: -0
// 再绕Y轴旋转: 90
// 最后绕Z轴旋转: -90

按照先绕X轴0°,再绕Y轴90°,最后绕Z轴-90°的顺序,将车辆坐标系旋转至相机坐标系,可以看出与我们设想的情况一致,验证完成。感兴趣的读者可以采用上述代码对 进行分解,能看到采用 分解出的欧拉角对车辆坐标系进行旋转后与实际情况不符

7cc953d42da17cbb6be672ad0c3b501e.png
车辆坐标系->相机坐标系

OK,至此我们已经验证,如果要将车辆坐标系旋转至相机坐标系,需要先对坐标变换矩阵 中左上方 的旋转矩阵 求逆,再进行欧拉角分解,得到的就是车辆坐标系如何旋转至相机坐标系。

在不考虑平移的情况下,坐标变换矩阵 T 中只包含 R ,因此我们也可以称 R 为坐标变换矩阵,其描述了坐标间的变换关系;我们将 R^{-1} 成为基变换矩阵,其描述了坐标系之间的变换关系。

我们接下来采用线性代数,来分析为什么坐标变换矩阵和基变换矩阵刚好就是互为逆的关系。

线性代数解释(坐标变换和基变换的本质)

对 中的一组旧基 进行线性组合,可以变为一组新基 , 如下式所示。注意这里每一个基都是 维列向量。

不难验证上述线性组合可以写为下述矩阵乘法的形式,注意这里是右乘矩阵,只有这样才能表示对旧基 进行线性组合。

我们记右乘的这个矩阵为 。还记得我们要做什么吗?重新梳理一下,已知现在有一个点 ,在旧基 下的坐标为 ,现在已知一个线性变换 ,将旧基 变为新基 ,在这组新基下,点 的坐标是多少,应该如何表示?

直接上推导,先把上面的那个公式拿过来:

公式两边同时乘上 ( 为 的逆):

公式两边同时乘上点 在旧基 下的坐标

从上面的公式看,答案已经呼之欲出了,可以看到公式右边的形式为新基 乘上一个列向量,该列向量就是点 在新基 下的坐标!即:

至此,我们可以看到基变换矩阵 P^{-1} 通过如下公式描述了两组基之间的变换关系。

坐标变换矩阵 通过如下公式描述了某点 在两组基下的坐标之间的变换关系。

基变换矩阵和坐标变换矩阵互为逆,推导完毕。

总结

基变换矩阵和坐标变换矩阵的关系之前也在矩阵论这门课中接触过,但当时完全不了解其应用场景,也对为什么这么取名一知半解。直到在实际应用中碰到了这个问题,才发现简简单单的两个公式,在使用时必须根据应用场景对齐进行区分,来选择究竟使用基变换矩阵还是坐标变换矩阵。

感谢各位读者能看到这,有表述不清或者看不懂的地方欢迎评论区里交流。

参考

[1] 欧拉角和旋转矩阵之间的转换 - 江南古镇的文章

投稿作者为『自动驾驶之心知识星球』特邀嘉宾,欢迎加入交流!

① 全网独家视频课程

BEV感知、毫米波雷达视觉融合多传感器标定多传感器融合多模态3D目标检测车道线检测轨迹预测在线高精地图世界模型点云3D目标检测目标跟踪Occupancy、cuda与TensorRT模型部署大模型与自动驾驶Nerf语义分割自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码即可学习

bcf12044c2491f580d4df1a41808cc96.png

网页端官网:www.zdjszx.com

② 国内首个自动驾驶学习社区

国内最大最专业,近2700人的交流社区,已得到大多数自动驾驶公司的认可!涉及30+自动驾驶技术栈学习路线,从0到一带你入门自动驾驶感知2D/3D检测、语义分割、车道线、BEV感知、Occupancy、多传感器融合、多传感器标定、目标跟踪)、自动驾驶定位建图SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案大模型、端到端等,更有行业动态和岗位发布!欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频

eb7a0746f32ef023db73d523fb71cfdd.png

③【自动驾驶之心】技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦2D/3D目标检测、语义分割、车道线检测、目标跟踪、BEV感知、多模态感知、Occupancy、多传感器融合、transformer、大模型、在线地图、点云处理、端到端自动驾驶、SLAM与高精地图、深度估计、轨迹预测、NeRF、Gaussian Splatting、规划控制、模型部署落地、cuda加速、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向。扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)

0e04e188f660394ca9e5043f7eb51dcd.jpeg

④【自动驾驶之心】平台矩阵,欢迎联系我们!

6a19a1e797aab7e7d085dbb382227838.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值