国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python: 用open3D庫,連續(xù)多幀顯示點(diǎn)云(查看localization pose的好壞)

這篇具有很好參考價值的文章主要介紹了Python: 用open3D庫,連續(xù)多幀顯示點(diǎn)云(查看localization pose的好壞)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

  • 連續(xù)多幀顯示點(diǎn)云,需要 點(diǎn)云文件 和 定位信息(IMU慣導(dǎo)信息),我這里是從bag包里面自己解析出來的定位信息,因?yàn)槭亲约簩懙墓?jié)點(diǎn),所以直接從代碼里面跑出來的,不是ros官方定義的,所以沒有用官方給出的方法
  • 總體思路:將每一幀點(diǎn)云和旋轉(zhuǎn)矩陣進(jìn)行 時間對齊 -----> 再進(jìn)行空間對齊 ------> 統(tǒng)一對齊到一幀坐標(biāo)系下可視化
    • 時間對齊:就是說我們哪一個時間下錄制的pcd要和對應(yīng)時間下旋轉(zhuǎn)矩陣相乘(我這里沒有用嚴(yán)格的時間插值,用的只是他們的差值小于0.01,我就認(rèn)為是匹配的)
    • 空間對齊:1.看看靜態(tài)物體(比如桿子)有沒有對齊? ? 2.看看地面有沒有變厚
    • 每一幀pcd都是在自車坐標(biāo)系下錄制的所以要轉(zhuǎn)到世界坐標(biāo)系下,然后再轉(zhuǎn)到某一幀的自車坐標(biāo)系下,就可以看到物體在移動的拖影,但是靜止的非物體不會移動
    • Python: 用open3D庫,連續(xù)多幀顯示點(diǎn)云(查看localization pose的好壞)

  • 時間對齊

    • 命令可見? ?rosbag解析
    • 用ros給出的命令直接解析bag包里面的點(diǎn)云數(shù)據(jù),它是以時間戳命名的(unix時間戳),小數(shù)點(diǎn)后面有9位
    • Python: 用open3D庫,連續(xù)多幀顯示點(diǎn)云(查看localization pose的好壞)

    • 而我解析定位信息得到的如下圖所示,第一列也是時間戳,小數(shù)點(diǎn)后面只有6位,后面的16列就是 自車轉(zhuǎn)世界坐標(biāo)系 的4×4的矩陣
    • Python: 用open3D庫,連續(xù)多幀顯示點(diǎn)云(查看localization pose的好壞)

    • 將兩個時間做差小于0.01秒的,就認(rèn)為匹配
    • 首先先將pcd的時間戳切出來
    • Python: 用open3D庫,連續(xù)多幀顯示點(diǎn)云(查看localization pose的好壞)
    • 再把定位信息的時間戳切出來
      • Python: 用open3D庫,連續(xù)多幀顯示點(diǎn)云(查看localization pose的好壞)?
    • 進(jìn)行差值判斷并轉(zhuǎn)到世界坐標(biāo)系下

      Python: 用open3D庫,連續(xù)多幀顯示點(diǎn)云(查看localization pose的好壞)

    ?

    • 在轉(zhuǎn)到某一幀的坐標(biāo)系下

      Python: 用open3D庫,連續(xù)多幀顯示點(diǎn)云(查看localization pose的好壞)

    • 20幀在統(tǒng)一坐標(biāo)系下進(jìn)行可視化

      Python: 用open3D庫,連續(xù)多幀顯示點(diǎn)云(查看localization pose的好壞)文章來源地址http://www.zghlxwxcb.cn/news/detail-410505.html

  • 總代碼:

  • import os
    from os import listdir
    import open3d as o3d
    import numpy as np
    
    #獲取pcd的名字
    p=[]
    def get_name_dict():
        name_dict = "./out_pcd"
        pcd_time = []
    
        for i,j,k in os.walk(name_dict):
            pcd_time = k
        for t in pcd_time:
            p.append(t.split(".pcd")[0])
    
        # pcds = listdir("./out_pcd")
        # pcd_name = []
        # for j,l in enumerate(pcds):
        #     pcd_path = os.path.join("./out_pcd",l)
        #     pcd_name.append(l)
        #     # print(l)
    
        return p
    #獲取txt文件的每一行
    def get_time_txt():
        txtname = './vehicle2globle_mat.txt'
        txt_time = []
        with open(txtname,"r+",encoding="utf-8") as f:
            for line in f:
                a = line.split()
                txt_time.append(a)
        # print(txt_time[0][0],txt_time[1][0])
    
        return txt_time
    
    #pcd與旋轉(zhuǎn)矩陣相乘
    def Trans(pcd, R):
        '''
        Input:
            pcd, (N, C)
            R, (4, 4)
        '''
        pcd_trans = pcd.copy()
        pcd_hm = np.pad(pcd[:, :3], ((0, 0), (0, 1)), 'constant', constant_values=1) #(N, 4)
        pcd_hm_trans = np.dot(R, pcd_hm.T).T
        pcd_trans[:, :3] = pcd_hm_trans[:, :3]
        return pcd_trans
    
    #將每一個
    def v_to_w():
        dd = []
        R = []
        tt = get_time_txt()
        for o in p:
            # print(o)
            for i  in  range(200):
                a= '%.6f'%float(tt[i][0])
                o=float(o)
                # print("a",a)
                # print("o",o)
                if -0.01 < o-float(a)  < 0.01 :
                    #dd是個列表,存放兩個符合條件的txt時間戳,總是dd[0]小,而我也只要小的所以以下就有dd[0]使用
                    dd.append(float(a))
                    print("pcd",o)
                    print("txt",a)
    
                    if len(dd) == 2:
                        print(dd)
                        pcd_path= os.path.join("./out_pcd/",str(o)+'.pcd')
                        # print(pcd_path)
                        #循環(huán)txt中每一個元素,切出4*4矩陣
                        for r in range(len(tt)):
                            for t in range(len(tt[0])):
                                if float(tt[r][0]) == dd[0] and t > 0:
                                    #求得4*4旋轉(zhuǎn)矩陣
                                    R.append(tt[r][t])
                                    if len(R) == 16:
                                        print("R",R)
                                        R = np.array(R).reshape(4,4)
                                        print("R.shape",R)
                                        #畫圖
                                        pcd = o3d.io.read_point_cloud(pcd_path)
                                        pcd_xyz = np.asarray(pcd.points)
                                        valid_mask = ~np.isnan(pcd_xyz.sum(axis=1))
                                        pcd_xyz = pcd_xyz[valid_mask]
                                        R = R.astype(np.float32)
                                        print(R)
                                        pcd_xyz_world = Trans(pcd_xyz, R)
                                        pcd_xyz_world_point = o3d.geometry.PointCloud()
                                        pcd_xyz_world_point.points = o3d.utility.Vector3dVector(pcd_xyz_world)
                                        o = str(o)
                                        # o3d.io.write_point_cloud("./out_pcd_w/"+o+".pcd",pcd_xyz_world_point,write_ascii=True,compressed=False,print_progress=True)
                                        R = R.tolist()
                                        R = R * 0
                        dd.clear()
                else:
                    pass
    
    
    def w_to_R0():
        pcd_dict = os.listdir("./out_pcd_w")
        for i in pcd_dict:
            print(i)
            pcd = o3d.io.read_point_cloud("./out_pcd_w/"+i)
            pcd_xyz = np.asarray(pcd.points)
            valid_mask = ~np.isnan(pcd_xyz.sum(axis=1))
            pcd_xyz = pcd_xyz[valid_mask]
            R0 = np.array([[-0.815266 ,0.578755 ,0.019607 ,656827.306071 ],
                  [-0.578086 ,-0.815380 ,0.031173 ,2967527.172453],
                  [0.034029 ,0.014080 ,0.999322 ,59.210000 ],
                  [0.000000 ,0.000000,0.000000 ,1.000000]])
            R0 = np.linalg.inv(R0)
            pcd_R0 =Trans(pcd_xyz,R0)
            pcd_w_R0 = o3d.geometry.PointCloud()
            pcd_w_R0.points = o3d.utility.Vector3dVector(pcd_R0)
            o3d.io.write_point_cloud("./w_to_R0/" + i, pcd_w_R0, write_ascii=False, compressed=False,
                                     print_progress=False)
    
    def vis_RO():
        pcds = []
        pcds_p = []
        pcd_20 = o3d.geometry.PointCloud()
        files = os.listdir("./w_to_R0")
        for f in files:
            pcd_path = os.path.join("./w_to_R0/" + f)
            pcds_p.append(pcd_path)
            pcd = o3d.io.read_point_cloud(pcd_path)
            # 降采樣
            pcd_dow = pcd.voxel_down_sample(voxel_size=0.2)
            pcds.append(pcd_dow)
    
        for i in range(len(pcds_p)):
            if i == 0:
                pcd0 = o3d.io.read_point_cloud(pcds_p[0])
                o3d.io.write_point_cloud("pcd_20_20.pcd",pcd0)
            else:
                pcd1 = o3d.io.read_point_cloud("pcd_20_20.pcd")
                pcd2 = pcd1 + o3d.io.read_point_cloud(pcds_p[i])
                o3d.io.write_point_cloud("pcd_20_20.pcd",pcd2)
                o3d.visualization.draw_geometries([pcd2], window_name="拼接20個點(diǎn)云",
                                                  width=1024, height=768,
                                                  left=50, top=50,
                                                  mesh_show_back_face=False)
    
    
    
    
    
        # # ---------------將兩個點(diǎn)云進(jìn)行拼接------------------
        # pcd0 = o3d.io.read_point_cloud(pcds_p[0])
        # pcd1 = o3d.io.read_point_cloud(pcds_p[1])
        # pcd_combined = o3d.geometry.PointCloud()
        # pcd_20 = pcd0 + pcd1
        # # 保存點(diǎn)云
        # o3d.io.write_point_cloud("pcd_20.pcd", pcd_combined)
        # for i in range(2, 16):
        #     print(i)
        #
        #     pcd_2 = o3d.io.read_point_cloud("pcd_20.pcd")
        #     pcd1 = o3d.io.read_point_cloud(pcds_p[i])
        #
        #     pcd_combined = pcd_2 + pcd1
        #     o3d.io.write_point_cloud("pcd_20.pcd", pcd_combined)
        # o3d.visualization.draw_geometries([pcd_combined], window_name="拼接20個點(diǎn)云",
        #                                   width=1024, height=768,
        #                                   left=50, top=50,
        #                                   mesh_show_back_face=False)
    
    
    
        # o3d.visualization.draw_geometries(pcd_20,
        #                                   window_name="點(diǎn)云旋轉(zhuǎn)",
        #                                   point_show_normal=False,
        #                                   width=800,  # 窗口寬度
        #                                   height=600)
    
    
    
    
    if __name__ == '__main__':
        # print(get_time_txt())
        # get_time_txt()
        # get_name_dict()
        # v_to_w()
        # w_to_R0()
        vis_RO()
    

