التنقل المستقل للروبوت المتحرك

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



المقدمة


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

لتحقيق هدف المشروع ، تمت صياغة المهام الوسيطة التالية:

  • تحليل قواعد مسابقة كأس RTK
  • تحليل الخوارزميات الحالية للتوجيه المستقل للروبوت المتنقل
  • إنشاء البرمجيات

تحليل قواعد مسابقة كأس RTK


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



باختصار عن العناصر التي يتكون منها المضلع
«» , . , , (), , (), ..

:



:



– , «» ( ) , . , , , , .

. , , , , , , .

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

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

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

أيضا ، يتم مضاعفة نقاط التغلب على العقبات إذا مرر الروبوت الآلي بشكل مستقل.

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



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

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

تحليل خوارزميات رؤية الكمبيوتر الموجودة


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

تتكون أنظمة رؤية الكمبيوتر من:

  • كاميرا أو أكثر
  • مجمع الكمبيوتر
  • البرنامج الذي يوفر أدوات معالجة الصور
  • قنوات الاتصال لنقل معلومات الهدف والقياس عن بعد.

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

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

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

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

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

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

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

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

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

  • دعم المكتبة لواجهة Python بسبب السهولة النسبية في تعلم هذه اللغة من قبل مبتدئ ، هو بناء بسيط ، والذي له تأثير مفيد على سهولة قراءة البرنامج.
  • قابلية النقل ، أي القدرة على تشغيل برنامج باستخدام هذه المكتبة على التوت pi3.
  • قد يكون انتشار المكتبة ، الذي يضمن مجتمعًا جيدًا من المبرمجين ، قد واجه بالفعل مشاكل قد تنشأ أثناء عملك.

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

تطوير البرمجيات


بعد تثبيت نظام التشغيل والتكوين الأولي لـ Raspberry pi ، ولكن قبل البدء في إنشاء البرنامج ، يجب عليك تثبيت جميع الحزم اللازمة لذلك. يتم تثبيت معظم هذه الحزم ، بدورها ، باستخدام مدير حزم النقاط (في حالة Python 3 ، pip3)

$ sudo apt install python3-pip

يتم تثبيت المكتبات التالية ، مثل:

  • picamera - مكتبة للعمل مع كاميرا التوت بي
  • numpy - مكتبة للعمل مع مصفوفات البيانات متعددة الأبعاد ، مثل الصور

$ sudo pip3 install picamera
$ sudo pip3 install numpy

cmake - أداة لبناء برنامج تلقائيًا من شفرة المصدر
cmake-curses-gui - حزمة GUI (واجهة رسومية) لـ cmake

$ sudo apt-get install cmake cmake-curses-gui libgtk2.0-dev
$ sudo apt-get install cmake cmake-curses-gui libgtk2.0-dev

مكتبات للعمل مع تنسيقات مختلفة للصور والفيديو والمزيد

$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libx264-dev libxvidcore-dev
$ sudo apt-get install libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev
$ sudo apt-get install gfortran libatlas-base-dev

لنقل بيانات الفيديو من الروبوت إلى الكمبيوتر ، سيتم استخدام GStreamer - إطار مصمم لاستقبال ومعالجة وإرسال بيانات الوسائط المتعددة:

$ sudo apt install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio

الخطوة التالية هي تثبيت مكتبة openCV نفسها من المصادر وتكوينها وإنشائها. للقيام بذلك ، يتم إنشاء مجلد عمل opencv.

$ mkdir opencv
$ cd opencv

من أجل تنزيل أحدث إصدارات المكتبة ، يتم استخدام wget - برنامج وحدة تحكم لتنزيل الملفات من الشبكة. في وقت إنشاء البرنامج ، كان أحدث إصدار ثابت من openCV هو 4.1.0 ، لذا قم بتنزيل وتفريغ المصادر:

$ wget https://github.com/opencv/opencv/archive/4.1.0.zip -O opencv_source.zip
$ unzip opencv_source.zip
$ wget https://github.com/opencv/opencv_contrib/archive/4.1.0.zip -O opencv_contrib.zip
$ unzip opencv_contrib.zip

بعد اكتمال عملية التفريغ ، يمكن حذف أرشيفات المصدر.

$ rm opencv_source.zip
$ rm opencv_contrib.zip

