PlayStationのジョイスティックでマニピュレータ操作

OpenGLおよびC# + DirectInputでジョイスティックからのデータを取得します.
取得したデータを手先座標データにしてマニピュレータの操作を行います.
でも実際のマニピュレータを使うと流石に怒られそうなので,シミュレータを用いて試してみます.

OpenGLでシミュレータ


OpenGLを用いたToolkitであるGLUTを用いてやってみます。

モデルとなるマニピュレータはこちらを採用。

このマニピュレータの関節とリンクをモデル化するとこんな感じになる。

090325_d7d69896231e151a7b5e1b83cc391414.png

J1~J6:関節
P:手先位置
J6以降のリンク長さによっては冗長になりそう・・・・

これはいろいろ面倒である。

手先位置の計算が大変そうなので少し関節減らします。
モデルで示すとこんな感じ。

090325_b409b37d27daa1ea3b9de6ea510873a3.png

計算方法に関してはまた面倒な問題になりますのでそのうちまとめます。
J1の回転角度さえわかれば、Y軸周りに-J1だけ回転した上でJ2位置分だけ原点まで平行移動してやれば、ZY平面上において教科書にも載っている2リンクマニピュレータになるので何とかなりそうですね。


090325_f888e0fd19dd54c2f1efff6a954f4567.png

リンクごとに分けてこんな感じで作りました。
STL形式にExportして保存。

ボーンアニメーションにして、Vertexペイントなんかするよりもお手軽かなということでこのような方法をとってみました。
なんせアニメーションではなく、シミュレータですしね。


モデルができたら表示してみます。
モデルは現物あわせであわせます。最初からCADで作ればよかったね。

090329_21d242ffbdcea160a54039059eac32f2.png

面の貼り方失敗してる部分がありますね。まあいいや。
黒線は各リンクの軸。若干ずれてるけどそれもいいや。

面の張り方というか法線ベクトルが逆の方向になってた模様.
直すときれいに.

090914_492db0fbe3be400745011feec6259fc4.png


次はジョイスティックからの入力を反映させてやります。
PlayStation用のアナログパッドを使ってみます。
JoyStick用のコールバック関数はこちら

void joystick(unsigned int ButtonMask, int x, int y, int z)
{
  if(ButtonMask & 1) printf("△");
  if(ButtonMask & 2) printf("○");
  if(ButtonMask & 4) printf("×");
  if(ButtonMask & 8) printf("□");
  if(ButtonMask & 16) printf("L2");
  if(ButtonMask & 32) printf("R2");
  if(ButtonMask & 256) printf("START");
  if(ButtonMask & 512) printf("SELECT");
  glutPostRedisplay();
}



ButtonMaskに押されているキーの情報が入ってるので、
適当にマスクして引っ張り出します。
x,yは方向キーの入力、zはアナログ右パッドのZ回転量になります。

コールバックの登録は以下のように

glutJoystickFunc(joystick, 10);



引数は関数名とチェックするインターバル(たぶんmSec)
以上で完了。
動かしてみると・・・・

動く

入力部(C#+DirectInput)の作成


コントローラはPlayStation用のものを使用します.
USB変換ケーブルを用いてPCに接続.

ひとまずはコントローラからの入力をPC上で見えるようにしてみました。
















コメント(0)

コメントを投稿する