到了這里,關(guān)于Python: 用open3D庫,連續(xù)多幀顯示點(diǎn)云(查看localization pose的好壞)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Open3D完全指南:點(diǎn)云讀取、保存與顯示

    Open3D完全指南:點(diǎn)云讀取、保存與顯示 Open3D是一款強(qiáng)大的開源庫,旨在促進(jìn)3D計算機(jī)視覺和深度學(xué)習(xí)技術(shù)在研究和開發(fā)中的應(yīng)用。在本文中,我們將專注于如何使用Open3D庫來讀取、保存和顯示點(diǎn)云數(shù)據(jù)。 首先,讓我們看看如何從文件中讀取點(diǎn)云數(shù)據(jù)。Open3D支持多種文件格式,

    2024年02月05日
    瀏覽(24)
  • 第二章 python-pcl、open3d讀取、顯示pcd、bin等格式點(diǎn)云數(shù)據(jù)

    第二章 python-pcl、open3d讀取、顯示pcd、bin等格式點(diǎn)云數(shù)據(jù)

    點(diǎn)云數(shù)據(jù)實(shí)際上就是許多組點(diǎn)的集合,每個點(diǎn)由{x,y,z}組成。當(dāng)然理論上的只包含有3D坐標(biāo)。 實(shí)際激光雷達(dá)獲取的點(diǎn)云數(shù)據(jù)還會包含強(qiáng)度、反射率等等。但我們一般只用提取{x,y,z}來處理即可。 點(diǎn)云數(shù)據(jù)相比于其他傳感器數(shù)據(jù)的核心優(yōu)勢就是在于 精準(zhǔn)的深度信息。可惜獲取具體

    2024年01月16日
    瀏覽(26)
  • Open3D點(diǎn)云數(shù)據(jù)處理(一):VSCode配置python,并安裝open3d教程

    Open3D點(diǎn)云數(shù)據(jù)處理(一):VSCode配置python,并安裝open3d教程

    專欄地址:https://blog.csdn.net/weixin_46098577/category_11392993.html 在很久很久以前,我寫過這么一篇博客,講的是open3d點(diǎn)云處理的基本方法。?? 當(dāng)時是 PyCharm + Anaconda + python3.8 + open3d 0.13 已經(jīng)是2023年了,現(xiàn)在有了全新版本。目前python由當(dāng)年的3.8更新到了3.11版本,open3d也從0.13來到了

    2024年02月07日
    瀏覽(37)
  • Open3D 點(diǎn)云裁剪(Python版本)

    基于用戶給定的多邊形區(qū)域,來提取區(qū)域內(nèi)所有的點(diǎn)云數(shù)據(jù),這個多邊形Open3D會通過一個json文件來進(jìn)行指定。 CropPointCloud.py

    2024年02月13日
    瀏覽(45)
  • 在PyQt5窗口中嵌入open3d窗口顯示點(diǎn)云圖形

    在PyQt5窗口中嵌入open3d窗口顯示點(diǎn)云圖形

    ?本文方法來自:PYQT5內(nèi)嵌外部exe程序(win7)_pyqt5嵌入外部窗口_這杯可樂有點(diǎn)甜的博客-CSDN博客 open3d在繪制點(diǎn)云等圖形時,通常需要創(chuàng)建一個窗口。本文實(shí)現(xiàn)了將open3d創(chuàng)建的窗口顯示在Qt窗口內(nèi),以便于后續(xù)通過Qt控件和槽函數(shù)調(diào)用open3d強(qiáng)大的繪圖和處理功能。 運(yùn)行結(jié)果如下

    2024年02月06日
    瀏覽(161)
  • Open3D 點(diǎn)云顏色渲染(Python版本)

    Open3D主要有兩種方式來進(jìn)行點(diǎn)云的顏色渲染,一種是使用PaintUniformColor函數(shù)為點(diǎn)云賦單色,第二種則是通過對點(diǎn)云對象的colors數(shù)組進(jìn)行操作來實(shí)現(xiàn),這種方式更為靈活。這里也簡單實(shí)現(xiàn)一下單色渲染以及隨機(jī)賦色。 PainPointCloud.py

    2024年02月11日
    瀏覽(26)
  • 『OPEN3D』1.1 點(diǎn)云處理 python篇

    『OPEN3D』1.1 點(diǎn)云處理 python篇

    目錄 1.open3d中的點(diǎn)云IO 2.點(diǎn)云的可視化 3 點(diǎn)云voxel下采樣 4. 頂點(diǎn)法線估計 5.最小外界矩 6. 凸包計算 7. 點(diǎn)云距離計算 8. DBSCAN clustering聚類 9. RANSAC(Random Sample Consensus)? 10. 點(diǎn)云平面分割 11. 隱藏點(diǎn)移除 12.outliers移除 13 最遠(yuǎn)點(diǎn)采樣(Farthest Point Sample) 專欄地址:https://blog.csdn.net/

    2024年02月02日
    瀏覽(55)
  • Open3D 點(diǎn)云數(shù)據(jù)轉(zhuǎn)深度圖像(一,python版本)

    由于對深度圖像也是感覺比較好奇,所以就簡單的使用正投影的方式來生成一個深度圖像來看一下效果,深度值這里采用了z值的差值(高差),具體的代碼與效果如下所示。 這里是將點(diǎn)云投影到xoy平面上,使用高差作為深度值。

    2024年02月15日
    瀏覽(22)
  • 三維點(diǎn)云擬合圓形(附open3d python 代碼)

    三維點(diǎn)云擬合圓形(附open3d python 代碼)

    圓擬合方法可分為以下步驟: 使用? SVD(奇異值分解) 找到平均中心點(diǎn)集的最佳擬合平面。 將均值中心點(diǎn)投影到新的 2D 坐標(biāo)中的擬合平面上。 使用 最小二乘法 擬合 2D 坐標(biāo)中的圓并得到圓心和半徑。 將圓中心變換回 3D 坐標(biāo)?,F(xiàn)在,擬合圓由其中心、半徑和法線向量指定。

    2024年02月06日
    瀏覽(28)
  • Open3D 點(diǎn)云數(shù)據(jù)轉(zhuǎn)深度圖像(二,Python版本)

    Open3D 點(diǎn)云數(shù)據(jù)轉(zhuǎn)深度圖像(二,Python版本)

    之前使用過PCL中的生成深度圖像功能,就想著使用MATLAB也實(shí)現(xiàn)一下類似的功能,整個過程是一個旋轉(zhuǎn)水平和豎直角度的采樣過程,如下圖所示(具體內(nèi)容也可以參考深度圖像轉(zhuǎn)點(diǎn)云數(shù)據(jù)(激光雷達(dá)數(shù)據(jù))),最終的結(jié)果可以通過行號和列號就可以確定俯仰角patch和偏航角yaw的

    2024年02月12日
    瀏覽(36)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包