手なしのコンピューター制御(私の王冠のジャイロスコープ!)









前の記事で、目でコンピューターを制御する方法について説明しました。 場合によっては視線追跡が病人に外の世界と通信する機会を与える唯一の方法であるという事実にもかかわらず、前述のシステムには欠点がないわけではありません。 まず第一に、ロシアでは入手が難しい部品を使用する必要があるということです。 さらに、眼鏡をかけた人は、眼鏡の表面のぎらつきを最小限に抑え、システムの安定した動作を実現するために、頭の位置を厳しく制限する必要があります。

人が頭を動かすことはできるが、手で作業するのが難しい場合、よりシンプルで信頼性の高いものを使用することは可能ですか?



-= 2019年1月の更新=-

この記事で説明したUpvel UM-510KBは購入できなくなりましたが、代わりに、 Arduino LeonardoGY-521モジュールから組み立てられたこのような回路をMPU-6050ジャイロスコープ/加速度計とともに使用できます。







Arduino LeonardoとGY-521は4本のワイヤで接続されています。 可能であればそれらをはんだ付けします。

私はそのようなプロトタイプを手に入れました。 当然のことながら、良い方法では、これらすべてをケースに入れて改良する必要があります。











Arduinoにロードする必要があるプログラム(スケッチ)は次のようになります。



#include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" #include "Wire.h" #include <Mouse.h> MPU6050 mpu; uint16_t packetSize; // expected DMP packet size (default is 42 bytes) uint16_t fifoCount; // count of all bytes currently in FIFO uint8_t fifoBuffer[64]; // FIFO storage buffer // orientation/motion vars Quaternion q; // [w, x, y, z] quaternion container VectorFloat gravity; // [x, y, z] gravity vector float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector //   float old_mx=-200; float old_my=-200; float dx,dy,mx,my; // ================================================================ // === INITIAL SETUP === // ================================================================ void setup() { Wire.begin(); Wire.setClock(400000); // 400kHz I2C clock. Comment this line if having compilation difficulties mpu.initialize(); mpu.dmpInitialize(); mpu.setDMPEnabled(true); packetSize = mpu.dmpGetFIFOPacketSize(); } // ================================================================ // === MAIN PROGRAM LOOP === // ================================================================ void loop() { // wait for MPU interrupt or extra packet(s) available while (fifoCount < packetSize) { fifoCount = mpu.getFIFOCount(); } // check for overflow (this should never happen unless our code is too inefficient) if ( fifoCount >= 1024) { // reset so we can continue cleanly mpu.resetFIFO(); fifoCount = mpu.getFIFOCount(); // otherwise, check for DMP data ready interrupt (this should happen frequently) } else { // wait for correct available data length, should be a VERY short wait while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount(); // read a packet from FIFO mpu.getFIFOBytes(fifoBuffer, packetSize); // track FIFO count here in case there is > 1 packet available // (this lets us immediately read more without waiting for an interrupt) fifoCount -= packetSize; //   mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); // ypr[0] -  X, ypr[1] -  Y, Y -  mx=ypr[0] * 180/M_PI; my=ypr[1] * 180/M_PI; if(old_mx>-200) //     { if((old_mx<-100)&&(mx>100)) { dx=(-180-old_mx)+(mx-180); } else if((old_mx>100)&&(mx<-100)) { dx=(180-old_mx)+(180+mx); } else { dx=mx-old_mx; } dy=my-old_my; Mouse.move(2000/60*dx, -1000/30*dy); } old_mx=mx; old_my=my; } }
      
      







スケッチをコンパイルするには、I2CdevおよびMPU6050ライブラリもダウンロードする必要があります。 ここから入手できます: github.com/jrowberg/i2cdevlib/tree/master/Arduino

スケッチをダウンロードした後、組み立てられたデバイスは記事のリモートコントロールと同じように機能します。 つまり、空間内のデバイスの向きを変更すると、画面上のマウスカーソルが移動します。



-=さらに-元の記事=-

人が頭を動かすことはできるが、手で作業するのが難しい場合、よりシンプルで信頼性の高いものを使用することは可能ですか?



もちろん、そのようなツールは存在します。 まず第一に、これらは通常のウェブカメラを使用して、頭の回転や、瞬きや唇の動きなどの他のアクションを制御するプログラムです(シープスキンのゲームはありますか? 」セクションでそれらについてお読みください)。





