بناء خريطة محلية للروبوت عبر البلاد

مرحبا يا هبر!

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

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

ما هي الخريطة المحلية عبر البلاد


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

إذا ظل الروبوت ثابتًا ، فستظل خريطته المحلية في ظل ظروف بيئية ثابتة ثابتة.

إذا تحرك الروبوت ، فعندئذ تختلف بيئته في كل لحظة من الزمن ، على التوالي ، تتغير الخريطة المحلية أيضًا.

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

لتبسيط المهمة ، تقرر جعل مربع الخريطة ، كما تقرر أن يكون مكتشف النطاق في وسط الخريطة بشكل مشروط (سيكون هذا المكان هو النقطة حيث x = y = 0). تم اختيار المركز بهذه الطريقة لأن جهاز تحديد المدى الذي أستخدمه ينبعث منه أشعة في الطائرة أكثر من 180 درجة (ينبعث منها الأشعة عند 240 درجة ، ولكن أكثر من ذلك لاحقًا) ، أي أن بعض الأشعة ستذهب بالتأكيد خلف الماسح الضوئي و إذا اخترت المركز الخطأ ، يمكن أن تفقدهم. مع الاختيار الصحيح للمركز ، سيتم عرض جميع الأشعة بشكل صحيح. وبناءً على ذلك ، جعلت حجم الخريطة أكبر مرتين من الطول الأقصى للأشعة المنبعثة.
حجم بطاقتي هو 12 * 12 متر.

الصورة

المستشعر الذي استخدمته


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

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

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

لحل مشكلتي ، استخدمت ماسحة ليزر Hokuyo URG-04LX-UG01. هذا المستشعر قادر على انبعاث الأشعة عند 240 درجة ويوفر معلومات دقيقة إلى حد ما حول العقبات التي تقف في طريق الأشعة. أقصى مدى لها هو 5-6 أمتار. من الجدير بالذكر أن هذا المدى يصدر أشعة فقط في المستوى الثنائي الأبعاد. تُلزمك هذه الحقيقة بوضع المستشعر على الروبوت في مكان معين ، عادة أمام الجزء السفلي من الروبوت ، للحصول على صورة أكثر دقة. مرة أخرى ، يمكنك استخدام الماسحات الضوئية ثلاثية الأبعاد ، والتي توفر معلومات أكثر دقة وكاملة عن البيئة ، ولكنها تكلف أيضًا أكثر بكثير.

أعتقد أن هذا الماسح الضوئي الخاص مثالي للتدريب على نسبة السعر إلى الجودة.

الصورة
هوكيو URG-04LX-UG01

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

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

الصورة

يمكن الحصول على البيانات التالية من ماسح ليزر:

لكل شعاع ينبعث:

  • المسافة إلى عقبة
  • زاوية الانبعاث

* يتم تخزين كل من المعلمات في مصفوفة منفصلة وتتوافق مع البيانات الخاصة بأحد الأشعة.

حول بناء الخريطة


لبناء الخريطة ورسمها ، استخدمت أدوات ROS (نظام تشغيل الروبوت) ، وهي: برنامج Rviz ونوع البيانات nav_msgs :: OccupancyGrid. لقد قمت بإنشاء ناشر للخريطة المحلية بنوع الرسالة nav_msgs :: OccupancyGrid تحت موضوع local_map المقابل. في Rviz ، اشترك في هذا الموضوع ، تلقى بيانات حول الخريطة وعرضها في شكل خريطة نوع.

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

ما الذي يحدث هنا؟
لأولئك الذين يواجهون هذا النوع من بيانات ROS للمرة الأولى: هذا غير عادي ، حيث يتم تمثيل الخريطة بشكل تقليدي كمصفوفة ثنائية الأبعاد مع عدد معين من الأعمدة والصفوف.

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

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

وهي: خطًا بسطر من تخزين ثنائي الأبعاد للكتابة في سطر واحد.

فويلا! هذا هو السر كله.

يحدث نداء إلى أي عنصر من هذا الصفيف أحادي البعد كما يلي:

localMap[mapSizej+i]


