دليل إعداد القفازات اللمسية Juqiao

المسار الكامل من فتح العلبة إلى بيانات الضغط المباشر وتكامل النظام الأساسي. خطط لأقل من 30 دقيقة إجمالاً.

1

ارتدِ القفاز وقم بتوصيل وحدة الاستحواذ

يتم شحن قفاز Juqiao كقفاز من القماش المنسوج مع موصل كابل شريطي عند المعصم. وحدة الاستحواذ عبارة عن حاوية PCB صغيرة منفصلة تتعامل مع التحويل التناظري إلى الرقمي واتصالات USB.

  • ارتدي القفاز كما تفعل مع القفازات القياسية، مع وضع موصل FPC على المعصم.
  • قم بتثبيت كابل الشريط: قم بمحاذاة كابل الشريط FPC من موصل معصم القفاز واضغط عليه بقوة في وعاء الشريط الخاص بوحدة الاستحواذ. تشير النقرة الخافتة إلى مقعد آمن. إذا أظهرت العقد قراءات صفرية، فهذا يعني أن الشريط ليس في مكانه بالكامل - راجع استكشاف الأخطاء وإصلاحها أدناه.
  • تركيب الوحدة: قم بتثبيت وحدة الاقتناء أو تثبيتها بشريط لاصق على حزام المعصم أو حامل الساعد بحيث لا تتداخل مع حركة المعصم أثناء التشغيل عن بعد.
  • توصيل يو اس بي: قم بتوصيل وحدة الاستحواذ بجهاز الكمبيوتر المضيف الخاص بك باستخدام كابل USB المرفق.
لا يوجد برنامج تشغيل مطلوب على Linux وmacOS. يتم تقديم وحدة الاستحواذ كجهاز تسلسلي USB CDC ACM. في Linux يتم تعداده كـ /dev/ttyUSB0 أو /dev/ttyACM0; على نظام التشغيل MacOS مثل /dev/tty.usbserial-*. في نظام التشغيل Windows، قم بتثبيت برنامج التشغيل CP210x أو CH340 المضمن إذا لم يتم تعداد الجهاز تلقائيًا كمنفذ COM.
2

تثبيت Python SDK (pyserial)

لا يلزم وجود SDK للبائع الخاص. تقوم وحدة الاستحواذ بتدفق الحزم الثنائية المؤطرة عبر منفذ تسلسلي قياسي - pyserial هي التبعية الوحيدة.

تثبيت بيسيريال:

pip install pyserial

تأكد من أن المنفذ التسلسلي مرئي:

# Linux
ls /dev/ttyUSB* /dev/ttyACM*

# macOS
ls /dev/tty.usbserial-*

# Or use pyserial's port listing tool
python -m serial.tools.list_ports

تأكيد البث المباشر (فحص السلامة):

# Replace /dev/ttyUSB0 with your port; 921600 is the default baud rate
python -m serial.tools.miniterm /dev/ttyUSB0 921600

يجب أن تشاهد دفقًا من البيانات الثنائية بمعدل العينة الذي تم تكوينه لوحدة الاستحواذ. إذا كان الجهاز صامتًا، فتحقق من اتصال USB ومؤشر LED للوحدة — فيجب أن ينبض بمعدل العينة.

مشكلة إذن لينكس؟ إذا تلقيت خطأ رفض الإذن على Linux، فأضف المستخدم الخاص بك إلى dialout المجموعة وتسجيل الخروج والعودة: sudo usermod -aG dialout $USER
3

قم بتشغيل قارئ إطار بايثون

ترسل وحدة الاستحواذ إطارات ثنائية ذات طول ثابت. يبدأ كل إطار بمحدد بداية مكون من 2 بايت 0xAA 0x55، متبوعًا بعدد قنوات 1 بايت N، N × 2 بايت من قيم الضغط ذات النهاية الكبيرة 16 بت، والمجموع الاختباري CRC16 2 بايت. إجمالي طول الإطار = 5 + 2N بايت.

قارئ الإطار الأساسي — يطبع قائمة بقيم الضغط لكل إطار:

import serial, struct, time

BAUD = 921600
PORT = "/dev/ttyUSB0"   # /dev/tty.usbserial-* on macOS, COMx on Windows
HEADER = b"\xaa\x55"

def read_frame(ser: serial.Serial, n_channels: int) -> list[int] | None:
    # Sync to frame header
    buf = ser.read(2)
    if buf != HEADER:
        ser.read_until(HEADER[-1:])
        return None
    raw = ser.read(1 + n_channels * 2 + 2)
    n = raw[0]
    if n != n_channels:
        return None
    pressures = list(struct.unpack_from(f">{n}H", raw, 1))
    # CRC check omitted for brevity — validate in production
    return pressures

