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

قم بتثبيت Paxini SDK، ودفق بيانات الضغط في Python، وتصور خرائط حرارة الاتصال، وأضف تكامل ROS2 الاختياري، وقم بالمزامنة مع ذراع الروبوت الخاص بك للحصول على خطوط أنابيب كاملة لجمع البيانات.

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

قم بتثبيت Paxini SDK

يتصل Paxini Gen3 عبر USB HID - لا يتطلب الأمر وحدات kernel أو برامج تشغيل خاصة بالموردين. يغلف Python SDK بروتوكول HID منخفض المستوى ويكشف عن واجهة برمجة التطبيقات المتدفقة النظيفة.

أي نظام تشغيل مدعوم يتم تعداد Gen3 كجهاز USB HID قياسي. تدعم أنظمة التشغيل Windows وmacOS وLinux جميعها برامج تشغيل البريد الوارد. مطلوب Python 3.10 أو الأحدث.
# Python 3.10+ required نقطة تثبيت paxini-sdk # With visualization extras (matplotlib, numpy) تثبيت النقطة "paxini-sdk[viz]" # With ROS2 bridge (requires ROS2 Humble or Jazzy) تثبيت النقطة "paxini-sdk[ros2]"

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

python -c "استيراد paxini؛ طباعة (paxini.__version__)" # Expected: 1.2.x or later
الخطوة 2 - اكتشاف USB

الكشف عن المستشعر

قم بتوصيل مستشعر Gen3 بجهاز الكمبيوتر الخاص بك عبر USB-C. استخدم الأداة المساعدة لاكتشاف جهاز SDK للتأكد من التعرف عليه:

بايثون -m paxini.discover # Example output: # Found 1 Paxini device(s): # [0] PX-6AX-GEN3 serial=PX3A0042 firmware=1.2.4 variant=fingertip

بالنسبة لإعدادات أجهزة الاستشعار المتعددة (على سبيل المثال، خمسة أصابع على لوحة وصل USB):

python -m paxini.discover --all # Found 5 Paxini device(s): # [0] PX-6AX-GEN3 serial=PX3A0042 variant=fingertip (index 0) # [1] PX-6AX-GEN3 serial=PX3A0043 variant=fingertip (index 1) # ...
أذونات USB لينكس في نظام التشغيل Linux، قد تحتاج إلى إضافة قاعدة udev للوصول إلى أجهزة HID بدون الجذر. يجري sudo python -m paxini.install_udev مرة واحدة لتثبيت القاعدة، ثم افصل المستشعر وأعد توصيله.
الخطوة 3 - واجهة برمجة التطبيقات للبث

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

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

# Minimal streaming example — 5 lines استيراد باكسيني الاستشعار = باكسيني. الاستشعار () # connects to first detected device بداية الاستشعار () للإطار في Sensor.stream (): طباعة (frame.pressure_map) # 2D numpy array, shape (rows, cols) طباعة (frame.total_force_n) # float, total normal force in Newtons

جميع طرق واجهة برمجة التطبيقات العامة:

الطريقة / الملكية وصف المرتجعات
بداية الاستشعار ()ابدأ البث؛ غير مانعلا أحد
توقف الاستشعار ()أوقف الدفق بشكل نظيفلا أحد
تيار الاستشعار ()مولد ينتج كائنات TactileFrame عند هرتز تم تكوينهمولد [إطار اللمس]
الأحدث ()إرجاع الإطار الأحدث دون حظرإطار اللمس
الاستشعار.set_rate (هرتز)ضبط معدل العينة (50–500 هرتز لـ USB-C، 50–200 هرتز لـ BLE)لا أحد
الاستشعار.معايرة ()معايرة الإزاحة الصفرية ضد حمل الراحة الحاليلا أحد
الاستشعار.التسلسليسلسلة الرقم التسلسلي للجهازشارع
البديل"الإصبع" | "لوحة الأصابع" | "نخل"شارع
الخطوة 4 - تنسيق البيانات

تنسيق البيانات اللمسية

كل إطار اللمس يتضمن:

مجال يكتب وصف
frame.timestamp_nsكثافة العملياتالطابع الزمني بالنانو ثانية (رتابة، الساعة المضيفة)
frame.pressure_mapnp.ndarray (H, W) float32الضغط بالكيلو باسكال لكل تاكسل. يختلف الشكل حسب النوع: طرف الإصبع 8×8، راحة اليد 16×12.
frame.contact_masknp.ndarray (H, W) منطقيصحيح عندما يتجاوز الضغط عتبة الاتصال (الافتراضي: 5 كيلو باسكال)
fram.contact_area_mm2يطفومجموع مناطق التاكسيل النشطة بالملليمتر المربع
frame.total_force_nيطفوالقوة العمودية المتكاملة عبر جميع التاكسيات، بوحدة نيوتن
fram.contact_centroid(تطفو، تعويم)(الصف، العمود) النقطه الوسطى لمنطقة الاتصال في إحداثيات التاكسيل
frame.in_contactمنطقيصحيح إذا تجاوز Total_force_n عتبة الاتصال (الافتراضي: 0.05 N)
frame.seqكثافة العملياتزيادة رقم تسلسل الإطار بشكل رتيب
القرار المكاني متغير الإصبع: 8 × 8 مصفوفة تاكسيل تغطي 14 × 14 مم، 1.75 مم خطوة تاكسيل. طراز راحة اليد: مصفوفة 16×12 تغطي 48×36 مم، مسافة 3 مم. يبلغ قياس كل تاكسل 0-600 كيلو باسكال.
الخطوة 5 - التصور

