SensorX2car:在道路场景下的完成传感器到车体坐标系标定

news2025/2/28 0:26:49

文章:SensorX2car: Sensors-to-car calibration for autonomous driving in road scenarios

作者:Guohang Yan, Zhaotong Luo, Zhuochun Liu and Yikang Li

编辑:点云PCL

代码:https://github.com/OpenCalib/SensorX2car

作者单位:上海人工智能实验室

欢迎各位加入知识星球,获取PDF论文,欢迎转发朋友圈。文章仅做学术分享,如有侵权联系删文。

公众号致力于点云处理,SLAM,三维视觉,高精地图等领域相关内容的干货分享,欢迎各位加入,有兴趣的可联系dianyunpcl@163.com。未经作者允许请勿转载,欢迎各位同学积极分享和交流。

摘要

自动驾驶系统中传感器的性能基本上取决于传感器校准的质量。必须将传感器准确地标定到车体坐标系下,才能够提供有价值的定位和环境感知结果。然而,虽然目前已经提出了许多在线校准的方法来实现传感器之间的外参校准,但很少有研究集中在传感器与车体坐标系之间的校准。为此,作者提出了SensorX2car,一个用于在线校准道路场景中传感器与车体坐标系之间关系的校准工具箱。它包含四种常用的传感器:IMU(惯性测量单元)、GNSS(全球导航卫星系统)、LiDAR(激光雷达)、相机和毫米波雷达。我们分别为每个传感器设计了一种方法,并主要校准了其相对于车体的旋转。在实际路测和模拟实验中证明了所提出方法的准确性和泛化能力。同时,相关代码已经开源以造福社区。据我们所知,SensorX2car是第一个开源的传感器与车体校准工具箱。

代码已开源:https://github.com/OpenCalib/SensorX2car。

主要贡献

目前有一些与传感器校准相关的开源项目,但大多数都是用于两个或多个传感器之间的校准。对于传感器与车之间的校准方法仍然非常少。因此,基于之前的OpenCalib[1]校准研究和项目经验,作者提出了一种基于道路场景的多传感器在线校准方法SensorX2car。本文的贡献如下: 

  • 提出了一种基于道路几何特征的相机与车体坐标系之间的校准方法,可以用单张图像进行实时校准。 

  • 提出了一种基于LiDAR的在线校准方法,可用于任意驾驶路线并实时运行。该方法可以准确估计旋转和z轴位移。

  •  通过选择最可能直接在车辆前方的静止物体和使用基于道路场景中静态物体的最小二乘优化拟合的新型校准优化方法,引入了一种Radar的在线校准方法。 

  • 提出了一种从姿态传感器到车辆的道路场景在线校准方法,可在直线或非直线行驶条件下实施。 

  • 所提出的校准方法在我们的模拟和真实数据集上表现出良好的性能,同时,相关代码已经开源以惠及社区。

主要内容

A. 坐标系定义

本文中的参考坐标系都是以图1中定义的车辆和其他传感器参考坐标系,使用(φ; θ; ψ)来表示横滚角、俯仰角和偏航角。

9941c35d82bbe5fe601eccc3809ffbd2.png

图1. 车辆和传感器的参考坐标系:z轴向上,x轴向前,y轴向左。

B. 相机标定 

相机标定的总体过程如图2所示,首先通过深度学习网络从单张图像中估计消失点和水平线的角度,假设相机的内参已知,可以计算出相机和路面之间的三个旋转角度,当车辆直行时,车辆的方向可以视为路面的方向。因此,可以得到了相机和车辆之间的旋转,需要注意的是,车辆不需要一直直行,我们在算法中使用消失点位置的稳定性作为判断条件来提取有用的图像片段。

0d4f7867c79bd451262b9c3c2fcfc681.png

 图2,相机标定的流程

1)检测网络:网络概述如图3所示,对于输入图像估计消失点位置和水平线角度,使用Transformer作为基本结构,并将提取的线特征馈送到解码器层,使用堆叠的Hourglass网络作为骨干网络来生成特征图,因为它可以在扩大感知范围的同时保留局部细节,在原始Hourglass网络之前和之后添加MaxPool层,以降低特征图的分辨率,以适应Transformer编码器输入。对于输入图像,来自骨干网络的高维特征图(W; H; W)被展平(W; H×W),并馈送到编码器层,然后特征被编码并传递到解码器层。