さらに、特殊なデバイスも生産されます。これは、赤外線範囲で明るく輝くマーカーを追跡するカメラでもあります 。 マーカーは、たとえば眼鏡フレーム、キャップ、ヘッドセットなど、頭部のどこかに固定されています。 時には、額にマーカーを貼ることを勧めさえします。



このタイプのデバイスを以前に製造していたさまざまな企業が、 NaturalPointの管理下に徐々に集まりました。 そして今、彼らのサイトでは、以前は競争していたデバイスを見つけることができますが、現在は異なる市場セグメントを共有しています。 そのため、たとえば、ゲーマーにはより簡単なオプション( TrackIR )を提供し、コンピューターでの作業にはより高価なオプション( SmartNav )を提供します。



既に高価なSmartNav (500ドル)は、ロシアで購入しようとすると金になります。 そのため、コンピューター画面にカーソルを置くことができるものの、よりアクセスしやすいものを作成するというアイデアが生まれました。





最初は、マーカー、バックライト、画像処理という同じ動作原理を使用したかったのです。 しかし、直接測定について考えました。 電子ノギスを頭に取り付けるまで(ほとんど冗談です)。



後に判明したように、そのようなデバイスは本当に存在します!



このエンジニアリングの奇跡を見てください。口で押さえて頭の動きを制御するために必要なレバーです。



突然、アイデアは[電子]ジャイロスコープを使用するようになりました。 これらは最近利用可能になり、非常に正確になりました。 ただし、「エアマウス」などの既製のデバイスは広く使用されていません。 たとえば、 Logitech MX Airマウスはすでに需要が不足しているため、すでに製造中止になっています。



スマートフォン(iPhoneとAndroidの両方)用のプログラムがあり、それらに組み込まれたジャイロスコープを使用して、それらをエアマウスとして使用できます。 しかし、まず第一に、安価なソリューションに興味があったので、この質問を深く調査しませんでした。



最後に、テレビ用のマルチメディアセットトップボックス用のリモコンも、内蔵のジャイロスコープを使用して表示されました。 それらのいくつかは通常のコンピューターで動作し、アダプターをUSBソケットに挿入するだけです。 データは無線で送信されます。つまり、赤外線トランシーバーの場合のように、リモートコントロールの直接の見通し線は必要ありません。



リモコンは頭部に固定されており、回転すると、画面上のマウスカーソルが移動します(記事のタイトルのチェブラーシカのように)。 マウスボタンと仮想キーボードのクリックを処理するためだけに残ります。 これらの目的のために、プログラムを作成しました



難点は次の点です。一定期間操作しないとコンソールが「スリープ」状態になり、ボタンを押すことで起動する必要があります。







一連の実験を実行する必要がありました。キーボードのボタンの1つをクランプし、押したボタンによってリモコンがスリープ状態にならないように、リモコンを非アクティブのままにします。 また、手で小さな動きをコンソールに伝えることができるので、手ではなく洗濯ばさみでボタンを固定する必要がありました。 ボタンは、Windowsで使用されていないボタンのみを押すことができます。

一部のリモートコントロールは無効にできませんでしたが、最終的に、 Upvel UM-510KBリモートコントロールが見つかりました。これにより、2、3のボタンを押している間、スリープ状態にならないことが保証されます。







このリモートコントロールを開くと、STMicroelectronicsのSTM8L-151マイクロコントローラー(1)、3軸のInvensense MPU-3050cジャイロスコープ(2)、2.4 GHz USBアダプターと通信するためのその他の名前のないチップ(3)を見つけることができます。 赤外線LEDも表示されます。 リモコンを使用してプログラムを切り替え、テレビの音量を調整する場合に必要です。 コンピューターと通信する場合、LEDは使用されないため、安全にブロックできます。



もちろん、美しい解決策は、マイクロコントローラープログラムを読み取り、分解して変更し、それからコンソールをスリープ状態にせず、ボタンを短絡させないように再フラッシュすることです。 しかし、私はこの分野に精通していません、私はこの機会を愛好家に任せます。



絶えず押されているボタンを備えたリモコンは、エネルギーを大量に消費します。 そのため、毎日バッテリーを交換しないように、電源をはんだ付けする必要がありました。



段階的な変更



まず、すべてが私のために働いたという事実は、それがあなたのために働くという意味ではないことに注意してください。 たとえば、製造元がファームウェアを変更した場合、2つのボタンを閉じても役に立たない可能性があります。 しかし、誰もファームウェアを不必要に変更しないことを願っています。



