2013-02-02 5 views
5

私は脳性麻痺を持っている障害のある子供たちと一緒に働いています。 1人の子どもは細かいモーターコントロールが限られているので、現在はマウスを操作するためにジョイスティックを使用しています。トラバースレートは非常に低く設定されています。これは画面上のすべてのボタンをクリックすることができるので、彼女にとってはうまくいくが、私たちはもっとうまくいくと思う。画面全体を横断したいときには、そうするのに年齢がかかる(約10秒)。は、マウスのレート設定を上書きします。私自身のマウスレートアルゴリズムを作成する

私の仮説は、彼女の脳は正常であり、彼女の運動制御だけが悪いということです。それが本当であれば、私は低速で始まったが、一定の加速を経験したマウスはスピードを上げ、スクリーン全体を横断するときに速くなるので、彼女にとってはより良いと信じている。 これが機能すれば、多数の障害者のためにPID制御と速度/加速度設定を微調整することができ、アクセスを高速化し、学習と開発をスピードアップできます。

しかし、私はこれを構築するための最善の方法はわかりません - すべての提案、考え、リンク、ヒントを歓迎します。

まず、ProcessingとJavaを使用し、mouseListenerとRobotを使用してカーソルを制御しようとしました。私はこれが最良の方法だとは確信していません。カーソルの位置を読んで書いているので、私の最高の試みはまだカーソルを飛び越え、スムーズな動きはありません。それはJavaで達成可能ですか?何らかのドライバを使用してUSBからのマウス入力を読み取ってから、画面上のカーソルのプロットを自分で置き換える必要がありますか?

私は、私がもたらそうとしている効果を説明するためにビデオをいくつか作りました。

現状(私のイラストは、矢印キーをオフカーソルを駆動している) http://www.youtube.com/watch?v=3ZhQCg5DJt8

私が望む新しい動作(マウスが加速する) http://www.youtube.com/watch?v=JcBK_ZCFGPs

それはすべての使用、私が使用した処理コードだ場合これらのデモを作るために以下にコピーされます。

現状のデモ:

import java.awt.AWTException; 
import jav 
a.awt.Robot; 

Robot robot; 
int i = 0; 
int j = 0; 

void setup() { 
    setupDotgame(); 
    try { 
    robot = new Robot(); 
    } 
    catch (AWTException e) { 
    e.printStackTrace(); 
    } 
    robot.mouseMove(screenWidth/2, screenHeight/2); 
} 

void draw() { 
    //println(frameCount); 
    robot.mouseMove(screenWidth/2+8*i, screenHeight/2+8*j); 
    drawDotgame(); 
} 

void keyPressed() { 
    if (keyCode == UP) { 
    j--; 
    } 
    else if (keyCode == DOWN) { 
    j++; 
    } 
    else if (keyCode == RIGHT) { 
    i++; 
    } 
    else if (keyCode == LEFT) { 
    i--; 
    } 
} 

望ましい行動:

import java.awt.AWTException; 
import java.awt.Robot; 

Robot robot; 
int i = 0; 
int j = 0; 
int delta = 8; 
int time = 0; 

void setup() { 
    setupDotgame(); 
    try { 
    robot = new Robot(); 
    } 
    catch (AWTException e) { 
    e.printStackTrace(); 
    } 
    robot.mouseMove(screenWidth/2, screenHeight/2); 
} 

void draw() { 



    //println(frameCount); 
    robot.mouseMove(screenWidth/2+i, screenHeight/2+j); 
    drawDotgame(); 

} 

void keyPressed() { 
    if (millis() - time < 90) { 
    delta += 8; 
    } 
    else { delta = 8; } 
    time = millis(); 


    if (keyCode == UP) { 
    j-=delta; 
    } 
    else if (keyCode == DOWN) { 
    j+=delta; 
    } 
    else if (keyCode == RIGHT) { 
    i+=delta; 
    } 
    else if (keyCode == LEFT) { 
    i-=delta; 
    } 
} 

そしてDotGameコード彼らは両方の参照:事前に

void setupDotgame() { 
    size(1000, 600); 
    background(255); 
    fill(255, 0, 0); 
    noStroke(); 
    smooth(); 
    drawCircle(); 
} 

void drawDotgame() { 
    if (get(mouseX, mouseY) != color(255)) { 
    background(255); 
    drawCircle(); 
    } 
} 

void drawCircle() { 
    int x = round(random(50, width-50)); 
    int y = round(random(50, height-50)); 
    int rad = round(random(20, 80)); 
    ellipse(x, y, rad, rad); 
} 

おかげ

+0

ジョイスティックのボタンを使って動きを速めることを検討しましたか?たとえば、Ctrl +矢印を使用すると、マウスキーを使用するとマウスがすばやく移動します。同様に必要な場合にジャンプすることができますが、まだ微調整に必要な低速がありますか? – cjds

+0

提案していただきありがとうございます。問題の学生は本当に一度に一つのことしかできないので、私は彼女がすぐに二つのことをすることができて楽観的ではありません。私の言うように、私は彼女の脳は大丈夫だと思うが、筋肉の痙攣がたくさんあり、それが本当に難しい。 – samjewell

+1

私はジャークのように聞こえたくはありませんが、これはプログラミングの質問です。答えが必要なのですか?これを行うには最良の方法でディスカッションをしようとしていますか?そして建設的な注意を払ってください: "あなたのプログラム"のためにこれを解決しないでくださいが、入力装置のためにそれを解決してください。ジョイスティックを1秒間にもっと多くのデルタにします(これは、arduinoなどで比較的簡単です)、「javaでこれを行う方法」の問題は消えます。これは、すべてのプログラムに対してユニバーサルな解決策があるためですすべてのオペレーティングシステムで使用できます。 –

答えて

0

カールが提案されているように、私は実際にマウスを作る最良の回答のショートを持っていると信じてこの動作は、あなたが行く必要のあるところにマウスを近づけさせ、その後そこからジョイスティックを使用するジャンプ動作です。

私は、AutoItv3というプログラムがこの種のことを行うことができることを知りました。特別なホットキーを認識するように設定し、そのホットキーを使用してマウスを任意の地域に移動させることができます。

これに便利なコマンドは、HotKeySet、MouseMove、Func/EndFuncです。

関連する問題