08d9fa3969c00049723bdc4fccc11198.png

图3,消失点和地平线检测网络综述

设置了两个可学习的查询对象作为解码器层的输入,以估计消失点的位置和水平线的角度。使用反正切投影将线和点表示在高斯球上。图像帧中的点p =(u; v)可以在高斯球上表示为:

dbfa74471ae0875e247340c9f969b92d.png

此外,通过LSD提取线特征,并在卷积网络之后将其输入解码器,线可以表示为两个端点的叉积:

7f878921df362f06f4fb56f03ab80d40.png

在解码器的输出端为每条线形成一个分类任务,以区分其是否通过消失点。通过这种方式,网络被迫更加关注朝向消失点的线条,我们设置一个阈值来标记距离消失点的线条是否为正样本或负样本。

a540b708b1fa09da2d82b85db11d4d49.png

其中d_i是线段l_i和消失点p之间的距离。

最终的损失函数包含三个部分:消失点位置的余弦相似度、地平线角度的绝对值误差和线分类的二元交叉熵损失(BCE loss)。

ce270dc54b36f20ab80af57873ef407b.png

其中,c_i 是第 i条线的标签,s_i是第i条线的 SoftMax 网络的输出。

2)旋转推导: 这里推导从VP位置和水平线角度到相机坐标系和路面坐标系之间的旋转过程,当车辆直行时,我们可以得到相机到车辆的旋转矩阵, 对于针孔相机,从三维空间P(X,Y,Z)到图像平面p(u,v)的投影可以描述为:

a31612b986ee1fee7fbfc7fa048b74b3.png

由于消失点是在无穷远处的平行线的交点,因此Z_vp=1。这里我们用p1表示图像平面上的消失点,用R3表示旋转矩阵R的第三列,通过使用方程式9的齐次性,我们可以得到:

26b5f1796f8bae6328e39d10adf9c5db.png

可以从 R3 推导出偏航角和俯仰角:

944716427414b2330a6494a4a1878f9c.png

横滚角就是水平线的角度。

1844cdf9d1e8a8842f7a6d1676483ce9.png

3)手动标定:如上所述作者还设计了一种手动工具,通过使用消失点、水平线和旋转角度之间的关系来进行相机标定,在这个工具中用户可以手动逐步改变角度。图像将通过您调整的新外参数进行重投影:

2bfe63ee4cd02efda3cc05aeb31ffe62.png

这里的T_WC表示从世界坐标系到相机坐标系的转换,T_M是我们手动添加的转换矩阵,一旦T_M = T_WC的逆,消失点就变成了:

1fd91578ed54e48fd5c34a8dc8fd49cf.png

其中,cx和cy是K中的内参,因此,调整目标是使你自己估计的消失点与光心重合,并使水平线看起来更加水平。这个工具的精度取决于你估计的消失点和水平线的质量。

C. LiDAR 标定 

对于 LiDAR,需要校准它的旋转和高度(离地高度),具体而言,首先通过提取地平面来校准俯仰、横滚和高度,然后通过分析相应时间戳处轨迹方向和速度方向的差异来估计偏航角。 

1)俯仰和横滚角估计:为了估计俯仰、横滚和 LiDAR 高度,基本上通过 RANSAC 算法提取地平面实现。该算法重复多次,使用随机的初始点,并对结果进行平均,以获得最终平面参数。然而,如果地面非常不平坦,RANSAC 可能无法找到足够的点来拟合平面。然后,这里作者采用 LPR [42] 作为替代方案,使用确定性分配的种子点迭代地提取地面表面。它首先按 z 轴值对点进行排序,并选择若干个具有最小 z 值的点来计算初始平面。然后它区分内点并进行迭代拟合平面。提取的平面可以由其法向量 np 和截距 dp 表示:

7066dd692051c83b073fa9eaa5ef1416.png

然后可以得到旋转向量和旋转角度:

cedade1acf56f29962429620fd73d48a.png

激光雷达的旋转R和高度z导出为:

ddfeeb7bb27d20c3e2c8856b7a74e7a8.png

其中Z^垂直水平面的法向量.

