جدول المحتويات:

فني روبو: 8 خطوات
فني روبو: 8 خطوات

فيديو: فني روبو: 8 خطوات

فيديو: فني روبو: 8 خطوات
فيديو: أعلى مستوى وصلتوا في البرمجة 2024, يوليو
Anonim
فني روبو
فني روبو

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

فني روبو للإنقاذ.

بشكل أساسي ، يتحكم هذا الرمز في Robo-Technician لأنه يتبع مسارًا فاتح اللون على الأرض. سيتبع هذا المسار حتى يجد تقاطعًا في المسار أو منعطفًا ، مما سيؤدي إلى التقاط صورة لمعالجة الصورة للسماح لـ Robo-Technician باتخاذ قرار بشأن المكان الذي يجب أن يتجه إليه بعد ذلك. تعمل مستشعرات النتوءات والصدمات الضوئية على حماية Robo-Technician من التلف ، وتتحكم مستشعرات الصدمات في وقت التقاط صورة تشخيصية. تم تصميم Robo-Technician معًا للتكبير في وحدات Mar ، مما يوفر وقت رواد الفضاء أثناء القيام بالمهمة الأساسية للتفتيش ، ويدعو فقط إلى المدخلات البشرية عندما يجد شيئًا خاطئًا.

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

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

المعدات

  • Raspberry Pi (استخدمنا الإصدار 3)
  • iRobot ®
  • نوع من جهاز الإمساك لإبقاء Raspberry Pi مرتبطًا بـ Robo-Technician
  • كاميرا Raspberry Pi (بغض النظر عن نوعها ، طالما لديها تركيز تلقائي ودقة صورة جيدة)
  • نوع من الحامل أو الحافظة لإبقاء الكاميرا متجهة للأمام على Robo-Technician
  • مادة لاستخدامها كشريط ، بيضاء (أو فاتحة اللون جدًا) ، يتم تثبيتها على الأرض بشكل آمن. يجب أن تكون أوسع قليلاً من المسافة بين مستشعري الجرف الأمامي.
  • 4 علامات بنص كبير جدًا (مع طباعة الكلمات IMAGE و RIGHT و BACK و LEFT)
  • أوراق من الورق الملون (ثلاثة على الأقل ويفضل الأحمر والأخضر والأزرق)

برمجة

  • تم استخدام Matlab (2018a و 2017b ويبدو أنهما يحدثان فرقًا بسيطًا)
  • حزمة دعم Raspberry Pi لـ Matlab
  • كود Raspberry Pi للاتصال بـ Matlab (رابط لكود المصدر الموضح أدناه)
  • مربع أدوات معالجة الصور لـ Matlab (لا يمكنك إلى حد كبير القيام بهذا المشروع بدون صندوق الأدوات)
  • اختياري: Matlab Mobile مثبتة على هاتفك ، والتي سأشرحها لاحقًا

الخطوة 1: إعداد الجهاز

ef.engr.utk.edu/ef230-2018-08/projects/roo…

هذا هو رابط الكود الأساسي للتأكد من أن iRobot® يمكنه التواصل مع Matlab ، إلى جانب برنامج تعليمي أساسي. كما قلت من قبل ، لن أغطي هذا الجزء المحدد لأن البرنامج التعليمي تم وضعه جيدًا بالفعل. سوف أذكر أنه بمجرد اتباعك للخطوات الموجودة على الرابط ، يمكنك استخدام أمر "doc" الخاص بـ Matlab للاطلاع على المعلومات المضمنة. خاصة:

دوك رومبا

ونقطة أخرى مهمة للغاية.

عندما تقوم بتنزيل الملفات من الرابط أعلاه ، ضعها في المجلد الذي وصفته أعلاه ، نظرًا لأن برنامج Matlab يتطلب وجود الملفات التي ينشئها المستخدم في مجلد العمل الحالي.

مع هذا بعيدًا ، دعنا ننتقل إلى الكود.

الخطوة الثانية: إيجاد كل تلك المستشعرات

