上一篇文章詳細介紹了在ElasticFusion上測試數據集的編譯過程,接下來我將介紹下如何使用Kinect 1深度相機實時構建場景三維模型。
環境:ubuntu14.04 + cuda7.5 + GTX 1070
相機:Kinect 1
1、安裝Kinect驅動
cd OpenNI2
git clone https://github.com/OpenKinect/libfreenect.git
cd libfreenect
mkdir build
cd build
cmake .. -DBUILD_OPENNI2_DRIVER=ON
make -j8
cp -L lib/OpenNI2-FreenectDriver/libFreenectDriver.so ~/OpenNI2/Bin/x64-Release/OpenNI2/Drivers
2、獲取權限
cd OpenNI2
sudo cp libfreenect/platform/linux/udev/51-kinect.rules /etc/udev/rules.d
sudo reboot 重啓
連接Kinect ,使用 lsusb 確保有以下三個輸出:
xbot camera
xbot motor
xbot audio
3、安裝成功測試
cd ~/OpenNI2/Bin/x64-Release/
./NiViewer
如果安裝成功的話,會出現Kinect相機同時獲取rgb 圖像和depth圖像的界面。
接下來,就是在~/ElasticFusion/GUI/build 下運行./ElasticFusion,如果幸運的話就可以利用kinect實時構建場景地圖了。
點擊窗口左側的save可以保存.ply文件,就是重建得到的三維地圖;直接關閉窗口,可以得到.freiburg文件,就是估計的相機軌跡。
ply文件可以通過MeshLab軟件打開,下載地址http://meshlab.sourceforge.net/,這個軟件還可以對重建後的模型進行處理,去除雜點之類的。
freiburg文件保存的是每一幀對應的時間戳;位置(x,y,z);姿態四元數(qx,qy,qz,qw),利用draw.py繪製估計軌跡
#!/usr/bin/env python
# coding=utf-8
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d
f = open("./dyson_lab.klg.klg.freiburg")
x = []
y = []
z = []
for line in f:
if line[0] == '#':
continue
data = line.split()
x.append( float(data[1] ) )
y.append( float(data[2] ) )
z.append( float(data[3] ) )
ax = plt.subplot( 111, projection='3d')
ax.plot(x,y,z)
plt.show()
python draw.py
得到軌跡
但是kinect的驅動不是很穩定,開始我用kinect相機測試成功了,但是過了幾天再運行./ElasticFusion就出現了問題。
Creating live capture... failed!
DeviceOpen using default: no devices found
卸載重新安裝驅動,嘗試了很多方法都沒有成功,後來我在github中看到可以利用Logger2來解決這個問題,通過Kinect 相機直接獲取真實場景的klg文件(就是將rgb和depth直接轉換成了klg格式),利用測試數據集的方式得到真實場景的三維地圖。
下載編譯Logger2參考了博客。
點擊record就可以開始捕獲場景信息,退出後在~/Kinect_Logs中看到保存的.klg文件;將該klg文件複製到~/ElasticFusion/GUI/build,運行./ElasticFusion -l *.klg 就可以得到重建模型和估計軌跡了。