تحريك السلحفاة (TurtleSim)
الملخص
تحريك السلحفاة هو برنامج بسيط بلغة بايثون يعمل على ROS يقوم بتحريك السلحفاة في TurtleSim الخاص بـ ROS إلى إحداثيات (نقاط) محددة. بدأ هذا المشروع كمشروع صف لـ CSCI473 في كلية كولورادو للمعادن (CSOM) ثم تطور إلى مشروع استخدمته لتعلم كيفية إنشاء أنظمة حلقة مغلقة، وقد استُخدمت المعرفة المكتسبة لمساعدتي في عملي بمختبر الروبوتات البشرية المركزية (HCR) في CSOM.
السياق
لخلفية بسيطة، ROS هو اختصار لـ أنظمة تشغيل الروبوتات. ROS هو برنامج وسيط مفتوح المصدر للروبوتات، يُستخدم عادةً مع نظام التشغيل Ubuntu، ويُستَخدم لإدارة مكونات/عناقيد البرمجيات في نظام روبوتي بشكل أفضل. يمكنك معرفة المزيد عن كيفية استخدام ROS عبر الويكي الرسمي لـ ROS. الكود الذي تكتبه في ROS يكون إما بلغة C++ أو بايثون.
TurtleSim هو محاكي روبوت ثنائي الأبعاد بسيط يُستخدم كمقدمة لـ ROS وحزم ROS للمستخدمين الجدد. كل ما يفعله TurtleSim هو فتح شاشة عرض ثنائية الأبعاد مع سلحفاة. تلك السلحفاة تعمل كـ “روبوت” ويمكنك إرسال رسائل إلى هذا “الروبوت” للتحرك و/أو الدوران. بالإضافة إلى ذلك، يولد TurtleSim بعض الأخطاء العشوائية لمحاكاة الفيزياء الواقعية بطريقة بسيطة.
معرفة ما هو ROS و TurtleSim، لماذا كنت أستخدمهما؟ في ربيع 2020، كنت أدرس مادة تسمى “الروبوتات المتمركزة حول الإنسان” في كلية كولورادو للمعادن كجزء من حملتي الدراسية في علوم الحاسوب. كان يُدرّس المادة الدكتور هاو تشانغ. تضمنت المادة ثلاثة مشاريع، وكان المشروع الأول يتضمن إعداد ROS، تعلم كيفية استخدام ROS، وتنفيذ خوارزمية إما حلقة مفتوحة أو حلقة مغلقة تجعل السلحفاة في TurtleSim ترسم حرف M. يمكن الاطلاع على وصف المشروع الأصلي هنا.
عند دراستي للمادة، أنجزت هذا المشروع بتنفيذ خوارزمية حلقة مفتوحة. هذا الحل عمل لكنه كان سيئًا جدًا ورسم حرف A كان “جيدًا بما فيه الكفاية” لكنه لم يكن قريبًا من “العظيم”. بعد تقديم المشروع في منتصف فبراير 2020، نسيت عنه حتى عام لاحقًا في حوالي فبراير 2021.
التحدي
في فبراير 2021، تم توظيفي كمساعد بحث في مختبر الروبوتات المتمركزة حول الإنسان (HCR) في كلية كولورادو للمعادن حيث عملت تحت إشراف الدكتور هاو تشانغ. هدف المختبر هو إجراء أبحاث حول “التعاون الذاتي المستمر، بهدف تمكين الروبوتات من العمل والتكيف على مدى فترات زمنية طويلة”. اعتبارًا من 1-9-2022 (1 سبتمبر 2022)، انتقل المختبر من كلية كولورادو للمعادن إلى جامعة ماساتشوستس أمهرست. لكن عندما عملت هناك، كان لا يزال يقع في كولورادو.
في مختبر HCR، كُلّفت بالعمل على مشروع Triton. كان مشروع Triton يتضمن عدة، عشرات، من الروبوتات المسماة Tritons. كانت Tritons روبوتات أرضية ثلاثية الأضلاع من نوع العجلات المتعددة الاتجاهات التي تبدو هكذا:
إلى جانب الـ Tritons، كان هناك ثمان كاميرات IR من شركة OptiTrack مرتبة في “ترتيب ثماني” على بُعد أقدام قليلة فوق الأرض. باستخدام تلك الكاميرات، وبرمجية Motive من Optitrack، وحاسوب يعمل بنظام Windows 10، وROS؛ تم إنشاء مساحة بحجم 2 متر × 2 متر × 2 متر (x, y, z) حيث يمكن تحديد الموقع الحقيقي الدقيق للأجسام التي تحمل علامات التقاط الحركة.
كانت مهمتي الأولى في مشروع Triton هي كتابة سكريبتات تجعل روبوت Triton يتحرك إلى موقع حقيقي محدد. في ذلك الوقت، لم أكن متأكدًا من كيفية تحقيق ذلك لكنني تذكرت المشروع الأول من CSCI473 حيث تم تقديم فكرة نظام حلقة مغلقة لي، لذا بدأت أبحث بعمق عن أنظمة الحلقة المغلقة، وبالتالي عن أنظمة التغذية الراجعة.
البحث
خلال بحثي، اكتشفت هذا الفيديو الرائع من AerospaceControlsLab:
في هذا الفيديو، تم عرض فكرة نظام PID وشرحها لي. نظام PID هو نظام حلقة مغلقة، حلقة تحكم، ينتج مخرجات محددة بناءً على بيانات من العالم الحقيقي. بعبارات بسيطة، هو نظام تغذية راجعة يضبط مخرجه بناءً على الفرق بين القيمة المطلوبة والقيمة المقاسة. هذه هي صيغة متحكم PID:
$$ u(t) = K_p e(t) + K_i \int e(t) dt + K_d \frac{de(t)}{dt} $$
- $u(t)$ هو إشارة التحكم.
- $K_p$، $K_i$، $K_d$ هي المكاسب النسبية، التكاملية، والمشتقة على التوالي.
- $e(t)$ هو إشارة الخطأ (الفرق بين القيمة المطلوبة والقيمة الفعلية).
- $\int e(t) dt$ هو تكامل الخطأ بمرور الوقت.
- $\frac{de(t)}{dt}$ هو مشتقة الخطأ.
للتعرف أكثر على ذلك، راجع فيديو AerospaceControlsLab أو هذه المقالة المذهلة على ويكيبيديا التي أخذت الصيغة منها.
بعد إكمال بحثي والحصول على مساعدة من أصدقائي الأذكياء وأساتذتي، قررت أن استخدام متحكم نسبي (P Controller) سيكون الأنسب لمساعدة Triton على الوصول إلى إحداثيات محددة.
نظرًا لأن Triton هو روبوت أرضي، فأنا بحاجة فقط للقلق بشأن إحداثيات X و Y. بناءً على ذلك، كان عليّ تحديد القيم المطلوبة والقيم المقاسة لمعالجتها داخل المتحكم P. في بحثي وجدت هذه المشاركة الرائعة على ويكي ROS بعنوان Go to Goal حيث ركزوا على الأخطاء التالية:
- خطأ المسافة: الفرق في المسافة بين الموقع المطلوب (X, Y) والموقع الحالي (X, Y).
- خطأ الزاوية (Theta): الفرق بين الاتجاه المطلوب والاتجاه الحالي.
الحل المقترح
مع معرفة كل ذلك، فإن الحل لجعل Triton يتحرك إلى إحداثيات حقيقية محددة هو استخدام متحكم نسبي لأخطاء المسافة والزاوية الخاصة بـ Triton بالنسبة إلى إحداثيات الهدف وإحداثيات Triton الحالية. لكن قبل تنفيذ ذلك في نظام مادي، أردت اختبار الفكرة في محاكاة، وفي ذلك الوقت اعتقدت أن استخدام TurtleSim كمحاكاة هو الخيار الأفضل.
الاختبار في المحاكاة
مع توضيح الحل النظري، اخترت أولاً التحقق منه عبر المحاكاة بدلاً من سيناريو العالم الحقيقي. غالبًا ما يكون العالم الحقيقي مليئًا بالضوضاء التي قد تُعقِّد فعالية الحل وتؤدي إلى التعامل مع مشكلات غير ذات صلة. مع الاعتراف بذلك، رجعت إلى مشروعي من CSCI473 وعدلته لتكون ساحة اختبار لهذا الحل النظري.
بعد تحديث الكود القديم من ROS Melodic إلى ROS Noetic ومع بعض التحسينات المتكررة، نجحت في تشغيل الحل المقترح في TurtleSim. يمكن العثور على عروض توضيحية لوظائفه، مع بعض مسارات إحداثيات الهدف المثيرة، في نهاية هذه المقالة. يمكن الاطلاع على الكود الكامل هنا.
الخلاصة
باختصار، من خلال هذا المشروع، تنقل سلحفاة TurtleSim بفعالية إلى الإحداثيات المحددة باستخدام نظام حلقة مغلقة، متفوقة بشكل كبير على نظام الحلقة المفتوحة الأولي الذي استخدمته في 2020. بعد اختبار ناجح، طبقت هذا الحل مع روبوتات Triton. لكن الضوضاء في العالم الحقيقي أدت إلى مشكلات غير متوقعة استغرقت أسابيع من تصحيح الأخطاء والاختبار الميداني. بعد تلك الأسابيع، تمكنت في النهاية من جعل Triton يصل إلى إحداثيات حقيقية محددة باستخدام الحل الذي اختبرته في TurtleSim. إليكم عرضًا توضيحيًا لتحرك Triton إلى إحداثيات حقيقية محددة باستخدام الطريقة التي تم اختبارها في TurtleSim:
في مراجعة لاحقة، أتمنى لو استخدمت محاكاة تحاكي الفيزياء الواقعية بشكل أفضل. TurtleSim رائع للتعلم لكنه ليس مثاليًا لاختبار أفكار الروبوتات الواقعية. في ذلك الوقت، ظننت أنه سيكون كافيًا لحالتي البسيطة لكن ذلك ثبت لاحقًا أنه ليس كذلك.
الهدف الأساسي من هذه المقالة هو توضيح إنشاء نظام حلقة مغلقة يمكّن سلحفاة TurtleSim، ومن ثم روبوتات Triton، من التنقل بدقة إلى المواقع المستهدفة (X, Y). أعتقد أن هذا الهدف تحقق، وربما جذب بعض الاهتمام لعملي في مختبر HCR. مع علمي بذلك، لدي خطط لكتابة المزيد من المقالات حول تجربتي العملية في مختبر HCR…
عروض تحريك السلحفاة (TurtleSim)
يحتوي هذا الفيديو على العروض التالية:
- Cayley Nodal: تصميم بسيط لـ Cayley Nodal
- Circles: تصميم يشبه شبكة العنكبوت
- Inner Circles: تصميم “دوائر داخل دوائر”
- M: تصميم حرف M بسيط جدًا