我有一个简单的问题,尽管它比看起来更难;我在互联网上找不到答案:O
我正在用 Matlab 编写一个脚本。我想做的是:
- 当我按 esc 键时,我希望弹出一个帮助对话框,所以我的脚本暂停。(所以当我按 esc 时,我想停止整个脚本运行,以便汽车(我为其编写脚本)停止行驶)
我该怎么做?我怎么能对 Matlab 说:当我按 esc 时,这样做......
谢谢你们的时间!
编辑:实现等待按键的东西是没有选择的。我正在为一辆驾驶汽车写剧本。它基本上只需要四处行驶,但是例如,当我按 esc 时,它应该停止行驶。所以脚本只需要运行,直到我按下 esc 键;然后脚本必须暂停。
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 中对我来说效果很好。缺点是图形窗口需要聚焦才能接收关键事件。
在 matlab 图中,您可以定义一个类似于执行您要求的操作的'KeyPressFcn'
。
如果你在控制台中,你必须解决 matlab 是单线程的。基本上,您需要停止程序流以检查按键。
顺便说一句 - 同样当您使用'KeyPressFcn'
时,您需要暂停一些,以便 Matlab 检查是否发生了什么。
btw2 - 我还应该在此暂停期间补充一点,Matlab 不仅会读取您的按键 - 还会做一些内务管理,例如重新绘制其窗口和其他东西。
我经常遇到类似的用例,并且通常更喜欢对操纵杆按钮做出反应,因为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
我曾经有一个相关的任务,我用getkey
表单 matlab 文件交换来完成。基本上,您将希望它侦听ascii 1B(27十进制)
如果getkey
不能解决您的问题,您仍然可以查看其代码,也许可以找到可以为您解决问题的行。