Nov11’s diary(自宅での開発環境作り )

3Dプリンタと切削加工機で工作した事をアップして行きます

自作したロボットアームを制御する(仮想現実での制御)(その3)カメラを取り付ける

エド(仮想現実)の手にカメラを取り付けて、エドの主観で仮想空間を見れる様にしてみた
また、エドの指先の空間座標を表示できる様にもして見た
実は、今回の苦労してVR(仮想現実)を作成した目的は、この2つを行いたかったからだ

複数の関節を動かした際に、ロボットアームの指先が、基準点(台座の中心点)から、どれくらいの距離なのかを算出したかったのと、仮想現実で表示内容とWebカメラで撮影した映像をOpenCVで画像処理した物を比較する事によりエドの動作状況をフィードバックさせる事が出来るようにする為だった
また、エドの主観視が出来たことで、抽象的な表現(上下左右など)をエドが認識できる

つまりは、「エドから見て、右上の赤いボールを、左の台に移動させて」が通じる様になるのだ
(右は、第一象限、左は第二象限、上は高さと言う感じです)

後は、音声認識ソフトを使用して、音声によりエドに指示が出せると言う、SF映画などでよく見る光景を作り出す事が出来そうです!
今回のプログラムは、OpenGLとEigenを使用しているので、スマートフォンにも移植しやすいので、スマートフォン音声認識機能を使用すれば、スマートフォン+インカムで、やり取りさせる事が出来る
おぉ~!、まさにSF映画だぁ~!!

[ロボットアームの画面]

f:id:Nov11:20160907110323j:plain
        (アームの先端にカメラと画面右上に空間座標が表示されてます)

[ロボットアームのカメラ動作確認用マーカ]

f:id:Nov11:20160907110354j:plain
        (テーブル上にアルファベットと高さ確認用のマーカを表示しています)

[ロボットアームのカメラに切り替え]

f:id:Nov11:20160907110434j:plain
        (テーブル上のアルファベットと高さ確認用のマーカが表示されています)

んで、エドの主観視した動画を撮ってみました(右上の数値が指先座標です/単位はミリ)

ロボットアームにカメラを取り付け仮想空間を撮影してみた

youtu.b(カクカク動いてますが、操作に慣れていない為です)

この動画でテーブル全面を収める事が出来たので、カメラの取り付け位置は問題ないようです

後は、目的解釈部分と画像認識、音声認識を作成すればVR(仮想現実)シミュレーション完成となる
ここまでで1ヶ月以上掛かった事を考えると、先は長そうだけど、体壊さないように頑張らねばです

今回の主観視を作成していて気付いたのだが、ここまでのプログラムでドックファイトやカーチェイスなどのゲームが作成できるのだ!
体は、少し不自由になったけど、VR(仮想現実)ならそんな制約は無いので、色々と妄想してみよう

最後に、VisualStudioC++とOpenGLの制御手順をまとめてみました

[OpenGLの制御手順]

1)OpenGLのダウンロードする
  ここは、「OpenGL ダウンロード」でググると出てくるので、
  サイトの記述に従いダウンロードする
  Windowsで、「OpenGL32.lib」を使用する場合には、1~3は不要で、
  インクルードを以下のように記述する
  ----------------------------------------------
  #include <windows.h>
  #include <GL/glu.h>
  #include "OpenGL.h"

  #pragma comment (lib, "OpenGL32.lib")
  #pragma comment (lib, "GLU32.lib")
  #pragma comment (lib, "user32.lib")
  #pragma comment(lib, "gdi32.lib")
  ----------------------------------------------

2)Windowsフォームアプリケーションを作成する
  VisualStudioの新しいプロジェクトで、VisualStudio C++
  Windowsフォームアプリケーションを作成する
  VisualStudioは、2010以前を使用すると作成し易くなる

3)OpenGLを配置する
  ヘッダー、ライブラリー、DLLファイルを新規作成した
  フォルダーに配置する

4)OpenGLの設定を行う
  Form1.hのコンストラクタで、描画するコントロール
  デバイスコンテキストを取得し、OpenGLの初期設定を行う
  wglDeleteContext,ReleaseDCなどを設定する

5)Cadデータを読込む
  DesignSpark mechanicalで、OBJファイルを出力しておく
  OBJファイル構成は、ネットに沢山あるので、そちらを参照する

6)カメラ設定を行う
   a)視野を設定
    glMatrixMode( GL_PROJECTION );←ここが無いと変更出来ない
    glLoadIdentity();
    gluPerspective();←引数は、Eigenを使用して求める
   b)カメラの位置、姿勢の設定
    glMatrixMode( GL_MODELVIEW );←ここが無いと変更出来ない
    glLoadIdentity();
    gluLookAt();←引数は、Eigenを使用して求める
   c)バッファのクリア
    glClear();←引数は、ググると出てくる
   d)ライトの設定
    glEnable();←引数は、ググると出てくる
    glLightfv();←引数は、ググると出てくる

7)パーツ表示を行う
  パーツ単位をglPushMatrixとglPopMatrixで挟み込み以下を繰り返す
   a)パーツの移動位置と回転をglTranslatedとglRotatefで指定する
   b)パーツのマテリアルをglMaterialfvで指定する
   c)パーツを構成するポリゴンをglVertex3fvで指定する
    各パーツは、glBeginとglEndで挟み込む
8)全て設定した後に、SwapBuffersを行う

なお、ブログの内容を参照して実行した結果に責任は負いかねますので、ご了承下さい