mapSize - حجم الخريطة المحلية
j هو رقم العمود
ط - رقم السطر

يجب أن تحتوي خلايا الخريطة (مرة أخرى وفقًا لنوع البيانات في OccupancyGrid) على قيم من 0 إلى 100. كلما كانت القيمة أصغر ، زادت احتمالية أن تكون الخلية قابلة للتمرير والعكس صحيح.

لتبسيط المهمة ، اخترت 3 ألوان أساسية لخلايا التلوين.

  • أبيض - منطقة سالبة = 0
  • أسود - منطقة غير سالكة = 100
  • الرمادي - منطقة غير معروفة = 50

نقطة مهمة!

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

الصورة
بطاقة غير معروفة

يتم إنشاء الأشعة باستخدام تحويل من نظام الإحداثيات القطبية (UCS)
إلى نظام الإحداثيات الديكارتية (DSC).

$$ display $$ \ left \ {\ start {collect} x = r * cos φ \\ y = r * sin φ \ end {collect} \ right. $$ display $$


س ، ص - إحداثيات جديدة في DSC
r هي المسافة إلى العائق
φ هي الزاوية التي تم فيها إسقاط الحزمة
ص ، φ - الإحداثيات القديمة في UCS

خوارزمية معالجة بيانات المستشعر:


نحن نجتاز صفائف المسافات r وزوايا φ للأشعة (بيانات UCS). لكل عنصر ، قم بما يلي:

  1. نقوم بتحويل الإحداثيات من UCS إلى DSC لـ r و ite المحدودين. قم بطلاء الخلية الناتجة باللون الأسود. هذه عقبة.
  2. نحن نمر في خط مستقيم من موقع الماسح الضوئي إلى الخلية مع عقبة بخطوة معينة ، في أبسط الحالات تساوي حجم الخلية.
  3. مرة أخرى ، نقوم بتحويل البيانات من UCS إلى DSC ونرسم الخلية الجديدة باللون الأبيض. هذه منطقة قابلة للمشي.

الصورة
أبسط مثال على كيفية بناء مسار قابل للمشي إلى عقبة

ولكن ماذا لو لم يعود الشعاع المنبعث؟
إذا حدث ذلك فقد يعني ذلك ما يلي:

  • الشعاع "مفقود" ، أي أنه لا ينعكس أو ينعكس بشكل كامل في الاتجاه الآخر
  • لم تكن هناك عقبات في طريق الشعاع وبسبب هذا ، لم يكن لديها شيء للتفكير فيه

* يمكن أن "تضيع" الشعاع عادة لأنه لا ينعكس بزاوية 180 درجة (أي تحت أي لا يصل إلى الوراء) ، لأن العائق يمكن أن يقف عموديًا على الشعاع. وكما تعلم من الفيزياء: زاوية الورود تساوي زاوية الانعكاس.

الصورة

أو لأن العائق كان أسودًا للغاية ويمتص معظم طاقة الشعاع ولم يكن للشعاع ما يكفي من الطاقة للعودة.

وبالتالي ، من المستحيل التأكد تمامًا مما حدث إذا لم تعد الحزمة.

ماذا تفعل في مثل هذه الحالات؟

نقوم بما يلي:

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

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

دقة البطاقة


أخيرا ، اللمسات الأخيرة!

كل بطاقة لديها إذن. ببساطة ، هذا هو عدد الخلايا التي يمكن أن تتناسب مع خلية واحدة.

على سبيل المثال
إذا كانت هناك خلية واحدة في خلية واحدة (الحالة الأبسط) ، فحينئذٍ يكون الحل 1.
إذا كان هناك 5 خلايا في خلية واحدة ، فإن الدقة هي 0.2.

دقة بطاقتي 0.04. أي في كل خلية هناك 25 خلية. وبالتالي ، فإن الحد الأدنى لخطوتي هو 4 سم ، وخلية واحدة 1 م.

الصورة
اختلاف الخلية والخلية على خريطتي

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


الصورة
مثال لبناء خريطة محلية عبر البلاد
* يشير اللون الأصفر إلى ألوان الخلايا

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

Source: https://habr.com/ru/post/ar418585/


All Articles