2)偏航角估计:在获取了俯仰角和横滚角之后,我们进行点云旋转,使得点云的 z 轴垂直于地面平面,通过SLAM 算法可以在每个时间戳获得 6 自由度位姿,并且 LiDAR 在地面上的 2D 轨迹可以通过位置 (xei,yei) 获得。接下来分析轨迹方向和速度方向之间的差异来估计偏航角,具体来说,使用一个长度为 3 的滑动窗口,在每个时间戳上计算当前和前两个时间戳的位置差分和速度差分,然后使用这些差异来计算速度方向和轨迹方向的夹角,这就是 LiDAR 的偏航角。

0ea502dfdca815968e792a5fa372daa9.png

在实验中,我们选择FAST-LOAM [43]作为算法,因为它能够同时实现实时性能和良好的准确性。然后使用B样条插值来根据t x(t),y(t) 拟合x、y曲线,并获取它的导数。

44f3839ba5a7435ab56a89cf609288b2.png

n是B样条的次数。方向速度可以计算为:

4f3cf5af6c204b508023a3e86ecfa201.png

其中v_i可以看作时间戳i时车辆的前进方向,e_i是时间戳i时LiDAR的方向。因此这两个角度之间的差异就是我们需要校准的偏航角偏差。此外根据两个条件过滤掉一些会产生较差估计的数据点,因为我们使用导数来计算速度,当车辆速度较低甚至静止时,计算出的方向容易产生显著的误差。因此需要设置一个最小值来删除移动速度过慢的数据点,由于算法的性能高度依赖于曲线拟合的效果,则需要删除曲率大的数据点,这意味着车辆有很大的加速度或者进行了急转弯。虽然我们的算法通常可以在曲线路径上正常工作,但建议使用直行驾驶数据以获得更准确的结果。

最终的偏航角是通过对每个有效时间戳的 vi 和 ei 的差异进行平均计算得出的。

4db6f0f01dda96a740786d856273db66.png

D. 毫米波雷达校准

毫米波雷达校准一般只需要校准雷达的偏航角,这个过程分为三步,包括粗略校准、静止物体识别和曲线拟合。毫米波雷达测量包含物体在雷达参考系下的相对速度、角度和距离,在这里还需要其他传感器的帮助,比如GNSS或者轮速计来获取车辆的速度,如果物体静止,则表示为:

8be95f9eea7b542acaa7b0f3d4c91864.png

其中theta是雷达坐标系到车辆坐标系的偏航角,是需要进行求解的值,这个公式在图4中有解释。

1cc61b582108a447e9c3226e81d50fb8.png

图4,物体静止时的速度关系

  • 偏航角校准:在偏航角校准阶段,首先将速度接近当前车速的目标点作为静止物体,通过分析具有最多静止物体的方向得到初始的偏航角度估计。

  • 静止物体识别:使用当前的偏航角度估计可以找出满足式子(24)的静止物体。

  • 曲线拟合:找到所有帧的静止物体后,可以拟合cos函数曲线来更新偏航角度估计,步骤2和3以迭代的方式进行,以优化校准结果。

E. 位姿-传感器校准

在位姿传感器校准中,估计IMU和车辆的偏航角以校正前向方向的传感器的安装误差,有两个分支:

1)直行:如果已知车辆直行,使用RANSAC算法将GNSS轨迹拟合成一条直线,并将其视为车辆的方向,表示为v。然后使用所有时间戳处的IMU测量Ii,并计算v和Ii之间的差异:

d763f6bfc3e4cef18e17b6f587a3709b.png

其中S_l是直线路径的集合。

2)非直行驾驶:该过程类似于LiDAR校准方法,计算车辆行驶方向与IMU测量的偏差角度,车辆行驶路线由GNSS测量得到,在局部参考框架中表示为(xiG; yiG; ziG),然后采用B样条方法平滑行驶路线,并在每个时间戳获取方向,表示为vi,IMU测量中的偏航角度表示为iI,通过删除行驶方向快速变化的数据,例如急转弯,可以获得实时真实偏航角的精确近,校准公式可以描述为:

6d97d5bd010dc414a151184fa0bfc616.png

由于 GNSS 轨迹不是非常精确和可靠,因此建议直接记录直线行驶数据进行校准。

实验

A. 相机标定 

为了训练和评估我们的检测网络,首先标注了一个数据集,其中包含消失点和地平线的注释。据我们所知,很少有开源数据集包含消失点和水平线标注,适用于自动驾驶场景。在基于KITTI [44]构建了自己的数据集。每帧的地平线通过IMU的绝对姿态和KITTI提供的IMU与相机之间的相对姿态自动生成。对于消失点,使用半自动方式,我们首先使用Neurvps估计一个大致的消失点。该算法在许多情况下可能失败,例如弯曲的道路或光照变化等。因此,需要人工手动检查并纠正它们。最终数据集包含43195帧,包括城市、住宅区、高速公路、校园、山区等不同场景。图5展示了一些示例,该数据集大致分为70%,15%和15%用于训练,验证和测试。

cec6c89ff27e849992837d9b991c1824.png

 图5,不同场景下标注的KITTI数据集示例

将我们的方法分别与消失点检测网络和水平线估计网络进行了比较,对于消失点,将我们的方法与Neurvps [21]进行比较,对于地平线,我们将其与TCHL 进行比较。结果如表1所示。实验结果表明,我们的方法具有竞争性能和相对较高的推理速度。

046ec04e8a5c98466e78d7ba83d2fda1.png

B. LiDAR校准 

在几个现实场景和模拟数据集上测试了算法。

1.定性结果: 为了定性地证明我们算法的有效性,可视化了车辆方向vi从轨迹中推导出来的,以及LiDAR方向vi在所有时间戳上的情况。如果这两条曲线具有相同的趋势,并且只有固定的偏移量不同,则意味着拟合效果是可靠的,如图6所示。

e14c29d362cc1fa56d40be33347659cd.png

图6,车辆偏航角与激光雷达偏航角的比较

a1297216a6d6f20f3fff0e6135e0133c.png

图7,虚拟环境中的2D激光雷达路线1

2. 定量结果:对于模拟数据,我们有旋转角的真实值,表2展示了估计结果与真实值之间的差异,虚拟世界中车辆的路径如图7所示,对于真实世界的数据可以使用不同帧结果的一致性作为评估指标。

a3e19a52fe39a252cce2e17b5916ec67.png

此外还有一个粗略的初始校准结果,该结果是在校准房间中获得的,可以用作参考,结果如表3所示,在真实世界的数据集中,路径是任意的,包含曲线和直线。

2ea74ca9afa652966d0f6a2d292d2f82.png

C. 毫米波雷达校准

1.定性结果:为了定性评估,可视化了公式 24 中的余弦曲线拟合,如图 8 所示,大多数数据点都很好地拟合了余弦曲线,证明了该方法的有效性。

e6670b863e63697839aa01070b333e96.png

图8,毫米波雷达标定中的余弦拟合

2.定量结果:对于定量评估,使用数据一致性和拟合优度指标,一个真实世界的雷达数据的实验结果如表4所示。

f9e573ff493f5d6c2caa6d7528e07a5c.png

D.姿态传感器校准

1.定性结果:我们在图9中可视化了B样条曲线拟合的效果,GNSS轨迹的原始偏航角度波动很大,使用B样条插值后,曲线得到了平滑,可以发现,尽管存在固定的偏移量,但两个曲线具有相似的趋势。

ef53c77a5a5e012d64dd1c3cdd3634e6.png

图9,毫米波雷达定标中的余弦拟合

2.定量结果:使用RANSAC拟合的得分和直线条件下的速度投影验证来评估结果,RANSAC得分是通过内点数与总数据点数的比例计算得出的,速度投影是使用校准后的偏航角计算得到的径向速度分量,较小的速度分量表示更准确的偏航角估计,至于自由行驶条件,使用所有帧估计的数据一致性来衡量结果。

fdb33d341404ea7af73d4a09d7ff8897.png

总结

本文提出了SensorX2car,这是第一个开源的实现传感器车体坐标系系标定工具箱,其中包含了四种常用传感器的标定方法:相机、激光雷达、毫米波雷达和姿态传感器(IMU+GNSS),这些方法是无需目标的,可以在常见的路况下工作,通过在模拟和真实场景数据集上验证了这些方法的实用性和有效性,我们的工作仍有一些改进的空间,未来将进一步优化这些方法,并进行更详细的实验,以系统地评估它们。

更多详细内容后台发送“知识星球”加入知识星球查看更多。

3D视觉与点云学习星球:主要针对智能驾驶全栈相关技术,3D/2D视觉技术学习分享的知识星球,将持续进行干货技术分享,知识点总结,代码解惑,最新paper分享,解疑答惑等等。星球邀请各个领域有持续分享能力的大佬加入我们,对入门者进行技术指导,对提问者知无不答。同时,星球将联合各知名企业发布自动驾驶,机器视觉等相关招聘信息和内推机会,创造一个在学习和就业上能够相互分享,互帮互助的技术人才聚集群。

以上内容如有错误请留言评论,欢迎指正交流。如有侵权,请联系删除

扫描二维码

                   关注我们

让我们一起分享一起学习吧!期待有想法,乐于分享的小伙伴加入知识星球注入爱分享的新鲜活力。分享的主题包含但不限于三维视觉,点云,高精地图,自动驾驶,以及机器人等相关的领域。

分享与合作方式:微信“cloudpoint9527”(备注:姓名+学校/公司+研究方向) 联系邮箱:dianyunpcl@163.com。

为上海人工智能实验室伙伴们点赞吧!

c4489d387a761be937b73ef097906cdf.gif

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

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

相关文章

IDEA+maven+Springboot工程创建超详细过程示例

IDEAmavenSpringboot工程创建超详细过程示例 1、IDEA、Maven下载安装及IDEA配置Maven教程2、IDEAmavenSpringboot的web工程创建示例2.1 SpringBoot简介2.2 maven形式创建sprintboot工程2.3 导入相关依赖2.4 创建SpringBoot启动类2.5 创建 Controller2.6 启动项目2.7 配置端口信…

springboot第22集:security,Lombok,token,redis

Spring Security是一个基于Spring框架的权限管理框架,用于帮助应用程序实现身份验证和授权功能。它可以为Web应用程序、REST API和方法级安全性提供支持,并支持各种认证方式。 Spring Security最初是Acegi Security的前身,但由于其配置繁琐而…

【第六期】Apache DolphinScheduler 每周 FAQ 集锦

