[自动驾驶算法][从0开始轨迹预测]:二、自动驾驶系统中常用的坐标系及相应的转换关系

news2024/11/20 3:34:31

自动驾驶中常见的坐标系与坐标转换

    • 1. 传感器坐标系
      • 1.1 相机坐标系统
        • 1) 相机相关基础知识
        • 2) 相机各坐标系
          • 图像/像素坐标系
          • 相机坐标系
          • 像平面坐标系
        • 3) 相机各坐标系之间的转换
          • 像平面坐标系到像素坐标系的转换(平移缩放变换)
          • 相机坐标系转像平面坐标系(透视变换):
          • 相机坐标系到像素坐标系
          • 世界坐标系到像素坐标系(旋转平移变换)
      • 1.2 激光雷达坐标系
      • 1.3 IMU坐标系
      • 1.4 GPS
      • 1.5 轮速计
    • 2. 车体坐标系
    • 3. 导航坐标系
    • 4. 世界坐标系
      • 4.1 地理坐标系(GCS)
        • 1. 地心地固坐标系(ECEF)
        • 2. 大地坐标系(LLA)
      • 4.2 投影坐标系
        • 1. 通用横轴墨卡托投影 UTM
        • 2. 网络墨卡托投影 Web Mercator
        • 3. UTM和Web Mercator的对比

写在前面:上一篇文章中,我们介绍了坐标转换的基础知识,接下来,我们将介绍由汽车的传感器到全局定位会涉及到的若干个坐标系统。


下图是自动驾驶系统中常见的坐标系统:

image-20240115150341004

​ 一般来说,典型的定位和建图场景情况,不同坐标系之间的关系如下:

环境传感器数据(如激光雷达,相机等)都是在其自身坐标系下测量得到的数据,包括状态测量传感器(如 IMU,轮速计),其测量得到的也是基于本身状态(虽然一般来说考虑 IMU 和编码器固连,可以认为这些传感器的状态和汽车本身的状态一致),因此需要将这些测量数据通过外参转化到车体坐标系下。

​ 传感器数据统一到车体坐标系后,通过不同的感知融合方式全局测量数据相比(在导航坐标系下或世界坐标系下)可以获取车辆在参考坐标系下的状态(定位),并且将传感器测量到的环境数据更新至参考坐标系中(建图),完成整体过程。在有绝对位置测量的情况下(经纬度),为了方便计算,一般先将其转换到投影坐标系下,且同样通过外参传递到车体坐标系下,和其他传感器数据进行融合,对融合完成后的位置同样通过相反过程,最后获得地理坐标系下的经纬度数据。

​ 在没有绝对测量值时可以将导航坐标系作为参考坐标系。而在有绝对测量值时,导航坐标系一般用来作为一个工具来计算周围特征之间的距离、角度等,相比于投影坐标系更加方便计算。

1. 传感器坐标系

​ 车载传感器都有其自身的坐标系,按照其测量原理可以分为相对测量(测量环境信息)绝对测量(测量自身信息)。相对测量的传感器如相机、激光雷达,他们是通过测量环境信息来进行间接定位,而绝对测量如 IMU、轮速计、GPS 则是通过直接测量自身的运动状态(速度、位置、姿态等)来进行定位。对于相对测量的传感器而言,其测量值通常是基于其自身传感器;而绝对测量的测量结果一般则是自身坐标系相对于其他坐标系(局部坐标系或世界坐标系等)的结果。下面对常见的测量传感器进行归纳。

1.1 相机坐标系统

摄像机/摄像头以其低廉的价格、丰富的图像信息,成为自动驾驶中最受人们关注的传感器之一。摄像头的作用是把三维世界中的形状、颜色信息,压缩到一张二维图像上。

基于摄像头的感知算法则是从二维图像中提取并还原三维世界中的元素和信息,如车道线、车辆、行人、异性障碍物等,并计算他们与自己的相对位置。

1) 相机相关基础知识

单反相机参数之ISO/焦距篇

景深概念与计算

光轴:一条垂直穿过理想透镜中心的光线。