with serial.Serial(PORT, BAUD, timeout=0.1) as ser:
    N = 64   # number of sensing nodes — confirm from spec doc
    while True:
        frame = read_frame(ser, N)
        if frame:
            print(frame)   # list of N 16-bit pressure values

اضغط على أجزاء مختلفة من القفاز وتأكد من أن قيم العقدة ترتفع وتنخفض. يجب أن تستجيب جميع العقد الـ 64. إذا لم تظهر المنطقة أي استجابة، فأعد فحص مكان كابل الشريط في كل من موصل القفاز والوحدة.

لا الأجهزة؟ استخدم الوضع الوهمي. لتطوير البرامج بدون المستشعر الفعلي، قم بمحاكاة الدفق التسلسلي باستخدام جهاز استرجاع أو برنامج نصي وهمي يصدر إطارات ذات تنسيق صالح. يقبل جسر النظام الأساسي نفس تنسيق JSONL بغض النظر عن المصدر.
4

معايرة نقطة الصفر

تخضع مستشعرات النسيج لإزاحة خط الأساس من اختلاف درجات الحرارة والضغط المتكرر. قم بالمعايرة في بداية كل جلسة للحصول على قراءات دقيقة.

  • استرخي القفاز على سطح مستو دون ممارسة أي ضغط — لا ترتديها أثناء المعايرة إلا إذا كان بإمكانك تثبيت يدك بشكل ثابت ومسترخي تمامًا.
  • ويندوز: افتح أداة تكوين Juqiao، وحدد منفذ COM الخاص بك، وانقر فوق يتصل، ثم انتقل إلى معايرة → صفر. يتم تعيين جميع الخطوط الأساسية للعقدة على قيم الراحة الحالية.
  • لينكس / ماك: أرسل أمر البرنامج صفر لكل مستند بروتوكول V2.3، أو قم بتطبيق الطرح الأساسي في البرنامج النصي لجسر Python الخاص بك (التقط 50 إطارًا في حالة الراحة واطرح المتوسط ​​لكل قناة).
# Simple software baseline subtraction (Linux/macOS alternative)
import serial, struct, numpy as np

BAUD, PORT, N = 921600, "/dev/ttyUSB0", 64
HEADER = b"\xaa\x55"

def read_frame(ser):
    ser.read_until(HEADER)
    raw = ser.read(1 + N * 2 + 2)
    return list(struct.unpack_from(f">{N}H", raw, 1))

with serial.Serial(PORT, BAUD, timeout=0.1) as ser:
    ser.reset_input_buffer()
    baseline = np.mean([read_frame(ser) for _ in range(50)], axis=0)
    print("Baseline captured. Starting calibrated stream...")
    while True:
        frame = read_frame(ser)
        if frame:
            calibrated = np.maximum(0, np.array(frame) - baseline)
            print(calibrated.astype(int).tolist())
أعد المعايرة إذا ارتفعت درجة حرارة القفاز. اتركه لمدة 1-2 دقيقة للإحماء في درجة حرارة التشغيل قبل المعايرة. بالنسبة لجلسات التسجيل الطويلة (> 30 دقيقة)، قم بتشغيل معايرة جديدة بين الحلقات.
5

تكامل النظام الأساسي — منصة لا تعرف الخوف

منصة الخوف في platform.roboticscenter.ai يدعم مستشعر Juqiao كعقدة لمسية في جلسة التشغيل عن بعد. يتم تسجيل إطارات الضغط بشكل متزامن جنبًا إلى جنب مع حالات مفصل الروبوت وتدفقات الكاميرا وطرائق الاستشعار الأخرى.

تسلسل التسجيل:

  • ابدأ جلسة Teleop عبر POST /api/teleop/sessions/create-sdk مع device_type: "juqiao_textile_skin".
  • افتح منصة WebSocket على /api/teleop/ws وأرسل مصافحة التسجيل: role: "operator", device_type: "tactile_sensor", capabilities: ["tactile", "pressure_array", "telemetry"].
  • على الاستلام type: "ready"، ابدأ في إعادة توجيه إطارات القياس عن بعد JSONL من القارئ التسلسلي.

باعث JSONL لجسر المنصة:

import serial, struct, time, json, sys

PORT = "/dev/ttyUSB0"
BAUD = 921600
N_CHANNELS = 64
HEADER = b"\xaa\x55"

def read_frame(ser):
    buf = ser.read_until(HEADER)
    if not buf.endswith(HEADER):
        return None
    raw = ser.read(1 + N_CHANNELS * 2 + 2)
    pressures = list(struct.unpack_from(f">{N_CHANNELS}H", raw, 1))
    return pressures

