دليل إعداد القفازات اللمسية Juqiao
المسار الكامل من فتح العلبة إلى بيانات الضغط المباشر وتكامل النظام الأساسي. خطط لأقل من 30 دقيقة إجمالاً.
ارتدِ القفاز وقم بتوصيل وحدة الاستحواذ
يتم شحن قفاز Juqiao كقفاز من القماش المنسوج مع موصل كابل شريطي عند المعصم. وحدة الاستحواذ عبارة عن حاوية PCB صغيرة منفصلة تتعامل مع التحويل التناظري إلى الرقمي واتصالات USB.
- ارتدي القفاز كما تفعل مع القفازات القياسية، مع وضع موصل FPC على المعصم.
- قم بتثبيت كابل الشريط: قم بمحاذاة كابل الشريط FPC من موصل معصم القفاز واضغط عليه بقوة في وعاء الشريط الخاص بوحدة الاستحواذ. تشير النقرة الخافتة إلى مقعد آمن. إذا أظهرت العقد قراءات صفرية، فهذا يعني أن الشريط ليس في مكانه بالكامل - راجع استكشاف الأخطاء وإصلاحها أدناه.
- تركيب الوحدة: قم بتثبيت وحدة الاقتناء أو تثبيتها بشريط لاصق على حزام المعصم أو حامل الساعد بحيث لا تتداخل مع حركة المعصم أثناء التشغيل عن بعد.
- توصيل يو اس بي: قم بتوصيل وحدة الاستحواذ بجهاز الكمبيوتر المضيف الخاص بك باستخدام كابل USB المرفق.
/dev/ttyUSB0 أو /dev/ttyACM0; على نظام التشغيل MacOS مثل /dev/tty.usbserial-*. في نظام التشغيل Windows، قم بتثبيت برنامج التشغيل CP210x أو CH340 المضمن إذا لم يتم تعداد الجهاز تلقائيًا كمنفذ COM.
تثبيت 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 للوحدة — فيجب أن ينبض بمعدل العينة.
dialout المجموعة وتسجيل الخروج والعودة: sudo usermod -aG dialout $USER
قم بتشغيل قارئ إطار بايثون
ترسل وحدة الاستحواذ إطارات ثنائية ذات طول ثابت. يبدأ كل إطار بمحدد بداية مكون من 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. إذا لم تظهر المنطقة أي استجابة، فأعد فحص مكان كابل الشريط في كل من موصل القفاز والوحدة.
معايرة نقطة الصفر
تخضع مستشعرات النسيج لإزاحة خط الأساس من اختلاف درجات الحرارة والضغط المتكرر. قم بالمعايرة في بداية كل جلسة للحصول على قراءات دقيقة.
- استرخي القفاز على سطح مستو دون ممارسة أي ضغط — لا ترتديها أثناء المعايرة إلا إذا كان بإمكانك تثبيت يدك بشكل ثابت ومسترخي تمامًا.
- ويندوز: افتح أداة تكوين 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())
تكامل النظام الأساسي — منصة لا تعرف الخوف
منصة الخوف في 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 واحد لكل علامة لخفض عدد الرسائل إلى النصف.
lsusb -v (Linux) أو إدارة الأجهزة (Windows)، وإصدار المواصفات (V2.3 أو V1.0 ثنائي اللغة)، ووصف مختصر للأعراض.