首页 > 其他分享 >无人驾驶中的坐标转换

无人驾驶中的坐标转换

时间:2024-03-25 09:58:03浏览次数:18  
标签:无人驾驶 转换 矩阵 旋转 坐标 传感器 自车 坐标系

无人驾驶中的坐标转换

image

无人车上拥有各种各样的传感器,每个传感器的安装位置和角度又不尽相同。对于传感器的提供商,开始并不知道传感器会以什么角度,安装在什么位置,因此只能根据传感器自身建立坐标系。无人驾驶系统是一个多传感器整合的系统,需要将不同位置的传感器数据统一到一个固定的坐标系——自车坐标系下,才能分析当前无人车所在的道路场景。


正文

无人车的自车坐标系

不同的无人驾驶团队对于坐标系的定义可能不同,但这并不影响开发,只要团队内部达成一致即可。

以百度Apollo提供的自车坐标系为例,自车坐标系的定义为:

z轴 – 通过车顶垂直于地面指向上方

y轴 – 在行驶的方向上指向车辆前方

x轴 – 自车面向前方时,指向车辆右侧

车辆坐标系的原点在车辆后轮轴的中心,如下图所示。

image

图片出处:https://github.com/ApolloAuto/apollo/blob/master/docs/specs/coordination_cn.md

传感器坐标系与自车坐标系的转换

对于无人车的传感器安装位置,业内大同小异,比如奥迪A8的传感器配置如下图所示

image

以安装在无人车左前方的角雷达(Corner radar)为例,进行后面的介绍,叫雷达的安装位置和坐标系如下图绿线所示。

image

角雷达检测到的障碍物如图中的绿点所示,绿点在雷达坐标系下的坐标为(x1,y1),为了便于理解暂不加入z方向的坐标。

绿点转换到自车坐标系下需要经过一定的数学运算。基本思路是这样的:

平移

先将角雷达坐标系的O点平移到与自车坐标系的O点重合,此时(x1,y1)需要减去两个坐标系在x和y方向的距离。如下图所示

image

旋转

在两个坐标系的O点重合后,将角雷达坐标系沿着z轴进行一定角度的旋转,这样(x1,y1)就转到了自车坐标系上。这个过程在数学上称为欧拉旋转。

坐标系的平移和旋转是两件相互独立的事情,先平移再旋转和先旋转再平移并不会影响最终的结果。

以上是感性的分析过程,下面我们将这整个过程在数学上实现。

平移

平移步骤根据传感器安装位置和自车后轴的距离进行计算,仅仅是XYZ三个方向加减运算。

旋转

绕轴旋转需要引入角度,不是简单的加减运算,所以我们通过图示来推导一下。

先将两个坐标系变换到正常的视角,如下图所示:

image

障碍物在角雷达坐标系下的坐标为(x1,y1),假设障碍物在自车坐标系下的坐标为(x0,y0),需要根据安装角度α(可测量),用x1,y1,α这三个已知量表示x0,y0,求得他们的数学关系。

通过做辅助线进行计算,如下图蓝线所示所示:

image

几何关系可用以下两个等式表示:

image

image

使用矩阵表示,可以简化表达,用一个等式代替两个等式,是这样的

image

由于这次旋转是绕z轴旋转,因此旋转前和旋转后的z值是保持不变的

image

将z方向的值也放到上面的等式中,即可得到

image

那就意味着,只要把角雷达采集到的障碍物坐标值与上面这个矩阵进行矩阵乘法运算,即可完成沿Z轴的旋转。在这里我们把这个矩阵叫做Z轴旋转矩阵RZ,那必然还有沿着X轴和Y轴的旋转矩阵RX和RY。

角雷达目标的坐标依次右乘这三个矩阵,就完成了沿着Z轴,Y轴,X轴的旋转,得到的结果就是自车坐标系下的坐标值了。即

image

再加上一个平移的矩阵,就能够完整描述整个坐标转换的关系了

image

不同的坐标系定义,会有不同的RX,RY和RZ,因此需要根据实际情况计算旋转矩阵和平移矩阵。

欧拉旋转所存在的问题

以上过程也称为欧拉旋转,但是欧拉旋转会有一个不可避免的问题——万向锁。欧拉旋转的过程中在某些特殊情况时,会导致少一个维度。万向锁通过文字解释起来会有点困难,可以看一个讲解万向锁的小视频进行了解。

image

03:52

视频出处:欧拉旋转

