قفاز جوكياو اللمسي

إعداد البرامج وبرامج التشغيل

قم بتثبيت برنامج تشغيل USB CDC، ودفق بيانات الضغط ذات 64 عقدة في Python، وتصور خرائط حرارة الاتصال، والتكامل مع خطوط أنابيب تسجيل Orca Hand.

الخطوة 1 - التثبيت

قم بتثبيت حزمة juqiao-glove

يتصل القفاز عبر USB CDC التسلسلي - لا توجد وحدات kernel ولا برامج تشغيل مخصصة. تلتف حزمة بايثون pyserial ويتعامل مع بروتوكول الإطار الثنائي.

أي نظام تشغيل مدعوم تظهر القفاز كجهاز تسلسلي قياسي من نوع CDC-ACM. تقوم أنظمة التشغيل Windows وmacOS وLinux بتعدادها تلقائيًا باستخدام برامج تشغيل البريد الوارد. لا يلزم تثبيت برنامج تشغيل البائع.
# Python 3.10+ recommended نقطة تثبيت juqiao-glove # Or with optional visualization extras (matplotlib, numpy) تثبيت النقطة "juqiao-glove[viz]" # Or with ROS2 bridge extras (requires ROS2 Humble or later) تثبيت النقطة "juqiao-glove[ros2]"

التحقق من التثبيت:

python -c "استيراد juqiao_glove؛ طباعة (juqiao_glove.__version__)" # Expected: 0.4.x or later
الخطوة 2 – اكتشاف المنفذ

الكشف عن منفذ USB

قم بتوصيل القفاز عبر كابل USB-C بطول 1.5 متر. يعدد الجهاز كمنفذ تسلسلي CDC-ACM.

OSاسم المنفذ النموذجيملحوظات
لينكس/dev/ttyACM0إضافة مستخدم إلى اتصال المجموعة إذا تم رفض الإذن
ماك/dev/tty.usbmodem*يستخدم ليرة سورية /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. طباعة (glove.info()) # → firmware version, node count, sample rate

أو حدد المنفذ بشكل صريح:

القفاز = JuqiaoGlove(port="/dev/ttyACM0"، معدل الباود=3000000)
خطأ في إذن لينكس؟ يجري Sudo usermod -aG اطلب $USER ثم قم بتسجيل الخروج ثم قم بتسجيل الدخول مرة أخرى. وبدلاً من ذلك، استخدم سودو chmod 666 /dev/ttyACM0 للحصول على حل بديل لجلسة واحدة.
الخطوة 3 - واجهة برمجة التطبيقات للبث

واجهة برمجة تطبيقات تدفق بايثون

يتدفق القفاز بسرعة 200 هرتز. يحتوي كل إطار على مصفوفة ضغط مكونة من 64 عنصرًا (ADC 16 بت، تمت تسويتها من 0.0 إلى 1.0) بالإضافة إلى طابع زمني.

من juqiao_glove قم باستيراد JuqiaoGlove وقت الاستيراد القفاز = JuqiaoGlove.find() القفاز. الاتصال () # Single-frame read الإطار = قفاز.read_frame() طباعة (الإطار. الطابع الزمني) # 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 =frame.pressures.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 مع glove.stream() كإطارات: للإطار في الإطارات: عملية (الإطار) إذا تم: استراحة القفاز. قطع الاتصال ()

مرجع كائن الإطار

