2014-03-03 341 views
8

我有一个简单的问题,虽然它比看起来更难;我无法找到interwebs上的答案:O检测键盘输入Matlab

我在Matlab中编写脚本。我想要做的是以下几点:

  • 当我按esc键,我想要一个帮助对话框弹出,所以我的脚本暂停。 (所以,当我按ESC键,我想停止整个脚本运行使汽车(这我写的脚本)停止驾驶)

我该怎么办呢?我怎么能说Matlab:当我按Esc,做到这一点...

感谢您的时间家伙!

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

回答

3

在MATLAB图中,可以定义一个'KeyPressFcn'的作品相似,你问什么。

如果你在控制台,你必须解决这个matlab是单线程。基本上你需要暂停程序流程来检查按键。

顺便说一句 - 还当您使用'KeyPressFcn'你需要做出一些停顿,使Matlab的将检查如果有什么事情发生了。

btw2 - 我还应该添加在此期间暂停Matlab的将不仅是读你的按键 - 但也做一些家政如重绘它的窗口和东西。

+0

那么问题是我不能暂停matlab为了按下一个键。我的想法是,当我按下某个键(即esc)时,matlab脚本暂停(出于安全原因)。但如果我不得不暂停matlab以便按下一个键来暂停脚本,那么它就没有用处。任何其他想法:)? – Earless

+0

您不必暂停很长时间,并且不需要暂时停顿(通常您会按住*键*更长)。在代码中加上一些“暂停(0.01)”就可以实现这一点 - 最好与非阻塞式读取相结合。在Matlab中你不会停下来。唯一能够实现的关键组合是Ctrl-C - 这对于控制流程没有用处。 – bdecaf

+0

你可以尝试在matlab上实现一些多线程。但通常用已经支持该语言的语言来实现算法会更容易。 (在Matlab中它也会很慢)。或者等到Matlab语言支持它 - 但我们在这里说几年甚至几十年。 – bdecaf

0

我有一个相关的任务一次,我与getkey形式MATLAB文件交换做到了。 基本上,你会希望它听取ascii 1B(十进制27)

如果getkey不能解决你的问题,你仍然可以看看它的代码,也许找到线将为你做的伎俩。

+0

如何信息getKey实际工作?据说getkey会等待键盘输入。等待,是否意味着脚本暂停了?因为那不是我想要的。我想实现,当我按下一个键时,脚本暂停(所以没有停顿为了按一个键)。你明白我想要什么吗?这可能与getkey? – Earless

5

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

get(gcf,'CurrentCharacter') 

然后,你可以将此属性设置为空,并查询其所需。 e.g:

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工作很适合我。缺点是图形窗口需要专注于接收关键事件。

+0

我喜欢这个。我发现自己想要捕捉一些击键(显示一系列图像,捕捉是/否的响应)。你知道如何防止键盘输入到控制台吗? – Floris

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