العثور على كل تلك المستشعرات
العثور على كل تلك المستشعرات
العثور على كل تلك المستشعرات
العثور على كل تلك المستشعرات

خذ ثانية وافحص iRobot®. من الجيد أن تعرف مكانها حتى يكون لديك فكرة عن المدخلات التي يتلقاها Robo-Technician ، وستكون قادرًا على معرفة سبب دوران الشيء في دوائر بدلاً من اتباع المسار الذي ستقوم بإعداده (قد يكون هذا أو ربما لم يحدث). من الواضح أنك سترى مستشعر الصدمات الجسدي الكبير في المقدمة. من الصعب رؤية مستشعرات الجرف ، ستحتاج إلى قلبها والبحث عن أربعة نوافذ بلاستيكية شفافة بالقرب من الحافة الأمامية. تم إخفاء مستشعرات النتوءات الضوئية بشكل أكبر ، ولكن في الوقت الحالي سيكون كافياً أن نقول العيش في النطاق الأسود اللامع الذي يمتد حول الجزء الأمامي من iRobot® ، الموجود في الجزء الأمامي من شريط مستشعر الارتطام المادي.

توجد مستشعرات لسقوط العجلة ، لكنها غير مستخدمة في هذا المشروع ، لذلك سننتقل إلى اختبار المستشعرات.

الخطوة 3: اختبار لضبط المعلمات

اختبار لتعيين المعلمات
اختبار لتعيين المعلمات

قبل أن نتمكن من إرسال فني الروبوت للقيام بعمله ، نحتاج إلى معرفة المراوغات ونطاقات المستشعرات الخاصة به. نظرًا لأن كل iRobot® يختلف قليلاً ويتغير على مدار عمر الروبوت ، فنحن بحاجة إلى معرفة كيفية قراءة المستشعرات فوق المناطق التي سيعمل فيها. أسهل طريقة للقيام بذلك هي إعداد المسار ذي الألوان الفاتحة (لقد استخدمت شرائط من ورق الطابعة الأبيض ولكن أي شيء فاتح اللون سيفي بالغرض) على السطح الذي سيعمله Robo-Technician.

ابدأ تشغيل Matlab وافتح نصًا جديدًا. احفظ البرنامج النصي في المجلد نفسه الذي وصفته سابقًا وقم بتسميته كما تريد (حاول أن تجعله قصيرًا ، لأن اسم هذا الملف سيكون اسم الوظيفة). قم بتشغيل الروبوت واستخدم إعداد roomba المتغير من البرنامج التعليمي ، واكتب الأوامر في نافذة الأوامر.

تأكد من توصيل Raspberry Pi بـ iRobot® وأن جهاز الكمبيوتر الخاص بك متصل بنفس اتصال الإنترنت. ستقضي وقتًا أقل في سحب شعرك في محاولة لمعرفة سبب عدم اتصال Matlab

r = roomba (الرقم الذي أعددته)

المتغير "r" في هذا الظرف ليس ضروريًا ، يمكنك تسميته كما تريد ، ولكنه يجعل الحياة أسهل في استخدام متغير من حرف واحد.

بمجرد إعداد المسار ، وتم توصيل roomba بنجاح ، ضع فني Robo-Technician المستقبلي حيث يكون واحد أو اثنان من مستشعرات الجرف أعلى المسار. من الواضح أن هذا يعني أن الاثنين أو الثلاثة الآخرين فوق السطح الذي اخترته.

ابدأ الآن تشغيل مجسات الاختبار بالأمر:

ص اختبار

ضع في اعتبارك أن "r." هو المتغير الذي حددته سابقًا ، لذلك إذا لم يكن "r" فغيّر "r". مهما قررت. سيؤدي ذلك إلى عرض شاشة مستشعر الاختبار مع الكثير من المعلومات.

بالنسبة لهذا المشروع ، ركز على مصدات الضوء ، والمصدات ، وأقسام المنحدرات. قم بتحريك Robo-Technician للتأكد من مشاهدة كيفية تغير المستشعرات على الأسطح المختلفة ، أو مدى القرب الذي يجب أن يكون عليه الكائن حتى تتغير قيم ligthBumper ، وما إلى ذلك. ضع هذه الأرقام في الاعتبار (أو قم بتدوينها) لأنك سوف في حاجة إليها لتعيين المعلمات في ثانية.

