जुकियाओ स्पर्शनीय दस्ताने

सॉफ़्टवेयर एवं ड्राइवर सेटअप

यूएसबी सीडीसी ड्राइवर स्थापित करें, पायथन में 64-नोड दबाव डेटा स्ट्रीम करें, संपर्क हीटमैप्स की कल्पना करें, और ओर्का हैंड रिकॉर्डिंग पाइपलाइनों के साथ एकीकृत करें।

चरण 1 - स्थापना

ज्यूकियाओ-ग्लव पैकेज स्थापित करें

दस्ताना यूएसबी सीडीसी सीरियल पर संचार करता है - कोई कर्नेल मॉड्यूल नहीं, कोई कस्टम ड्राइवर नहीं। पायथन पैकेज रैप्स पाइसरियल और बाइनरी फ्रेम प्रोटोकॉल को संभालता है।

कोई भी OS समर्थित दस्ताना एक मानक सीडीसी-एसीएम सीरियल डिवाइस के रूप में दिखाई देता है। विंडोज़, मैकओएस और लिनक्स सभी इनबॉक्स ड्राइवरों के साथ स्वचालित रूप से इसकी गणना करते हैं। किसी विक्रेता ड्राइवर इंस्टॉलर की आवश्यकता नहीं है.
# Python 3.10+ recommended पिप इंस्टाल ज्यूकियाओ-ग्लव # Or with optional visualization extras (matplotlib, numpy) पिप इंस्टाल "जुकियाओ-ग्लव[अर्थात्]" # Or with ROS2 bridge extras (requires ROS2 Humble or later) पिप इंस्टाल "जुकियाओ-ग्लव[रोस2]"

इंस्टॉल सत्यापित करें:

पायथन -सी "आयात juqiao_glove; प्रिंट (juqiao_glove.__version__)" # Expected: 0.4.x or later
चरण 2 - पोर्ट डिटेक्शन

यूएसबी पोर्ट का पता लगा रहा है

1.5 मीटर यूएसबी-सी केबल के माध्यम से दस्ताने को प्लग इन करें। डिवाइस सीडीसी-एसीएम सीरियल पोर्ट के रूप में गणना करता है।

OSविशिष्ट पोर्ट नामटिप्पणियाँ
लिनक्स/dev/ttyACM0उपयोगकर्ता को इसमें जोड़ें डायल करें यदि अनुमति अस्वीकृत हो तो समूह बनाएं
मैक ओएस/dev/tty.usbmodem*उपयोग ls /dev/tty.usb* सटीक नाम खोजने के लिए
खिड़कियाँCOM3 (भिन्न होता है)डिवाइस मैनेजर की जाँच करें → पोर्ट (COM और LPT)

पायथन से दस्ताने का स्वतः पता लगाएं:

juqiao_glove से JuqiaoGlove आयात करें # Auto-scan all serial ports and return the first Juqiao device found दस्ताना = JuqiaoGlove.find() प्रिंट(दस्ताना.पोर्ट) # → '/dev/ttyACM0' or 'COM3' etc. प्रिंट(दस्ताना.जानकारी()) # → firmware version, node count, sample rate

या पोर्ट को स्पष्ट रूप से निर्दिष्ट करें:

दस्ताना = JuqiaoGlove(port='/dev/ttyACM0', बॉड्रेट=3000000)
लिनक्स अनुमति त्रुटि? दौड़ना sudo usermod -aG डायलआउट $USER फिर लॉग आउट करें और वापस अंदर आएं। वैकल्पिक रूप से, उपयोग करें सुडो chmod 666 /dev/ttyACM0 एक-सत्र के समाधान के लिए।
चरण 3 - स्ट्रीमिंग एपीआई

पायथन स्ट्रीमिंग एपीआई

दस्ताना 200 हर्ट्ज़ पर प्रवाहित होता है। प्रत्येक फ्रेम में 64-तत्व दबाव सरणी (16-बिट एडीसी, सामान्यीकृत 0.0-1.0) और एक टाइमस्टैम्प होता है।

juqiao_glove से JuqiaoGlove आयात करें आयात समय दस्ताना = JuqiaoGlove.find() दस्ताना.कनेक्ट() # Single-frame read फ़्रेम = ग्लव.रीड_फ़्रेम() प्रिंट(फ़्रेम.टाइमस्टैम्प) # float, seconds since epoch प्रिंट(फ़्रेम.दबाव) # np.ndarray shape (64,), float32, range 0.0-1.0 प्रिंट(frame.pressures.reshape(8,8)) # 8×8 spatial grid # Continuous callback stream डीईएफ़ on_frame(फ़्रेम): max_node = फ़्रेम.दबाव.argmax() प्रिंट(f"t={frame.timestamp:.4f}peak_node={max_node} val={frame.pressures[max_node]:.3f}") Glove.stream(कॉलबैक=on_frame, अवधि=5.0) # stream for 5 seconds # Or use as an iterator ग्लव.स्ट्रीम() के साथ फ्रेम के रूप में: फ़्रेम में फ़्रेम के लिए: प्रक्रिया(फ़्रेम) यदि किया गया: तोड़ना दस्ताना.डिस्कनेक्ट()

फ़्रेम ऑब्जेक्ट संदर्भ

गुणप्रकारविवरण
फ़्रेम.टाइमस्टैम्पतैरनाहोस्ट-साइड प्राप्त समय (सेकंड, यूनिक्स युग)
फ्रेम.दबावnp.ndarray (64,)प्रति नोड सामान्यीकृत दबाव, 0.0 (कोई नहीं) से 1.0 (अधिकतम)
फ़्रेम.दबाव_कच्चाnp.ndarray (64,)रॉ 16-बिट एडीसी गणना (0-65535)
फ़्रेम.संपर्क_मास्कnp.ndarray (64,) बूलसत्य जहां दबाव सीमा से अधिक है (डिफ़ॉल्ट 0.05)
फ़्रेम.संपर्क_नोड्ससूची[int]वर्तमान में संपर्क में नोड्स के सूचकांक
फ़्रेम.grasp_regionstr या कोई नहींअनुमानी क्षेत्र: "हथेली", "अँगूठा", "अनुक्रमणिका", "मध्य", "अँगूठी", "पिंकी", कोई नहीं
फ़्रेम.अनुक्रमint यहाँफ़्रेम काउंटर (65535 पर लपेटता है); गिरे हुए फ़्रेम का पता लगाने के लिए उपयोग करें
संदर्भ - सेंसर लेआउट

64-नोड सेंसर लेआउट

64 टैक्सल्स को एक बुने हुए फाइबर मैट्रिक्स के रूप में व्यवस्थित किया गया है जो हथेली और सभी पांच अंगुलियों के खंडों को कवर करता है। नोड सूचकांक एक सुसंगत पृष्ठीय-दृश्य पंक्ति-प्रमुख क्रम का पालन करते हैं।

0–12
हथेली (केंद्रीय पैड)
13–23
अंगूठा (3 खंड)
24–34
तर्जनी
35–45
बीच की ऊँगली
46–54
रिंग फिंगर
55–63
कनिष्ठा # छोटी अंगुली
# Access region slices by name juqiao_glove.layout से REGION_SLICES आयात करें पाम_नोड = फ्रेम.दबाव[क्षेत्र_स्लाइस["हथेली"]] थंब_नोड्स = फ़्रेम.दबाव [क्षेत्र_स्लाइसेस ["अंगूठे"]] Index_nodes = फ्रेम.दबाव[REGION_SLICES["index"]] # Reshape to 8×8 spatial grid (dorsal view, row-major) ग्रिड = फ़्रेम.दबाव.रीशेप(8, 8)
वैकल्पिक - विज़ुअलाइज़ेशन

दबाव हीटमैप विज़ुअलाइज़ेशन

The [अर्थात्] अतिरिक्त अंशांकन और डिबगिंग के लिए उपयोगी एक लाइव मैटप्लोटलिब हीटमैप रेंडरर स्थापित करता है।

# Requires: pip install "juqiao-glove[viz]" juqiao_glove से JuqiaoGlove आयात करें juqiao_glove.viz से PressureHeatmap आयात करें दस्ताना = JuqiaoGlove.find() दस्ताना.कनेक्ट() अर्थात = प्रेशरहीटमैप (शीर्षक = "जुकिआओ ग्लव - लाइव प्रेशर") अर्थात दिखाओ(दस्ताना) # Opens a matplotlib window; press Q to quit

