09-27-2023 04:55 AM
大学でLabVIEWを用いて測定機器の操作を行っている学生です。
シグマ光機の「SHOT-304GS」にフライトシミュレーター用のジョイスティックを接続して、ジョイスティックによる操作をしたいと考えております。(そのほかにもカメラやDAQを接続しています。)
USB式であるジョイスティックがLabVIEWで動作するのは確認したのですが、どのようにブロックダイアグラムを組めば良いかがどうしてもわかりません。
実際に作成したいプログラムは、ジョイスティックを右に倒したらステージも右に動き、奥に倒したらステージは上に動くようなプログラムを考えております。
シグマ光機のステージ操作にはサンプル配布されていたプログラムを使用しています。以下に添付します。
また、同時に接続されている他のデバイスとステージ操作のプログラムは干渉しておりません。
どうかご教授お願い致します。
https://jp.optosigma.com/ja_jp/software__sample
CU Control v1.1.0です。私が使用しているのはv1.0.0で、基本的には同じものですが、v1.1.0ではz軸が追加されています。
09-27-2023 07:08 AM
LabVIEWのプログラミングの基礎は学ばれたのでしょうか。書籍でも良いですし、NI社の対面授業形式(今はオンラインですかね?)はとても分かりやすかった記憶があります。(高いですが、学割が効いたはずです)
大まかな枠組みとしてはステートマシンで組んで、ジョイスティック入力チェック→(入力ありの場合)ステージ制御→ジョイスティック入力チェック、というステート間をぐるぐる回すことで実現ができるかと思います。
連続で押し続けたら加速する、とか端まで移動したらそれ以上動かなくする、とか考えればきりがなさそうですが、ステートマシンで十分でしょう、に一票です。
09-29-2023 02:19 AM
CU Controlは細かく作り込まれていますが、基本構造は「生産者/消費者デザインパターン(イベント)」で、ユーザーの操作に応じた動作を実行するようになっています。
一度に一つの動作しかしないので改造は比較的やり易いと思います。とはいえLabVIEW中級以上の知識は必要です。
操作はフロントパネルのボタンまたはキーボードのキーが選べるようになっているので、ここにジョイスティックのボタンを加えられれば良さそうです。
私がやるなら、ジョイスティックのボタンを読み取るループを追加して、そこから生産者ループのイベントストラクチャにダイナミックイベントを送るようにします。
上記で知らない単語があったらLabVIEWのヘルプやサンプルVIを探し、テストVIを組んで動きを探ってください。うまくいかないときはここで質問してください。
10-03-2023 11:10 PM
回答していただきありがとうございます。
いただいたアドバイスをもとに、ステートマシンについて改めて学習し直し、新たにジョイスティックのボタンを加えてイベントストラクチャにループ内容を送るようなプログラムの作成を試みています。
ジョイスティックから得られたX, Y軸の情報をジョイスティックの倒れた方向ごとに場合分けし、数値に変換後、足し合わせることで静止状態含めた上下左右斜めの9通りの数値で表現しました。
その数値によってRight, Left, Forwardなどのイベントストラクチャを動作させるVIです。
しかし、このVIだけではジョイスティックによるステージ操作はできませんでした。
何か修正するところはありますでしょうか?
10-04-2023 01:35 AM - 編集済み 10-04-2023 01:37 AM
このコードだと、Enable Joystick Inputの値がFalse→Trueに変わった瞬間しかジョイスティックの状態を読み取ることができません。
まずはLabVIEWメニューの「ヘルプ」>>「サンプルを検索」でサンプルファインダを開き、検索タブで「ジョイスティック」を検索し、「キーボードとマウスの監視」を開いてください。
このサンプルはキーボードとマウスしか扱っていませんが、入力デバイスの扱い方を学ぶことができます。最初に初期化を行い、Whileループで状態を繰り返し読み取り、終了時に閉じているのがわかると思います。
デバイスをジョイスティックに置き換えたWhileループをCU Controlの第3のWhileループとして配置します。
キューで自前のコマンドを送ってもいいのですが、元のプログラムの処理部分を利用するため、ボタンをクリックしたのと同等のイベントをプロパティノードを使って発生させた例を下図に示します。
10-05-2023 03:14 AM
ありがとうございます。
実際に同じようなVIを作成し、実行してみました。
方向ボタン自体は反応しているのですが、ステージはいまだに動かせておりません。
1枚目中央のLeft 1で2枚目のケースストラクチャ内のLeft 1が動作するのではないのですか?
10-05-2023 03:17 AM - 編集済み 10-05-2023 04:00 AM
何度も申し訳ございません。
以下のようにキューを用いて繋げたところステージを動かすことができました。
しかし、入力をするとジョイスティックを離しても入力され続けてしまい上限までに移動してしまいます。
入力した信号を監視し続けてジョイスティックの入力がなくなった瞬間にステージの移動もなくなるようにしたいのですが、このジョイスティックのループが独立しているのが問題でしょうか?
10-05-2023 04:09 AM
>1枚目中央のLeft 1で2枚目のケースストラクチャ内のLeft 1が動作するのではないのですか?
違います。これではLeft 1ステートは実行されません。
私の貼ったコードに、ラベルが「Right」で中に「Val(Sgnl)」と書かれたノードがあります。これはプロパティノードで、LabVIEWのあらゆる要素(ここではフロントパネルの制御器)の特性を読み書きできます。
Val(Sgnl)プロパティはユーザがこの制御器をクリックしたのと同じイベント発生させます。つまり「ジョイスティックの状態に従って適切なボタンをクリックする」ことをプログラム的に実行しています。
ところで、私がダウンロードしたCU Control_v1.1.0c.viには「Left 1」というケースはありません。2枚目の「Left 1」ケースのコードも少し違うようです。もしかしたらイベントの処理が多少違うかもしれませんので、話が食い違う可能性があります。
v1.0.0は入手できないようなので、v1.1.0に移行しませんか?
10-05-2023 04:15 AM
話の前後が入れ違ってしまいましたね。
スティックを倒したときにキューで移動命令を送ったら、スティックを戻したときにはストップ命令を送らねばなりません。
10-05-2023 04:36 AM
提示されたプログラムは注意深く見てください。私が貼ったコードの「スティックの動作を判定するコード」と書いた部分は単純ではありません。
基本的に、スティックの状態が変化したとき(センターに戻った、倒す角度が変わった、倒す方向が変わった、など)に、命令の種類と送信する回数や順序などを分類して、適切なコマンド発行をする必要があります。
たとえば連続移動命令は“一度だけ”送信する必要があります。連続して送り続けるとどうなるかわかりません。
私が貼ったコードは、元のプログラムでボタンがクリックされ移動中はボタンがグレーアウトされる(ボタンは有効でない)ことを利用して、繰り返し送信しないようになっています。コマンドを送信しなくていいときは-1ケース(空)です。