يتم إنشاء دليل للتجميع والتكوين.

$ cd /home/pi/opencv/opencv-4.1.0
$ mkdir build
$ cd build

يتم تكوين معلمات البناء باستخدام الأداة المساعدة cmake. للقيام بذلك ، يتم تمرير جميع المعلمات الهامة كمتغيرات فائدة ، إلى جانب القيم المعينة:

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON_EXAMPLES=ON -D INSTALL_C_EXAMPLES=OFF -D BUILD_opencv_python2=OFF -D WITH_GSTREAMER=ON -D BUILD_EXAMPLES=ON -DENABLE_VFPV3=ON -DENABLE_NEON=ON -DCPU_BASELINE=NEON ..

بعد إعداد التكوين ، ستعرض الأداة كافة المعلمات. بعد ذلك ، تحتاج إلى تجميع المكتبة. للقيام بذلك ، استخدم الأمر Command console –jN ، حيث N هو عدد النوى التي ستشارك في عملية الترجمة. بالنسبة إلى raspberry pi 3 ، يكون عدد النوى 4 ، ولكن يمكنك بالتأكيد معرفة هذا الرقم من خلال كتابة الأمر nproc في وحدة التحكم.

$ make –j4

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

عندما كان التجميع ناجحًا ، يجب تثبيت المكتبة. يتم ذلك أيضًا باستخدام الأداة المساعدة make. ثم سنقوم بتشكيل جميع الاتصالات اللازمة مع أداة ldconfig:

$ sudo make install
$ sudo ldconfig

نتحقق من التثبيت عن طريق كتابة الأوامر التالية في الوضع التفاعلي لبايثون:

import cv2
print(cv2.getBuildInformation())

سيكون الاستنتاج التالي للبرنامج دليلاً على التثبيت الصحيح.



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

إنشاء مخطط توزيع فيديو

قبل البدء في كتابة التعليمات البرمجية ، تحتاج إلى تطوير مخطط تعمل بموجبه الخوارزمية. في حالة تطوير البرمجيات الخاصة بروبوت تم إنشاؤه للمشاركة في مسابقات كأس RTK في ترشيح Extreme ، سيتم تقسيم البرنامج بالكامل إلى جزأين: روبوت وجهاز تحكم عن بعد ، سيتم تشغيلهما بواسطة جهاز كمبيوتر مثبت عليه Linux. من أهم المهام هنا إنشاء مخطط تقريبي لكيفية نقل بيانات الفيديو بين أجزاء مختلفة من الخوارزمية. سيتم استخدام Wi-Fi كقناة اتصال بين الجهازين. سيتم نقل حزم البيانات التي توفر التحكم في الروبوت وبيانات الملاحظات من جهاز لآخر باستخدام بروتوكول UDP الذي يتم تنفيذه في استخدام مكتبة المقابس. بيانات الفيديوبسبب القيود في حجم حزمة UDP سيتم إرسالها باستخدام GStreamer. لتسهيل عملية التصحيح ، سيتم تنفيذ دفق فيديو:

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

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



سيتم تنفيذ التحكم عن بعد للروبوت بسبب عمل تدفقين متوازيين على الروبوت وعلى الكمبيوتر:

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

قبل تحليل خوارزمية الكشف عن الخط ، أقترح أن تتعرف على ميزات تصميم الروبوت:

عن الروبوت
.

— . (3 ) . , . 6 , . . . . , - . «» rasberry pi 3 b — .

, , , , Solidworks petg . , raspberry .

ubiquiti bullet M5 hp. ( ) , . , «» .


: «» thingiverse. , , , , .


, , . , . , , , , . , , , .





- ( - 200 ) , , 90 70 ( ), , « ». , VL53L0X , .


«» , , (rds3115). — , , , , .


, , , :


- , , , . . raspberry, , . , .

, USB. , , .




إنشاء خوارزمية كشف الخط باستخدام طرق مكتبة OpenCV


1. تلقي البيانات

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

أسهل طريقة للحصول على إطارات من الكاميرا c لمزيد من المعالجة هي استخدام مكتبة picamera. قبل أن تبدأ ، تحتاج إلى السماح بالوصول إلى الكاميرا من خلال raspi-config -> كاميرا خيارات التواصل -> اختر نعم.

sudo raspi-config

