检测键盘输入 Matlab

10

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

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

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

我该如何做到这一点? 我怎样才能告诉Matlab:当我按下esc键时,执行这个...

谢谢你们的时间!

编辑:实现等待按键的方案不可取。 我正在为一辆行驶汽车编写脚本。 基本上只需要让它开着,但是例如当我按下esc键时,它应该停止行驶。 因此,脚本只需运行,直到我按下esc键; 然后脚本就会暂停。

4个回答

6

KeyPressFcn很好,因为它强制你编写事件驱动的代码,这通常是一个好主意!然而,如果KeyPressFcn对你来说不合适,例如如果你必须在循环中保持运行,并且只想轮询按键是否被按下,我在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版本中,这对我很有效。缺点是图形窗口需要聚焦才能接收按键事件。


我喜欢这个。我发现自己想要捕捉一些按键(显示一系列图像,捕捉是/否响应)。你有任何想法如何防止按键被回显到控制台? - Floris

4
在Matlab图形中,你可以定义一个'KeyPressFcn',它的工作方式类似于你所要求的功能。
如果你在控制台中运行程序,你需要绕过Matlab是单线程的这个问题。基本上你需要暂停程序流来检查按键。
顺便说一句,在使用'KeyPressFcn'时,你需要进行一些暂停,这样Matlab才会检查是否发生了任何事情。
顺便说一下,当进行这些暂停时,Matlab不仅会读取你的按键输入,还会执行一些诸如重绘窗口等操作。

问题在于我无法暂停Matlab以按下键。我的想法是,当我按下一个键(例如esc)时,Matlab脚本会暂停(出于安全原因)。但是,如果我必须暂停Matlab才能按下键以暂停脚本,那么这并不是很有用。还有其他的想法吗? - Earless
您不必暂停太久,也不需要在特定时刻暂停(通常您会按住键盘更长时间)。在代码中添加几个 pause(0.01) 就可以解决问题 - 最好与非阻塞读取结合使用。在 Matlab 中,您无法避免暂停。唯一能够传递到您的是 Ctrl-C 组合键 - 这对于控制流程并不是很有用。 - bdecaf
可以尝试在Matlab上实现一些多线程操作。但通常,在一个已经支持多线程的编程语言中实现算法会更容易。(并且在Matlab中也可能会很慢) 或者等待Matlab语言支持它 - 但这可能需要数年甚至数十年的时间。 - bdecaf
非常感谢您的帮助。最终我决定制作一个GUI,在其中使用了KeyPressFcn。它起作用了 :) - Earless

1

我经常遇到类似的用例,通常更喜欢通过 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

0

我曾经有一个相关的任务,我用Matlab文件交换中的getkey完成了它。基本上,您需要让它监听ASCII 1B(十进制27)。

如果getkey不能解决您的问题,您仍然可以查看其代码,也许会找到适合您的解决方案。


getkey实际上是如何工作的?它被说明会等待键盘输入。等待是否意味着脚本被暂停了?因为这不是我想要的。我想要实现这样一个功能,当我按下一个键时,脚本会暂停(所以不需要暂停来按键)。你明白我的意思吗?使用getkey可以实现这个吗? - Earless

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接