التصور المباشر للخريطة الحرارية

تشحن SDK متخيلًا مباشرًا جاهزًا للتشغيل. قم بتشغيله مباشرة من سطر الأوامر:

# Launch live heatmap — press Q to quit بايثون -m paxini.visualize # Multi-sensor visualization (e.g., 5-finger setup) بايثون -m paxini.visualize --all

أو قم بتضمين البرنامج النصي الخاص بك باستخدام ملف paxini.viz الوحدة النمطية:

استيراد باكسيني من paxini.viz استيراد HeatmapWindow الاستشعار = باكسيني. الاستشعار () بداية الاستشعار () window = HeatmapWindow(title="Paxini Gen3 — Fingertip") للإطار في Sensor.stream (): window.update(frame.pressure_map) إذا كان window.should_ Close (): استراحة توقف الاستشعار ()
الخطوة 6 (اختياري) - ROS2

واجهة روس2

ينشر جسر ROS2 أ Sensor_msgs/Image (خريطة الضغط) والعرف paxini_msgs/TactileFrame الموضوع لكل جهاز استشعار. يتطلب ROS2 متواضع أو جازي.

# Install the ROS2 extras and launch the node تثبيت النقطة "paxini-sdk[ros2]" ros2 قم بتشغيل paxini_ros2 Sensor_node # Published topics (per sensor): # /paxini/PX3A0042/pressure_image sensor_msgs/Image # /paxini/PX3A0042/tactile_frame paxini_msgs/TactileFrame # /paxini/PX3A0042/contact_event std_msgs/Bool

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

الخطوة 7 - تكامل الذراع

تكامل ذراع الروبوت

لمزامنة بيانات Paxini مع حالة مفصل ذراع الروبوت، استخدم paxini.sync وحدة. إنه يضع طوابع زمنية على جميع إطارات المستشعر مقابل ساعة مشتركة ويوفر واجهة برمجة تطبيقات للحظر تنتج أزواجًا متزامنة (arm_state، tactile_frame):

استيراد باكسيني من paxini.sync قم باستيراد MultiSourceSync # Initialize sensor and arm interface الاستشعار = باكسيني. الاستشعار () الذراع = YourArmInterface () # any arm with a get_joint_state() method المزامنة = MultiSourceSync( الاستشعار = الاستشعار، ذراع = ذراع، max_dt_ms=5.0 # reject pairs with >5ms timestamp gap ) بالنسبة لحالة الذراع، اللمس في sync.stream(): طباعة (arm_state.joint_positions) طباعة (tactile.total_force_n) طباعة (tactile.pressure_map)
محاذاة الطابع الزمني إطارات الطوابع الزمنية Gen3 بدقة النانو ثانية باستخدام الساعة المضيفة في وقت مقاطعة USB. يكون الارتعاش عادةً أقل من 0.5 مللي ثانية. ال MultiSourceSync يتعامل الفصل مع الاستيفاء عندما تختلف معدلات الذراع والمستشعر.
استكشاف الأخطاء وإصلاحها

أهم 3 قضايا

يقوم paxini.discover() بإرجاع قائمة فارغة

لم يتم اكتشاف المستشعر. تحقق بالترتيب: (1) جرّب كابل USB-C مختلفًا — بعض الكابلات مشحونة فقط ولا تحمل بيانات. (2) في نظام التشغيل Linux، قم بتشغيل sudo python -m paxini.install_udev ثم افصل/أعد توصيل المستشعر. (3) تأكد من أن مؤشر LED للمستشعر ثابت (لا يومض) - يومض يعني أنه في وضع تحديث البرنامج الثابت؛ اضغط مع الاستمرار على زر إعادة الضبط لمدة 5 ثوانٍ للخروج.

خريطة الضغط كلها أصفار عند الضغط عليها

يحتاج المستشعر إلى المعايرة أو تم ضبط العتبة على مستوى مرتفع جدًا. يجري sensor.calibrate() مع تفريغ المستشعر (بدون اتصال). إذا استمرت المشكلة، فتأكد من أن متغير المستشعر يطابق الحامل الخاص بك - سيُظهر مستشعر راحة اليد المثبت على طرف الإصبع قيم ضغط منخفضة جدًا نظرًا لمساحة التاكسيل الأكبر. قم أيضًا بتأكيد إصدار البرنامج الثابت 1.2+ باستخدام python -m paxini.discover.

يقوم MultiSourceSync برفع TimestampDriftError

تتباعد ساعة واجهة الذراع والطابع الزمني للمستشعر بأكثر من max_dt_ms. يحدث هذا عادةً بسبب قيام مجموعة SDK بإرجاع حالة مشتركة قديمة (على سبيل المثال، تخزينها مؤقتًا بمعدل أقل). يزيد max_dt_ms إلى 10.0 كاختبار أول، ثم تحقق من سبب انخفاض معدل تحديث حالة الذراع عن المتوقع. بالنسبة لأذرع USB، تأكد من أن معدل استقصاء USB لا يتم التحكم فيه بواسطة إدارة الطاقة (sudo powertop على لينكس).

لا تزال عالقة؟ مشاركة في موضوع أسئلة المنتدى مع نظام التشغيل لديك، إصدار SDK (paxini.__version__)، وإخراج الخطأ الدقيق.