【问题标题】:Detect Keyboard Input Matlab检测键盘输入 Matlab
【发布时间】:2014-03-03 11:15:29
【问题描述】:

我有一个简单的问题,虽然它比看起来更难;我在互联网上找不到答案:O

我正在用 Matlab 编写脚本。我想做的是:

  • 当我按下 esc 键时,我想弹出一个帮助对话框,所以我的脚本暂停了。 (所以当我按 esc 时,我想停止整个脚本运行,以便汽车(我为其编写脚本)停止行驶)

我该怎么做?如何对 Matlab 说:当我按 esc 时,执行此操作...

感谢你们的时间!

编辑:没有选择实现等待按键的东西。我正在为驾驶汽车编写脚本。它基本上只需要四处行驶,但是当我按下 esc 时,它应该停止行驶。所以脚本只需要运行,直到我按下 esc 键;那么脚本必须暂停。

【问题讨论】:

    标签: matlab user-input keyboard-events


    【解决方案1】:

    KeyPressFcn 很好,因为它迫使您编写事件驱动的代码。这通常是个好主意!但是,如果 KeyPressFcn 似乎不适合您,例如,如果您必须继续循环运行,并且您只想 poll 是否按下了某个键,我发现这个解决方案被埋没了在matlab网站上:

    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 年对我来说效果很好。缺点是图形窗口需要聚焦才能接收关键事件。

    【讨论】:

    • 我喜欢这个。我发现自己想要捕捉一些击键(显示一系列图像,捕捉是/否响应)。你知道如何防止击键被回显到控制台吗?
    【解决方案2】:

    在 matlab 图中,您可以定义一个 'KeyPressFcn',其作用类似于您所要求的。

    如果您在控制台中,则必须解决 matlab 是单线程的问题。基本上,您需要停止程序流程以检查按键。

    顺便说一句 - 当您使用 'KeyPressFcn' 时,您需要暂停一些,以便 Matlab 将检查是否发生了任何事情。

    btw2 - 我还应该在此暂停期间添加,Matlab 不仅会读取您的按键 - 而且还会做一些内务处理,例如重绘它的窗口和其他东西。

    【讨论】:

    • 嗯,问题是我不能暂停matlab来按下一个键。我的想法是,当我按下一个键(即 esc)时,matlab 脚本会暂停(出于安全原因顺便说一句)。但是,如果我必须暂停 matlab 才能按下一个键来暂停脚本,那它就没有那么有用了。任何其他想法:)?
    • 您不必暂停很长时间,也不需要恰好在此刻暂停(通常您按住键更多的时间)。通过代码洒一些pause(0.01) 就可以了——最好结合非阻塞读取。在 Matlab 中,您不会遇到暂停。唯一能传达给您的组合键是 Ctrl-C - 这对于控制流程没有多大用处。
    • 可以尝试在matlab之上实现一些多线程。但通常用已经支持该算法的语言来实现该算法会更容易。 (在 Matlab 中也会很慢)。或者等到 Matlab 语言支持它 - 但我们在这里谈论的是几年甚至几十年。
    • 非常感谢您的帮助。最后我决定制作一个 GUI,在其中我使用了 KeyPressFcn。它奏效了:)
    【解决方案3】:

    我经常遇到类似的用例,并且通常更喜欢对操纵杆按钮做出反应,因为 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

    【讨论】:

      【解决方案4】:

      我曾经有一个相关的任务,我用getkey form matlab 文件交换完成了它。 基本上你会想让它监听 ascii 1B(十进制 27)

      如果getkey 不能解决您的问题,您仍然可以查看它的代码,或许可以找到适合您的代码。

      【讨论】:

      • getkey 实际上是如何工作的?据说 getkey 将等待键盘输入。等待,是否意味着脚本已暂停?因为那不是我想要的。我想实现,当我按下一个键时,脚本会暂停(所以没有暂停来按下一个键)。你明白我想要什么吗?使用 getkey 可以吗?
      猜你喜欢
      • 2014-04-18
      • 2012-09-10
      • 2011-06-09
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      相关资源
      最近更新 更多