在blensor中仿真TOF激光雷达扫描得到PCD数据

  • 初识blensor
  • 导入模型
  • 场景基本设置
  • 仿真扫描获得PCD


初识blensor

我在刚开始时参考了点云仿真软件Blensor介绍,对我帮助很大,我也是基于此做的延伸。

值得注意的是,blensor、blendor、blender图标一致,看似是一个软件,然而blender是做动画仿真的(我没找到lidar在哪,欢迎评论补充),B站也有详细教程。blensor才是做激光雷达仿真的,官网是https://www.blensor.org/而不是blender.org,虽然blensor下载下来也叫blender.exe。

导入模型

点击 file-import 可以选择合适的模型格式导入,记得每次做完要保存文件,文件格式是blend(整个场景文件),这软件不会自动保存也不会提醒你保存。

java 雷达扫描图效果 雷达扫描建模app_数据

场景基本设置

点击 view-properties可以显示右边的transform栏目,或者点击右下方窗口的黄色立方体图标,也可以看到transform,在这里可以设置物体的位姿,选择物体设置为我们想要的位姿

java 雷达扫描图效果 雷达扫描建模app_java 雷达扫描图效果_02

选择相机camera,点击录像机图标唤起相机设置界面,在这可以设置激光雷达的一些参数,雷达的位姿设置同上。

java 雷达扫描图效果 雷达扫描建模app_激光雷达_03

仿真扫描获得PCD

我也没弄懂软件自带的保存PCD应该怎么操作,保存下来无论数据还是格式都有问题,这里我们选择用python写一个采集数据代码。

点击左下角立方体图标选择text editor,在里面复制进我们的采集代码

:软件所有的操作都可以通过代码实现,也可以选择鼠标点击实现

java 雷达扫描图效果 雷达扫描建模app_点云_04


java 雷达扫描图效果 雷达扫描建模app_激光雷达_05

import bpy
import math
from numpy import arange
from bpy import data as D
from bpy import context as C
from mathutils import *
from math import *
import blensor

"""clear the scanning in view windows and start newly scan"""
bpy.ops.blensor.delete_scans(); #这里有点问题后面细讲
bpy.ops.blensor.scan();

f=open("D:/data.txt","w") #文件位置自行修改
i = 0; #存储点云数目
for item in bpy.data.objects:
    if item.type == 'MESH' and item.name.startswith('Scan'):
        print('write once')
        for sp in item.data.vertices:
            #print('X=%+#5.3f\tY=%+#5.3f\tZ=%+#5.3f' % (sp.co[0], sp.co[1],sp.co[2]));
            str='%#5.3f\t%#5.3f\t%#5.3f \n' % (sp.co[0], sp.co[1],sp.co[2]);
            i = i+1;
            f.write(str);  
f.close()          
f=open("D:/data.txt","r+") #文件位置自行修改
new_data = ("# .PCD v0.7 - Point Cloud Data file format\nVERSION 0.7\nFIELDS x y z\nSIZE 4 4 4\nTYPE F F F\nCOUNT 1 1 1\nWIDTH %d\nHEIGHT 1\nVIEWPOINT 0 0 0 1 0 0 0\nPOINTS %d\nDATA ascii\n" %(i,i))
old = f.read()
f.seek(0)
f.write(new_data)
f.write(old )

先别运行脚本

值得注意的是,代码里的delete操作并不会删除data里面的scan文件,只会删除scene里面的scan,导致如果不提前删除之前扫描的scan的话,pcd里面的点云数据会被重复写入好几次。

查看这种情况是点开window-toggle system console,这里是python脚本的命令行,如果只输出了一次write once就是正常的,有几次write once就是重复写了几次点,pcd文件会有问题。

java 雷达扫描图效果 雷达扫描建模app_数据_06

所以在每次运行脚本之前,右侧选择blender file ,把object里面的scan全部删干净,之后就可以在代码界面右键选择run script,或者下面也有run script按键,之后文件会被保存在对应路径(这里是D:data.txt),我们把后缀直接改成pcd就可以了。

java 雷达扫描图效果 雷达扫描建模app_点云_07


java 雷达扫描图效果 雷达扫描建模app_激光雷达_08

java 雷达扫描图效果 雷达扫描建模app_点云_09


本文只是我所做的一个记录,希望可以起到抛砖引玉的作用,如果需要写txt或者csv或者重复扫描,思路也类似,欢迎讨论