如何使用手勢(shì)識(shí)別和嵌入式機(jī)器學(xué)習(xí)來(lái)控制物理模型
掃描二維碼
隨時(shí)隨地手機(jī)看文章
UoM工程大樓的手勢(shì)控制模型使用Pi 5 + ML -揮揮手,建筑就會(huì)移動(dòng)。
我們開(kāi)發(fā)了一個(gè)交互式的,由手勢(shì)控制的曼徹斯特大學(xué)工程大樓的比例模型,由機(jī)器學(xué)習(xí)和嵌入式系統(tǒng)提供動(dòng)力。
我們的模型實(shí)時(shí)響應(yīng)手勢(shì):
?向左滑動(dòng)→左邊的建筑打開(kāi)
?向右滑動(dòng)→右側(cè)打開(kāi)
?舉起雙臂做t字姿勢(shì)→整個(gè)建筑旋轉(zhuǎn)
這種非接觸式控制系統(tǒng)允許用戶(hù)以一種全新的方式與物理結(jié)構(gòu)進(jìn)行交互,為教育工具,展覽和智能環(huán)境提供了無(wú)限的可能性。
我們?yōu)槭裁匆ㄔ焖?/strong>
我們開(kāi)始探索如何使用手勢(shì)識(shí)別和嵌入式機(jī)器學(xué)習(xí)來(lái)控制物理模型。我們的目標(biāo)是展示如何利用這些技術(shù)來(lái)創(chuàng)造直觀(guān)、身臨其境的體驗(yàn),讓用戶(hù)以一種更自然、更免提的方式與模型或環(huán)境互動(dòng)。
在許多情況下,傳統(tǒng)的交互方法(如按鈕或屏幕)可能會(huì)受到限制。通過(guò)結(jié)合手勢(shì)控制,我們使用戶(hù)無(wú)需觸摸就能與系統(tǒng)互動(dòng),增加了靈活性和可訪(fǎng)問(wèn)性。這一概念適用于:
?智能建筑:對(duì)人類(lèi)輸入做出反應(yīng)的建筑或空間。
?交互式展覽:用戶(hù)可以通過(guò)簡(jiǎn)單的手勢(shì)控制模型或顯示系統(tǒng)。
?公共空間:用于與技術(shù)的非接觸式交互,確保易用性和可達(dá)性。
它是如何工作的
手勢(shì)識(shí)別該系統(tǒng)使用帶有攝像頭的樹(shù)莓派5來(lái)實(shí)時(shí)檢測(cè)手勢(shì)。使用TensorFlow Lite模型進(jìn)行有效的手勢(shì)分類(lèi)。我們訓(xùn)練模型識(shí)別特定的手勢(shì):
?向左滑動(dòng):?jiǎn)?dòng)模型左側(cè)的打開(kāi)。
?向右滑動(dòng):觸發(fā)右側(cè)打開(kāi)。
?T-pose:命令模型繞其中心軸旋轉(zhuǎn)。
驅(qū)動(dòng)(樹(shù)莓派Pico)樹(shù)莓派Pico作為伺服電機(jī)的實(shí)時(shí)控制器,對(duì)模型進(jìn)行物理操作:
?兩個(gè)伺服電機(jī)控制著建筑左右兩側(cè)的開(kāi)口。
?當(dāng)檢測(cè)到t姿勢(shì)手勢(shì)時(shí),一個(gè)中央伺服電機(jī)控制模型的旋轉(zhuǎn)。
?Pi 5(用于手勢(shì)檢測(cè))和Pico(用于實(shí)時(shí)電機(jī)控制)之間的這種分工確保了系統(tǒng)以最小的延遲高效運(yùn)行。
技術(shù)棧
樹(shù)莓派5:
?使用TensorFlow Lite運(yùn)行手勢(shì)檢測(cè)模型,以實(shí)現(xiàn)高效的基于邊緣的機(jī)器學(xué)習(xí)推理
?使用OpenCV處理攝像頭輸入和檢測(cè)手勢(shì)。
TensorFlow Lite: TensorFlow的輕量級(jí)版本,針對(duì)樹(shù)莓派等邊緣設(shè)備進(jìn)行了優(yōu)化。它可以實(shí)現(xiàn)高效的實(shí)時(shí)手勢(shì)識(shí)別。
有限狀態(tài)機(jī):跟蹤用戶(hù)手勢(shì)并解釋動(dòng)作序列以確定適當(dāng)?shù)哪P晚憫?yīng)。FSM確保動(dòng)作只有在正確的手勢(shì)執(zhí)行時(shí)才會(huì)發(fā)生。
樹(shù)莓派Pico:與伺服電機(jī)接口的微控制器,用于實(shí)時(shí)控制模型的運(yùn)動(dòng)。
伺服電機(jī):控制模型打開(kāi)和旋轉(zhuǎn)的物理執(zhí)行器。這些都是通過(guò)樹(shù)莓派Pico供電和控制的。
定制設(shè)計(jì)模型:UoM工程建筑模型是用泡沫板和3d打印部件手工制作的,以創(chuàng)建結(jié)構(gòu)的功能表示。該模型設(shè)計(jì)有三個(gè)關(guān)鍵的移動(dòng)部件:
?左側(cè)開(kāi)口
?右側(cè)開(kāi)口
?中心旋轉(zhuǎn)機(jī)構(gòu)
我們學(xué)到了什么
嵌入式設(shè)備上的實(shí)時(shí)機(jī)器學(xué)習(xí):使用樹(shù)莓派5進(jìn)行實(shí)時(shí)手勢(shì)識(shí)別,與TensorFlow Lite配對(duì),證明既高效又響應(yīng)迅速。
伺服控制:管理樹(shù)莓派Pico的實(shí)時(shí)驅(qū)動(dòng)和協(xié)調(diào)伺服運(yùn)動(dòng)是具有挑戰(zhàn)性的,但展示了使用低成本硬件創(chuàng)建交互式模型的能力。
手勢(shì)靈敏度和校準(zhǔn):微調(diào)手勢(shì)檢測(cè)需要反復(fù)測(cè)試,以平衡精度和響應(yīng)在不同的照明條件和環(huán)境。
潛在應(yīng)用
AURA項(xiàng)目展示了基于手勢(shì)的控制系統(tǒng)在各個(gè)領(lǐng)域應(yīng)用的潛力:
互動(dòng)展覽:博物館、科學(xué)中心和教育機(jī)構(gòu)可以使用手勢(shì)控制模型來(lái)吸引游客,并以動(dòng)手的方式展示復(fù)雜的系統(tǒng)。
智能建筑:這個(gè)概念可以演變成一個(gè)系統(tǒng),用戶(hù)可以通過(guò)手勢(shì)控制建筑元素,比如百葉窗、窗戶(hù)甚至房間。
公共空間:在商場(chǎng)、公共交通或智能城市等環(huán)境中,用戶(hù)可以通過(guò)手勢(shì)與數(shù)字顯示器、模型甚至物理結(jié)構(gòu)進(jìn)行交互,從而減少了對(duì)物理接觸點(diǎn)的需求。
結(jié)論
AURA項(xiàng)目表明,機(jī)器學(xué)習(xí)和嵌入式系統(tǒng)可以無(wú)縫集成,以創(chuàng)建免提的交互式體驗(yàn)。通過(guò)使用簡(jiǎn)單的手勢(shì)來(lái)控制物理模型,我們提供了直觀(guān)的、響應(yīng)式架構(gòu)的未來(lái)一瞥。
我們相信這個(gè)項(xiàng)目只是一個(gè)開(kāi)始,隨著進(jìn)一步的發(fā)展,它可以擴(kuò)展到智慧城市、無(wú)障礙技術(shù)和教育工具的應(yīng)用中。
代碼
#include
Servo rightServo;
Servo leftServo;
const int ledPin = 25; // Onboard LED for Pico
const int rightPin = 2; // GP2 (physical pin 4)
const int leftPin = 3; // GP3 (physical pin 5)
const int inp1 = 0; // Right servo control (active HIGH)
const int inp2 = 1; // Left servo control (active HIGH)
// Servo states (FSM)
bool rightServoState = false; // false=0°, true=180°
bool leftServoState = false; // false=0°, true=180°
// Previous input states for edge detection
bool prevInp1 = LOW;
bool prevInp2 = LOW;
void setup() {
pinMode(ledPin, OUTPUT);
rightServo.attach(rightPin);
leftServo.attach(leftPin);
pinMode(inp1, INPUT); // pull low resistor, input from Pi5
pinMode(inp2, INPUT); // pull low resistor, input from Pi5
// Initialize
rightServo.write(0);
leftServo.write(0);
digitalWrite(ledPin, LOW);
}
void loop() {
// Read current inputs
bool currentInp1 = digitalRead(inp1);
bool currentInp2 = digitalRead(inp2);
// Right servo control (trigger on rising edge)
if (currentInp1 == HIGH && prevInp1 == LOW) {
rightServoState = !rightServoState; // Toggle state
if (rightServoState) { // If true, set to 90°
rightServo.write(90);
digitalWrite(ledPin, HIGH);
} else { // If false, set to 0°
rightServo.write(0);
digitalWrite(ledPin, LOW);
}
}
prevInp1 = currentInp1;
// Left servo control (trigger on rising edge)
if (currentInp2 == HIGH && prevInp2 == LOW) {
leftServoState = !leftServoState; // Toggle state
if (leftServoState) { // If true, set to 90°
leftServo.write(90);
} else { // If false, set to 0°
leftServo.write(0);
}
}
prevInp2 = currentInp2;
delay(10); // Minimal delay to prevent busy-waiting
}
本文編譯自hackster.io