焦点:与光轴平行的光线射入凸透镜时,理想的凸镜应该是所有的光线会聚在透镜后面一点上,这个会聚所有光线的一点,就叫做焦点。

焦距:一般指镜片的中心到焦点为止的光轴上的距离,入射平行光线(或其延长线)与出射会聚光线(或其延长线)相交,就能确定折射主面,这个想象的平面与镜头光轴相交处就是主点。改变物体在相机中的成像大小。
在这里插入图片描述在这里插入图片描述

光圈:光圈对照片的影响主要有两大项,一是镜头的进光量,二是相片的景深。光圈越大(f 值越小),景深越浅(前景/背景看上去就像化掉一样);光圈越小(f 值越大),景深越深(前景/背景看上去比较清楚)。镜头焦距确定了画面的取景范围,而光圈主要影响画面虚实。

景深: 是指在一幅图像中清晰的范围,景深的深浅主要取决于以下元素:镜头的光圈大小、镜头的焦距长短、摄影主体的远近、感光元件的大小

在这里插入图片描述

2) 相机各坐标系
图像/像素坐标系

电脑上存储的照片或图像,一般以图像的左上角为原点,像素坐标系 O u v O_{uv} Ouv,以向右为 x − u x-u xu正方向,向下为 y − v y-v yv正方向,以“像素”为单位。 u , v u,v u,v代表像素的行数和列数,无实际的物理单位。

相机坐标系

由于图像坐标系向右为 x x x,向下为 y y y,所以相机坐标系以镜头主光轴中心为原点,向右为x正方向,向下为y正方向,向前(景深方向)为z正方向。这样,x,y方向与图像/像素坐标系的方向吻合,z方向即为景深。

在这里插入图片描述

像平面坐标系

为了能够定量描述三维空间到二维图像的映射关系,图形学里引入了像平面坐标系。它是相机坐标系的一个平移,中心仍在摄像机主光轴上,距离光轴中心的距离等于摄像机的焦距 f f f ,根据小孔成像原理,相机会在光轴中心后方的底片上成一个缩小的倒像,是真正的像平面 X f ′ O f ′ Y f ′ X'_fO'_fY'_f XfOfYf。但是为了分析和计算方便,我们会在光轴中心前方设立一个虚拟像平面。虚拟像平面上的成像为正像,大小与真实倒像相同 X f O f Y f X_fO_fY_f XfOfYf

3) 相机各坐标系之间的转换
像平面坐标系到像素坐标系的转换(平移缩放变换)

假设 ( u 0 , v 0 ) (u_0,v_0) (u0,v0)代表像平面原点(焦点)在u-v坐标系下的坐标,dx和dy分别表示每个像素在像平面系下横轴x和纵轴y的物理尺寸;已知p点在像平面系下的坐标为 ( x , y ) (x,y) (x,y),那么 x d x \frac{x}{dx} dxx单位就是像素了。

在这里插入图片描述

u = x d x + u 0 v = y d y + v 0 [ u v 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ x y 1 ] u = \frac{x}{dx}+u_0 \\ v = \frac{y}{dy}+v_0 \\ \left [ \begin{array}{} u \\v\\1 \end{array} \right] = \left [ \begin{array}{} \frac{1}{dx} & 0& u_0 \\0 & \frac{1}{dy} & v_0 \\ 0&0&1\end{array} \right]\left [ \begin{array}{} x\\y\\1 \end{array} \right] u=dxx+u0v=dyy+v0 uv1 = dx1000dy10u0v01 xy1

相机坐标系转像平面坐标系(透视变换):

对于成像物体上的点 P ( X , Y ) P(X,Y) P(X,Y),其在像平面上对应点 p ( x , y ) p(x,y) p(x,y),根据相似三角形原理,它们之间的坐标对应关系有:

在这里插入图片描述