القسم التالي من الكود متصل بكاميرا التوت وفي دورة مع تردد معين يستقبل الإطارات في شكل مصفوفة جاهزة للاستخدام من قبل مكتبة opencv.

from picamera.array import PiRGBArray
from picamera import PiCamera
import cv2
#   
camera = PiCamera()
camera.resolution = (640, 480) 
camera.framerate = 30
cap = PiRGBArray(camera, size=(640, 480))

for frame in camera.capture_continuous(cap , format="bgr", use_video_port=True):
	new_frame = frame.array
	cap.truncate(0)
	if False: #   -   
		break

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

مثال على صورة من كاميرا عنوان روبوت بدون معالجة:


II. المعالجة المسبقة

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

gray = cv2.cvtColor(self._frame, cv2.COLOR_RGB2GRAY)
blur = cv2.GaussianBlur(gray, (ksize, ksize), 0)

حيث ksize هو حجم قلب Gaussian ، مما يؤدي إلى زيادة درجة الضبابية.

مثال للصورة بعد الترجمة بتدرج الرمادي والتمويه:


ثالثًا. تحديد التفاصيل

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

thresh = cv2.threshold(blur, self._limit, 255, cv2.THRESH_BINARY_INV)[1]

هنا ، يتم استبدال جميع وحدات البكسل التي تكون أغمق من قيمة العتبة (self._limit) بـ 0 (أسود) وأخف وزنًا - 255 (أبيض).

بعد المعالجة ، تبدو الصورة كما يلي:


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

IV. الكشف

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

contours = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[0]

وهنا الإطار الذي تم الحصول عليه في هذه المرحلة:


خامسا معالجة عالية المستوى

بعد العثور على جميع الخطوط في الإطار ، يتم تحديد المحيط بأكبر مساحة ويتم اعتباره كفاف للخط. معرفة إحداثيات جميع نقاط هذا الكفاف ، تم العثور على إحداثيات مركزه. لهذا ، يتم استخدام ما يسمى "لحظات الصورة". اللحظة هي السمة الكلية للكونتور ، محسوبة من خلال جمع إحداثيات جميع وحدات بكسل الكفاف. هناك عدة أنواع من اللحظات - حتى الدرجة الثالثة. لهذه المشكلة ، لا يلزم سوى لحظة الترتيب الصفري (m00) - عدد جميع النقاط التي يتكون منها الكفاف (محيط الكفاف) ، ولحظة الترتيب الأول (m10) ، وهي مجموع إحداثيات X لجميع النقاط ، و m01 هي مجموع إحداثيات Y لجميع النقاط. من خلال قسمة مجموع إحداثيات النقاط على أحد المحاور على عددها ، يتم الحصول على المتوسط ​​الحسابي - الإحداثيات التقريبية لمركز الكفاف. بعد ذلك ، يتم حساب انحراف الروبوت عن الدورة:تتوافق الدورة "مباشرة" مع إحداثيات نقطة المركز على طول X بالقرب من عرض الإطار مقسومة على نقطتين. إذا كانت إحداثيات مركز الخط قريبة من مركز الإطار ، فعندئذ يكون إجراء التحكم ضئيلًا ، وبالتالي ، يحتفظ الروبوت بمساره الحالي. إذا انحرف الروبوت من أحد الجانبين ، فسيتم إدخال إجراء تحكم يتناسب مع الانحراف حتى يعود.

mainContour = max(contours, key = cv2.contourArea)
M = cv2.moments(mainContour)
if M['m00'] != 0:#     (..   -  )
    cx = int(M['m10']/M['m00'])
    cy = int(M['m01']/M['m00'])

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