बिना सोचे-समझे वातावरण या डेटा समीक्षा के लिए, फ़्रेम को वीडियो के रूप में सहेजें:

juqiao_glove.viz से रिकॉर्ड_हीटमैप_वीडियो आयात करें रिकॉर्ड_हीटमैप_वीडियो( इनपुट_एनपीवाई=सत्र_दबाव.एनपीवाई, # shape (N, 64) saved during recording आउटपुट_mp4='हीटमैप.mp4', एफपीएस=30, कलरमैप = "इन्फर्नो", )
वैकल्पिक - ROS2

ROS2 इंटरफ़ेस

The juqiao_glove_ros2 पैकेज एक कस्टम प्रकाशित करता है TactileArray 200 हर्ट्ज पर संदेश. ROS2 हंबल और आयरन के साथ संगत।

# Install the package (requires ROS2 to be sourced) पिप इंस्टाल "जुकियाओ-ग्लव[रोस2]" # Or build from source in your workspace सीडी ~/ros2_ws/src गिट क्लोन https://github.com/roboticscenter/juqiao_glove_ros2 सीडी ~/ros2_ws && कोलकॉन बिल्ड --पैकेज-सेलेक्ट juqiao_glove_ros2

ड्राइवर नोड लॉन्च करें:

स्रोत /opt/ros/humble/setup.bash स्रोत ~/ros2_ws/install/setup.bash # Auto-detect port ros2 लॉन्च juqiao_glove_ros2 glove.launch.py # Specify port explicitly ros2 लॉन्च किया गया juqiao_glove_ros2 glove.launch.py ​​​​पोर्ट:=/dev/ttyACM0

प्रकाशित विषय:

विषयसंदेश प्रकारदरविवरण
/juqiao_glove/tactile_arrayjuqiao_glove_ros2/TactileArray200 हर्ट्जपूर्ण 64-नोड दबाव सारणी
/juqiao_glove/contact_maskstd_msgs/UInt8MultiArray200 हर्ट्जप्रति नोड बाइनरी संपर्क (0 या 1)
/juqiao_glove/grasp_regionstd_msgs/स्ट्रिंग200 हर्ट्जसक्रिय क्षेत्र अनुमानी या खाली स्ट्रिंग
/juqiao_glove/statusडायग्नोस्टिक_एमएसजीएस/डायग्नोस्टिकस्टेटस1 हर्ट्जफ़र्मवेयर संस्करण, फ़्रेम ड्रॉप दर

संयुक्त ओर्का हैंड + ग्लव लॉन्च

सिंक्रनाइज़ रिकॉर्डिंग के लिए ओर्का हैंड के साथ दस्ताने का उपयोग करते समय:

# Launch Orca Hand driver ros2 लॉन्च Orca_ros2 Orca_hand.launch.py ​​port:=/dev/ttyUSB0 # In a second terminal, launch Juqiao Glove driver ros2 लॉन्च किया गया juqiao_glove_ros2 glove.launch.py ​​​​पोर्ट:=/dev/ttyACM0 # Verify synchronized topics ros2 सामग्री तालिका | grep -e "orca|juqiao" ros2 विषय hz /juqiao_glove/tactile_array ros2 विषय hz /orca_hand/joint_states
चरण 4 - अंशांकन

बेसलाइन अंशांकन

फ़ैक्टरी अंशांकन के साथ दस्ताना जहाज। यदि आप बेसलाइन बहाव (आराम पर गैर-शून्य पढ़ने वाले नोड्स) या विस्तारित भंडारण के बाद देखते हैं तो पुन: कैलिब्रेट करें।

अंशांकन करने से पहले दस्ताना हटा दें अंशांकन शून्य-दबाव आधार रेखा को कैप्चर करता है। अंशांकन अनुक्रम के दौरान दस्ताने को न पहनें या स्पर्श न करें - इसे सतह पर सपाट रखें।
# CLI calibration — lay glove flat, do not touch पायथन -एम juqiao_glove.calibrate --पोर्ट /dev/ttyACM0 # Or from Python juqiao_glove से JuqiaoGlove आयात करें दस्ताना = JuqiaoGlove.find() दस्ताना.कनेक्ट() Glove.calibrate_baseline(अवधि=3.0) # averages 3 seconds of idle frames glove.save_calibration("~/.juqiao_glove_cal.json") दस्ताना.डिस्कनेक्ट()

रनटाइम पर लोड अंशांकन:

दस्ताना = JuqiaoGlove.find() दस्ताना.कनेक्ट() glove.load_calibration("~/.juqiao_glove_cal.json") # Now frame.pressures reflects calibrated values फ़्रेम = ग्लव.रीड_फ़्रेम() प्रिंट(frame.pressures.max()) # Should be ~0.0 at rest

दहलीज ट्यूनिंग

डिफ़ॉल्ट संपर्क सीमा 0.05 (पूर्ण पैमाने का 5%) है। प्रति कार्य समायोजित करें:

# For delicate objects (lower threshold detects light touch) Glove.set_contact_threshold(0.02) # For heavy manipulation tasks (reduce false positives) Glove.set_contact_threshold(0.10) # Per-region thresholds glove.set_contact_threshold({"हथेली": 0.08, "अंगूठे": 0.03, "सूचकांक": 0.03})
समस्या निवारण

सामान्य मुद्दे

सीरियल अपवाद: [एर्नो 13] अनुमति अस्वीकृत: '/dev/ttyACM0'
दौड़ना sudo usermod -aG dialout $USER फिर लॉग आउट करें और वापस अंदर आएं। वैकल्पिक रूप से: sudo chmod 666 /dev/ttyACM0 (अनप्लग पर रीसेट होता है)।
JuqiaoGlove.find() ने कोई नहीं लौटाया - कोई उपकरण नहीं मिला
यूएसबी कनेक्शन जांचें. दौड़ना dmesg | tail -20 (लिनक्स) या ls /dev/tty.usb* (macOS) OS को सत्यापित करने के लिए डिवाइस की गणना करता है। एक अलग यूएसबी पोर्ट या केबल आज़माएं (कनेक्टर यूएसबी-सी है लेकिन डेटा केबल होना चाहिए, केवल चार्ज करने के लिए नहीं)।
सभी 64 नोड्स 0.0 पढ़ते हैं - कोई दबाव डेटा नहीं
पुकारना glove.info() फ़र्मवेयर प्रतिक्रिया की पुष्टि करने के लिए। यदि ऐसा होता है, तो जाँच लें कि अंशांकन फ़ाइल अधिक घटाव तो नहीं कर रही है। मिटाना ~/.juqiao_glove_cal.json और दस्तानों को सपाट रखकर पुन: अंशांकित करें।
बेसलाइन बहाव - आराम पर नोड्स 0.1-0.2 पढ़ते हैं
पुन: कैलिब्रेट करें: बिना किसी दबाव के दस्ताने को सीधा रखें और दौड़ें glove.calibrate_baseline(). तापमान परिवर्तन या विस्तारित भंडारण के बाद हो सकता है। यदि ग्लव फ़्लैट के साथ बहाव> 0.4 है, तो सेंसिंग फैब्रिक को प्रतिस्थापन की आवश्यकता हो सकती है (जुकियाओ समर्थन से संपर्क करें)।
फ़्रेम गिरता है - अनुक्रम संख्याएँ छूट जाती हैं
यूएसबी केबल की गुणवत्ता और पोर्ट की जांच करें। USB 3.0 पोर्ट का उपयोग करें. लिनक्स पर, अन्य उच्च-बैंडविड्थ उपकरणों के साथ यूएसबी हब से बचें। अपना सुनिश्चित करें on_frame कॉलबैक जल्दी लौटता है - एक अलग थ्रेड में भारी प्रोसेसिंग करें।
ROS2 नोड प्रारंभ होता है लेकिन /juqiao_glove/tactile_array पर कोई संदेश नहीं
पोर्ट तर्क सत्यापित करें: ros2 launch juqiao_glove_ros2 glove.launch.py port:=/dev/ttyACM0. नोड लॉग जांचें: ros2 node info /juqiao_glove_driver. सुनिश्चित करें dialout ROS2 नोड चलाने वाले उपयोगकर्ता पर समूह फिक्स लागू किया गया था।