web-dev-qa-db-ja.com

キーボード入力Matlabを検出する

簡単な質問がありますが、見た目より難しいです。インターウェブで答えが見つかりませんでした:O

Matlabでスクリプトを書いています。私がやりたいことは次のとおりです。

  • Escキーを押すと、ヘルプダイアログがポップアップするので、スクリプトが一時停止します。 (つまり、escを押すと、スクリプト全体の実行を停止して、(スクリプトを書いている)車が運転を停止するようにします)

どうすればよいですか? Matlabにどのように言うことができますか:escを押すとき、これを行います...

お時間をいただきありがとうございます!

編集:キーが押されるのを待つ何かを実装するオプションはありません。運転中の車の脚本を書いています。基本的には運転するだけですが、例えばescを押すと運転が止まるはずです。したがって、escキーを押すまで、スクリプトを実行する必要があります。その後、スクリプトを一時停止する必要があります。

9
Earless

Matlabの図では、要求したことを実行するのと同じように機能する'KeyPressFcn'を定義できます。

コンソールを使用している場合は、MATLABがシングルスレッドであることを回避する必要があります。基本的に、キーが押されているかどうかを確認するには、プログラムフローを停止する必要があります。

ところで-'KeyPressFcn'を使用する場合も、Matlabが何かが起こったかどうかをチェックするために、一時停止する必要があります。

btw2-この一時停止中にMatlabがキーの押下を読み取るだけでなく、ウィンドウの再描画などのハウスキーピングも実行することも追加する必要があります。

4
bdecaf

KeyPressFcnは、イベント駆動型コードの記述を強制するため、優れています。これは一般的に良い考えです!ただし、KeyPressFcnが適切でないと思われる場合、たとえば、ループで実行し続ける必要があり、キーが押されたかどうかをpollしたい場合は、このソリューションはmatlabのWebサイトに埋め込まれています。

get(gcf,'CurrentCharacter')

次に、このプロパティを空白に設定し、必要に応じてポーリングします。例えば:

finish=false;
set(gcf,'CurrentCharacter','@'); % set to a dummy character
while ~finish
  % do things in loop...

  % check for keys
  k=get(gcf,'CurrentCharacter');
  if k~='@' % has it changed from the dummy character?
    set(gcf,'CurrentCharacter','@'); % reset the character
    % now process the key as required
    if k=='q', finish=true; end
  end
end

これは2014bで私にとってうまくいきました。欠点は、主要なイベントを受信するためにグラフィックウィンドウに焦点を合わせる必要があることです。

5
Sanjay Manohar

私は頻繁に同様のユースケースに遭遇し、vrjoystickによって提供されるより便利なインターフェイスのために、通常はジョイスティックボタンに反応することを好みました。しかし、私は最近、キーボード入力用の同様のインターフェイスを提供するライブラリを作成しました。

% Pause on ESC
kb = HebiKeyboard();
while true
    state = read(kb);
    if state.ESC
      % PAUSE DRIVING
    else
      % DRIVE CAR
    end
end

それはノンブロッキングであり、特定の人物に焦点を合わせる必要はありません。

ファイル交換: http://mathworks.com/matlabcentral/fileexchange/61306-hebirobotics-matlabinput

Github: https://github.com/HebiRobotics/MatlabInput

1
Florian Enner

私は一度関連するタスクを持っていました、そして私はそれを getkey フォームmatlabファイル交換で行いました。基本的には、ASCII 1B(10進数で27)をリッスンする必要があります。

getkeyで問題が解決しない場合でも、そのコードを確認して、そのトリックを実行する行を見つけることができます。

0
ben