with serial.Serial(PORT, BAUD, timeout=0.05) as ser:
    while True:
        frame = read_frame(ser)
        if frame:
            record = {
                "ts": int(time.time() * 1000),
                "device": "juqiao_textile_skin",
                "variant": "high_frequency_v2.3",
                "pressures": frame,   # flat list, N_CHANNELS values
                "n_channels": N_CHANNELS
            }
            print(json.dumps(record), flush=True)  # JSONL for platform bridge

تنسيق إطار القياس عن بعد الذي تم إرساله إلى النظام الأساسي WebSocket:

{
  "type": "telemetry",
  "member_id": "juqiao-glove-right",
  "device": "juqiao_textile_skin",
  "variant": "high_frequency_v2.3",
  "pressures": [0, 512, 1024, ...],   // flat array, N_CHANNELS 16-bit values
  "n_channels": 64,
  "ts": 1743680400123                  // Unix millisecond timestamp
}

الاقتران مع OpenArm أو DK1: في إعداد التشغيل عن بعد النموذجي، يتم تشغيل ثلاث عمليات منفصلة على جهاز الكمبيوتر المضيف ويتم تسجيل كل منها بنفس معرف الجلسة - جسر التحكم بذراع الروبوت، وجسر Juqiao التسلسلي، وجسور الكاميرا لعرض المعصم والمشهد. يقوم النظام الأساسي بمحاذاة جميع التدفقات باستخدام ts الحقل وأرشفة ملف JSONL لحلقة واحدة لكل عرض توضيحي. أثناء التشغيل، تعرض لوحة GloveWorkbench خريطة حرارة الضغط اللمسي بجانب مسار مفصل الذراع.

الإعداد ثنائي. بالنسبة للتشغيل عن بعد ثنائي اليدين، قم بتسجيل عقدتين قفازتين باستخدام خاصية مميزة member_id قيم - juqiao-glove-right و juqiao-glove-left. يحتوي كل قفاز على وحدة اقتناء خاصة به واتصال USB. قم بتجميع القفازات في كائن JSON واحد لكل علامة لخفض عدد رسائل النظام الأساسي إلى النصف عند 200 هرتز.

للحصول على مرجع كامل لواجهة برمجة التطبيقات (API) يغطي إنشاء الجلسة ومصافحة WebSocket وتنزيل الحلقة، راجع مرجع API لمنصة SDK.

!

استكشاف الأخطاء وإصلاحها

  • لا يوجد جهاز تسلسلي على Linux: يجري sudo usermod -aG dialout $USER وتسجيل الخروج/الدخول. التحقق مع lsusb التي تعدها الوحدة. على النواة القديمة، modprobe cdc_acm قد تكون هناك حاجة.
  • جميع قراءات الضغط صفر: افصل USB، وأعد تثبيت شريط FPC من كلا الطرفين (موصل القفاز والوحدة)، ثم أعد التوصيل. تحقق من مؤشر LED للوحدة - يجب أن ينبض بمعدل العينة الذي تم تكوينه.
  • إزاحة خط أساسي كبير على العقد غير المحملة: قم بتشغيل معايرة نقطة الصفر في درجة حرارة الغرفة قبل الجلسة. اترك القفاز يستقر لمدة 1-2 دقيقة بعد ارتدائه.
  • أخطاء مزامنة الإطار/البيانات المشوهة: تأكد من أن معدل الباود هو 921600. امسح المخزن المؤقت التسلسلي عند الفتح: ser.reset_input_buffer(). يستخدم read_until(HEADER) عند بدء التشغيل لإعادة المزامنة بدلاً من القراءات ذات الطول الثابت.
  • تستجيب عقد الاستشعار ببطء أو تشعر بأنها "لزجة": قم بثني القفاز بلطف عبر نطاق حركته الكامل عدة مرات قبل الجلسة. قد تشير المشكلات المستمرة إلى إرهاق الألياف — اتصل بـ Juqiao Precision للاستبدال.
  • يقوم جسر المنصة بإسقاط الإطارات عند 200 هرتز: خفض معدل العينة إلى 100 هرتز لجلسات القفازات الواحدة. بالنسبة للإعدادات اليدوية، قم بتجميع القفازين في كائن JSON واحد لكل علامة لخفض عدد الرسائل إلى النصف.
لا تزال عالقة؟ اتصال دعم SVR وقم بتضمين إصدار نظام التشغيل وإصدار Python الخاص بك، ومخرجات lsusb -v (Linux) أو إدارة الأجهزة (Windows)، وإصدار المواصفات (V2.3 أو V1.0 ثنائي اللغة)، ووصف مختصر للأعراض.

هل اكتمل الإعداد؟

تحقق من المواصفات الكاملة أو افتح المنصة لبدء تسجيل الحلقات.