يصفيكتبوصف
الإطار.الطابع الزمنييطفووقت الاستلام من جانب المضيف (بالثواني، عصر Unix)
frame.pressuresnp.ndarray (64،)الضغط الطبيعي لكل عقدة، 0.0 (لا شيء) إلى 1.0 (كحد أقصى)
frame.pressures_rawnp.ndarray (64،)عدد ADC الأولي 16 بت (0–65535)
frame.contact_masknp.ndarray (64,) منطقيصحيح عندما يتجاوز الضغط العتبة (الافتراضي 0.05)
frame.contact_nodesقائمة [كثافة العمليات]مؤشرات العقد الموجودة حاليًا على اتصال
frame.grasp_regionشارع أو لا شيءالمنطقة الإرشادية: "نخل", "إبهام", "فِهرِس", "وسط", "جرس", "الخنصر", لا أحد
frame.sequenceكثافة العملياتعداد الإطار (يلتف عند 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 palm_nodes = إطار.الضغوطات[REGION_SLICES["palm"]] Thumb_nodes = إطار.الضغوطات[REGION_SLICES["thumb"]] فهرس_العقد = إطار.الضغوط[REGION_SLICES["index"]] # Reshape to 8×8 spatial grid (dorsal view, row-major) الشبكة = الإطار. الضغوط. إعادة الشكل (8، 8)
اختياري – التصور

تصور خريطة الحرارة للضغط

ال [بمعنى] يقوم الإضافي بتثبيت عارض خريطة الحرارة matplotlib المباشر المفيد للمعايرة وتصحيح الأخطاء.

# Requires: pip install "juqiao-glove[viz]" من juqiao_glove قم باستيراد JuqiaoGlove من juqiao_glove.viz قم باستيراد خريطة الضغط الحراري القفاز = JuqiaoGlove.find() القفاز. الاتصال () بمعنى = PressureHeatmap(title="قفاز Juqiao - الضغط المباشر") بمعنى عرض (قفاز) # Opens a matplotlib window; press Q to quit

بالنسبة للبيئات بدون رأس أو مراجعة البيانات، احفظ الإطارات كفيديو:

من juqiao_glove.viz قم باستيراد Record_heatmap_video Record_heatmap_video( input_npy = "session_pressures.npy"، # shape (N, 64) saved during recording output_mp4="heatmap.mp4"، إطارا في الثانية = 30، خريطة الألوان = "الجحيم"، )
اختياري - ROS2

واجهة روس2

ال juqiao_glove_ros2 تنشر الحزمة مخصصًا TactileArray رسالة عند 200 هرتز. متوافق مع ROS2 المتواضع والحديد.

# Install the package (requires ROS2 to be sourced) تثبيت النقطة "juqiao-glove[ros2]" # Or build from source in your workspace مؤتمر نزع السلاح ~/ros2_ws/src استنساخ بوابة https://github.com/roboticscenter/juqiao_glove_ros2 cd ~/ros2_ws && colcon build --packages-select 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/String200 هرتزمنطقة نشطة إرشادية أو سلسلة فارغة
/juqiao_glove/statusDiagnostic_msgs/DiagnosticStatus1 هرتزإصدار البرنامج الثابت، معدل سقوط الإطار

إطلاق Orca Hand + Glove المدمج

عند استخدام القفاز بجانب Orca Hand للتسجيل المتزامن:

# Launch Orca Hand driver إطلاق ros2 منفذ orca_ros2 orca_hand.launch.py:=/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 هرتز /juqiao_glove/tactile_array موضوع ros2 هرتز /orca_hand/joint_states
الخطوة 4 - المعايرة

معايرة خط الأساس

يتم شحن القفاز بمعايرة المصنع. قم بإعادة المعايرة إذا لاحظت انحراف خط الأساس (قراءة العقد غير صفرية في حالة السكون) أو بعد التخزين الممتد.

قم بإزالة القفاز قبل المعايرة تلتقط المعايرة خط الأساس للضغط الصفري. لا ترتدي القفاز أو تلمسه أثناء تسلسل المعايرة - ضعه بشكل مسطح على السطح.
# CLI calibration — lay glove flat, do not touch python -m juqiao_glove.calibrate --port /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 الإطار = قفاز.read_frame() طباعة (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})
استكشاف الأخطاء وإصلاحها

القضايا المشتركة

استثناء تسلسلي: [Errno 13] تم رفض الإذن: '/dev/ttyACM0'
يجري sudo usermod -aG dialout $USER ثم قم بتسجيل الخروج ثم قم بتسجيل الدخول مرة أخرى. وبدلاً من ذلك: sudo chmod 666 /dev/ttyACM0 (إعادة تعيين على افصل).
JuqiaoGlove.find() أعاد لا شيء — لم يتم العثور على أي جهاز
تحقق من اتصال USB. يجري dmesg | tail -20 (لينكس) أو ls /dev/tty.usb* (macOS) للتحقق من تعداد نظام التشغيل للجهاز. جرّب منفذ USB أو كابلًا مختلفًا (الموصل هو USB-C ولكن يجب أن يكون كبل بيانات، وليس للشحن فقط).
جميع العقد الـ 64 تقرأ 0.0 — لا توجد بيانات ضغط
يتصل glove.info() لتأكيد استجابة البرامج الثابتة. إذا كان الأمر كذلك، فتأكد من عدم الإفراط في طرح ملف المعايرة. يمسح ~/.juqiao_glove_cal.json وأعد المعايرة مع وضع القفاز بشكل مسطح.
الانجراف الأساسي - قراءة العقد 0.1-0.2 في حالة الراحة
إعادة المعايرة: ضع القفاز بشكل مسطح دون الضغط ثم قم بالجري glove.calibrate_baseline(). يمكن أن يحدث بعد تغيرات درجة الحرارة أو التخزين الممتد. إذا كان الانجراف أكبر من 0.4 مع قفاز مسطح، فقد يحتاج نسيج الاستشعار إلى الاستبدال (اتصل بدعم Juqiao).
قطرات الإطار - تخطي الأرقام التسلسلية
تحقق من جودة كابل USB ومنفذه. استخدم منفذ USB 3.0. في نظام التشغيل Linux، تجنب لوحات وصل USB مع الأجهزة الأخرى ذات النطاق الترددي العالي. تأكد من الخاص بك 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.