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

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

自作したロボットアームを制御する(日本語指示)(その1)音声認識&音声合成機能

仮想現実(VR)が完成したので、外部情報の取り込み&3D認識に取り掛かろうって思っていたけど大事な機能を追加する事を忘れていたので機能を作成する事にした

忘れていた機能は、エド(ロボットアームの呼称)と音声対話をする為の、音声認識音声合成機能で、この機能が無いと、エドと対話しながらオセロゲームを行う事が出来ない!!

んで、実装をどうするかグーグルさんで検索すると、音声認識組込モジュール(SR-MOD100)やスマートフォンを使用した音声認識、後は、大学が進めている「Julius」と言うソフトがヒットした
音声認識組込モジュール(SR-MOD100)は、簡単だけど、文章認識って感じでは無い
スマートフォンは、無線環境が無いとダメだし、パソコン有るのにわざわざって感じになってしまう
「Julius」は、何だか、ややこしそうな感じがする
色々と悩んでたら、Windowsには、音声合成音声認識が入っているとの事なので、これを利用させてもらう事にしました

プログラムを作成して、動作させてみると、若干の誤認識はあるが、良い感じで動作してくれました

で、以下が、認識をしている時の画像です

f:id:Nov11:20170909152344j:plain

んで、以下が、認識をしている時の動画です

認識は、日本語を音声合成で読み上げて、読み上げた内容を音声認識させてみた結果です
(※)夜中に一人で、パソコンに向かってブツブツ言ってる姿を想像したら、少し怖くなって、音声合成の音声を認識させる事にしたです...

テスト時に発音や、文節毎に、ひと息いれないと誤認識してしまう事が判ったので、これを利用して、音声操作を行う為には、筆者の脳も学習機能を起動させる必要があるみたいです
慣れるまで、一人パソコンに向かって、ブツブツ言わないといけないのが辛く恥ずかしい作業となりそうですが...

後は、誤認識補正と日本語解析&言語変換を作成すれば、音声対話や日本語入力での操作が可能になりそうです。最終的には、アニメやSF映画みたいに、軽い冗談を入れた会話をしながら筆者の作業を手伝ってくれるまでになると嬉しいのだけど、先は長そうだが、くじけずに頑張るぞぉ~!

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

 

自作したロボットアームを制御する(仮想と現実)(その5)仮想現実(VR)完成!!

VisualStudio C++/CLIで、物理エンジンのOpen Dynamics EngineとOpenGLを使って、仮想現実(VR)上に物理法則を組み込む事が出来る様になったので、この空間にエド(ロボットアームの呼称)の情報を読込んで動作させてみました
が!、エドのオブジェクト情報をそのまま展開すると、ジオメトリパーツが多すぎて演算時間が大変な事になってしまった
んで、どうしようかと考えていたら、アニメの「ID-0」で、よく使われていたフレーズ「空間にメッシュを展開する」を思い出しましたので、エドの各パーツの周囲にざっくりメッシュを展開し、この情報を元にジオメトリを作成したら、おぉ~動いてくれましたぁ~!

早速、空間上にドミノを配置してエドにドミノ倒しをさせたところ、上手く行かない...
何故だか、ドミノがとんでもない速さで、どこかへ消し飛んでしまう...
調べた結果、エドのパーツがドミノに食い込むと、とんでもない反発を起こし、その反動で飛んで行ってしまうみたいなので、方針を変えて、エドを動作させた際に、どのジオメトリにどのように衝突するのかを予め求めて、衝突する直前に対象とする対象ジオメトリに外力をかける様に変更し、何とか(衝撃力の計算が微妙)期待通りの動きをしてくれたけど、若干の不自然さは否めないってところですね
この不自然さの原因は、エドを物理法則の外に置いているせいなので、やっぱりエドも物理空間に実体として存在させた上で、適切な力を加える事で動作させないと解決しないみたいですね
ふぅ~、しばらくトライアル&エラーが続きそうです...

少し不自然ですが、動作結果は、こんな感じです

f:id:Nov11:20170827182728j:plain

動画はこんな感じです

後は、ここに現実空間で認識した物体を反映させ、仮想空間と現実空間の同期がとれる様になれば、アニメの「アルドノア・ゼロ」に登場する「タルシス」みたいな予測行動ができるようになるかもですね
&簡単な物理計算もできるので、ウェアラブルディスプレイを使えば、「界塚 伊奈帆」の左目とか「電脳コイル」のメガネとかも出来る様になるかもですね

その為にも、2Dカメラ映像の3D変換プログラムを作成しなければ...
アルゴリズムは考えたけど、なかなかの作業量になりそうです...

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

 

自作したロボットアームを制御する(仮想と現実)(その4)仮想現実に物理法則を組み込む