f Z = x X = y Y x = f X Z , y = f Y Z [ x y 1 ] = 1 Z [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ X Y Z 1 ] \frac{f}{Z} = \frac{x}{X} =\frac{y}{Y} \\ x=f\frac{X}{Z},y=f\frac{Y}{Z} \\ \left [ \begin{array}{} x \\y\\1 \end{array} \right] = \frac{1}{Z}\left [ \begin{array}{} f & 0& 0&0 \\0 & f & 0&0 \\ 0&0&1&0\end{array} \right]\left [ \begin{array}{} X\\Y\\Z\\1 \end{array} \right] Zf=Xx=Yyx=fZX,y=fZY xy1 =Z1 f000f0001000 XYZ1

相机坐标系到像素坐标系

由前面两小节的推导,我们已经知道由相机坐标系到像平面坐标系,再由像平面坐标系到像素坐标系的转换,则相机坐标系到像素坐标系的转换为:
[ u v 1 ] = 1 Z [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ X Y Z 1 ] \left [ \begin{array}{} u \\v\\1 \end{array} \right] = \frac{1}{Z}\left [ \begin{array}{} \frac{1}{dx} & 0& u_0 \\0 & \frac{1}{dy} & v_0 \\ 0&0&1\end{array} \right]\left [ \begin{array}{} f & 0& 0&0 \\0 & f & 0&0 \\ 0&0&1&0\end{array} \right]\left [ \begin{array}{} X\\Y\\Z\\1 \end{array} \right] uv1 =Z1 dx1000dy10u0v01 f000f0001000 XYZ1

[ u v 1 ] = 1 Z [ f d x 0 u 0 0 0 f d y v 0 0 0 0 1 0 ] [ X Y Z 1 ] = 1 Z [ f x 0 c x 0 0 f y c y 0 0 0 1 0 ] [ X Y Z 1 ] = 1 Z K [ X Y Z 1 ] \left [ \begin{array}{} u \\v\\1 \end{array} \right] = \frac{1}{Z}\left [ \begin{array}{} \frac{f}{dx} & 0& u_0 &0 \\0 & \frac{f}{dy} & v_0 &0 \\ 0&0&1&0\end{array} \right]\left [ \begin{array}{} X\\Y\\Z\\1 \end{array} \right]=\frac{1}{Z}\left [ \begin{array}{} f_x & 0& c_x &0 \\0 & f_y & c_y &0 \\ 0&0&1&0\end{array} \right]\left [ \begin{array}{} X\\Y\\Z\\1 \end{array} \right] = \frac{1}{Z}\mathbf{K}\left [ \begin{array}{} X\\Y\\Z\\1 \end{array} \right] uv1 =Z1 dxf000dyf0u0v01000 XYZ1 =Z1 fx000fy0cxcy1000 XYZ1 =Z1K XYZ1

其中 K \mathbf{K} K​为相机的内参矩阵,由fx 和 fy:焦距,用像素表示。fx 是 x 轴方向的焦距,fy 是 y 轴方向的焦距。cx 和 cy:是图像的主点坐标,也就是图像中心的像素坐标。

世界坐标系到像素坐标系(旋转平移变换)

见上一篇坐标变换~

1.2 激光雷达坐标系

激光雷达可以分为 2D 和 3D,每一帧信息为一帧点云。点云中的每个点可以表示为极坐标(距离和角度)或者笛卡尔坐标(x, y, z)形式,该坐标系是在激光雷达坐标系下。激光雷达坐标系方向因具体型号而异,一般来说平放的情况下,Z 轴和激光雷达旋转轴重合指向上,XY 平面和地面平行,以下为 Ouster OS-1-64 的坐标系示意图:
在这里插入图片描述
在这里插入图片描述

1.3 IMU坐标系

和相机、激光雷达不同,IMU,GPS和轮速计等不采集环境信息,而是通过不同原理直接对传感器本身的状态进行测量。IMU 的测量原理可以参考我之前写的博客:IMU 测量模型。

IMU 加速度计和陀螺仪的测量值分别为 IMU 坐标系相对于惯性系的加速度和角速度。惯性系的选择随使用场景和精度要求不同可以有不同选择,对于小范围短时间内的定位可以近似认为局部坐标系为惯性系,这样解算载体状态较为简单,对于大范围长时间且要求精度高的场合可以选择世界坐标系(如下文提到的 ECEF 坐标系)为惯性系,此时解算载体状态需要考虑地球自转速度、载体所在高度等信息,计算相对较为复杂。

