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

روبوت والاس المستقل - الجزء 4 - إضافة مسافة الأشعة تحت الحمراء ومستشعرات "أمبير": 6 خطوات
روبوت والاس المستقل - الجزء 4 - إضافة مسافة الأشعة تحت الحمراء ومستشعرات "أمبير": 6 خطوات

فيديو: روبوت والاس المستقل - الجزء 4 - إضافة مسافة الأشعة تحت الحمراء ومستشعرات "أمبير": 6 خطوات

فيديو: روبوت والاس المستقل - الجزء 4 - إضافة مسافة الأشعة تحت الحمراء ومستشعرات
فيديو: الدرس 32 - الجزء 2 - السيارة الذكية - الاختبارات والتحكم بجهاز الأشعة تحت الحمراء 2024, سبتمبر
Anonim
Image
Image
إضافة دارة داعمة (MCP3008)
إضافة دارة داعمة (MCP3008)

مرحبًا ، نبدأ اليوم المرحلة التالية من تحسين قدرات والاس. على وجه التحديد ، نحاول تحسين قدرته على اكتشاف وتجنب العقبات باستخدام مستشعرات المسافة بالأشعة تحت الحمراء ، وكذلك الاستفادة من قدرة وحدة التحكم في المحرك Roboclaw على مراقبة التيار وتحويله إلى "مستشعر" افتراضي (برمجي). أخيرًا ، سنلقي نظرة على كيفية التنقل بدون SLAM (الموقع والتخطيط المتزامن) (في الوقت الحالي) ، نظرًا لأن الروبوت لا يحتوي حتى الآن على IMU (وحدة قياس القصور الذاتي) أو مستشعرات ToF (وقت الرحلة).

من خلال التنقل ، سيكون في البداية هدفين رئيسيين فقط:

  1. تجنب العقبات
  2. تعرف عندما تكون عالقة في مكان ما ولا تحرز أي تقدم. (يعني "التقدم" هل تحركت إلى الأمام أي مسافة ذات معنى)
  3. يمكن أن يكون الهدف الثالث المحتمل أن تحاول محاذاة نفسها بشكل مباشر إلى الحائط.

بدأ هذا المشروع بمجموعة روبوت والحصول على حركات أساسية للعمل باستخدام لوحة مفاتيح واتصال ssh.

كانت المرحلة الثانية هي إضافة دوائر داعمة كافية للتحضير لإضافة العديد من أجهزة الاستشعار.

في Instructable السابق ، أضفنا العديد من أجهزة الاستشعار الصوتية HCSR04 ويمكن للروبوت الآن تجنب العقبات أثناء تحركه حول الشقة.

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

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

(تحديث: في الواقع ، في الوقت الحالي ، المراقبة الحالية هي الخطة أ عند الرجوع إلى الخلف حيث أزلت مؤقتًا وأجهزة الاستشعار من الخلف).

يشكل الفيديو الخاص بهذا القسم المرحلة الأخيرة من مجسات تجنب العوائق.

ما تراه في الفيديو هو ستة مستشعرات صوتية أمامية HCSR04 ، واثنين من مستشعرات Sharp IR. لم تلعب مستشعرات الأشعة تحت الحمراء دورًا كبيرًا في الفيديو. تكمن قوتهم في الغالب عندما يجد الروبوت نفسه في منطقة تناول الطعام مواجهًا للطاولة وأرجل الكرسي.

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

أخيرًا ، يستخدم تاريخ آخر 100 حركة ، وبعض التحليلات الأساسية للإجابة على سؤال واحد:

"هل تم إحراز تقدم حقيقي مؤخرًا (أم أنه عالق في بعض الرقصات المتكررة)؟"

لذلك في الفيديو عندما ترى تكرارا للأمام والعكس ، ثم يستدير ، فهذا يعني أنه تعرّف على النمط الأمامي-العكسي ، وبالتالي يحاول شيئًا آخر.

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

الخطوة 1: إضافة الدوائر الداعمة (MCP3008)

إضافة دارة داعمة (MCP3008)
إضافة دارة داعمة (MCP3008)
إضافة دارة داعمة (MCP3008)
إضافة دارة داعمة (MCP3008)
إضافة دارة داعمة (MCP3008)
إضافة دارة داعمة (MCP3008)

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

سنضيف محول تناظري إلى رقمي MCP3008. هناك العديد من الموارد عبر الإنترنت حول كيفية توصيل هذه الشريحة بـ Raspberry Pi ، لذلك لن أتطرق إلى ذلك كثيرًا هنا.