الخطوة 4: بدء الكود

أولا سوف تقوم ببناء دالة. لقد أطلقت عليه اسم "المسار" ولكن مرة أخرى ، الاسم ليس ضروريًا ، لكنني سأشير إليه على أنه "مسار" من الآن فصاعدًا.

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

list = {'Red'، 'Blue'، 'Green'}

problist = {'Casualty، Save Image'، 'Component Out of Place، Save Image'، 'Expected، Continue'} pathcolor = listdlg ('PromptString'، 'Select a Path Color'، … 'SelectionMode'، 'single'، 'ListString' ، قائمة) prob = 0 ؛ دريف = ،

يجب الإعلان هنا عن متغيري "prob" و "driv" حيث سيتم استخدامهما داخل حلقة while الرئيسية للوظيفة ، ولكن مرة أخرى ، إذا كنت تريد إعادة تسمية أي من هذه المتغيرات أو تغيير تحديدات القائمة ، فلا بأس طالما أنت متسق في بقية الشفرة.

الخطوة 5: الجزء العلوي من الحلقة: مستشعرات الارتطام المادي

يحتوي الجزء العلوي من الحلقة while على منطق مستشعر الارتطام المادي. في الأساس ، عندما يصطدم Robo-Technician بشيء يتوقف (أو بالنسبة لمستشعر الصدمات الأمامي ، فإنه يتراجع 0.1 متر) ، ثم يضع نفسه لالتقاط صورة. دعنا نغطي جزء التحكم في السرعة والموضع أولاً.

إذا قمت باختبار جميع المستشعرات على Robo-Technician في الخطوات السابقة ، فستعرف أن مستشعرات الصدمات لها قيمة منطقية (0 أو 1) مع الصفر الذي يمثل الوضع الطبيعي غير المضغوط للمستشعر. ضع ذلك في الاعتبار للرمز.

بينما يتلقى true٪ main while loop٪ معلومات المصد S = r.getBumpers إذا كان S.left ~ = 0 r.stop elseif S.right ~ = 0 r.stop elseif S.front ~ = 0 r.stop end

هذا هو الجزء الأساسي "إذا اصطدم بشيء ما ، توقف". إذا اكتشفت المستشعرات تصادمًا ، فحينئذٍ تنتقل إلى الجزء التالي من الكود ، والذي يعيد ضبط موضع Robo-Technician للحصول على صورة.

إذا كان S.left ~ = 0٪ if loop يأخذ معلومات الوفير ويقوم بمحاذاة الكاميرا للصورة r. PromptString '،' تم العثور على عقبة غير متوقعة ، الرجاء تحديد '…،' SelectionMode '،' single '،' ListString '، problist) elseif S.right ~ = 0 r.turnAngle (-5) pause (0.5) img = r. getImage image (img) prob = listdlg ('PromptString'، 'وجدت عقبة غير متوقعة ، يرجى تحديد'…، 'SelectionMode'، 'single'، 'ListString'، problist) elseif S.front ~ = 0 r.moveDistance (- 0.1) وقفة (0.5) img = r.getImage image (img) prob = listdlg ('PromptString'، 'Found an Unlimited Obstacle، Please Identify'…، 'SelectionMode'، 'single'، 'ListString'، problist) end

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

الآن قمت بإدخال قسم رمز بين جزء مستشعر الارتطام وجزء حفظ الصورة. يأخذ هذا قيم lightBumper ويضبط سرعة القيادة على 0.025 متر / ثانية (بطيئة جدًا) ، وهو ليس ضروريًا في الواقع ولكنه يقلل من قيام Robo-Technician بقرع الأشياء وفي النهاية تآكل مستشعرات الصدمات المادية.

L = r.getLightBumpers إذا اليسار> 100 || L.leftFront> 100 || ل.أمام> 100 || L right> 100 driv = 0.025 r.setDriveVelocity (0.025) محرك آخر = 0.1 نهاية

سيكون هذا هو الجزء الذي تلعب فيه القيم التي لاحظتها (ونأمل أن تكون دونتها) في وقت سابق

استند "L. (جانب المستشعر واتجاهه)> 100" على القيم التي لاحظتها ، لذلك إذا كانت ملاحظاتك مختلفة ، فقم بتغيير هذه الأرقام. الفكرة هي أنه إذا استشعر فني الروبوت شيئًا ما على بعد بضعة سنتيمترات أمامه ، فسوف يتباطأ ، أي أكثر من ذلك غير ضروري.

الجزء التالي هو المكان الذي يتم فيه حفظ الصور لوقت لاحق.

٪ إذا تم تحديد الخيار الأول أو الثاني في مربع الحوار prob ، يحفظ الصورة إذا كان prob == 1٪ إذا كانت الحلقة تبني معلومات ملف للصورة ، تكتب مع الطابع الزمني t = clock ؛ basename = sprintf ('\ img_٪ d_٪ d_٪ d_٪ d_٪ d.png'، t (1)، t (2)، t (3)، t (4)، t (5)) ؛ المجلد = 'E: / UTK / Classes / Fall 18 / ef230 / irobot / images' ؛ fullFileName = الملف الكامل (المجلد ، الاسم الأساسي) ؛ imwrite (img، fullFileName) أغلق الشكل 1 وقفة (2) elseif prob == 2 t = clock؛ basename = sprintf ('\ img_٪ d_٪ d_٪ d_٪ d_٪ d.png'، t (1)، t (2)، t (3)، t (4)، t (5)) ؛ المجلد = 'E: / UTK / Classes / Fall 18 / ef230 / irobot / images' ؛ fullFileName = الملف الكامل (المجلد ، الاسم الأساسي) ؛ imwrite (img، fullFileName) أغلق الشكل 1 pause (2) end

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

مع تغطية مستشعرات الصدمات المادية ، يمكننا الانتقال إلى مستشعرات الجرف والمسار التالي.

الخطوة 6: اتباع المسار

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

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

clear img clear t clear basename مسح fullFileName clear folder

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

C = r.getCliffSensors٪ إذا كانت الحلقة تتبع نطاقًا ملونًا (أبيض) إذا كان C.leftFront> 2000 && C rightFront> 2000٪ توجيه المسار المستقيم r.setDriveVelocity (محرك الأقراص) elseif C.leftFront 2000٪ يتحول إلى اليمين إذا ذهب الروبوت بعيدًا جدًا left r.turnAngle (-2.5) elseif C.leftFront> 2000 && C rightFront <2000٪ يتحول إلى اليسار إذا تحرك الروبوت بعيدًا جدًا جهة اليمين r زاوية الدوران (2.5) elseif C.leftFront <2000 && C. rightFront 100 || L.leftFront> 100 || ل.أمام> 100 || L.right> 100 img = r.getImage end٪ يتحقق لمعرفة ما إذا كان هناك انحناء في المسار إذا كان C.left> 2800 && C. right <2800 r.turnAngle (2.5) elseif C.left 2800 r.turnAngle (- 2.5) مكان نهاية٪ لنهاية نهاية التعرف على صورة المسار ("الحصول على الصورة")

ضع في اعتبارك أن أسماء المتغيرات التي اخترتها اختيارية ، لكنني أعتقد مرة أخرى أنه يجعل الحياة أسهل في استخدام متغيرات من حرف واحد عندما يكون ذلك ممكنًا

لشرح القسم الأوسط من الكود ، عندما ينطلق المستشعران الأماميان من حافة المسار (عندما يتعلق الأمر بالتقاطع أو عندما يصل إلى نهاية المسار) ، فإنه يتطلع لمعرفة ما إذا كان هناك شيء أمامه. ستحتاج إلى وضع كائن على الأرض في نهاية المسار أو عند أي تقاطعات حتى يعمل هذا.