1.4 GPS

GPS 自身没有坐标系,它测量的是载体在世界坐标系(WGS84)下的坐标值。由经度和纬度组成。

1.5 轮速计

轮速计通常没有自身的坐标系,单个编码器的测量值为该轮的转速。通过两个轮子上编码器结合查分模型可以得到两轮连线中心的切向速度。如下图所示:

在这里插入图片描述

2. 车体坐标系

​ 车体坐标系用来描述车辆周围的物体和本车之间的相对位置关系。目前学术界和工业界有几种比较常用的车体坐标系定义方式。分别是ISO国际标准定义,SAE(Society of Automotive Engineers)汽车工程协会定义,和基于惯性测量单元IMU的坐标定义。

ISO定义SAE定义IMU定义
X正方向
Y正方向
Z正方向
横滚正方向向右向右向右
俯仰正方向向下向上向下
偏航正方向逆时针顺时针(-pi,pi)逆时针
中心/原点车辆重心/后轴中心车辆重心/后轴中心IMU位置
右手坐标系是(perception)是(OBF radar)

​ 在车辆动力学分析中,ISO定义的车体坐标系较为常见。SAE定义的车体坐标系与航空航天领域常用的集体坐标系相一致。基于IMU定义的车体坐标系,则在IMU的相关应用中较为常见。无论使用哪一种坐标系定义,都可以完成对车身位姿的描述,以及确定周围物体和本车间的相对位置关系。

3. 导航坐标系

自动驾驶中里程计会追踪汽车在连续时刻中的运动,从而引出导航坐标系的概念。导航坐标系一般固定在汽车起始时刻的位置。在能够对齐重力(有 IMU 等惯性传感器)的情况下,方向一般有两种,分别为 ENU(东-北-天)或者 NED (北-东-地),如果不能够对齐重力,则方向为汽车坐标系的初始姿态。里程计测量出来的汽车的位姿为在导航坐标系下的位姿。相对于世界坐标些而言,可以将其视为一个局部坐标系。

在小范围下,通过固定一个初始点 (tie point),通过计算经纬度之间的距离可以作为局部的笛卡尔坐标系使用。但是由于这种方式忽略了地球本身的曲率,因此只适用于较小范围,地球曲率可以忽略的区域的计算(通常小于 4km),但超过一定范围后变形会非常明显。此时如果想要控制物体结构的变形,可以考虑使用下面提到的针对地球球面提出的投影坐标系。

4. 世界坐标系

实际情况中,自动驾驶汽车可能会多次经过同一区域进行定位和建图。导航坐标系的原点每次都不一致,对于相同的场景,导航坐标系表现的结果也是不一致的。因此需要有全局测量获得汽车在地球上的绝对位置,从而引出世界坐标系的概念。世界坐标系通常囊括整个地球范围,且原点固定在地球某处(地心),按其形式有地心坐标系和笛卡尔坐标系。由于地球本身是一个(椭)球体,因此从地心坐标系转换到笛卡尔坐标系需要遵循某种投影方式,中间会涉及到失真和变形的问题。

4.1 地理坐标系(GCS)

1. 地心地固坐标系(ECEF)

地心地固坐标系(Earth-Centered,Earth-Fixed,ECEF)原点为地球质心,x 轴指向本初子午线与赤道的交点, y 轴垂直于xOz平面(即东经90度与赤道的交点), z 轴指向北极点,它和导航坐标系(以 ENU 为例)的关系如下图所示:

在这里插入图片描述

2. 大地坐标系(LLA)

由于地球表面本身是个椭球面,因此用 ECEF 来描述地理位置不太直观。因此除了用笛卡尔坐标系描述以外,还可以用大地坐标系来描述某个点在地球上的位置。从上图中可以看出,要定位一个点在地球上的位置,有两种参数化方法,一种是使用 ECEF 系下的 x , y , z x,y,z x,y,z 坐标来描述,另一种是使用大地坐标系下的 λ , ϕ , h \lambda,\phi,h λ,ϕ,h来描述,这种方法就是我们常用的经纬度(和高度)描述法。目前使用的标准为 WGS-84。