VisualStudio C++/CLIで、物理エンジンのOpen Dynamics EngineとOpenGLを使って、仮想現実(VR)上に物理法則を組み込む事が出来る様になったので、自由落下による連鎖以外に、物体に力を加える事による連鎖を行って見る事にしてみました
どんな事をやるか考えた結果、オーソドックスにドミノ倒しで連鎖を確認する事にしてみました
Open Dynamics Engineで、ボールを水平方向に射出する方法をネットで検索すると、速度をdBodySetLinearVel()で行い、角速度をdBodySetAngularVel()で行えば良いとあったので、この2つを使って、ボールを射出し、ビリヤードと同じように、壁に何度か当ててから、ドミノを倒す事にしてみた
また、前回不自然な動きをしていた原因が、衝突時の反発係数にあったので、これを修正して、摩擦係数などの設定を行うと、自然な動きをしてくれるようになりました

んで、動作結果は、こんな感じです

f:id:Nov11:20170603091226j:plain


動作している動画です

youtu.be

簡易とは言え、何とか物理空間を手に入れる事が出来ましたぁ~!!
これをエド(ロボットアームの呼称)の仮想空間に加えれば、予測行動が出来る様になりそうです
エドに色んな事をさせる前に、思考実験を仮想空間内で行い、実際に動作させた結果と思考実験の差異を蓄積させて行けば、賢くなったエドが、筆者の開発サポートもしてくれるようになるかもですね

ん~、また一歩SF映画に近づけたような気がします

 

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

 

自作したロボットアームを制御する(仮想と現実)(その3)仮想現実に物理法則を組み込む

ロボットアームのエドの仮想空間と現実空間の視覚が同期できる様になったので、以前から組み込んでみたかった仮想現実に物理法則を組み込んでみた
と言っても、一から物理法則を作成するなんて事を個人で行うのは、とても無理なので、賢い人達の知恵を利用する事にしました
ネットで調べたら、BulletとOpen Dynamics Engineの2つが良さそうな感じなので、比較した結果、Open Dynamics Engineを使用する事にしました
選んだ理由は、とても単純で、ファイルサイズが小さかったからで、
サイズが小さい→機能が少ない→設定が少ない→簡単に使える?って感じで選んでみました

ネットで使い方を調べた結果、以下の様になりました
ただ、描画は、Open Dynamics Engineに付属しているdrawstuffは使用せずに、OpenGLで描画する様にしたので、プログラムで時間を進めて、位置を取得して、OpenGLに渡す形にしました

ODEの初期化する
 dInitODE() → 初期化
 dWorldCreate() → シミュレーション空間作成
 dHashSpaceCreate() → 衝突空間作成
 dWorldSetGravity() → 重力設定
 dCreatePlane() → 地面生成

剛体を作成する
 dBodyCreate() → ボディ作成
 dMassSetSphereTotal() → 球を作成する場合
 dMassSetBoxTotal() → ボックスを作成する場合
 dBodySetMass() → 質量設定
 dGeomSetBody() → ジオメトリ作成
 dBodySetPosition() → 位置設定

時間を進める
 dWorldStep() → 時間経過
 dSpaceCollide() → 衝突確認
 dBodyCopyPosition() → 位置取得

ODEを終了する
 dWorldDestroy();
 dCloseODE();

 

んで、動作させたら、以下の様になりました

f:id:Nov11:20170531020324j:plain


動画は、こんな感じです

youtu.be

まだ設定不足なのか、不思議な動きをしているけど、なかなか良い感じで動いてくれます
(音とか土煙なんかの効果が無いので少し寂しいですが...)
以前、ピタゴラスイッチをやってみたいって思ってたけど、何とかなりそうな予感がしますね


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

 

自作したロボットアームを制御する(仮想と現実)(その2)カメラモジュールを取り付ける

3Dプリンタで自作したロボットアームのエドを仮想空間と現実空間での動作を同期させる事が出来たので、カメラモジュールを取り付けて、視覚も同期出来る様にしてみました
最初は、JPEGカメラを取り付ける予定だったけど、コンパクトで安価(999円)なWebカメラモジュール(マイク付き)が見つかったので、これを取り付けてみました
カメラモジュールの取り付け位置は、掴みの下部で下の写真の様にしてみました

f:id:Nov11:20170429224520j:plain

何も無いと比較しにくいので、以下の様にオセロボードを仮想空間と現実空間に配置して、

f:id:Nov11:20170501170940j:plain

OpenCVを使って、動画を取り込み、OpenGLで描画した仮想空間と並べてみました

f:id:Nov11:20170429224558j:plain
カメラから被写体までの距離が近いせいか若干ピンボケだけど、なかなか良い感じになったです
後は、視野角などを調整して、物体認識した結果を仮想空間に取り込んだり、仮想空間の動体を動画に表示できる様にすれば、良い感じの拡張現実も出来そうです

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

 

