التحكم PID مع TurtleSim

مستودع مشروع GitLab

الملخص

تحرك السلحفاة هو نص برمجي بسيط بلغة بايثون يستخدم ROS لتحريك السلحفاة في TurtleSim إلى إحداثيات محددة (نقاط). بدأ هذا المشروع كمشروع صف في CSCI473 في مدرسة كولورادو للمناجم (CSOM) وتطور لاحقًا إلى مشروع استخدمته لمساعدتي في تعلم كيفية إنشاء أنظمة الحلقة المغلقة، والتي استخدمت المعرفة المكتسبة منها في عملي في مختبر الروبوتات المتمحورة حول الإنسان (HCR) في CSOM.

السياق

لإعطاء بعض الخلفية، ROS تعني أنظمة تشغيل الروبوتات. ROS هو برنامج وسيط مفتوح المصدر للروبوتات، عادة ما يتم دمجه مع نظام التشغيل أوبونتو، والذي يستخدم لإدارة مكونات/كتل البرمجيات لنظام الروبوت بشكل أفضل. يمكنك معرفة المزيد عن كيفية استخدام 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 متر (س، ص، ع) حيث يمكن تحديد الموقع الحقيقي الدقيق للأشياء مع علامات التقاط الحركة.

كانت مهمتي الأولى في مشروع 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، سيكون الأفضل لمساعدة Triton في الوصول إلى إحداثية محددة.

نظرًا لأن Triton هو روبوت أرضي، لم أكن بحاجة للقلق إلا بشأن إحداثيات X وY. مع معرفة ذلك، كان علي بعد ذلك تحديد القيم المرغوبة والقيم المقاسة لقياسها ومعالجتها داخل وحدة التحكم P. في بحثي وجدت هذا المنشور الرائع على ويكي ROS يسمى اذهب إلى الهدف حيث ركزوا على الأخطاء التالية:

  • خطأ المسافة: الفرق في المسافة بين الموقع المرغوب (X، Y) والموقع الحالي (X، Y).
  • خطأ الزاوية: الفرق بين الاتجاه المرغوب والاتجاه الحالي.

الحل المقترح

مع معرفة كل هذا، فإن الحل لجعل Triton يتحرك إلى إحداثية حقيقية محددة هو استخدام وحدة تحكم نسبية لخطأ المسافة وخطأ الزاوية بالنسبة لإحداثية الهدف وإحداثية Triton الحالية. لكن قبل تنفيذ ذلك في نظام مادي، أردت اختبار الفكرة في محاكاة، وفي ذلك الوقت، اعتقدت أن استخدام TurtleSim كمحاكاة كان الخيار الأفضل.

الاختبار في المحاكاة

مع الحل النظري المحدد، اخترت في البداية التحقق منه من خلال المحاكاة، بدلاً من سيناريو العالم الحقيقي. غالبًا ما يكون العالم الحقيقي مليئًا بالضوضاء التي قد تعكر فعالية الحل وتؤدي إلى التعامل مع قضايا غير ذات صلة. مع إدراك ذلك، عدت إلى مشروعي من CSCI473 وقمت بتعديله كأرض اختبار لهذا الحل النظري.

بعد تحديث الكود القديم من استخدام ROS Melodic لاستخدام ROS Noetic ومع بعض التحسينات التكرارية، تمكنت من جعل الحل المقترح يعمل في TurtleSim. يمكن العثور على عروض توضيحية لوظيفته، مع بعض مسارات إحداثيات الهدف الرائعة، في نهاية هذه المدونة. يمكن عرض الكود لكل هذا هنا.

الخاتمة

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

في retrospect، أتمنى لو كنت استخدمت محاكاة تحاكي الفيزياء في العالم الحقيقي بشكل أفضل. TurtleSim رائعة للتعلم لكنها ليست رائعة لاختبار أفكار الروبوتات في العالم الحقيقي. في ذلك الوقت، اعتقدت أنها ستكون جيدة بما يكفي لحالتي البسيطة، لكن ثبت لاحقًا أن ذلك لم يكن صحيحًا.

كان الهدف الرئيسي من هذه المدونة هو توضيح إنشاء نظام حلقة مغلقة يمكّن السلحفاة في TurtleSim، ومن ثم روبوتات Triton، من التنقل بدقة إلى مواقع الهدف المحددة (X، Y). أعتقد أن هذا الهدف قد تحقق، لكن قد يكون قد أثار بعض الاهتمام في عملي في مختبر HCR. مع معرفة ذلك، لدي خطط لكتابة المزيد من المدونات حول تجربتي العملية في مختبر HCR…

عروض تحريك السلحفاة (TurtleSim)

يحتوي هذا الفيديو على العروض التوضيحية التالية:

  • Cayley Nodal: تصميم بسيط Cayley Nodal
  • دوائر: تصميم يشبه شبكة العنكبوت
  • دوائر داخلية: تصميم “دوائر داخل دوائر”
  • M: تصميم M بسيط جدًا