查看引用/信息源請點擊:中國AI網
將一只普通手套變成VR控制器
(中國AI網 2025年12月01日)薩哈娜·文卡塔拉曼(Sahana Venkataraman)是一位13歲的科技和歷史愛好者,并正致力于利用虛擬現(xiàn)實技術來提高人們對南亞歷史中遭到忽視的歷史奇跡。日前,她分享了自己是如何通過DIY將一只普通手套變成VR控制器:
我制作了一只手套,戴上它后,你只需動動手指就能移動虛擬物體!!下面是我如何一步步實現(xiàn)它的概述,你也可以照著做??

所需材料:
Arduino Uno開發(fā)板
USB A轉USB B數(shù)據(jù)線
2個彎曲傳感器 —— 務必確保它們是彎曲傳感器,而不是”柔性壓力傳感器”,這兩者經常混淆。類似這種:https://ca.robotshop.com/products/22-10k-flexible-sensor?qd=033c88268cfeac91575a5458c805bdf9
一個轉換器(如果你的筆記本電腦沒有USB接口的話)
一雙手套(準備弄壞也無所謂的那種)
熱熔膠槍和膠棒
一臺性能尚可的筆記本電腦 —— 需要安裝的軟件:Unity、代碼編輯器(如VS Code)和Arduino IDE。
公對母跳線 或者 一根你不介意拆掉的舊線纜 + 一把小刀、剝線鉗和剪刀
針和線
步驟1:設置Unity項目
1.1:創(chuàng)建一個新的Unity 3D項目
打開Unity App。
轉到Projects標簽頁→New Project→Universal 3D。
將其重命名為類似”GloveProject”的名字。
當你點擊Open Project時,會開始加載一個新窗口——這就是Unity編輯器,我們將在其中創(chuàng)建場景。
1.2:添加包含物體的場景
在左側的Hierarchy面板中,添加:
一個立方體——這將是我們用手套操控的物體。將其重命名為”TargetCube”。
(按回車鍵或點擊查看完整尺寸圖片)

一個”Create Empty”——這是下拉菜單中的第一個選項。將其重命名為”GloveManager”。
步驟2:在Unity中設置UDP接收器
2.1:創(chuàng)建UDP接收器C#腳本