في الأساس ، لدينا خيار. إذا كان إصدار مستشعرات الأشعة تحت الحمراء يعمل بجهد 3 فولت ، فيمكن أيضًا لـ MCP3008 ، وبعد ذلك يمكننا الاتصال مباشرة بـ Raspberry.

[مستشعر الأشعة تحت الحمراء 3 فولت] - [MCP3008] - [Raspberrry Pi]

ومع ذلك ، في حالتي ، أعمل في الغالب بجهد 5 فولت ، وهذا يعني تغيير مستوى ثنائي الاتجاه.

[مستشعر 5V IR] - [MCP3008] - [ناقل ثنائي الاتجاه 5V إلى 3V] - [Raspberry Pi]

ملاحظة: يوجد خرج إشارة واحد فقط من مستشعر الأشعة تحت الحمراء. يذهب مباشرة إلى أحد خطوط الإشارة التناظرية للإدخال في MCP3008. من MCP3008 ، هناك 4 خطوط بيانات نحتاج إلى توصيلها (عبر ناقل ثنائي الاتجاه) بـ Raspberry Pi.

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

الخطوة 2: تركيب مستشعرات الأشعة تحت الحمراء

تركيب مجسات الأشعة تحت الحمراء
تركيب مجسات الأشعة تحت الحمراء
تركيب مجسات الأشعة تحت الحمراء
تركيب مجسات الأشعة تحت الحمراء
تركيب مجسات الأشعة تحت الحمراء
تركيب مجسات الأشعة تحت الحمراء
تركيب مجسات الأشعة تحت الحمراء
تركيب مجسات الأشعة تحت الحمراء

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

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

هناك ثلاث طرق على الأقل لتركيب هذه المستشعرات على الروبوت.

  1. ضعهم في وضع ثابت ، في المقدمة ، وواجههم بعيدًا قليلاً عن بعضهم البعض.
  2. ضعهم على مؤازرة ، في المقدمة ، في مواجهة بعيدًا قليلاً عن بعضهم البعض.
  3. ضعهم في وضع ثابت ، في الأمام ، ولكن في أقصى اليسار وأقصى اليمين ، بزاوية تجاه بعضهما البعض.

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

مع الاختيار رقم 1 ، كلما زاد تباعد المستشعرات عن بعضها البعض ، زادت النقطة العمياء في المركز.

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

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

أرغب في ترك خيار المؤازرة لوقت لاحق عند إضافة أجهزة استشعار أكثر أهمية ، مثل Time-of-Flight (ToF) ، أو ربما كاميرا.

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

لذلك نحن ننتقل إلى اختيار الموضع رقم 3.

الخطوة الثالثة: حان وقت الاختبار

Image
Image

بعد إجراء جميع الاتصالات بين Raspberry Pi و MCP3008 ADC ومستشعرات Sharp IR ، حان الوقت للاختبار. مجرد اختبار بسيط للتأكد من أن النظام يعمل مع المستشعرات الجديدة.

كما في Instructables السابقة ، أستخدم مكتبة wiringPi C قدر الإمكان. يجعل الأمور أسهل. هناك شيء غير واضح جدًا من مراجعة موقع wiringPi ، وهو أن هناك دعمًا مباشرًا لـ MCP3004 / 3008.

حتى بدون ذلك ، يمكنك فقط استخدام امتداد SPI. لكن لا داعي لذلك. إذا ألقيت نظرة فاحصة على مستودع Git Git لـ wiringPi ، فستجد قائمة من الرقائق المدعومة ، أحدها مخصص لـ MCP3004 / 3008.

قررت إرفاق الرمز كملف لأنني لم أتمكن من عرضه بشكل صحيح على هذه الصفحة.

الخطوة 4: مستشعر افتراضي - AmpSensor

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

يحتوي الروبوت حاليًا على ثمانية مستشعرات سونار صوتية HCSR04 (ليست محور هذا Instructable) ، ولديه الآن جهازي استشعار شارب IR للمسافات. كما ذكرنا سابقًا ، يمكننا الاستفادة من شيء آخر: ميزة استشعار التيارات الحركية في Roboclaw.

يمكننا التفاف استدعاء الاستعلام هذا إلى وحدة التحكم في المحرك في فئة C ++ وتسميته AmpSensor.

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

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

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

الخطوة الخامسة: التنقل

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

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

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

لقد اخترت عمدًا عدم استخدام وحدة تحكم دقيقة مثل Arduino لأنني أ) لا أحب بيئة psuedo-C ++ ، ب) وأن الكثير من التطوير سيؤدي إلى إهلاك ذاكرة القراءة والكتابة (؟) ، وأنا سيحتاج إلى كمبيوتر مضيف لتطوير (؟). أو ربما تحدثت مثل Raspberry Pi.