4.2 投影坐标系

由于地球表面是曲面,对于 ECEF 和 LLA 坐标系,都不方便计算两个点沿地球表面的距离,因此在可视化以及建图定位时,常需要将地球投影到一个 2D 平面上,因此引入投影坐标系的概念。这里介绍两种投影坐标系。

1. 通用横轴墨卡托投影 UTM

UTM 投影的原理可以参考:聊聊GIS中的坐标系|再版。UTM 坐标将地球分为 60 个经度区和 20 个纬度区。在 UTM 系下,地球上的每个点都可以通过四个参数确定位置:经度带号、维度带号、该点距该经度区中心子午线的投影距离以及该点距赤道的投影的距离。如下图所示:

在这里插入图片描述

2. 网络墨卡托投影 Web Mercator

Web Mercator 投影的原理可以参考:Web Mercator 公开的小秘密。Web Mercator 能够将经纬度投影为两个 X/Y 坐标。

3. UTM和Web Mercator的对比

UTM 投影的思路是按经度进行分带,以若干条经线为中心左右 3° 或 6°进行投影。由于是横轴投影,因此可以保证中央的经线不会发生变形,离中央经线越远的地方变形程度越高。且纬度越高,横向的变形程度越大。

Web Mercator 为纵向投影,在南极和北极等高纬度有一部分无法被投影。可以按不同缩放比例,将地图投影到若干个瓦片,相比于 UTM 投影,其坐标是连续的,原点为本初子午线和赤道的交点,向东向北为正,向西向南为负。投影过程中纵向和横向都会发生变形,在高纬度地区尤其明显(对比格林兰岛和非洲的面积),但由于变形比例类似,因此可以保持物体的形状的发生不变。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1389516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle基础查询介绍

1、oracle语句分为: DCL:数据控制语言,关键字有 grant、revoke 如:grant create table to test2; DDL:数据定义语言,关键字有 create、alter、drop、truncate 如:create table test1; DML&am…

接口测试用例设计 - 实战篇

一.接口测试流程 1.需求讨论 2.需求评审 3.场景设计 4.数据准备 5.执行 二.分析接口文档中哪些元素 1.接口名称 2.接口地址 3.支持格式 4&#xff0…

IDEA2023的激活与安装(全网最靠谱,最快捷的方式)

前言: 相信很多小伙伴已经开始了java的学习之旅,想要更快乐的学习当然少不了IDEA这个得力的开发工具软件。但是IDEA是付费的,免费版功能有太少,怎么才能既免费,又能使用上正式版呢!当然还是激活啦&#xf…

【昕宝爸爸小模块】深入浅出之JDK21 中的虚拟线程到底是怎么回事(一)

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。 本文章CSDN首发,欢迎转载,要注明出处哦! 先感谢优秀的你能认真的看完本文&…

Leetcode22-旅行终点站(1436)

1、题目 给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 cityBi 。请你找出这次旅行的终点站,即没有任何可以通往其他城市的线路的城市。 题目数据保证线路…

【Macos系统】安装VOSviewer及使用VOSviewer教程!!以ESN网络的研究进行案例分析

【Macos系统】安装VOSviewer及使用VOSviewer教程 以ESN网络的研究进行案例分析 本文介绍如何安装和使用VOSviewer软件,并以ESN(Echo State Network)网络的研究为案例进行分析。利用VOSviewer对相关文献进行可视化分析,并深入了解…

最新可用GPT-3.5、GPT-4、Midjourney绘画、DALL-E3文生图模型教程【宝藏级收藏】

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画,文档对话总结DALL-E3文生图,相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容甚至也可以和…

麒麟KYLINOS域名解析失败的修复方法