点击蓝字 关注我们 摘要 为了让 Apache DolphinScheduler 的广大用户和爱好者对于此项目的疑问得到及时快速的解答,社区特发起此次【每周 FAQ】栏目,希望可以解决大家的实际问题。 关于本栏目的要点: 本栏目每周将通过腾讯文档(每…

用排列组合来编码通信(六)——魔术《5张牌的预言》的魔术拓展之《My Fitch Four Glory》...

早点关注我,精彩不错过! 在上一篇中,我们介绍了《5张牌的预言》这个魔术的一个精彩的扩展表演《Eigens Value》,把这个魔术和数学性质的结合做到了极致,相关内容请戳: 用排列组合来编码通信(五&…

第二十二章 Unity 光照贴图

光照贴图过程将预先计算场景中静态物体表面的亮度,并将结果存储在称为“光照贴图”的纹理中供以后使用。光照贴图可以包含直接光照和间接光照,以及阴影效果。但是,烘焙到光照贴图中的数据无法在运行时更改,这就是为什么移动静态物…

Angular开发之——Angular介绍(01)

一 概述 Angular是什么AngularJS和Angular关系Angular特性Angular的发展历史Angular学习建议 二 Angular是什么 Angular(读音[ˈŋɡjələr])是一套用于构建用户界面的javaScript框架。由Google开发和维护,主要被用来开发单页面应用程序类似于Vue.js(MVVM数据驱动…

视觉检测技术在图书生产缺陷控制中的应用

在过去我们一直向大家展示的是视觉检测应用在重工业制造之上,让很多人误以为这种新兴的检测技术更加倾向于重工业,或者说因为成本因素,这项技术对目前的轻工业来说更加的不友好,其实并不是这样的。 轻工业我们之所以很少的提机器…

docker入门和docker应用场景,镜像制作,服务编排,docker私服

一、简介 docker解决了什么问题docker和虚拟机的区别在CentOS7里安装docker 1. docker简介 我们写的代码会接触到好几个环境:开发环境、测试环境以及生产环境等等。多种环境去部署同一份代码,由于环境原因往往会出现软件跨环境迁移的问题(也就…

黏包和半包

黏包和半包 黏包: Slf4j public class HelloWorldServer {public static void main(String[] args) {NioEventLoopGroup boss new NioEventLoopGroup();NioEventLoopGroup worker new NioEventLoopGroup();try {ServerBootstrap serverBootstrap new ServerBoo…

open3d教程(二):可视化三维模型,并转换成点云(Python版本)

1、三维模型获取 可以自己用建模软件建立一个模型从free3d免费下载 2、关键函数 open3d.visualization.draw_geometries 参数: geometry_list(List[open3d.geometry.Geometry]):要可视化的几何体列表.window_name(str, optional, defaultOpen3D)&…

Linux环境下编程遇到“fatal error:stdio.h:没有那个文件或目录”错误解决办法

我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下linux环境下如何解决一个常见的问题,也就是“fatal error:stdio.h:没有那个文件或目录”错误。 不少初学者在linux环境下用gcc编译C语言时,经常会遇到这个问题。 比如当…

工具推荐二

(点击上方公众号,可快速关注) GUI框架 我是个后端程序员,使用GUI框架的机会很少,主要用来编写个人或工作中的一些小工具上,经验有限,仅供参考。 Tk框架这个框架tcl语言自带,在python…

海报图片生成服务在狐友的落地实践

本文字数:22817字 预计阅读时间:58分钟 项目背景 狐友作为搜狐的一款社交产品,在流量传播上有着旺盛的需求点。而在流量传播所需的众多载体之中,海报图片以其简单的分享形式、可定制的视觉体验、自带二维码识别导流等特点&#xf…

入门与 Follow GPT 的路径分析:LLM 道阻且长,行则将至

动手点关注 干货不迷路 本文只用于技术交流,仅代表作者个人观点。 作为 CEO,Sam 将 OpenAI 的内部氛围组织的很好,有位 OpenAI 的前员工告诉拾象团队,当 2018 年 GPT-2 的论文被驳回时,Sam 在团队周会上将拒信的内容朗…

ONES X 高测股份|用数字化,重构新材料企业的研发管理体系

近日,ONES 签约高硬材料切割的领军企业——高测股份,助力高测股份建立有效、规范的研发测试管理体系,实现项目管理、测试管理、知识库管理、工时管理、组织效能管理等端到端的研发管理,提升测试效率和产品交付质量,并进…

用Python+OpenCV+Yolov5+PyTorch开发的车牌识别软件(包含训练数据)

目录 演示视频 软件使用说明 软件设计思路 演示视频 这是一个可以实时识别车牌的软件,支持图片和视频识别,以下是软件的演示视频。 车牌识别软件 点击查看代码购买地址 软件使用说明 1. 下载源码后,首先安装依赖库。项目所用到的依赖库已…

bash shell 基础命令

章节目录: 一、浏览文件系统1.1 Linux 文件系统1.2 遍历目录 二、列出文件和目录三、处理文件3.1 创建文件3.2 复制文件3.3 命令行补全3.4 链接文件3.5 文件重命名3.6 删除文件 四、管理目录4.1 创建目录4.2 删除目录 五、查看文件内容5.1 查看文件类型5.2 查看整个…

【Linux】Linux编辑神器vim的使用

目录 一、Vim的基本概念 二、Vim的基本操作 1、进入vim 2、正常模式切换至插入模式 3、插入模式切换至正常模式 4、正常模式切换至底行模式 5、退出Vim编辑器 三、Vim正常模式命令集 1、移动光标 2、删除文字 3、复制 4、替换 5、撤销 四、Vim底行模式命令集 1、列出行号 2、光…

【Linux】进程信号捕捉

前言 在【Linux】进程信号及信号产生中,我们提到,进程接收到信号,并不是立刻处理,而是在合适的时候才执行相应的动作,那合适的时候是什么时候呢,进程捕捉信号的过程究竟是怎么样的呢?本篇博客就…

Python入门(七)if语句(二)

if语句(二) 1.if语句1.1 简单的if语句1.2 if-else语句1.3 if-elif-else结构1.4 使用多个elif代码块1.5 使用多个elif代码块 2.使用if语句处理列表2.1 检查特殊元素2.2 确定列表不是空的2.3 使用多个列表 作者:xiou 1.if语句 前面我们理解了…