ومع ذلك ، فإن Pi الذي يعمل Raspbian ليس نظام تشغيل في الوقت الفعلي ، لذلك بين عدم استقرار هذه المستشعرات ، وعدم قراءة نظام التشغيل في كل مرة ، شعرت أن الغرض من هذه المستشعرات كان أكثر ملاءمة لتجنب العقبات وليس قياس المسافة الفعلي.

بدا هذا النهج معقدًا وليس له فائدة كبيرة ، عندما يمكننا استخدام مستشعرات ToF (وقت الرحلة) أفضل (لاحقًا) لهذا الغرض (SLAM).

أحد الأساليب التي يمكننا استخدامها هو الاحتفاظ بنوع من التتبع لأوامر الحركة التي تم إصدارها خلال الثواني أو الأوامر الأخيرة.

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

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

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

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

يمكنني التفكير في طريقتين أساسيتين (بدائيتين) لاستخدام تاريخ الحركة.

  • بالنسبة لآخر عدد س من الحركات ، هل تتطابق مع النمط ص. مثال بسيط يمكن أن يكون (وهذا ما حدث) "إلى الأمام ، عكس ، إلى الأمام ، عكس ، …". لذلك هناك وظيفة المطابقة هذه التي ترجع إما TRUE (تم العثور على نمط) أو FALSE (غير موجود). إذا كانت القيمة TRUE ، في جزء التنقل من البرنامج ، فحاول تسلسل حركة أخرى.
  • بالنسبة لآخر X عدد من التحركات ، هل هناك حركة عامة أو صافية للأمام. كيف يمكن للمرء أن يحدد ما هو التحرك الحقيقي للأمام؟ حسنًا.. إحدى المقارنة السهلة هي أنه بالنسبة لآخر تحركات X ، يحدث "FORWARD" أكثر من "REVERSE". لكن هذا لا يجب أن يكون الوحيد. ماذا عن هذا: "الحق ، اليمين ، اليسار ، اليمين". في هذه الحالة ، يتعين على الروبوت أن يقوم بالدوران الصحيح للخروج من الزاوية أو لأنه اقترب من الحائط بزاوية ، يمكن اعتبار ذلك تقدمًا حقيقيًا للأمام. من ناحية أخرى ، "LEFT ، RIGHT ، LEFT ، RIGHT …" قد لا يعتبر تقدمًا حقيقيًا للأمام. وبالتالي ، إذا حدث "RIGHT" أكثر من "LEFT" أو "LEFT يحدث أكثر من" RIGHT "، فقد يكون ذلك تقدمًا حقيقيًا.

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

الخطوة 6: الأفكار النهائية ، المرحلة التالية …

نأمل أن يكون هذا Instructable قد أعطى بعض الأفكار.

تقدم إضافة المزيد من المستشعرات بعض المزايا والتحديات.

في الحالة المذكورة أعلاه ، عملت جميع المستشعرات الصوتية بشكل جيد معًا وكانت مباشرة إلى حد ما مع البرنامج.

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

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

في الوقت الحالي ، بعد التجربة والخطأ ، انتهى الأمر بالأشياء في هذه الأولوية:

  1. أمبير الاستشعار
  2. استشعار الأشعة تحت الحمراء
  3. الاستشعار الصوتي

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

حتى الآن ، لم تكن هناك حاجة للقيام بأي برنامج متعدد الخيوط أو يحركه المقاطعة ، على الرغم من أنني أواجه أحيانًا فقدان التحكم بين Raspberry Pi ووحدة التحكم في المحرك Roboclaw (فقدان الاتصالات التسلسلية).

هذا هو المكان الذي ستستخدم فيه دائرة E-Stop (انظر التعليمات السابقة). ومع ذلك ، نظرًا لأنني لا أريد (حتى الآن) التعامل مع الاضطرار إلى إعادة تعيين Roboclaw أثناء التطوير ، والروبوت لا يعمل بهذه السرعة ، وأنا موجود لمراقبته وإغلاقه ، لم أفعل ربط E-Stop.

في النهاية ، من المرجح أن يكون استخدام خيوط المعالجة المتعددة ضروريًا.

الخطوات التالية…

شكرا لك على الوصول إلى هذا الحد.

لقد حصلت على بعض مستشعرات VL53L1X IR ليزر ToF (وقت الرحلة) ، لذلك من المحتمل أن يكون هذا هو موضوع Instructable التالي ، جنبًا إلى جنب مع أجهزة.

موصى به: