Matlab 检测键盘输入

Matlab 检测键盘输入,matlab,user-input,keyboard-events,Matlab,User Input,Keyboard Events,我有一个简单的问题,尽管它比看起来更难;我在互联网上找不到答案:O 我正在用Matlab写一个脚本。我想做的是: 当我按下esc键时,我希望弹出一个帮助对话框,因此我的脚本暂停。(因此,当我按下esc键时,我想停止整个脚本的运行,以使汽车(我正在为其编写脚本)停止行驶) 我该怎么做?我如何对Matlab说:当我按下esc键时,做这个 谢谢你们的时间,伙计们 编辑:没有选项来实现等待按键的东西。我正在为一辆汽车写剧本。它基本上只需要四处行驶,但当我按esc键时,它应该停止行驶。所以脚本必须运行

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

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

  • 当我按下esc键时,我希望弹出一个帮助对话框,因此我的脚本暂停。(因此,当我按下esc键时,我想停止整个脚本的运行,以使汽车(我正在为其编写脚本)停止行驶)
我该怎么做?我如何对Matlab说:当我按下esc键时,做这个

谢谢你们的时间,伙计们


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

我曾经有一个相关的任务,我用表单matlab文件交换完成了它。 基本上,您需要让它监听ascii 1B(27位小数)


如果
getkey
不能解决您的问题,您仍然可以查看它的代码,也许可以找到一行代码来帮助您解决问题。

在matlab图形中,您可以定义一个
'KeyPressFcn'
,它的工作原理类似于按您的要求执行操作

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

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


btw2-我还应该补充一点,在暂停期间,Matlab不仅会读取您的按键操作,还会进行一些整理工作,例如重新绘制窗口和其他内容。

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

get(gcf,'CurrentCharacter')
然后可以将此属性设置为空白,并根据需要轮询它。 e、 g:


这在2014b对我很有效。缺点是图形窗口需要聚焦以接收关键事件。

我经常遇到类似的用例,通常更倾向于对操纵杆按钮作出反应,因为VRMagicke提供了更方便的界面。然而,我最近编写了一个库,为键盘输入提供了类似的接口

% Pause on ESC
kb = HebiKeyboard();
while true
    state = read(kb);
    if state.ESC
      % PAUSE DRIVING
    else
      % DRIVE CAR
    end
end
它是非阻塞的,不需要关注任何特定的图形

文件交换:


Github:

问题是,我不能暂停matlab来按键。我的想法是,当我按下一个键(即esc)时,matlab脚本会暂停(顺便说一句,出于安全原因)。但是,如果我必须暂停matlab以按下一个键来暂停脚本,那么它就没有那么有用了。还有其他想法吗:)?你不需要长时间停顿,也不需要在某个时刻完全停顿(通常你握钥匙的时间要长得多)。在代码中喷洒一些
pause(0.01)
就可以了-最好与非阻塞读取相结合。在Matlab中,您将无法绕过暂停。唯一能让您理解的组合键是Ctrl-C,它对控制流没有多大用处。您可以尝试在matlab上实现一些多线程。但通常,用一种已经支持该算法的语言来实现该算法更容易。(在Matlab中也会非常慢)。或者等到Matlab语言支持它——但我们在这里谈论的是几年甚至几十年。非常感谢您的帮助。最后,我决定制作一个GUI,在其中我使用了KeyPressFcn。它起作用了:)getkey实际上是如何工作的?声明getkey将等待键盘输入。等待是否意味着脚本已暂停?因为那不是我想要的。我想实现的是,当我按下一个键时,脚本会暂停(因此按下一个键时不会暂停)。你明白我想要什么吗?用getkey可以吗?我喜欢这个。我发现自己想要捕捉一些击键(显示一系列图像,捕捉是/否响应)。您是否知道如何防止击键被回响到控制台?
% Pause on ESC
kb = HebiKeyboard();
while true
    state = read(kb);
    if state.ESC
      % PAUSE DRIVING
    else
      % DRIVE CAR
    end
end