近期参与到了手写AI的车道线检测的学习中去,以此系列笔记记录学习与思考的全过程。车道线检测系列会持续更新,力求完整精炼,引人启示。所需前期知识,可以结合手写AI进行系统的学习。
文章主要介绍自动驾驶技术中几种常用的坐标系统,以及他们之间如何完成关联和转换,最终构建出统一的环境模型。这里重点理解自车到相机刚体转换(外参),相机到图像转换(内参),图像到像素有单位转换。3d向2d转换会有相应的畸变,平移等。
重点:自车坐标系<->相机机体坐标系<->像平面坐标系<->像素坐标系
难点:要考虑图像畸变,去畸变和加畸变都是在像平面上去补偿
视觉系统一共有四个坐标系:像素平面坐标系(u,v)、图像坐标系(x,y)、相机坐标系( x c , y c , z c x_c,y_c,z_c xc,yc,zc)和世界坐标系( x ω , y ω , z ω x_\omega,y_\omega,z_\omega xω,yω,zω)。每种坐标系之间均存在联系,那么如何通过图像像素坐标定位到世界坐标系的坐标,需要通过相机标定来解决,其中关键的算法部分在于坐标系转换,而变换则需要通过齐次坐标的表示方式来完成。
摄像头的作用是把三维世界中的形状、颜色信息,压缩到一张二维图像上。基于摄像头的感知算法则是从二维图像中提取并还原三维世界中的元素和信息,如车道线,车辆、行人等,并计算他们与自己的相对位置。
感知算法和相机相关的坐标系有图像坐标系(像素坐标系)、摄像机坐标系、像平面坐标系
电脑上存储的照片或图像,一般以左上角为原点,向右为x正方向,向下为y正方向,单位以“像素”最为常用。图像坐标系为二维坐标系,标记为(Xv, Yv)。
由于图像坐标系向右为x,向下为y,所以摄像机坐标系以镜头主光轴中心为原点,一般向右为x正方向,向下为y正方向,向前为z正方向。这样,x,y方向与图像坐标系的方向吻合,z方向即为景深,摄像机坐标系记为(Xc, Yc)
为了能够**定量描述三维空间到二维图像的映射关系,**图形学里引入了像平面坐标系。它是摄像机坐标系的一个平移,中心仍在摄像机主光轴上,距离光轴中心的距离等于摄像机的焦距
我们知道摄像机会在光轴中心后方的底片上成一个缩小的倒像,是真正的像平面(Xf, Yf)。但是为了分析和计算方便,我们会在光轴中心前方设立一个虚拟像平面。虚拟像平面上的成像为正像,大小与真实倒像相同
根据情况而定,可以表示任何物体,此时是由于相机而引入的。单位m。
世界坐标系 O w X w Y w Z w O_{w}X_{w}Y_{w}Z_{w} OwXwYwZw ,相机坐标系 O c X c Y c Z c O_{c}X_{c}Y_{c}Z_{c} OcXcYcZc ,成像坐标系 O I X I Y I Z I O_{I}X_{I}Y_{I}Z_{I} OIXIYIZI 及像素坐标系 O p X p Y p Z p O_{p}X_{p}Y_{p}Z_{p} OpXpYpZp
Lidar (Light Detection and Ranging) 是一种远程感测技术,使用激光光束测量与物体的距离。360度旋转发射射线,根据不同目标反射率不同反射而形成电云。在自动驾驶和机器人领域,Lidar常被用作一个主要的传感器来获取周围环境的3D信息。在多数情况下,Lidar坐标系为右手坐标系,但具体定义可能会因Lidar制造商而异。
X轴: 通常指向Lidar前方。当激光束直接向前发射时,与该方向的距离测量会在X轴上产生一个正值。
Y轴: 通常指向Lidar的左侧。当激光束直接向左侧发射时,与该方向的距离测量会在Y轴上产生一个正值。
Z轴: 通常指向Lidar的上方,与X和Y轴垂直。高度测量通常沿Z轴进行,正值代表物体高于Lidar设备,而负值代表低于Lidar设备。
- 车载Lidar系统的坐标系与车辆坐标系可能不完全对齐,需要一个转换矩阵来在两者之间进行坐标变换。
- 数据标注、地图生成、物体检测等任务需要明确Lidar坐标系的定义。
- 对于与其他传感器的数据融合,例如摄像头,知道各自的坐标系是非常关键的,以便进行正确的数据对齐和融合。
- 当与摄像头、雷达或其他传感器进行数据融合时,通常需要知道Lidar与这些传感器之间的外部标定参数(例如,旋转和平移矩阵),以便在它们之间进行坐标变换。
一般环境中选择一个参考坐标系来描述传感器和物体的位置,该坐标系称为世界坐标系;自车坐标系一般指的是以车体后轴中心为原点(因为后轴中心不会随着车摆动而发生相对变化),左前上或右前上的空间坐标系,左(右)一般为横向,前一般为纵向,上指地面以上空间,坐标系随着车运动而运动。所有的下游需要感知输出的目标都要在自车坐标系下面,BEV视角目标也是指的在这个坐标系下
一般三维空间坐标系用三个正交轴X,Y,Z表示物体的位置,用绕这三个正交轴的旋转角度(roll 滚动角, pitch 俯仰角, yaw 偏航角)表示物体的姿态。时间坐标系只有一个维度。为了表述方便,我们一般将空间坐标和时间坐标分开讨论。
内参用来确定摄像机从三维空间到二维图像的投影关系。
主要包含三个参数,相机主点,相机焦距,畸变系数。内参一般由商家给定,也可以进行摄像机标定。在自动驾驶应用中**,摄像机的内参为常数,使用中不会发生变化**,但需要在使用前做好标定工作。摄像机的拍摄过程,可以抽象成是从三维摄像机坐标系映射到二维像平面坐标系,再映射到图像坐标系的过程。
摄像机的内参通常可以表示为一个矩阵:
K = [ f x 0 c x 0 f y c y 0 0 1 ] K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \\ \end{bmatrix} K= fx000fy0cxcy1
这个矩阵通常被称为内参矩阵或相机矩阵。
通过二维图像推断物体在三维摄像机坐标系中的位置,例如获得距离深度信息。从二维图像中获取三维距离信息,如果需要获得物体在世界坐标系中的位置,则还需要知道摄像机在世界坐标系中的位姿。
这一位姿表示被称为摄像机的外部参数,简称外参,用来决定摄像机坐标与世界坐标系之间相对位置关系。自动驾驶应用中,得到这一位置关系还需要一系列的标定和定位工作。
相机相对其它坐标系,旋转+平移矩阵,其中旋转外参与上述欧拉角【yaw,patch,roll】,旋转顺序一般为(z-y-x), 单位度;平移外参,相机到目标坐标系中的平移距离,单位米
关系与转换:
大多数情况下自车坐标系等同于世界坐标系,本文章也是这么理解的。
物体之间的坐标系变换都可以表示坐标系的旋转变换加上平移变换,则世界坐标系到相机坐标系的转换关系也是如此。绕着不同的轴旋转不同的角度得到不同的旋转矩阵。
绕Z轴旋转θ示意图:
- 旋转:
坐标变换:根据相似三角形和勾股定理可以推出:
{ x = x ′ c o s θ − y ′ s i n θ y = x ′ s i n θ + y ′ c o s θ z = z ′ \left.\left\{\begin{array}{c}x=x'cos\theta-y'sin\theta\\y=x'sin\theta+y'cos\theta\\z=z'\end{array}\right.\right. ⎩ ⎨ ⎧x=x′cosθ−y′sinθy=x′sinθ+y′cosθz=z′
转换成矩阵形式如下:
[ x y z ] = [ c o s θ − s i n θ 0 s i n θ c o s θ 0 0 0 1 ] [ x ′ y ′ z ′ ] \begin{bmatrix}x\\y\\z\end{bmatrix}=\begin{bmatrix}cos\theta&-sin\theta&0\\sin\theta&cos\theta&0\\0&0&1\end{bmatrix}\begin{bmatrix}x'\\y'\\z'\end{bmatrix} xyz = cosθsinθ0−sinθcosθ0001 x′y′z′
R 1 [ x ′ y ′ z ′ ] \left.R_1\left[\begin{matrix}x'\\y'\\z'\end{matrix}\right.\right] R1 x′y′z′
其他绕x,y,转也类似,可以得到:
[ x y z ] = [ 1 0 0 0 c o s ϕ s i n ϕ 0 − s i n ϕ c o s ϕ ] [ x ′ y ′ z ′ ] [ x y z ] = [ c o s ω 0 − s i n ω 0 1 0 s i n ω 0 c o s ω ] [ x ′ y ′ z ′ ] \begin{aligned}&\begin{bmatrix}x\\y\\z\end{bmatrix}=\begin{bmatrix}1&0&0\\0&cos\phi&sin\phi\\0&-sin\phi&cos\phi\end{bmatrix}\begin{bmatrix}x'\\y'\\z'\end{bmatrix}\\&\begin{bmatrix}x\\y\\z\end{bmatrix}=\begin{bmatrix}cos\omega&0&-sin\omega\\0&1&0\\sin\omega&0&cos\omega\end{bmatrix}\begin{bmatrix}x'\\y'\\z'\end{bmatrix}\end{aligned} xyz = 1000cosϕ−sinϕ0sinϕcosϕ x′y′z′ xyz = cosω0sinω010−sinω0cosω x′y′z′ 最后可以简单总结为旋转矩阵: R = R 1 R 2 R 3 R=R_1R_2R_3 R=R1R2R3
- 平移:
平移相机坐标点( x c , y c , z c x_c,y_c,z_c xc,yc,zc)平移距离为( t x , t y , t z t_{x},t_{y},t_{z} tx,ty,tz)到世界坐标点( x ω , y ω , z ω x_\omega,y_\omega,z_\omega xω,yω,zω):
[ x ω y ω z ω 1 ] = [ 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ] [ x c y c z c 1 ] \begin{bmatrix}x_\omega\\y_\omega\\z_\omega\\1\end{bmatrix}=\begin{bmatrix}1&0&0&tx\\0&1&0&t_y\\0&0&1&t_z\\0&0&0&1\end{bmatrix}\begin{bmatrix}x_c\\y_c\\z_c\\1\end{bmatrix} xωyωzω1 = 100001000010txtytz1 xcyczc1
如果坐标点( x c , y c , z c x_c,y_c,z_c xc,yc,zc)绕X,Y,Z轴分别旋转α,β,γ度,则最终的表达式为:
[ X W Y W Z W 1 ] = [ X c Y c Z c 1 ] [ R 0 T 1 ] [X_W\quad Y_W\quad Z_W\quad1]=[X_c\quad Y_c\quad Z_c\quad1]{\begin{bmatrix}R&0\\T&1\end{bmatrix}} [XWYWZW1]=[XcYcZc1][RT01]
其中:
R = R x R y R z T = [ t x t y t z ] \begin{aligned}\mathrm{R}&=R_xR_yR_z\\T&=\begin{bmatrix}t_x&t_y&t_z\end{bmatrix}\end{aligned} RT=RxRyRz=[txtytz]
[ X w Y w Z w 1 ] = [ R T 0 1 ] [ Z c f 0 0 0 Z c f 0 0 0 Z c 0 0 1 ] [ d x 0 − u 0 d x 0 d y − ν 0 d y 0 0 1 ] [ u v 1 ] \begin{bmatrix}X_w\\Y_w\\Z_w\\1\end{bmatrix}=\begin{bmatrix}R&T\\0&1\end{bmatrix}\begin{bmatrix}\dfrac{Z_c}{f}&0&0\\0&\dfrac{Z_c}{f}&0\\0&0&Z_c\\0&0&1\end{bmatrix}\begin{bmatrix}dx&0&-u_0dx\\0&dy&-\nu_0dy\\0&0&1\end{bmatrix}\begin{bmatrix}u\\v\\1\end{bmatrix} XwYwZw1 =[R0T1] fZc0000fZc0000Zc1 dx000dy0−u0dx−ν0dy1 uv1
通过最终的转换关系来看,一个三维中的坐标点,的确可以在图像中找到一个对应的像素点,但是反过来,通过图像中的一个点找到它在三维中对应的点就很成了一个问题,因为我们并不知道等式左边的 z c z_c zc的值
红框内即为外参,R和T分别为旋转和平移量。内参为是相机固有的属性,实际上就是焦距f,像元尺寸dx,dy。很明显 z c z_c zc,表示的是点离光轴的距离
梳理了自动驾驶的各种坐标系,展现自动驾驶各坐标系间的关系,最终得到像素坐标系与世界坐标系的转换关系。