作者 | 洪泽鑫
编辑 | 王博
用手机对着激光雷达拍照或录像,可能会把你的手机摄像头干废。
本月初,有用户在社交平台小红书上称,“夜拍蔚来ET5和银河,发现排出来的照片有两个贼亮的看不到的星,发现是手机摄像头被激光雷达打坏了。”
稍早前,也有网友称自己在拍摄蔚来新车ES7时,小米12S Ultra的相机受到了损坏,拍摄出的画面中出现了多条水平绿线。网友称拍的时候车是停着的,但激光雷达仍在工作。
再向前追溯,2019年CES展会期间,一位索尼手机用户在拍摄AEye公司的激光雷达时,手机摄像头同样出现绿线。
这三个事件中,相同点是都指向了1550nm光源的激光雷达。
那么,1550nm激光雷达是否会烧坏手机摄像头?
Chat GPT 4.0给出了结论。
但具体为什么会出现这种情况?我们做了些研究。
现有的1550nm激光雷达不止一次烧坏过手机摄像头。
除了上面提到的手机被激光雷达烧坏的案例,据激光雷达从业人士向HiEV表示,有激光雷达公司在内部测试1550nm产品时,也曾出现过类似情况。
但这是小概率事件。
背后的原因也很好理解,放眼全球范围,1550nm车载激光雷达正式量产的时间并不长。目前以向蔚来汽车提供产品的图达通为主,其他激光雷达公司采用的是905nm光源。
此外,1550nm激光雷达也不是遇上手机摄像头一定会将后者干掉。
弄清楚整个事情之前,我们先来了解两个东西。
手机摄像头是什么?
手机摄像头的专业术语叫CMOS传感器,这是一种将光信号转换成电信号的图像传感器。它是数字相机、手机摄像头、监控摄像头等数码成像设备中最常用的传感器之一。
CMOS传感器由成千上万个微小的光电传感单元组成,每个传感单元都能够将光信号转换成电信号。
下面是一张CMOS图像传感器的简单原理图:
如图所示,CMOS传感器的原理是将光信号转换成电信号,其中每个像素单元由感光元件、转换电路和读出电路三部分组成。
感光元件是一个光敏二极管或光电容,当光线照射到它上面时,就会产生电荷。
转换电路将感光元件产生的电荷转换成电压信号,并且在此过程中放大和整形电荷,使其更容易测量。
读出电路将电荷转换成数字信号,读出电路一般采用逐行逐列的方式,将每个像素单元的信号逐一读出,并将其转换成数字信号。
最终,由计算机对读取的数字信号进行处理和编码,生成一幅完整的数字图像。
激光雷达是什么?
激光雷达可以通过发射激光脉冲,然后测量脉冲的回波时间和强度,从而确定目标物体的距离、位置、形状等信息。
激光雷达通常由激光器、扫描器、探测器、处理器等部分组成。
下面是一个简单的激光雷达的原理图,可以用来说明激光雷达的基本原理和组成部分:
激光器(Laser):发射激光脉冲的光源,一般采用固态激光器、半导体激光器等。
扫描器(Scanner):控制激光束的扫描范围和速度,一般采用旋转镜或微机电系统(MEMS)扫描器。
接收器(Receiver):接收目标物体反射回来的激光信号,一般采用光电二极管、光电倍增管等。
计算机(Computer):对接收到的激光信号进行处理,包括测量距离、位置、速度等信息,生成三维点云图或图像。
激光器发出高能量的脉冲激光,扫描器将激光束控制在一定范围内扫描,接收器接收回波信号并测量回波的时间和强度,计算机对数据进行处理并生成三维点云图或图像。
激光雷达的工作原理是利用激光束在空气中传播的速度非常快,可以近似地看作光在真空中的传播速度,因此可以用极高的精度来测量物体的距离和位置。
激光雷达所用的激光波长一般为几百纳米至几微米不等,常见的波长有905纳米、1550纳米等,具体的波长根据不同的应用需求而定。
那么,当手机摄像头拍摄激光雷达时,真的会被烧坏吗?
一般情况下,车载激光雷达发射的光束在传输过程中会逐渐衰减,到达接收器时的光强已经很小。此外,现代激光雷达系统通常都采用滤光片等措施来减少对CMOS传感器等光敏元件的干扰和损害。
所以,车载激光雷达通常不会烧坏CMOS传感器。
那么,什么情况下激光雷达会对CMOS传感器造成损坏?
激光雷达的光束强度和波长都会对其对物体的作用产生影响,因此光束的功率和波长都是需要考虑的因素。
此前有论文对激光对CMOS传感器的辐照损伤机制和影响因素进行了深入研究。
文章针对不同波长(532、1064和1550 nm)和能量密度(10-1000 mJ/cm2)的激光对CMOS传感器进行了辐照实验,通过研究不同条件下CMOS传感器的辐照后电性能和图像质量,得出以下结论:
激光波长对CMOS传感器的辐照损伤产生显著影响,其中532 nm的激光辐照引起的损伤最为显著,而1550 nm的激光辐照引起的损伤相对较小。
激光功率对CMOS传感器的辐照损伤程度有非常显著的影响,功率越高,对传感器的损伤也越明显。在所有测试中,1000 mJ/cm2的激光辐照产生了最严重的损伤。
辐照时间也对损伤程度产生影响。较短时间的激光辐照会对传感器产生暂时性损伤,而较长时间的辐照则会对传感器产生更为严重和持久的损伤。
激光辐照对CMOS传感器中单元电荷转移率和电荷收集效率等性能指标产生了影响,同时也对图像噪声、动态范围等图像质量指标产生了影响。
从上图可以看到,随着激光能量增加,CMOS依次出现光斑损伤、线损伤、十字交叉线面损伤。
通过CMOS失效机理分析、结合损伤CCD仿真模拟,可知:
CMOS出现光斑损伤主要是由于微透镜和滤光片受损,伴随着部分金属铝剥落融化,部分单元像素失效造成的;
出现线损伤主要是由于局部电路短路或断路导致信号传输中断;
随着CMOS温度继续升高,晶体硅融化,二氧化硅由于受到热应力作用发生变形和断裂,金属线路严重损坏,出现十字交叉线面损伤,CMOS大面积失效。
回到文章开头出现的1550nm激光雷达烧坏手机摄像头案例。
一种观点认为,1550nm的激光束照射到Si像素上不会被吸收,会直接透射过去,也就是说,1550nm不会烧坏所有的CMOS,纯Si工艺的不会烧坏。但是在CIS底层电路中有可能对1550nm较敏感的部分,造成短时间热效应,烧坏该部分电路。
还有一种分析观点认为,1550激光雷达脉冲功率较高,人眼是有晶状体的,含有比较多的水,能够吸收一部分能量,对光的能量做一些衰减。但有些手机的摄像头没有做1550nm的滤波,光直接打到了CMOS上,造成了损坏。
一位接近图达通的人士告诉HiEV,问题原因目前还没有明确定论,但基本上能判断一些影响因素,可能和激光能量、透过率这两个因素相关。
完善方向也基本上有了。
一方面,对于激光脉冲能量可以通过特殊模式的开发以进行控制。在还没有非常完善的研究评判之前,可以开发一些特殊模式,做到近距离跟车、静止时刻场景下特殊模式的开发,在特殊模式下能够对脉冲能量有一些控制。
另一方面,能量是和透过率、镜头光圈大小、镜头和滤光片的镀膜是相关的。这三种因素会影响到激光脉冲打到CMOS能量的。其中,滤光片的镀膜成本会相对低一些,是比较能够实操的状态了。
总体来说,当一辆顶着1550nm激光雷达的汽车从你身边经过时,保险起见请不要对着拍照,否则真有可能会烧坏手机摄像头。
同时,欣赏的时候跟激光雷达保持一个安全距离——10cm,离的太近了是突破人眼安全阈值的。
激光雷达有可能会烧坏手机摄像头,那它会烧坏眼睛吗?
大功率的激光器肯定会。但车载激光雷达,目前并没有对眼睛造成伤害的公开案例。
从功率上来看,之前有观点说,对于同样的功率和激光器类型,905 nm波长的激光的单光子探测器灵敏度相对比1550 nm波长的激光高,因此,可以在较低功率下实现较远距离的探测和测量。
相比之下,1550 nm波长的激光器单光子探测器灵敏度较低,并且人眼安全阈值高(比905nm高40倍),所以1550nm波长激光雷达普遍会通过提升激光器功率来实现比905nm更远的探测距离。
在具体应用中,激光器的功率和波长需要根据具体的应用场景和系统参数进行选择和调整,以达到最佳的性能和效果。
所以说,离开具体的应用场景和系统参数来谈这两种波长功率的高低,就是在耍流氓。
从对眼睛的伤害程度来看,之前有观点称905nm过量会伤害视网膜,因为它能够穿透眼睛前部,主要被视网膜黑色素吸收;而1550nm过量会伤害角膜和晶状体,因为它会被眼球的晶状体和角膜吸收,两者在过量的情况下,对于眼球伤害部位不同。
这个观点不一定正确。
2010年中国科学院理化技术研究所发表过一篇文章:
波长在可见光和近红外光的激光,眼屈光介质的吸收率较低,透射率高,而屈光介质的聚焦能力(即聚光力)强。强度高的可见或近红外光进入眼睛时可以透过人眼屈光介质,聚积光于视网膜上。
此时视网膜上的激光能量密度及功率密度提高到几千甚至几万倍,大量的光能在瞬间聚中于视网膜上,致视网膜的感光细胞层温度迅速升高,以至使感光细胞凝固变性坏死而失去感光的作用。
远红外激光对眼睛的损害主要以角膜为主,这是因为这类波长的激光几乎全部被角膜吸收,所以角膜损伤最重,主要引起角膜炎和结膜炎,患者感到眼睛痛,异物样刺激、怕光、流眼泪、眼球充血,视力下降等。
按照ASTM(美国试验和材料检测协会)的定义,可见光的波长范围为380到780纳米,近红外光的波长范围为780到2500纳米,远红外光的波长范围为2500纳米到1毫米。
905nm和1550nm都属于近红外光,并没有找到学术论文研究过他们对眼睛影响的区别。
出于不同的应用场景和需求,不同的激光雷达制造商在开会选择不同波长的激光作为其核心技术。
他们会在宣传和营销中夸大自己产品的优点,甚至诋毁竞争对手的产品。
这也是为什么网上有很多关于905 nm和1550nm激光的优缺点讨论,并且其中有不少是没有结合应用场景和需求就下结论的。
参考资料:
https://thinklucid.com/tech-briefs/understanding-digital-image-sensors/
https://www.opticsjournal.net/Articles/OJ912514f90cb3382/FullText
http://www.ipc.cas.cn/kxcb/kxpj/201811/t20181118_5185796.html
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or