UoM工程大樓的手勢控制模型使用Pi 5 + ML -揮揮手,建筑就會移動。
我們開發(fā)了一個交互式的,由手勢控制的曼徹斯特大學工程大樓的比例模型,由機器學習和嵌入式系統(tǒng)提供動力。
我們的模型實時響應手勢:
?向左滑動→左邊的建筑打開
?向右滑動→右側打開
?舉起雙臂做t字姿勢→整個建筑旋轉
這種非接觸式控制系統(tǒng)允許用戶以一種全新的方式與物理結構進行交互,為教育工具,展覽和智能環(huán)境提供了無限的可能性。
我們?yōu)槭裁匆ㄔ焖?/strong>
我們開始探索如何使用手勢識別和嵌入式機器學習來控制物理模型。我們的目標是展示如何利用這些技術來創(chuàng)造直觀、身臨其境的體驗,讓用戶以一種更自然、更免提的方式與模型或環(huán)境互動。
在許多情況下,傳統(tǒng)的交互方法(如按鈕或屏幕)可能會受到限制。通過結合手勢控制,我們使用戶無需觸摸就能與系統(tǒng)互動,增加了靈活性和可訪問性。這一概念適用于:
?智能建筑:對人類輸入做出反應的建筑或空間。
?交互式展覽:用戶可以通過簡單的手勢控制模型或顯示系統(tǒng)。
?公共空間:用于與技術的非接觸式交互,確保易用性和可達性。
它是如何工作的
手勢識別該系統(tǒng)使用帶有攝像頭的樹莓派5來實時檢測手勢。使用TensorFlow Lite模型進行有效的手勢分類。我們訓練模型識別特定的手勢:
?向左滑動:啟動模型左側的打開。
?向右滑動:觸發(fā)右側打開。
?T-pose:命令模型繞其中心軸旋轉。
驅動(樹莓派Pico)樹莓派Pico作為伺服電機的實時控制器,對模型進行物理操作:
?兩個伺服電機控制著建筑左右兩側的開口。
?當檢測到t姿勢手勢時,一個中央伺服電機控制模型的旋轉。
?Pi 5(用于手勢檢測)和Pico(用于實時電機控制)之間的這種分工確保了系統(tǒng)以最小的延遲高效運行。
技術棧
樹莓派5:
?使用TensorFlow Lite運行手勢檢測模型,以實現(xiàn)高效的基于邊緣的機器學習推理
?使用OpenCV處理攝像頭輸入和檢測手勢。
TensorFlow Lite: TensorFlow的輕量級版本,針對樹莓派等邊緣設備進行了優(yōu)化。它可以實現(xiàn)高效的實時手勢識別。
有限狀態(tài)機:跟蹤用戶手勢并解釋動作序列以確定適當?shù)哪P晚憫SM確保動作只有在正確的手勢執(zhí)行時才會發(fā)生。
樹莓派Pico:與伺服電機接口的微控制器,用于實時控制模型的運動。
伺服電機:控制模型打開和旋轉的物理執(zhí)行器。這些都是通過樹莓派Pico供電和控制的。
定制設計模型:UoM工程建筑模型是用泡沫板和3d打印部件手工制作的,以創(chuàng)建結構的功能表示。該模型設計有三個關鍵的移動部件:
?左側開口
?右側開口
?中心旋轉機構
我們學到了什么
嵌入式設備上的實時機器學習:使用樹莓派5進行實時手勢識別,與TensorFlow Lite配對,證明既高效又響應迅速。
伺服控制:管理樹莓派Pico的實時驅動和協(xié)調伺服運動是具有挑戰(zhàn)性的,但展示了使用低成本硬件創(chuàng)建交互式模型的能力。
手勢靈敏度和校準:微調手勢檢測需要反復測試,以平衡精度和響應在不同的照明條件和環(huán)境。
潛在應用
AURA項目展示了基于手勢的控制系統(tǒng)在各個領域應用的潛力:
互動展覽:博物館、科學中心和教育機構可以使用手勢控制模型來吸引游客,并以動手的方式展示復雜的系統(tǒng)。
智能建筑:這個概念可以演變成一個系統(tǒng),用戶可以通過手勢控制建筑元素,比如百葉窗、窗戶甚至房間。
公共空間:在商場、公共交通或智能城市等環(huán)境中,用戶可以通過手勢與數(shù)字顯示器、模型甚至物理結構進行交互,從而減少了對物理接觸點的需求。
結論
AURA項目表明,機器學習和嵌入式系統(tǒng)可以無縫集成,以創(chuàng)建免提的交互式體驗。通過使用簡單的手勢來控制物理模型,我們提供了直觀的、響應式架構的未來一瞥。
我們相信這個項目只是一個開始,隨著進一步的發(fā)展,它可以擴展到智慧城市、無障礙技術和教育工具的應用中。
代碼
#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





