2014-03-03 305 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