بمجرد التقاط الصورة ، فإنها تستخدم التعرف على الصورة لمعرفة ما يجب القيام به. يوجد مكان في هذا القسم من الكود أيضًا:

٪ نائب عن مسار التعرف على صورة المسار ("الحصول على الصورة")

لقد استخدمت هذا في الوقت الحالي لأنني أردت التحدث على وجه التحديد عن معالجة النص واللون التي تحدث ، وهي في الخطوة التالية.

الخطوة 7: معالجة الصور

هناك جزأين لمعالجة الصور. الأول هو التعرف على اللون ، والذي يحسب كثافة اللون في الصورة لتقرير ما إذا كنت ستستمر في التعرف على النص أم لا. تعتمد حسابات الألوان على الاختيار الذي تم إجراؤه في مربع الحوار الأول هذا في البداية (استخدمت الأحمر والأزرق والأخضر ولكن يمكنك اختيار الألوان التي تريدها ، طالما يمكن التعرف على القيم المتوسطة لكثافة اللون من خلال كاميرا Raspberry Pi).

img = r.getImage img = imcrop (img، [0 30512354]) imgb = imcrop (img، [0 30512354]) imgt = imcrop (img، [0 30512354]) أحمر = يعني (يعني (imgb (: ،: ، 1))) ؛ g = يعني (يعني (imgb (: ،: ، 2))) ؛ ب = يعني (يعني (imgb (: ،: ، 3))) ؛

هذا هو فحص الشدة. سيتم استخدام هذا في الجزء التالي لتحديد ما تريد القيام به.

if red> g && red> b if pathcolor == 1 imgc = imcrop (img، [0 30 512 354]) R = ocr (img) if R. Words {1} == IMAGE || R. Words {2} == IMAGE || R. Words {3} == IMAGE t = clock؛ basename = sprintf ('\ img_٪ d_٪ d_٪ d_٪ d_٪ d.png'، t (1)، t (2)، t (3)، t (4)، t (5)) ؛ المجلد = 'E: / UTK / Classes / Fall 18 / ef230 / irobot / images' ؛ fullFileName = الملف الكامل (المجلد ، الاسم الأساسي) ؛ imwrite (img، fullFileName) pause (2) elseif R. Words {1} == RIGHT || R. Words {2} == RIGHT || R. Words {3} == RIGHT r.turnAngle (-75) elseif R. Words {1} == LEFT || R. Words {2} == LEFT || R. Words {3} == LEFT r.turnAngle (75) elseif R. Words {1} == رجوع || R. Words {2} == BACK || R. Words {3} == BACK r.turnAngle (110) end else r.turnAngle (110) end

يقرر هذا المقطع ما إذا كان اللون الذي تم تحديده في مربع الحوار الأول يطابق اللون الذي تراه الكاميرا. إذا كان الأمر كذلك ، فإنه يعمل على التعرف على النص. يتطلع إلى معرفة الكلمة التي تظهر (IMAGE أو BACK أو RIGHT أو LEFT) ثم إما يستدير (لليمين واليسار) أو يدور (للخلف) أو يلتقط صورة ويحفظها بنفس الطريقة السابقة.

لقد قدمت فقط قسمًا واحدًا من الكود للألوان المختلفة

للسماح للكود بالتعرف على اللونين الأزرق والأخضر ، ما عليك سوى نسخ الكود وتغيير التحقق المنطقي في الجزء العلوي من المقطع وتعيين "pathcolor == (number)" ليتوافق مع تحديدات اللون من مربع الحوار العلوي (لـ الكود كما هو معروض ، الأزرق سيكون 2 والأخضر سيكون 3).

الخطوة 8: المنتج النهائي

المنتج المنتهي
المنتج المنتهي

الآن يجب أن يقوم Robo-Technician بالتكبير حول وحدات مهمة المريخ وإبلاغ رواد الفضاء عندما يكون أي شيء في غير محله.

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

آمل أن تكون قد استمتعت بإعداد مساعد صغير لمهمة المريخ ، واستمتع بالبناء.

موصى به: