二维与三维之间的桥梁——点云
在做圖像配準(zhǔn)時(shí)就聽聞過一些點(diǎn)云的方法,卻沒對其有太多的認(rèn)識,只是知道點(diǎn)云point cloud顧名思義就是一些離散點(diǎn)的集合。現(xiàn)在在無人駕駛中一些激光雷達(dá)的作用其實(shí)就是生成點(diǎn)云數(shù)據(jù),接下來介紹一下點(diǎn)云數(shù)據(jù)的含義和基礎(chǔ)的使用方法。
雖然特斯拉是堅(jiān)定的純視覺自動(dòng)駕駛路線的支持者,但其實(shí)更多的無人駕駛公司同時(shí)還會(huì)使用激光雷達(dá)LiDAR。經(jīng)常見到無人駕駛的車頂會(huì)有一個(gè)旋轉(zhuǎn)的圓柱體,其實(shí)就是機(jī)械式激光雷達(dá),通過旋轉(zhuǎn)鏡面將激光反射到不同角度,得到360度的數(shù)據(jù):
雷達(dá)有很多種,激光雷達(dá)只是其實(shí)一種,它的全稱是light detection and ranging,就是使用激光進(jìn)行探測和測距。
先來講測距的原理。
因?yàn)橥瑫r(shí)有發(fā)射器和接收器,而光速是已知的,所以很明顯可以利用波束傳播的時(shí)間來得到距離。那么怎么得到傳播時(shí)間呢?一個(gè)方法就大名鼎鼎的TOF,time of fly,又叫做光束法。這種方法依靠物體的漫反射,對脈沖寬度和接收器時(shí)間分辨率要求高,所以總體效果一般。第二種方法是相位法phase difference,這是一種相對的方法:不是發(fā)射一束而是成周期地發(fā)射,所以回波會(huì)產(chǎn)生相位差,從而可以估計(jì)傳播時(shí)間。
除了基于時(shí)間段測距,還有基于幾何的測距。三角測量法triangulation principle利用了三角形相似原理。
探測是基于測距的,目的是得到物體的三維坐標(biāo)。以什么坐標(biāo)系?
得到三維坐標(biāo)及每個(gè)點(diǎn)對應(yīng)的反射強(qiáng)度就構(gòu)成了點(diǎn)云數(shù)據(jù)。接下來看一下真實(shí)的點(diǎn)云數(shù)據(jù)是什么樣子。從阿波羅項(xiàng)目頁可以下載到一些點(diǎn)云數(shù)據(jù)。這里百度提供了兩種數(shù)據(jù)格式:一種是.pcd,一種是.bin文件。.pcd是PCL庫官方指定的格式,每一個(gè).pcd文件都會(huì)有一個(gè)文件頭,就和Opencv中的Mat一樣,會(huì)有一個(gè)數(shù)據(jù)頭去描述這個(gè)點(diǎn)云圖的一些基礎(chǔ)信息:
# .PCD v0.7 - Point Cloud Data file format VERSION 0.7 #指定PCD文件版本 FIELDS x y z intensity timestamp #指定一個(gè)點(diǎn)可以有的每一個(gè)維度和字段的名字 SIZE 4 4 4 1 8 #用字節(jié)數(shù)指定每一個(gè)維度的大小 TYPE F F F U F #一個(gè)字符指定每一個(gè)維度的類型,F是浮點(diǎn) COUNT 1 1 1 1 1 #每一個(gè)維度包含的元素?cái)?shù)目,一般都是1,但是描述子可能是128 WIDTH 101045 #無序點(diǎn)云的數(shù)目或者有序點(diǎn)云一行的數(shù)目 HEIGHT 1 #無序點(diǎn)云時(shí)設(shè)置為1,有序時(shí)表示一列的數(shù)目 VIEWPOINT 0 0 0 1 0 0 0 #視點(diǎn)信息被指定為三維平移+ 四元數(shù),默認(rèn)值為0001000 POINTS 101045 #指定點(diǎn)云中點(diǎn)的總數(shù) DATA binary_compressed #指定存儲(chǔ)點(diǎn)云數(shù)據(jù)的數(shù)據(jù)類型:ASCII或者Bin,bin更快速按道理它就是一個(gè)文本,但是直接以文本打開的話除了剛才講到的文件頭,其余數(shù)據(jù)都是亂碼,python中使用utf-8和ISO-8859-1和rb都無法看到正常的點(diǎn)坐標(biāo)。所以兜兜轉(zhuǎn)轉(zhuǎn)半天,還是通過安裝第三方庫輕松解決。
import open3d as o3d print("Load a ply point cloud, print it, and render it") pcd = o3d.io.read_point_cloud("20期.pcd") print(pcd) print(o3d.np.asarray(pcd.points)) o3d.visualization.draw_geometries([pcd])可以得到坐標(biāo)及可視化結(jié)果:
[[ -8.39819813 ?-5.66665173 ?-0.9710691 ]
?[ -8.13930702 ?-5.81639719 ?-0.9073652 ]
?[-22.42602539 -21.35739517 ? 0.32076412]
?...
?[ -6.15335035 ?-5.64766216 ?-1.15699255]
?[ -6.67443991 ?-5.32205296 ?-1.74743378]
?[ -6.31309557 ?-5.57189178 ?-1.63395274]]
也可以安裝PCL,似乎需要自己編譯,暫未實(shí)現(xiàn)。
Reference:
1.https://www.zhihu.com/question/418827194/answer/1451606698
2.旋轉(zhuǎn)https://baijiahao.baidu.com/s?id=1695602953340739196&wfr=spider&for=pc
3.readhttps://www.cnblogs.com/zyber/p/9578240.html
4.格式https://blog.csdn.net/weixin_46098577/article/details/111594733
5安裝pclhttps://blog.csdn.net/McEason/article/details/105195285
總結(jié)
以上是生活随笔為你收集整理的二维与三维之间的桥梁——点云的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【每日SQL打卡】
- 下一篇: cocos2dx实现经典飞机大战