原文链接:麒麟KYLINOS域名解析失败的修复方法 hello,大家好啊!今天我要给大家介绍的是在麒麟KYLINOS操作系统上修复域名解析的方法。在日常使用中,我们可能会遇到由于系统配置问题导致的域名解析失败,这在内网环境下尤…

世微AP5160宽电压 LED 降压型恒流芯片14-18V 3A 电源PCB线路

这是一款14-18V 3A 电流的PCB设计方案. 运用的是世微AP5160 电源驱动IC,这是一款效率高,稳定可靠的 LED 灯恒流驱动控制芯片,内置高精度比较器,固定 关断时间控制电路,恒流驱动电路等,特别适合大功率 LED 恒流驱动。 …

selenium模拟浏览器查询导出参考文献

通过使用Selenium和BeautifulSoup,在CNKI网站上,以"知识图谱"为关键词,通过自动化工具在搜索页面提取相关文章信息。点击清楚并全选进行文献导出,随后从导出页面和管理导出的页面提取参考文献。 浏览器及WebDriver下载…

集合框架(一)

集合体系概述 集合体系结构 Collection代表单列集合,每个元素(数据)只包含一个值。Map代表双列集合,每个元素包含两个值(键值对)。 Collection集合体系 Collection集合特点 List系列集合:添加…

主流进销存系统有哪些?企业该如何选择进销存系统?

主流进销存系统有哪些?企业该如何选择进销存系统? “永久免费”的软件,这个可能还真不太可能有。而且就算有,也只能说是相对免费。 因为要么就是数据存量有限,要么就是功能有限数据、信息都不保障,并且功…

最小矩阵宽度 - 华为OD统一考试

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C++ 题目描述 给定一个矩阵,包含N*M个整数,和一个包含K个整数的数组。 现在要求在这个矩阵中找一个宽度最小的子短阵,要求子矩阵包含数组中所有的整数。 输入描述 第一行输入两个正整数 N, M 表示矩阵大小。 接下…

Go后端开发 -- 面向对象特征:结构体 继承 多态 interface

Go后端开发 – 面向对象特征:结构体 && 继承 && 多态 && interface 文章目录 Go后端开发 -- 面向对象特征:结构体 && 继承 && 多态 && interface一、Go的结构体1.结构体的声明和定义2.结构体传参 二、将…

嵌入式一开始要怎么学?

今日话题,嵌入式一开始要怎么学?废话不多说,我认为学习嵌入式编程无需观看视频,拥有好的文档比视频更有帮助。掌握一门编程语言是学好嵌入式的关键。现今有许多计算机编程语言可供选择,比如C语言和C等。如果你刚刚入门…

CDN(内容分发网络)和DNS(域名系统)的区别

CDN关注于提高网站的访问速度和性能,主要通过在全球范围内分布的服务器缓存内容来实现,而DNS则是将域名转换为IP地址的系统,是互联网上进行任何形式的数据交换和通信的基础。 CDN(内容分发网络) 目的:CDN的…

查看centos的CPU、内存、磁盘空间等配置信息

目录 查看CPU/proc/cpuinfo中的信息 查看内存/proc/meminfo中的信息 查看磁盘空间df 命令du命令使用fdisk命令 查看CPU /proc/cpuinfo中的信息 前置: [ltkjltkj front]$ cat /proc/cpuinfo| grep "physical id" physical id : 0 physical id : 0 physi…

GO——gin中间件和路由

中间件 参考:https://learnku.com/articles/66234 结构 中间件是函数中间件函数被放在调用链上调用链的末尾是路由path对应的函数 执行过程 net/http包调用到gin的serverHTTP 参考:go/pkg/mod/github.com/gin-gonic/ginv1.7.7/gin.go:506 通过path找到…

Qt根据单价计算总价与进制转换

1.相关说明 二进制、十进制、十六进制间的相互转换 2.界面绘制 3.相关主要代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete …

学习JavaEE的日子 day12 构造方法 类的制作

Day12 需求:创建人类的对象,并操作对象 分析: 人类 - Person 属性:name、sex、age 方法:eat、sleep 场景:创建多个对象,去操作对象 //测试类:该类中有main方法,测试我们写…