cv2.line(frame, (cx, 0), (cx, self.height), (255, 0, 0), 1)    #    
cv2.line(frame, (0, cy), (self.width, cy), (255, 0, 0), 1)                  
cv2.circle(frame, (self.width//2, self.height//2), 3, (0, 0, 255), -1) #  
cv2.drawContours(frame, mainContour, -1, (0, 255, 0), 2, cv2.FILLED) #   

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





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


الخطوة التالية في البرنامج هي تحويل المعلومات التي تم الحصول عليها في الخطوة السابقة إلى قيم الطاقة لمحركين.

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

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

error= cx / (self.width/2) - 1  
#  ( 0   )  [-1; 1]
error*= cy / self.height + self.gain #

في أغلب الأحيان ، في ظروف مسابقة "كأس RTK" ، يستخدم المشاركون ما يسمى "دائرة الخزان" - يتحكم محرك واحد أو أكثر في جانب واحد من الروبوت ، ويعمل مع كل من المسارات والعجلات. يتيح لك استخدام هذا المخطط التخلص من عناصر الإرسال المعقدة التي تزيد من فرصة الكسر (التفاضلية أو أعمدة الكاردان) ، والحصول على أصغر نصف قطر دوران ممكن ، مما يمنح ميزة في المضلع المحصور. يتضمن هذا المخطط التحكم الموازي لـ "جانبين" للحركة على طول مسار معقد. للقيام بذلك ، يستخدم البرنامج متغيرين - قوة المحرك الأيمن والأيسر. تعتمد هذه القدرة على سرعة القاعدة (BASE_SPEED) ، والتي تتراوح في النطاق من 0 إلى 100.الأخطاء (الخطأ) - الفرق بين مركز الإطار وإحداثيات منتصف الخط ومعامل التأثير النسبي (self._koof) ، والذي يتم معايرته بواسطة عامل التشغيل. تؤثر قيمته المطلقة على مدى سرعة الروبوت في محاذاة الخط. نظرًا لحقيقة أنه يتم طرح إجراء التحكم على محرك واحد من السرعة الأساسية ، ومن ناحية أخرى - يتم إضافته ، يتم إجراء دوران عند الانحراف عن الدورة. يمكن تعديل الاتجاه الذي سيتم فيه الانعكاس عن طريق تغيير علامة متغير self._koof. أيضًا ، قد تلاحظ أنه نتيجة لقسم الرمز التالي ، قد تظهر قيمة طاقة تزيد عن 100 ، ولكن في برنامجي تتم معالجة هذه الحالات أيضًا في وقت لاحق.تؤثر قيمته المطلقة على مدى سرعة الروبوت في محاذاة الخط. نظرًا لحقيقة أنه يتم طرح إجراء التحكم على محرك واحد من السرعة الأساسية ، ومن ناحية أخرى - يتم إضافته ، يتم إجراء دوران عند الانحراف عن الدورة. يمكن تعديل الاتجاه الذي سيتم فيه الانعكاس عن طريق تغيير علامة متغير self._koof. أيضًا ، قد تلاحظ أنه نتيجة لقسم الرمز التالي ، قد تظهر قيمة طاقة تزيد عن 100 ، ولكن في برنامجي تتم معالجة هذه الحالات أيضًا في وقت لاحق.تؤثر قيمته المطلقة على مدى سرعة الروبوت في محاذاة الخط. نظرًا لحقيقة أنه يتم طرح إجراء التحكم على محرك واحد من السرعة الأساسية ، ومن ناحية أخرى - يتم إضافته ، يتم إجراء دوران عند الانحراف عن الدورة. يمكن تعديل الاتجاه الذي سيتم فيه الانعكاس عن طريق تغيير علامة متغير self._koof. أيضًا ، قد تلاحظ أنه نتيجة لقسم الرمز التالي ، قد تظهر قيمة طاقة تزيد عن 100 ، ولكن في برنامجي تتم معالجة هذه الحالات أيضًا في وقت لاحق.حيث سيتم إجراء الانعكاس ، يمكنك الضبط بتغيير علامة متغير self._koof. أيضًا ، قد تلاحظ أنه نتيجة لقسم الرمز التالي ، قد تظهر قيمة طاقة تزيد عن 100 ، ولكن في برنامجي تتم معالجة هذه الحالات أيضًا في وقت لاحق.حيث سيتم إجراء الانعكاس ، يمكنك الضبط بتغيير علامة متغير self._koof. أيضًا ، قد تلاحظ أنه نتيجة لقسم الرمز التالي ، قد تظهر قيمة طاقة تزيد عن 100 ، ولكن في برنامجي تتم معالجة هذه الحالات أيضًا في وقت لاحق.

#if lineFound:
leftSpeed = round(self.base_speed + error*self.koof)
rightSpeed = round(self.base_speed - error*self.koof)

استنتاج


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

  • -, , ( , ), . , , , . , , , ,
  • -, — , ,

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

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

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


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

All Articles