論文でちょいちょい見かけて気になったので,ダウンロードかつ少し使いやすく加工した.
heliosのほうがより疑似計測の精度は高そうだが,こちらは対象物を見ながら計測でき,かつやり直しがききやすいことが利点.
Blensorのダウンロード
https://www.blensor.org/pages/downloads.html からBlensor 1.0.18 RC 10 Windowsをダウンロードする.
Blensor-1.0.18-Blender-2.79-Winx64.zipがダウンロードされるので解凍する.

“Blensor-1.0.18-Blender-2.79-Winx64”フォルダを開き,” blender.exe”をダブルクリックしたら,Blensorが立ち上がる.

操作方法
Blensor(厳密にはBlender)の画面は以下のようになっている.
計測オブジェクトはメッシュであれば基本的に問題ない.他ソフトウェアで作成したものでもメッシュとしてインポートできるものなら使える.
レーザースキャナを右クリックして,選択(オレンジ色になる)する.すると,右下にレーザー計測のメニューが出る.

Scanner typeを”TOF Camera”にする.
“Add scan”にチェックする.
“Single scan”をクリックしたら,レーザースキャナ位置からの点群が取得できる.
レーザースキャナの位置や向きを移動させれば,計測位置や向きも変えられる.
複数の点群データを統合したい際は,右上のリスト上でShift+左クリックをして複数選択してからCtrl+Jで統合される.

Pythonスクリプトを用いた拡張
上記のデフォルト機能が少し痒い所に手が届かないものなので,Pythonスクリプトで補強した.
点群データをxyzファイルで出力
以下のexport_xyz.pyを任意の場所に保存する.
export_xyz.py
import bpy
TextFilePath = "出力先.xyz"
fout = open(TextFilePath,'w')
i = 1
for v in bpy.context.object.data.vertices :
X = str( v.co.x )
Y = str( v.co.y )
Z = str( v.co.z )
fout.writelines(X + ',' + Y + ',' + Z + '\n')
i += 1
fout.close()
print('Finished : ' + str(i-1) + 'verts')
Blensorを開き,保存する点群を右クリックで選択する.
上記のスクリプトは現在選択中のオブジェクトの頂点を取得しているので,必ず選択処理をスクリプト実行前に行うこと.
左下の時計のアイコンをクリックし,”Text editor”をクリックする.

すると,下の画面が以下に変わる.”Open”をクリックして,”export_xyz.py”を開く.

“Run Script”をクリックしたら,保存先のxyzファイルに点群の座標値が入力される.

疑似的な据え置きレーザースキャナ
1回の計測では1ヶ所+1方向しか測れず非効率的なので,回転角を段階的に変えながら計測を繰り返し,最後に計測点群データを統合する処理を追加した.
以下のfixedscan.pyを任意の場所に保存する.rot_xとrot_zは回転の間隔数なので,必要に応じて修正して良い.
fixedscan.py
import bpy
import math
camera = bpy.data.objects['Camera']
rot_x = 18
rot_z = 18
for i in range(rot_z):
camera.rotation_euler[2] = camera.rotation_euler[2] + (360/rot_z) / 180 * math.pi
camera.rotation_euler[0] = 45 / 180 * math.pi
for j in range(rot_x):
camera.rotation_euler[0] = camera.rotation_euler[0] + (270/rot_x) / 180 * math.pi
bpy.ops.blensor.scan()
camera.rotation_euler[0] = 45 / 180 * math.pi
camera.rotation_euler[2] = 0
camera.select = False
for ob in bpy.context.scene.objects:
if 'Scan' in ob.name:
bpy.context.scene.objects.active = ob
ob.select = True
print(ob.name)
bpy.ops.object.join()
bpy.context.scene.objects.active = camera
Blensorを開く.レーザースキャナのオブジェクトは初期設定で”Camera”という名前になっていて,その名前をもとにオブジェクト取得を行っているのでこの名前は変えないこと.
左下の時計のアイコンをクリックし,”Text editor”をクリックする.

すると,下の画面が以下に変わる.”Open”をクリックして,”fixedscan.py”を開く.

“Run Script”をクリックしたら,全方位を計測した点群データが生成されている.どうしても1スキャン分だけはスクリプトで統合できず,手動で統合する.
