在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(整个场景文件),这软件不会自动保存也不会提醒你保存。
场景基本设置
点击 view-properties可以显示右边的transform栏目,或者点击右下方窗口的黄色立方体图标,也可以看到transform,在这里可以设置物体的位姿,选择物体设置为我们想要的位姿
选择相机camera,点击录像机图标唤起相机设置界面,在这可以设置激光雷达的一些参数,雷达的位姿设置同上。
仿真扫描获得PCD
我也没弄懂软件自带的保存PCD应该怎么操作,保存下来无论数据还是格式都有问题,这里我们选择用python写一个采集数据代码。
点击左下角立方体图标选择text editor,在里面复制进我们的采集代码
注:软件所有的操作都可以通过代码实现,也可以选择鼠标点击实现
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文件会有问题。
所以在每次运行脚本之前,右侧选择blender file ,把object里面的scan全部删干净,之后就可以在代码界面右键选择run script,或者下面也有run script按键,之后文件会被保存在对应路径(这里是D:data.txt),我们把后缀直接改成pcd就可以了。
本文只是我所做的一个记录,希望可以起到抛砖引玉的作用,如果需要写txt或者csv或者重复扫描,思路也类似,欢迎讨论