Mobot#

مقال بقلم Cosku Acay وEdwin Cho وKenneth Li وNishant Pol. PDF.

وصف المشروع#

في مسابقة Mobot بجامعة كارنيجي ميلون، يجب أن تمر الروبوتات عبر سلسلة من 14 بوابة موضوعة فوق خط أبيض منحنٍ بطول 255 قدماً على رصيف خارجي. يتضمن المسار منحدرين حادين ومنطقة نقطة قرار حيث يجب على الروبوت اختيار المسار الصحيح للمرور عبر 14 بوابة بترتيب تسلسلي. وبما أن الخط في الخارج وتحت طقس بيتسبرغ، يجب أن يعمل الروبوت في مجموعة متنوعة من الظروف. في هذا العام كان الجو ممطراً وعاصفاً يوم المسابقة. يمكن العثور على مزيد من المعلومات على http://www.cs.cmu.edu/mobot/mobot.html

Mobot Mobot

Mobot (full size)Mobot (full size)

الحل باستخدام CMUcam4#

اخترنا التعامل مع مهمة اتباع الخط باستخدام CMUcam4 لأنها تتطلب الحد الأدنى من العتاد ولها واجهة مناسبة تمامًا لتتبع خط.

Mobot hardware Mobot hardware (full size)

تلتقط CMUcam4 صورة للخط بمعدل 30 إطارًا في الثانية وتغذي صورة تتبع الألوان إلى Arduino Mega عبر أحد الخطوط التسلسلية الثلاثة. ثم يعالج Arduino Mega هذه الصورة (الرجاء الاطلاع على وصف البرمجيات أدناه) ويرسل أوامر سرعة المحرك والانعطاف إلى متحكم PID عبر خط تسلسلي آخر. يزوّد متحكم PID بدوره Arduino Mega بعدّات المُشفِّر لكل من العجلتين اليمنى واليسرى، مما يتيح لنا تتبع موضعنا واتجاهنا نسبةً إلى البوابة 0.

متحكم PID (MD-25) من صنع Robot-Electronics في المملكة المتحدة. يقود محركين فرشاتيين تياريين مسننين مع مُشفّرات مغناطيسية على عمود المحرك. شاشة LCD لأغراض تصحيح الأخطاء. كان لدينا سِكتان للطاقة، 12 فولت للمحركات و5 فولت للمنطق، يتشاركان الأرضي نفسه وكلاهما مصدره بطارية واحدة قابلة لإعادة الشحن بجهد 12 فولت.

خططنا في البداية لصنع نموذج أولي من قاعدة خشبية لندخل في مرحلة البرمجة بسرعة، ثم نعمل على قاعدة أسرع وأكثر موثوقية مثل سيارة تحكم عن بُعد. لكننا وجدنا أن النموذج الأولي كان موثوقًا جدًا وسهل العمل معه، لذا أبقيناه للتصميم النهائي. تكوّن العزل المائي للهيكل من طبقة سيلوفان تحت طبقة من شريط التغليف. لكن المطر تسرب عبر شريط التغليف لحسن الحظ ليس عبر طبقة السيلوفان. غُطيت الكاميرا بمربع من البلاستيك من كيس Ziploc إذ وجدنا أن "المرشح" حسّن قدرة الكاميرا على تجاهل بقع صغيرة من الخط بدت، للكاميرا، مثل الخرسانة الخلفية.

وصف الخوارزمية#

الخلفية#

نستخدم CMUcam4 في وضع تتبع الألوان مع تفعيل وضع YUV، مما يعطينا تمثيلاً بصورة ثنائية للخط. تصفّي برمجية الكاميرا أي شيء ليس أبيض (أي الخلفية) وتضع بكسل "مفعّل" حيث يوجد خط (حيث يكون أبيض). نستخدم وضع YUV بحيث يكون تتبع الألوان غير حساس لشدة الضوء، بحيث يمكن لروبوتنا أن يعمل في ظل مجموعة واسعة من الظروف بما في ذلك الداخل والخارج.

تتبع الخطوط#

تزوّد CMUcam4 شريحة Arduino الخاصة بنا بصورة ثنائية بحجم 80 في 60. نأخذ عينة من 10 صفوف بكسل متباعدة بالتساوي من الصورة ونحسب مركز ثقل وحدات البكسل "المفعّلة" (انظر هنا: https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points). ثم نفترض أن الخط يقع على مركز الثقل. بفعل هذا على 10 صفوف مختلفة في الصورة، نحصل على تقريب جيد للخط بوصل النقاط. يمكننا بعد ذلك استخدام هذه البيانات بإيجاد مدى بُعد كل نقطة على الخط عن الخط الرأسي الذي يقع في مركز الصورة للحصول على قيمة تمثل مدى انحناء الخط. يمكن اعتبار هذا كإيجاد المساحة بين خط المماس ومنحنى واستخدام تلك المساحة لتحديد مقدار الانعطاف اللازم. تحدد الإشارة ما إذا كان الانعطاف يسارًا أو يمينًا، بينما يحدد المقدار كم نحتاج للانعطاف لاتباع الخط. كما تتوقع، إذا قِسنا مساحة صفرية، فإن الخط مباشرة أمام الروبوت وهو خط مستقيم. إذا كان مقدار المساحة كبيرًا، فإن الروبوت يحتاج للانعطاف للحفاظ على محاولة تقليل مقدار هذه المساحة.

نقاط القرار#

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

يرجى الذهاب إلى https://github.com/cacay/Mobot لرؤية نسخة مبسطة من كودنا أو هنا للحصول على نسخة محلية.