だから、リモートを開きます。 ドライバーが開くまでドライバーでピックし、ケースにわずかな損傷を与えます。 次に、ボードを取り出して、2つのボタンを閉じます(写真を参照)。 はんだごてを使ってボードを剥がすこともできますが、私はお菓子の箔を補強テープで接着しました。



3ボルトの安定化電源から電力をはんだ付けします。



ワイヤーをケースにしっかりと保持するために、味に接着剤を注ぎます。









指定された場所の2つの(!)ボタンを閉じます。 注意! 当初、写真には誤ってラベル付けされたボタンが含まれていました! [設定]ボタンと、[OK]の左側にある4つの正方形のボタンを閉じる必要があります。 ワイヤーを補強する アッシー






リモコンを頭の上に保持する方法は? リモコンを頭の上に置き、ウールの帽子をかぶるだけです。 だから最初にやった。 しかし、長期使用のために、あなたはいくつかの頭飾りにポケットを縫うことができます。





ヘッドに対するコンソールの正確な位置は必要ありません。 マウスカーソルが希望する場所にない場合は、カーソルを画面の端に合わせて静止するように頭を回してください。 これにより、カーソルが頭の回転と反対方向に移動します。 要するに、試してみると、説明なしですべてが明らかになります。



ゲームはろうそくの価値がありますか?





すべてが完了した後、私は従来のウェブカメラを使用してマウスを手なしで制御する比較プログラムを試すことにしました。 彼ら全員が素晴らしいお金を稼いだとき、私の驚きは何でしたか! 手元に他に何もない場合は、それらを使用することをお勧めします。



次のプログラムを試してみました(すべて無料):



個人的には、プログラムeViaCamが一番好きでしたが、これは純粋に主観的で、表面的な意見であり、デフォルト設定と私が持っているウェブカメラでの短い使用に基づいています。 あなたは完全に異なるプログラムが好きかもしれません。





純粋なソフトウェアソリューションよりもジャイロスコープを使用する利点を評価するために、画面に表示される四角形の後にカーソルを移動する必要があるプログラムを作成しました。 この場合、マウスカーソルは少なくとも0.2秒間、ボックスの上で停止(ロック)する必要があります。



2つのボックスが表示されます。赤-マウスを導く場所、緑-次のステップで赤が移動する場所。

プログラムとそのソースコードはhttps://github.com/MastaLomaster/CStestで入手できます



その結果、40x40ピクセルの25の正方形に沿って、次のカーソル移動時間が得られました(間接的に、速度が速いほど位置決め精度も高くなります)。



手で普通のマウス 28.3秒
頭にジャイロスコープを備えたリモコン 36.7秒
eViaCam 58.3秒
頭のマウス 66.3秒
カメラマウス 48.4秒




仮想キーボードでのタイピング速度はそれほど重要ではありません。 実際、キーボードでは、マウスカーソルをキーの上に長時間(約1秒間)「ホバー」する必要があります。 そうしないと、誤ったクリックが発生する可能性があります。 それでも、私は一連のテキストに関するデータを引用しています。 「手を使わずにコンピューターを制御する」というテキストを入力すると、次のようになりました。



手で普通のマウス 1分15秒
頭にジャイロスコープを備えたリモコン 1分23秒
eViaCam 1分31秒
頭のマウス 1分44秒
カメラマウス 1分28秒


カメラマウス-カーソルが静止していないのにけいれんするという事実のために、私は最も好きではありませんでした。 しかし、その中のタイピング速度はかなり良いことが判明しました。



Tobii REX視線追跡デバイスで動作するように作成したプログラムを使用し、その後、空中マウスを含む画面上のカーソルを移動するデバイスをサポートするように修正しました。

プログラム自体とそのソースコードは、 https//github.com/MastaLomaster/bkbから入手できます。



このプログラムがアイトラッキングデバイスでどのように機能するかについては、 http//www.youtube.com/watch?v = O68C4d2SNC8をご覧ください。



他のデバイスでも、プログラムは同じように機能し、目の動きからはカーソルだけが動きません。たとえば、ジャイロスコープで頭を回すことからは動きます。



使用できる無料のプログラムがあり、頭に何かを引っ掛ける必要がない場合、リモートコントロール、電源、配線のために約1000ルーブルを捨て、さらには時間を無駄にすることは価値がありますか?



私の意見では、リモートを使用すると次の利点があります。





もちろん、あなたが決めます。






All Articles