自作したロボットアームを制御する(仮想と現実)(その1)仮想空間と現実空間を同期させる

エド(ロボットアームの呼称)に搭載するデバイスが揃ってきたので、搭載前に仮想空間と現実空間を同期させてみる事にした
と言っても、仮想空間のエドに指示している関節角度をサーボモータ制御用PWM(15mSec周期)のデューティー比に変換して、以前作成したサーボコントローラ(16/04/25のブログ)に送信するだけなので、現在作成中のプログラムに、この処理を追加し、OpenCVで動画撮影が出来るので、この部分も追加し、仮想空間と現実空間が同期している事が分かるようにもしてみた

この制御での注意点は、サーボモータの速度制御をしてあげないと、本体やサーボモータを破損してしまうという点で、今回作成しているロボットアームは全長30cm以上あるので、速度制御しないと大きく動かした後に慣性でとんでもない事になってしまいます
まぁ、予算があればデジタルサーボ等を使用して、速度制御出来る様にするのが一番だけど、トルクの大きいデジタルサーボは、とてもお高く貧乏な筆者では手が出ないので、上記のような工夫をするしかないのでした

同期させて動作させた写真です

f:id:Nov11:20170324050826j:plain
この写真を撮っている時に気付いたのが、ロボットアームを水平位置から一気に上昇させると、色んな関節に負荷が掛かって、最大で7A近くの電流が流れるみたいで、電源は50W(5V,10A)だけど、ボードが40W仕様なので、後で改良する必要が...ですね

んで、同期させると、こんな感じになります


多少のカクカク間は否めないけど、とりあえず、同期させる事が出来ました


後は、カメラと距離計を搭載し、画像認識した結果を仮想空間に反映できれば、仮想空間と現実空間が相互同期する事になる
ん~、少しずつだけど、SF映画ぽくなってきました

 

nov11.hatenablog.com

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

開発環境ツールを自作する(電圧電流モニター作成)(その8)

別件で、I-V測定を行う必要があったので、1年程前に作成していたピークホールド付き電圧電流モニター(16/04/20のブログ)を引っ張り出して測定したところ、何だか値がおかしい事に気付いた
調べたら、増幅率やゼロレベルがずれていたせいで正しい値が出ていない...
他にも、各基盤を繋いでいるケーブルの接触不良があり安定した値が表示されない...
とりあえず、瞬間的な電流を測る必要はなかったので、テスターを使用して測定をしたのだが、これを機会にちゃんと使える物にバージョンアップする事にした

現行の問題点は、ケーブルが多い、調整用の半固定抵抗(段々とズレてくる)、表示が見づらい等々...
んで、全て見直した結果、前回なるべくMCUを使用しない方向で作成したが、今回はなるべくMCUを使用し、調整などをMCUに行わせる方向で作成する事にしてみました

まず検討したのは、この回路の肝であるシグナルコンデショナーとピークホールドの2点で、これをMCUで制御出来る様に見直しを行い、シグナルコンデショナー内の、アナログ信号の四則演算部分をPICで代用し、ピークホールドのリセットタイミングも制御出来る様にし、I2C接続を行う事にした
表示については、見易さ優先で、7セグにして、これもI2C接続で制御出来る様にしてみた
また、通信にBluetoothモジュールを使用していたが、データ量が少ないので、双方向赤外線モジュールを自作する事にした
通信速度は、2400bpsと低いけど、電圧電流値を送るだけなので問題は無いし、なんといっても安くて200円程度で出来てしまう
注意点は、双方向にしたので、自分で送信したデータを自分も受信してしまうので、簡単なパケットとプロトコルを作成しなければいけないってところですね
で、大事な測定対象の電源ラインの接続部分も強化して、10Aに耐えれる様にもしてみました
最終的に、PICを8個使用して、表示用の7セグモジュールのみケーブルで接続する形式となり、オシロスコープでも確認出来る様に、変換前の信号と加工後の信号をピンヘッダーを出してみました

んで、完成したのが、以下の写真です

f:id:Nov11:20170315175315j:plain
       (セメント抵抗の数が足りずに、9Aまでの測定となっています)

パソコンから、増幅率、ホールド時間や校正値等を送れば自動調整してくれるのが嬉しいですね
10cm×10cm×6㎝と少し大きくなったけど、デジタルマルチメータを2台並べるよりは、ずっと小さいし、瞬間的な電流も測れるので良しってところです

ん~、ここまで出来ると、オシロスコープが無くても、波形も見られるとなぁ~って思ってしまいますね
今回、アナログ信号の四則演算制御が出来る様になったので、オシロスコープも出来そうだし、表示器のラインナップにグラフィック液晶表示器が加わると、発想の幅も広がるので、後日作成してみる事にしようと思います

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