aeroTAP 3D USBカメラ用 OpenNI2ドライバーの試作 (PCL編)

aeroTAP 3D USBカメラ用 OpenNI2ドライバーの試作 (PCL編)

OpenNI2ドライバーの試作にあたり、各種アプリケーションでのテストを行ったので、設定方法などと共に紹介します。

今回は、PCL(Windows x86環境)です。PCLの入手をインストール手順は、下記のサイトを参照してください。非常に大変です。既に準備されている場合は、そのまま使えると思います。

 

aerotap.hatenablog.com

 

 

 

実行結果

f:id:aerotap:20180824132001p:plain

 

準備するもの

1. PCL環境

サンプルコードのpcl_openni2_viewerを使います。

C:\pcl-master/build フォルダーにビルド環境を作成しました。 

2. OpenNI2ドライバーのダウンロード

http://www.aerotap.com/developer.html からOpenNI2ドライバをダウンロードします。

 

設定方法

1. OpenNi2ドライバーのコピー

OpenNI2ドライバのx64フォルダーのファイルを、PCL OpenNI2ドライバフォルダーにコピーします。

C:\pcl-master/build/bin/openNi2/drivers 

 

実行方法

1.  pcl_openni2_viewerをビルドして、実行します。

 

カラー画像と、3D画像が表示されます。

 

 

 

 

 

aeroTAP 3D USBカメラ用 OpenNI2ドライバーの試作 (RTAB-Map編)

aeroTAP 3D USBカメラ用 OpenNI2ドライバーの試作 (RTAB-Map編)

OpenNI2ドライバーの試作にあたり、各種アプリケーションでのテストを行ったので、設定方法などと共に紹介します。

今回は、RTAB-map(Windows環境)です。RTAB-Mapの入手は、下記のサイトから行えます。

introlab.github.io

 

実行結果

f:id:aerotap:20180824122453p:plain

 

準備するもの

1. RTAB-mapのダウンロード

https://github.com/introlab/rtabmap/releases からWindows x64版をダウンロードし、インストールします。

2. OpenNI2ドライバーのダウンロード

http://www.aerotap.com/developer.html からOpenNI2ドライバをダウンロードします。

 

設定方法

1. OpenNi2ドライバーのコピー

OpenNI2ドライバのx64フォルダーのファイルを、RTABMapフォルダーのOpenNI2/Drivers フォルダーにコピーします。

 

実行方法

1. RTABmap.exeを実行します。

2. デバイスを選択します。メニューから[Detection]>[Source]>[More Options...]を選択します。

f:id:aerotap:20180824125058p:plain

 

3. デバイスの詳細を設定

下の画面の内容を設定し、[Test]ボタンをクリックすると、カラー画像と、深度画像が表示されたら、設定は問題ありません。

f:id:aerotap:20180824125310p:plain

4. メイン画面に戻り、キャプチャを開始します。

メニューから[File]>[New Database]を選択し、新しいデータベースを作成します。‘

カメラを手に持って、撮影準備をします。

次に、[Start]ボタンをクリックすると開始されます。

f:id:aerotap:20180824125603p:plain

カメラをゆっくり移動したり、回転させながらマップを作成します。

f:id:aerotap:20180824125616p:plain

停止ボタンをクリックして完了です。

 

ヒント

操作方法の詳細は、https://github.com/introlab/rtabmap/wiki/Kinect-mapping 

 

カメラをあまり早く動かすと、レジストレーションが見つからない警告(赤いフラッシュ)がでます。最後の位置に戻って、慎重に取り直してください。

 

Skanect での利用

本格的な3Dスキャナーソフトウェアとして、Skanectがあります。同様にOpenNI2ドライバを登録することで使えます。無料版もあるのでトライして見てください。

ただ、現在のaeroTAP 3D USBカメラでは、精度不足で細かな凹凸は計測できません。

aeroTAP 3D USB GSなら十分なスキャン結果が得られますのでこうした利用には、GSを期待してください。

skanect.occipital.com

 

 

 

Raspberry Pi2/3で3Dセンサーを動かす(3/3)

Raspberry Pi2に3Dセンサーを接続することができたので、もう少し3Dぽく表示する方法を紹介します。 

3D 点群の表示には、ofVboMeshを使います。 

 

aerotap.hatenablog.com

 

ZDTableの入手

センサーからのDepthMapの情報 8bitを距離データ(mm)に変換するためのテーブルを予め準備します。

ExportZDTable.exeをaeroTAP3D USBカメラを接続したWindows環境で実行します。

ExportZDTable.exe /VGA