如上圖所示,右鍵點擊Assets→Create→Scripting→Empty C# Script。將腳本重命名為”Udpreceiver.cs”。
在右側的面板中,點擊”open”來編輯代碼。代碼應該會在你筆記本電腦上下載的代碼編輯器中打開(我使用的是Visual Studio Code)。將以下代碼粘貼到你的代碼編輯器中:
using UnityEngine;using System.Net;using System.Net.Sockets;using System.Text;public class UdpReceiver : MonoBehaviour{ public int port = 5065; // MUST match the Python script UDP_PORT public GameObject targetObject; // assign in Inspector private UdpClient client; private IPEndPoint remoteEndPoint; private string lastMessage = ""; private bool initialized = false; void Start() { try { client = new UdpClient(port); client.Client.Blocking = false; // don't hang if no data remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); initialized = true; Debug.Log("UDP Receiver started on port " + port); } catch (System.Exception e) { Debug.LogError("UDP Receiver error: " + e.Message); } } void Update() { if (!initialized || client == null) return; try { if (client.Available > 0) { byte[] data = client.Receive(ref remoteEndPoint); lastMessage = Encoding.ASCII.GetString(data).Trim(); // Expecting "v1,v2" string[] parts = lastMessage.Split(','); if (parts.Length >= 2) { int sensor1, sensor2; if (int.TryParse(parts[0], out sensor1) && int.TryParse(parts[1], out sensor2)) { if (targetObject != null) { Vector3 p = targetObject.transform.position; // --------------------------- // SENSOR 1 (A0): forward/back (Z) // Bent ≈ 340, straight ≈ 550 // --------------------------- float mapped1 = MapTo01(sensor1, 340f, 550f); // bent, straight mapped1 = Mathf.Pow(mapped1, 2f); // exaggerate float nearZ = 0.5f; // close to camera float farZ = 50f; // far away float newZ = Mathf.Lerp(nearZ, farZ, mapped1); // --------------------------- // SENSOR 2 (A1): up/down (Y) // Bent ≈ 400, straight ≈ 600 // More bend = down, less bend = up // --------------------------- float mapped2 = MapTo01(sensor2, 400f, 600f); // bent, straight mapped2 = Mathf.Pow(mapped2, 2f); // exaggerate float bottomY = 0f; // cube low position float topY = 5f; // cube high position float newY = Mathf.Lerp(bottomY, topY, mapped2); // Apply both targetObject.transform.position = new Vector3(p.x, newY, newZ); } } } } } catch (System.Exception) { // ignore transient UDP errors } } float MapTo01(float value, float min, float max) { if (max <= min) return 0.0f; float t = (value - min) / (max - min); return Mathf.Clamp01(t); } void OnApplicationQuit() { if (client != null) { client.Close(); client = null; } }}此代碼接收我們稍后將插入的傳感器的數(shù)據(jù),并彌合了傳感器數(shù)據(jù)與Unity中立方體之間的差距。
按Cmd/Ctrl+S保存。
2.2:將腳本附加到我們的Unity場景
回到Unity編輯器中,在Hierarchy面板下,點擊我們創(chuàng)建的”GloveManager”。
在右側的Inspector面板中,應該有一個名為”Add Component”的按鈕。點擊它,搜索UDP receiver并添加。
現(xiàn)在,UDP receiver下方應該有一個字段,用于指定目標對象。將Hierarchy面板中的”TargetCube”拖拽到該字段中。

步驟3:為Arduino編程
3.1:通過USB-A轉USB-B數(shù)據(jù)線連接Arduino
使用任何Arduino Uno(兼容板或官方板均可)——用USB線連接到筆記本電腦,如果需要的話使用轉換器。
3.2:將以下代碼上傳到新項目文件中
如果你以前沒用過IDE,這步就是點擊那個寫著”New Sketch”的藍色按鈕。
粘貼并上傳:
const int flex1Pin = A0;const int flex2Pin = A1;void setup() { Serial.begin(9600); pinMode(flex1Pin, INPUT_PULLUP); pinMode(flex2Pin, INPUT_PULLUP);}void loop() { int v1 = analogRead(flex1Pin); int v2 = analogRead(flex2Pin); Serial.print(v1); Serial.print(","); Serial.println(v2); delay(30);}3.3:關閉IDE中的串口監(jiān)視器
一次只能有一個程序使用串口,所以請關閉IDE的串口監(jiān)視器。
步驟4:創(chuàng)建Python→UDP橋接
這部分將Arduino傳感器讀數(shù)轉發(fā)到Unity。
4.1:設置終端和腳本
打開你筆記本電腦的代碼終端,通過粘貼以下命令然后按回車來安裝pyserial:pip3 install pyserial
通過粘貼以下命令/按回車,告訴終端你想將接下來要寫的代碼存儲在你的桌面文件夾:cd ~/Desktop
通過粘貼以下命令創(chuàng)建腳本:nano arduino_to_udp.py
這會帶你到一個空編輯器,在那里你將粘貼以下代碼:
import serialimport socketSERIAL_PORT = "/dev/cu.usbmodemXXXX" # your actual portBAUD_RATE = 9600UDP_IP = "127.0.0.1"UDP_PORT = 5065def main():ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1)sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)print("Forwarding serial → UDP")while True:data = ser.readline().decode("utf-8", errors="ignore").strip()if not data:continuesock.sendto(data.encode(), (UDP_IP, UDP_PORT))print("Serial:", data)if __name__ == "__main__":main()注意到第4行寫著”/dev/cu.usbmodemXXXX”了嗎?用你的實際端口名稱替換掉這整個名字。你可以通過導航到Arduino IDE,點擊Tools并查看”Port”下拉菜單旁邊顯示的名稱來找到它。那就是你要用的那個。
修改完代碼后,按Ctrl+O(是字母O),然后按回車確認,再按Ctrl+X退出。
步驟5:硬件部分!!
現(xiàn)在我們可以做更有趣的事情了——連接傳感器,讓整個系統(tǒng)真正工作起來!
5.1:準備工作——準備好導線
如果你有公對母跳線,我羨慕你。你不需要解剖任何充電線纜——可以忽略這一步。對于像我這樣沒有這種便利條件的人,以下是我如何讓它工作的:
務必確保在使用小刀和剪刀時非常小心
用剪刀剪掉一根你不需要的舊線纜的末端——可以是耳機線、充電線等。你會得到一段裸露的線纜。
用小刀,沿著線纜外部絕緣層的中心切開,小心不要割傷自己或損壞內部線芯。這樣應該更容易剝掉絕緣層。在接觸到內部線芯之前,可能還需要剝掉幾層東西。
大多數(shù)標準充電線有4根線,這正是我們需要的數(shù)量。取4根線,將所有4根線的兩端都剝掉一到兩厘米的絕緣層。我沒有剝線鉗,所以用了小刀——只能說這花了我一些時間。
5.2:連接導線
讓我們從連接第一個傳感器開始。將2根導線的金屬絲擰在一起,然后插入到GND和A0——應該看起來像這樣:

現(xiàn)在,我們將每根導線的自由端纏繞在傳感器各自的引腳上。傳感器應該有兩個引腳,所以將GND線纏繞在一個引腳上,將A0線纏繞在另一個引腳上。確保兩根導線的金屬絲沒有任何部分相互接觸。
通過USB線將你的Arduino連接到筆記本電腦。確保IDE應用程序中的串口監(jiān)視器已關閉,然后運行終端代碼(將以下內容粘貼到終端:python3 arduino_to_udp.py)。
你應該至少得到一個數(shù)字讀數(shù)(我們只連接了一個傳感器)。確保當你相應地彎曲傳感器時,讀數(shù)有顯著變化。記錄傳感器完全彎曲和伸直時的讀數(shù)。如果讀數(shù)不合理,嘗試:
調整連接到Arduino板子的連接
確保兩根導線沒有相互接觸
這通常能解決問題。當你確定連接穩(wěn)定且工作正常后,用熱熔膠將導線粘在傳感器引腳上。確保只粘引腳的中下部,不要碰到傳感器實際塑料底座——這里要非常小心。
如果你有公對母跳線,將公頭插入GND和A0,母頭可以套在傳感器引腳上。
對第二個傳感器重復完全相同的操作,只是將導線插入另一個GND端口和A1(而不是A0)。最終的Arduino導線連接應該看起來像這樣:

最終連接
傳感器1:
導線A→Arduino GND→傳感器引腳
導線B→Arduino A0→傳感器引腳
傳感器2:
導線C→Arduino GND→傳感器引腳
導線D→Arduino A1→傳感器引腳
步驟6:將傳感器縫到手套
將傳感器放在手套的食指和中指上(我把它放在手的前面/手掌側,但你可以選擇任意一側——事后看來,放在手背可能更好)。
用線在傳感器上方縫出環(huán)扣,不要穿過傳感器本身。一個在傳感器頂端,一個在中間,一個靠近底部。
通過在靠近手套中部的位置(如下圖)用線環(huán)固定導線,并在該線環(huán)上加點熱熔膠,來確保導線有一定的松弛度。我還在指尖附近加了幾點熱熔膠,以防止傳感器從縫制的線環(huán)中滑出。

步驟7:運行最終程序!!!
回到Unity編輯器,點擊屏幕頂部的播放按鈕。如果你戴著手套彎曲手指,立方體應該開始移動了!中指控制它的高度,食指控制它的遠近。就這樣,你成功了!現(xiàn)在你只需動動手指就能控制虛擬物體了!
結構概述
項目總結如下:
傳感器發(fā)送數(shù)據(jù)到Arduino IDE→將數(shù)據(jù)轉發(fā)到終端→發(fā)送到Unity中的UDP接收器→根據(jù)Unity 3D場景中的C#腳本控制”TargetCube”
結論
制作這個手套真的很有趣,但有時也相當令人沮喪。無論如何,我會說這一切都是值得的。
目前,它還只是一個立方體。但這個設置實際上是一個可用于任何事物的空白輸入設備:
在VR中抓取和投擲物體
在虛擬博物館中按下看不見的按鈕
改變顏色、觸發(fā)動畫或瀏覽菜單
最終,用你的雙手而不僅僅是眼睛來探索那些未充分代表的南亞歷史奇跡
很酷的一點是,一旦你完成了一次這樣的布線,你就不需要重復那些困難的部分。你可以繼續(xù)重復使用同一只手套和代碼來為新想法、場景和體驗制作原型。
通過這個項目,我學到了從”我有一個想法”到”這個東西存在并且能工作”實際需要付出什么。這個過程并不總是順利的。在某些時候,你會想把你的Arduino掰成兩半。但無論如何都要堅持下去。當整個系統(tǒng)協(xié)同工作時,每一個令人沮喪的時刻都變得值得了:)