为了解决欧拉旋转所带来的万向锁问题,业界引入了四元数。四元数除了解决万向锁的问题外,还能在一定程度上简化计算。因而百度Apollo也选择了四元数作为各个传感器安装位置和角度的存储介质。有关四元数的定义和使用方法这里不做详细讨论,可参看Apollo的Calibration模块。


结语

实际参与到开发中你才会发现,自己在大学学习的高数和线性代数等都是很重要的数学工具,而不是仅仅用来考试的。

以上就是有关无人驾驶技术中传感器到车体坐标系的坐标转换原理及数学推导,该原理不仅用在无人车领域,同时在机器人、无人机、三维建模等领域也得到了广泛使用。

好了(o)/~,这篇分享就到这啦。如果对坐标转换还有什么疑问,可以在评论区与我互动。

如果你觉得我写的还不错,赞和关注比收藏更能体现文章的价值~

附赠自动驾驶学习资料和量产经验:链接

标签:无人驾驶,转换,矩阵,旋转,坐标,传感器,自车,坐标系
From: https://www.cnblogs.com/autodriver/p/18093720

相关文章

  • 数制转换与子网划分
    前言        我们一般说的百兆、千兆网络的单位是bps(比特率,即位/秒,bit/s),比如我们说网卡或光纤的传输速度是百兆,也就是100Mbps的意思。而在实际应用中(各类下载工具)使用的传输单位是字节/秒(Byte/s)。Byte是字节,而bit是二进制位单元8bit=1byte1024byte=1KB102......
  • 怎么把spark中的时间转换成天数
    目录怎么把Spark中的时间转换成天数1.创建SparkDataFrame2.将时间转换成天数3.结果展示数据准备和DataFrame创建时间转换成天数结果展示SparkDataFrame特点和优势:创建DataFrame:DataFrame操作:怎么把Spark中的时间转换成天数在Spark中,处理时间数据时经常需要......
  • 字母大小写转换
    #include<stdio.h>//字母大小写转换intmain(){ charch=0; while(scanf("%c",&ch)==1) { if(ch>='a'&&ch<='z') printf("%c\n",ch-32); if(ch>='A'&&ch<=......
  • 上位机开发 halcon坐标转轴坐标
    背景    上位机开发中有一种相机叫标定相机,主要是有来给某些要进行根据CAD图点位计算时当前产品实际点位坐标时使用的一种标定测量相机。主要原理是根据两个或多个指定的标定点进行取图计算圆心坐标,再将视觉计算出的圆心坐标和取图时的轴坐标进行偏差计算。最后得到标......
  • JAVA高级面向对象二:多态下的类型转换问题
     packagecom.itheima.多态;publicclassTest{//多态好处publicstaticvoidmain(String[]args){////好处1:实现解耦合,右边对象可以随时切换,后续业务随即改变//Peoplep1=newTeacher();//p1.run();////好处2:可以使用父......
  • 国内ip转换器安卓版怎么下载?
    在移动设备上实现IP地址转换和切换变得越来越重要,特别是在国内用户访问网站或应用时。虎观代理小二将深入探讨国内IP转换器安卓版的下载途径、功能特点以及使用攻略,帮助用户更好地理解和利用该工具。1.下载国内IP转换器安卓版官方网站:首选在官方网站或其他官方应用商店中......
  • 7.GoLang中基本数据类型之间的转换
    GoLang中基本数据类型之间的转换1、关于golang中的数据类型转换Go语言中只有强制类型转换,没有隐式类型转换。2、数值类型之间的相互转换数值类型包括:整形和浮点型packagemainimport"fmt"funcmain(){varaint8=20varbint16=40varc=int16......
  • C# 03 数据类型及转换
    类型:integer(int)、double、long:数値型string:文字型boolean:布尔型写法:inti=int.Parse("1234");longl=long.Parse("1234");doubled=double.Parse("124.3");boolb=bool.Parse("True");stringstr=i.ToString(); 时间Da......
  • tcp/ip网络通信时的大小端序转换
    1.短整形/长整形的转换#include<arpa/inet.h>//u:unsigned//16:16位,32:32位//h:host,主机字节序//n:net,网络字节序//s:short//l:int//这套api主要用于网络通信过程中IP和端口的转换//将一个短整形从主机字节序->网络字节序uint16_thtons(......
  • 将秒转换成天时分秒格式
    deftimestamp_difference_to_dhms(timestamp1,timestamp2):#将时间戳转换为datetime对象##13位时间戳会报错iflen(str(timestamp1))==13:timestamp1=timestamp1/1000iflen(str(timestamp2))==13:timestamp2=timestamp2......