ExportZDTable.exe /QVGA

ExportZDTableは、下記サイトからダウンロードできます。

www.aerotap.com

*WVGA対応版のaeroTAP 3D USBカメラは、直接 shareEDGEまでお問い合わせください。通常版では、対応していません。

 

準備

サンプルコードをダウンロードします。

 

wget

http://www.aerotap.com/Help.SDK/sample/meshFrom3DCamera.zip

 

また、今回は、examples/3d/meshFromCamera を使います。

/home/pi/openframeworks/examples/3d/meshFromCameraを/home/pi/openframeworks/apps/myApps/meshFrom3DCameraとしてコピーします。

 

cp -r -v /home/pi/openframeworks/examples/3d/meshFromCamera /home/pi/openframeworks/apps/myApps/

 

1. ビルドできることを確認

cd /home/pi/openframeworks/apps/myApps/meshFrom3DCamera

make && make run

*3Dセンサーからのカラー画像を使って表示されていることを確認

 

2. サンプルコードで上書き

cp -v-r /home/pi/meshFrom3DCameraExample/* ./ 

 

3. ZDTableを準備

サンプルコードに含まれているものは、他のカメラのデータのため、ご利用のカメラから予めカメラから抽出したZDTableをbin/dataフォルダーに上書きコピーします。

zdTable_VGA.txt

zdTable_QVGA.txt

 

 

4. ビルドと実行

 マウスで、グリグリと3D描画を動かすことができます。24FPS程度出ています。

f:id:aerotap:20180822124319p:plain

3D PointCloud

 

youtu.be

コードの解説

threadedCam()

3Dセンサーからのデータの読み込み、ZDTableの読み込みを行っています。

 

RGBデータを取得

unsigned char *threadedCam::getImage(int cam) 

距離データを取得

 unsigned char *threadedCam::getDepth(int cam){

ここで得られる距離データは、mmに変換された値です。 

 

3D点群への変換

LocalLengthを使って、xx,yyを距離(mm)へと変換します。FocalLengthは、センサーの種類、解像度により異なります。

 

float zz = (float)pDepth[p]; float zz = (float)pDepth[p];

float xx = (float)(x - tCam.camWidth/2)*zz / nFocalLengthW;

float yy = (float)(y - tCam.camHeight/2)*zz / nFocalLengthH;

ofVec3f tmpVec(xx, yy, -zz);

*表示するために、奥行きの符号を変更しています。

点群をVBOに保存

myVbo.setVertex(pp, tmpVec);

myVbo.setVertex(pp, tmpVec);

myVbo.setColor(pp, sampleColor);

 

高速化/表示変更

#define POINT_STEP 2

の値を大きくすると、サンプリングが荒くなり、点群数が減ります。

 

#define POINTSIZE 2 

の値を大きくしると点の描画が大きくなります。

 

考察

今回、単純にカラー画像を、生の深度データをそのままVboMeshに割り当てて表示しています。単純というのは、本気で表示するには、深度データの加工が必要です。

例えば、ノイズの除去(Outlier処理)、アップサンプリング(穴埋め)、平滑化などの処理が必要です。

Raspberry piでこれらをリアルタイムで処理するには、パワー不足かもしれませんが、スケールを荒くしたり、距離フィルターを入れたりすることで点群数を少なくすることである程度実用可能な速度が出ると思いますので、挑戦してみてください。

 

 

Windows版の3Dビューアは、こちら(3D Viewer)にありますので参考にしてください。

 

www.aerotap.com

 

 

Raspberry Pi2/3で3Dセンサーを動かす(2/3)

前回で、Raspberry Pi2でopenframeworksを実行できる環境を作成しました。

3Dセンサー( aeroTAP 3D USBカメラ)を接続して、サンプルプログラムを実行してみます。

 

aerotap.hatenablog.com

 

 

準備

aeroTAP 3D USBカメラ (Amazonで購入)

f:id:aerotap:20180822000227p:plain 詳細スペックは、こちら

 

サンプルコードのダウンロード

Linux サンプル ( Openframeworks)

 

http://www.aerotap.com/developer.html

cd ~

wget http://www.aerotap.com/Help.SDK/sample/videoGrabberExample.zip

unzip videoGrabberExample.zip

 

3Dセンサーらのデータ取得

 Linux環境では、aeroTAP 3D USBカメラは、UVC1.1カメラとして、/dev/video0と/dev/video1 として2つのでデバイスとして表れます。

video0には、カラー画像、video1から深度画像を得ることができます。

 

追記:

最近、改めて環境を作成するとOS上には、/dev/video0 /dev/video1 /dev/video2 /dev/video3 と見えるようなりました。

この場合には、video0は、カラー画像、video2が深度画像になるため、ソースコードの変更が必要になります。

/aeroTAP/aeroTAPLinuxCamera.cpp を開き

            m_hCamera2 = new ofxUvcCamera("/dev/video1", depthWidth, depthHeight);

行を

            m_hCamera2 = new ofxUvcCamera("/dev/video2", depthWidth, depthHeight);

*video1 をvideo2に変更

 

 

サンプルビルド手順

openframeworksのサンプルコードを利用します。

1.VideoGrabberSampleを使います

cd /home/pi/openframeworks/examples/video/videoGrabberSample

2. ビルドできることを確認

make && make run

*ESCキーで終了

3. ダウンロードしたサンプルを上書き

cd src

mkdir aeroTAP

cp -r -v /home/pi/videoGrabberExample/src/ ./

4. ビルドと実行

make 

make run 

aeroTAP3D USBカメラからのカラー画像と、深度画像が表示されていることが確認できます。FPSもそこそこ十分出ています。

 

f:id:aerotap:20180822124326p:plain

 

コード解説

aeroTAPLinux3DCamera( Color Width, Color Height, Depth Map width,Depth Map Height);

*重要: DepthMap widthの値は、Color Widthの半分を指定します。つまり、QVGA (320x240)カラー画像の場合は、160x240を指定します。得られるDepthMapのサイズは、カラー画像と同じ、320x240になります。

 

  aeroCam = new aeroTAPLinux3DCamera(camWidth,camHeight,camWidth/2,camHeight);

 

Yuv2RGB変換

得られたカラー画像をRGBに変換します。

unsigned char *pTrg= colorImg.getPixels().getData();
YUY2_to_RGB24(pColor, pTrg, camWidth, camHeight);

 

深度画像

深度画像(Disparity)は、8Bitデータです。実際の距離(mm)に変換するには、ZDTableを利用しますが、ここでは、そのまま表示しています。

ZDTableについては、次回を参照してください。

 

unsigned char *pDepth = aeroCam->getFrame(typeD);
depthMap.setFromPixels(pDepth,camWidth,camHeight,OF_IMAGE_GRAYSCALE);

 

 

次回は、ofVboMeshを使って3D 点群表示してみます。

 

 

aerotap.hatenablog.com

 

 

 

 

Raspberry Pi2/3で3Dセンサーを動かす(1/3)

Raspberry Pi2でUSBカメラの性能を見ていたら、そこそこの性能が出ていたので驚きました。

少し集中して勉強しましたので、誰かのお役に立てばと思い、手順を残します。

ここでの手順は、Ubuntu + openFrameworks でも同じように動作します。

ゴール

Raspberry Pi2にaeroTAP 3D USBカメラ( 3Dセンサー)を接続して、リアルタイムで3D描画(VboMesh)します。

 

準備

Raspberry Pi2の環境を作成します。Raspberry Pi3も同様、Raspberry Pi3は電源を入れたままにしていると、時々Low Batteryの警告が出ているのでRaspberru Pi2をメインすることにしました。

描画には、openframeworksを使います。ただ、バージョンは、v0.10.0です。v0.9.8は、Raspberry Pi環境では pocoライブラリのバージョン違いのためかビルドできませんでした。悪戦苦闘している中、v0.10.0を試すと、あっさりできたのでv0.10.0がお勧めです。

 

MicroSDカードは、16GB以上を推奨。8GBでは、作成したアプリのビルドでフルになってしまいました。

Raspberry Pi2起動イメージの作成 ( Windows 環境から)

Raspberry Pi2のイメージは、2018-06-27-raspbian-stretchを使います。

下記サイトを参照しながら、起動用SDカードを作成します。
https://openframeworks.cc/ja/setup/raspberrypi/raspberry-pi-getting-started/

RPi Easy SD Card Setup - eLinux.org

1. Formatterをダウンロードし、SDカードをフォーマット

https://www.sdcard.org/downloads/formatter_4/eula_windows/

2. イメージライター(ImageWriter)でSDカード書き込み

https://www.sdcard.org/downloads/formatter_4/eula_windows/

ダウンロードした、Raspberry pi2イメージを選択して、書き込みます。

3. カードをRaspberry Pi2に差して、起動!

 

Raspberry Pi2初期設定

1. 起動後、guiでパスワード設定、ロケール情報、WiFi設定を行う。(アップデートはここではスキップ)。

2. 再起動

3. guiが起動したら、ターミナルを開く

4. sudo raspi-config とタイプして、各種基本設定を行う。

メニューから 5 Interfacing Options > P2 SSH

メニューから 7 Advanced Options >A1 Expand Filesystem 

メニューから7 Advanced Options >A3 Memory Split > 64 >  <ok>

  • コンソールの起動

メニューから 3 Boot Options >B1 Console

5. Escで終了して、ターミル画面に戻る

6. rootのパスワードを設定

root password
sudo passwd root

7. OSのアップデート

sudo apt-get clean

sudo apt-get updates

udo apt-get upgrade

8. 再起動

sudo reboot

openframeworksの準備 ( WindowsからSSHで接続して )

後の作業は、Puttyなどから、SSHで接続して作業すると楽です。

1. openframeworks v0.10.0  aemv6 のダウンロードと初期設定

wget https://openframeworks.cc/versions/v0.10.0/of_v0.10.0_linuxarmv6l_release.tar.gz --no-check-certificate
mkdir openFrameworks
tar vxfz of_v0.10.0_linuxarmv6l_release.tar.gz -C openFrameworks --strip-components 1

cd openframeworks/scripts/linux/debian
sudo ./install_dependencies.sh
sudo ./install_codec.sh

make Release -C /home/pi/openframeworks/libs/openFrameworksCompiled/project

*すべてエラーがなく終了することを確認


2 環境確認

cd /home/pi/openFrameworks/examples/graphics/polygonExample
make
make run

*サンプルプログラムが実行できることを確認

3. サンプルプログラムのビルド

cd /home/pi/openframeworks/scripts/linux

./buildAllRPIExamples.sh

 

 

aerotap.hatenablog.com

 

 

 

aeroTAP 3D USBをPCLで使う (1) PCL環境作成

aeroTAP 3D USBカメラをPCLで使うために、PCL1.8.0 32bit環境を作成する手順についてのメモです。

ネットに様々な例があったが、最新版の構築に関する文献がなかったのでメモしておきます。

 

環境

Windows 10 Home 64Bit ( 2016update)

GForce GT 730 ( cuda用に必要)

 

事前準備

Visuak Studio 2015 Update3のインストール

MSSDK (for Windows 10)インストール

CMAKE 3.7.1インストール

cuda_8.0.61_win10.exe インストール
Opencv 2.4.9 (Cmakeでビルド)

WindowsMPI SDK 7.1.12437.25 インストール

Kinect SDK KinectSDK-v2.0_1409-Setupをインストール ( Kinfuをビルドするため)

OpenNI2 インストール

 

参考文献

https://gist.github.com/UnaNancyOwen/59319050d53c137ca8f3#file-pcl1-8-0-md

Boost 1.63.0

参考文献通りに、Boost 1.63.0 をビルドとインストールwith Visual Studio

*文献になないが、mpi.jamの編集が必要( mpiのパス)

eigen-3280

インストールのみ

flann-1.8.4-src

ビルドとインストール

qhull-2015.2

ビルドとインストール

VTK-7.0.0

ビルドとインストール

 * 文献にある通り、VTK_RENDERING_BACKGROUND OpenGL2->OpenGLの設定変更が必要

OpenCV ビルド (2.4.9を選択)

PCLのビルド前に

PCLのビルドを行う前に、環境変数の設定(文献参照)を確認し、PCを再起動します。

 

 

 WITHに下記をチェック

-- WITH_CUDA 
-- WITH_OPENGL
-- WITH_OPENNI2
-- WITH_PNG
-- WITH_QHULL
-- WITH_VTK

 BUILDに下記をチェック

 

f:id:aerotap:20170219212116p:plain

PCLビルドとインストール

文献通りビルドとインストール( VCを管理者権限で実行すること)

 

完成までに遭遇した問題

実際環境作成には、相当時間がかかりました。問題の一つは、Visual Studioバージョン選択。

VC 2010, 2012,2015と試したが、結局2015で成功。ただし、VC1025で環境作成する前に、VC2010,2012など全てをアンインストールする必要があった。

バージョンの違うVCでコンパイルされたlibが影響して、最終的に、PCLのビルドでLinkエラーが発生する。

 

kinfuビルドは、結局kinfu_appのプロジェクトは生成されなかったので、toolsフォルダのものを元にkinfu_appをビルドした。

 

 

 

 

コンシューマ用として必要な機能 メモ(1)

BtoBでの展開を始めていますが、BtoCも視野に、タッチレスの楽しく使えることができないかな?

こんな機能を追加しようか:

- BTデバイス機能で、スマホやミュージックプレイヤーを操作

- 指先操作の性能を上げないと...