مقدمة لنظام تشغيل الروبوت: إطار عمل تطبيق الروبوت النهائي

نشرت: 2022-03-11

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

يتم تقسيم ROS إلى أكثر من 2000 حزمة ، كل حزمة توفر وظائف متخصصة. ربما يكون عدد الأدوات المتصلة بإطار العمل هو أكبر قوته.

لماذا يجب علي استخدام نظام تشغيل الروبوت؟

يوفر ROS وظائف لاستخراج الأجهزة ، وبرامج تشغيل الأجهزة ، والاتصال بين العمليات عبر أجهزة متعددة ، وأدوات للاختبار والتصور ، وغير ذلك الكثير.

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

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

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

  • استبدل المكونات بواجهات متشابهة على الفور ، مما يلغي الحاجة إلى إيقاف النظام لإجراء تغييرات مختلفة

  • مضاعفة مخرجات مكونات متعددة في مدخل واحد لمكون آخر ، مما يسمح بالحل المتوازي للعديد من المشاكل

  • قم بتوصيل المكونات التي تم إنشاؤها بلغات برمجة مختلفة فقط من خلال تنفيذ الموصلات المناسبة لنظام المراسلة ، مما يسهل تطوير البرامج عن طريق توصيل الوحدات النمطية الموجودة من مطورين مختلفين

  • إنشاء عقد عبر شبكة من الأجهزة ، دون القلق بشأن مكان تشغيل التعليمات البرمجية وتنفيذ أنظمة الاتصال بين العمليات (IPC) واستدعاء الإجراءات عن بُعد (RPC)

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

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

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

توفر الأساليب البديلة مثل MRPT و CARMEN و LCM و Player و Microsoft RDS وغيرها بعض هذه الميزات ، ولكن ليس كلها. في معظم الأحيان ، تتمثل عيوب التصميم في قيود دعم اللغة ، أو الاتصال غير المُحسَّن بين العمليات ، أو نقص الدعم للأجهزة المختلفة التي يمكن القول إنها أصعب مشكلة يجب إصلاحها.

ما الذي سنقوم ببنائه؟

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

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

اللغات الرئيسية لكتابة كود ROS هي C ++ و Python ، ويفضل C ++ بسبب الأداء الأفضل. سنشرح أمثلةنا في Python نظرًا لقلة الترميز المعياري في الكود وعدم الحاجة إلى بناء واضح.

التثبيت والتكوين

يشار إلى إصدارات ROS بالاسم. اعتبارًا من هذا التاريخ ، أحدث إصدار هو Jade Turtle ، وأحدث إصدار LTS Indigo Igloo . يُفضل استخدام إصدار LTS ، والتوافق مع الإصدارات السابقة غير مضمون في ROS ، لذلك ستتم كتابة جميع الأمثلة لـ Indigo .

يتوفر ROS على العديد من منصات * NIX. الإصدار المدعوم رسميًا موجود على Ubuntu. يدعم المجتمع إصدارات OS X و Arch Linux و Debian و Raspbian و Android.

سنتابع عملية تثبيت Ubuntu 14.04 على سطح المكتب. تتوفر عمليات جميع الإصدارات والأنظمة الأساسية المدعومة على الموقع الرسمي. تتوفر أيضًا أجهزة افتراضية مثبت عليها نظام ROS.

يعتمد التثبيت على النظام الأساسي (وتحتوي معظم الأنظمة الأساسية على حزم متوفرة) ، ولكن تكوين مساحة العمل هو نفسه لجميع الأنظمة الأساسية.

التثبيت على أوبونتو

توفر ROS مستودعاتها الخاصة. الخطوة الأولى هي إضافتهم.

 sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 0xB01FA116 sudo apt-get update

بعد ذلك سيكون لديك جميع الحزم المستضافة لجميع إصدارات ROS المتاحة لإصدار Ubuntu الخاص بك. على سبيل المثال ، يدعم Ubuntu 14.04 indigo jade .

يتضمن تثبيت الحزم الأساسية على سطح المكتب أحد الخيارات الثلاثة:

  • sudo apt-get install ros-indigo-ros-base للحصول على الحد الأدنى من التثبيت

  • sudo apt-get install ros-indigo-desktop للحصول على أدوات واجهة المستخدم الرسومية الإضافية الأساسية

  • sudo apt-get install ros-indigo-desktop-full للحصول على جميع الميزات الرسمية ، بما في ذلك العديد من أجهزة المحاكاة والمكتبات للتنقل والإدراك

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

 sudo apt-get install ros-indigo-<package-name>

يتم استبدال الشرطات السفلية بواصلات في الاسم النهائي ، لذلك سيكون stage_ros في الحزمة ros-indigo-stage-ros .

الخطوة التالية هي تهيئة rosdep . يمكن أن تعلن الحزم في ROS عن المكونات التي تعتمد عليها. يسمح لك rosdep بتجميع هذه الحزم دون الكثير من معالجة التبعية اليدوية. لتهيئته ، اتصل بـ:

 sudo rosdep init rosdep update

تمتلك ROS العديد من متغيرات البيئة التي تستخدمها أدواتها. مع التثبيت الافتراضي ، يوجد سكربت bash لتهيئتها في /opt/ros/indigo/setup.bash . يجب تهيئة المتغيرات في كل جلسة bash ، لذا فإن أفضل حل هو إضافتها إلى ~/.bashrc .

 echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc source ~/.bashrc

تقوم بعض الحزم بتثبيت التبعيات الخارجية عبر rosinstall ، والذي يتوفر كحزمة ويتم تثبيته عبر sudo apt-get install python-rosinstall .

هذه نهاية التثبيت على Ubuntu. فيما يلي مقدمة قصيرة عن تركيب مساحات العمل.

إعدادات

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

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

 mkdir src cd src catkin_init_workspace cd .. catkin_make echo "source $(pwd)/devel/setup.bash" >> ~/.bashrc source ~/.bashrc

لقد قمت الآن بإنشاء مساحة عمل يمكنك من خلالها إنشاء حزم ROS الخاصة بك.

التعرف على الأدوات

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

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

 roscore

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

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

rqt

بعد تشغيل roscore ، يمكننا تشغيل أداة واجهة المستخدم الرسومية الرئيسية لـ ROS: rqt . ما نراه محبط للغاية - نافذة فارغة. تستضيف rqt مجموعة متنوعة من المكونات الإضافية التي يمكن تهيئتها في أي تكوين مرئي وأي عدد من طرق العرض المحددة مسبقًا.

لقطة شاشة لنافذة واجهة مستخدم رسومية فارغة بعنوان "افتراضي - rqt" وبها قوائم ملف ، ومكونات إضافية ، وتشغيل ، ووجهات نظر ، ومساعدة.

كبداية ، لنقم بتشغيل المكون الإضافي Robot Steering ، باختياره في Plugins > Robot Tools > Robot Steering . ما نحصل عليه هو منزلقان يمثلان الحركة الخطية والدورانية التي نريد أن يمتلكها الروبوت. في الجزء العلوي من المكون الإضافي ، نرى مربع نص به /cmd_vel . يمكننا إعادة تسميته إلى أي شيء نريد. إنه يمثل اسم الموضوع الذي ينشر التوجيه عليه. تعد الأدوات الطرفية هي أفضل مكان لمعرفة ما يحدث في الخلفية.

لقطة شاشة تعرض نفس النافذة كما في السابق ، ولكن مع واجهة توجيه الروبوت - مع رموز D ، وإعادة التحميل ، والمساعدة ، والتقليل ، والدائرة ، و X - بداخلها. يحتوي السطر الأول على مربع نص به "/ cmd_vel" وزر إيقاف. يوجد أدناه شريط تمرير عمودي متمركز عموديًا على المنتصف عند 0.0 م / ث ، مع أزرار على اليسار لـ + ، 0 ، و- ، وعناصر تحكم رقمية أعلى وأسفل والتي تقرأ 1،00 و -1،00. يوجد أدناه منزلق مشابه أفقي ويتم قياسه بوحدة راديان / ثانية ، مضبوطًا على 0 في المنتصف ، مع وجود عناصر تحكم في الأرقام عند 3،00 على اليسار و -3،00 على اليمين.

أدوات المحطة الطرفية

يحتوي نظام ROS على العديد من الأدوات القوية لفحص ما يحدث في النظام. الأداة الأولى التي سنقدمها هي rostopic . يسمح لنا بفحص الموضوعات التي يمكن للعقد الاشتراك فيها ونشرها. rostopic list الجارية إلى:

 /cmd_vel /rosout /rosout_agg

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

 linear: x: 0.2 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0

كم مرة تقوم بإرسال بريد مزعج لهذه الرسالة؟ rostopic hz /cmd_vel بمعدل متوسط ​​يبلغ 10 هرتز. حسنًا ، كم عدد الموضوعات مثل هذه التي يمكنني تشغيلها عبر اتصال Wi-Fi البطيء؟ rostopic bw /cmd_vel عن متوسط ​​480 B / s.

الآن كل هذا جيد وجيد ، لكننا تحدثنا عن أنواع الرسائل. هذه البيانات مفيدة للإنسان ، ولكن التطبيق سيحتاج إلى البيانات الأولية ، وسيحتاج إلى معرفة نوع الرسالة حتى يتمكن من تفسير البيانات. يمكن تحديد rostopic type /cmd_vel ، مما يخبرنا أنه geometry_msgs/Twist . جميع أدوات ROS الطرفية التي يتم استدعاؤها بدون أي وسيطات تقوم بإرجاع رسالة مساعدة قياسية.

يعد ROS Wiki جيدًا بما يكفي لإجراء بحث على الويب عن هذه السلسلة في شرح Wiki لما تحتويه وكيف يتم هيكلته. لكن لا يتعين علينا الاعتماد عليه. rosmsg هي الأداة العامة لأنواع الرسائل. تشغيل rosmsg show geometry_msgs/Twist سيعود:

 geometry_msgs/Vector3 linear float64 x float64 y float64 z geometry_msgs/Vector3 angular float64 x float64 y float64 z

تتكون الرسالة من متجهين ثلاثي الأبعاد ، يمثلان السرعة الخطية والزاوية في الفضاء ثلاثي الأبعاد.

إذا أردنا الموضوعات التي تتصل بها العقدة ، rosnode info <node-name> بيانات مفصلة حول العقدة. الأدوات rostopic و rosmsg و rosnode هي الأدوات الرئيسية لفحص وظائف ROS الأولية. يحتوي نظام ROS على الكثير من الأدوات الطرفية وواجهة المستخدم الرسومية ، ولكنها خارج نطاقنا لهذه المقدمة.

الأدوات الرئيسية لتشغيل عقد ROS هي rusrun و roslaunch . يمكن rosrun تشغيل العقد عبر rosrun <package_name> <node_name> ، ويقوم roslaunch بتشغيل العقد بناءً على ملفات التشغيل ، والتي سنتعرف عليها إلى حدٍ كبير نظرًا لأنها أكثر العناصر تعقيدًا في أتمتة ROS.

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

إنشاء Gamepad Teleoperation

هدفنا الأول هو محاكاة وظيفة Robot Steering عن طريق إنشاء عقدة تنشر بيانات geometry_msgs/Twist إلى /cmd_vel بناءً على إدخال لوحة الألعاب. محطتنا الأولى هي حزمة joy .

باقة joy

توفر حزمة joy برامج تشغيل ROS عامة لأذرع التحكم ولوحات الألعاب. لم يتم تضمينه في التثبيت الافتراضي ، لذلك يجب تثبيته عبر:

 sudo apt-get install ros-indigo-joy

بعد التثبيت ، يمكننا تشغيل rosrun joy joy_node . سيؤدي هذا إلى توصيلنا بعصا التحكم أو لوحة الألعاب الافتراضية. يظهر لنا تشغيل rostopic list أن لدينا موضوعًا يسمى /joy . يُظهر لنا الاستماع إليها عبر rostopic echo رسائل بالتنسيق التالي (لاحظ أنه يجب عليك التفاعل مع لوحة الألعاب أو عصا التحكم لنشر الرسائل).

 header: seq: 4156 stamp: secs: 1450707466 nsecs: 204517084 frame_id: '' axes: [0.0, 0.0, 0.0, -0.0, 0.0, 0.0, 0.0, 0.0] buttons: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

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

 std_msgs/Header header uint32 seq time stamp string frame_id float32[] axes int32[] buttons

خلق لدينا Teleoperation

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

 catkin_create_pkg toptal_tutorial rospy joy geometry_msgs sensor_msgs

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

لدينا الآن مجلد toptal_tutorial . داخل المجلد ، قم بإنشاء مجلد scripts الذي سيضم جميع نصوص Python النصية الخاصة بنا.

لنقم بإنشاء ملف يسمى teleop.py ، وداخله سنقوم بتعيين:

 #!/usr/bin/env python import rospy from sensor_msgs.msg import Joy def joy_callback(data): print data def main(): rospy.init_node('teleop') rospy.Subscriber('joy', Joy, joy_callback) while not rospy.is_shutdown(): pass if __name__ == '__main__': main()

سنحتاج أيضًا إلى ضبط chmod +x teleop.py حتى يصبح البرنامج النصي قابلاً للتشغيل. سيؤدي تشغيل rosrun joy joy_node في محطة واحدة و rosrun toptal_tutorial teleop.py في محطة أخرى إلى teleop.py النهائية برسائل Joy.

دعونا نفحص ما يفعله الكود.

أولاً ، نقوم باستيراد rospy ، الذي يستضيف المكتبة للتفاعل مع إطار عمل ROS. تحتوي كل حزمة تعرّف الرسائل على حزمة فرعية msg بها تعريفات للرسالة. نقوم باستيراد Joy للتعامل مع المدخلات. ليست هناك حاجة لاستيراد أنواع الرسائل المضمنة (مثل Header من std_msgs.msg الموجود في رسالة Joy ) ما لم نرغب في ذكرها صراحةً.

خطوتنا الأولى هي تهيئة عقدة باسم محدد (في هذه الحالة ، نسميها "teleop"). بعد ذلك أنشأنا مشتركًا يشترك في موضوع "joy" من النوع sensor_msgs.msg.Joy ، ويتعامل مع كل رسالة عن طريق استدعاء وظيفة joy_callback . تستقبل عمليات الاسترجاعات معلمة واحدة ، وهي البيانات الواردة من الرسالة. الوصول إلى أعضاء البيانات أمر بسيط. إذا أردنا طباعة حالة المحور الأول ، إذا استدعينا نوع الرسالة ، print data.axes[0] ، وسيكون عددًا عائمًا. الحلقة في نهاية الحلقات حتى يتم إغلاق ROS.

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

 #!/usr/bin/env python import rospy from sensor_msgs.msg import Joy from geometry_msgs.msg import Twist # new from functools import partial # new def joy_callback(pub, data): # modified cmd_vel = Twist() # new cmd_vel.linear.x = data.axes[1] # new cmd_vel.angular.z = data.axes[0] # new pub.publish(cmd_vel) # new def main(): rospy.init_node('teleop') pub = rospy.Publisher('cmd_vel', Twist, queue_size=1000) # new rospy.Subscriber('joy', Joy, partial(joy_callback, pub)) # modified while not rospy.is_shutdown(): pass if __name__ == '__main__': main()

أولاً ، نضيف رسالة Twist ، ونضيف دعمًا لوسائط دالة الربط عبر functools.partial . نقوم بإنشاء ناشر ، ناشر ، cmd_vel pub من نوع Twist . نحن نربط هذا الناشر بمعاودة الاتصال ، ونجعله ينشر رسالة تويست على كل مدخل مع تمثيل السرعات في أول محورين. يقوم هذا الكود بما نتوقعه ، ويمكننا أن نرى الناتج الناتج عبر rostopic echo /cmd_vel .

لا يزال لدينا مشكلة واحدة. يمكن نشر موضوع /joy بمعدلات كبيرة. إذا قمنا بمراقبة rostopic hz /cmd_vel العصا التناظرية في دوائر ، فيمكننا رؤية عدد كبير من الرسائل. لا يؤدي ذلك إلى قدر كبير من الاتصالات فحسب ، بل يجب على العمليات التي تتلقى هذه الرسائل معالجة كل واحدة منها. ليست هناك حاجة لنشر هذه البيانات بشكل متكرر ، ومن الأفضل لنا النشر بمعدل ثابت يبلغ 10 هرتز. يمكننا تحقيق ذلك باستخدام الكود التالي.

 #!/usr/bin/env python import rospy from sensor_msgs.msg import Joy from geometry_msgs.msg import Twist from functools import partial def joy_callback(cmd_vel, data): # modified cmd_vel.linear.x = data.axes[1] cmd_vel.angular.z = data.axes[0] # moved pub.publish(cmd_vel) to main loop def main(): rospy.init_node('teleop') cmd_vel = Twist() # new pub = rospy.Publisher('cmd_vel', Twist, queue_size=1000) rospy.Subscriber('joy', Joy, partial(joy_callback, cmd_vel)) # modified rate = rospy.Rate(10) # new while not rospy.is_shutdown(): pub.publish(cmd_vel) # new rate.sleep() # new if __name__ == '__main__': main()

قمنا بتعديل رد الاتصال لتلقي كائن Twist القابل للتغيير وتعديله داخل الحلقة. تحافظ وظيفة sleep من rospy.Rate على تردد إخراج ثابت.

سينتج عن الكود النهائي أن يحصل موضوع /cmd_vel على أوامر السرعة عند 10 هرتز ، لتقليد إخراج المكون الإضافي Robot Steering rqt .

تشغيل نظام محاكاة

محاكاة العالم

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

 roscd stage_ros cd world

يوجد داخل المجلد عدة ملفات. دعونا ندير واحدة.

 rosrun stage_ros stageros willow-erratic.world

هذا خلق عدة مواضيع. تم توثيق معنى كل منها أيضًا مع الحزمة. الجزء المهم هو أنه يحتوي على cmd_vel .

لقطة من نافذة بعنوان Stage: willow-erratic.world. تقرأ تسمية الحالة ، "0m 20s 300msec (1.0)." يوجد مقياس على اليمين يمتد من 18 في الأسفل إلى 30 في الأعلى ، بزيادات واحد. الصورة الرئيسية عبارة عن لوحة شطرنج بها نقاط وخطوط سوداء رئيسية منتشرة في جميع أنحاءها ، بالإضافة إلى مربع أزرق بالقرب من المنتصف ، ومربع أحمر أكبر قليلاً على بعد بضع مربعات من رقعة الشطرنج بعيدًا عن ذلك.

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

إعداد نظامنا عبر ملفات التشغيل

دعنا ننشئ مجلد launch داخل الحزمة الخاصة بنا ، وداخله أنشئ ملفًا يسمى teleop.launch . يجب أن تبدو بنية المجلد النهائية كما يلي:

 toptal_tutorial/ ├── CMakeLists.txt ├── launch │ └── teleop.launch ├── package.xml ├── scripts │ └── teleop.py └── src

سنحدد مجموعة من العقد وترابطها داخل ملف teleop.launch .

 <launch> <arg name="world_file" default="$(find stage_ros)/world/willow-four-erratics-multisensor.world" /> <node pkg="stage_ros" type="stageros" name="simulated_world" args="$(arg world_file)"></node> <group ns="robot_0"> <node pkg="joy" type="joy_node" name="joy_input"></node> <node pkg="toptal_tutorial" type="teleop.py" name="joy_convert"></node> </group> </launch>

يتكون العالم الجديد من أربعة روبوتات ، ولكل موضوع منها بادئة من robot_<n> . لذلك ، يحتوي الروبوت رقم 0 على موضوع أمر سرعة يسمى robot_0/cmd_vel . هذا هو السبب في أننا وضعنا سيطرتنا داخل مساحة اسم تسمى robot_0 ، لضبط أسمائهم على النموذج الجديد. بهذا المعنى ، يمكنك التفكير في أسماء الموضوعات كمجلدات في نظام ملفات.

رسم تخطيطي من قسمين ، عالم محاكاة و / robot_0. يحتوي الأخير على صناديق وفقاعات تبدأ جميعها بـ / robot_0 /. الأول يحتوي على فقاعة تحمل علامة / عالم محاكاة متصل بفقاعة cmd_vel الخاصة بالأخيرة ، والتي تنضم إلى مربع joy_convert ، والذي ينضم إلى صندوق الفرح ، والذي ينضم إلى فقاعة joy_input. / simulated-world يتصل أيضًا بأربعة مربعات في / robot-0 ، وهي image_1 ، و deep_0 ، و deep_1 ، و image_0.

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

 roslaunch toptal_tutorial teleop.launch

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

 /robot_<n>/base_pose_ground_truth /robot_<n>/base_scan_0 /robot_<n>/base_scan_1 /robot_<n>/camera_info_0 /robot_<n>/camera_info_1 /robot_<n>/cmd_vel /robot_<n>/depth_0 /robot_<n>/depth_1 /robot_<n>/image_0 /robot_<n>/image_1 /robot_<n>/odom

نستبدل <n> بـ 0 أو 1 أو 2 أو 3. وهذا يقودنا إلى موضوعنا الأخير.

عرض بياناتنا مع rqt

لم نتعمق كثيرًا في rqt ، لكنها الأداة المثالية لعرض بيانات أكثر تعقيدًا. يمكنك تجربة جميع الموضوعات ، لكننا سنركز على image_0 و image_1 depth_0 depth_1 .

دعنا نطلق rqt أي مكونات إضافية مفتوحة. سنفتح الآن 4 متخيلات للصور ( Plugins > Visualization > Image View ) ، ونضعها في تشكيل شبكة 2x2. أخيرًا ، في الزاوية العلوية اليسرى لكل طريقة عرض ، دعنا نختار أحد الموضوعات الأربعة المحددة لـ robot_0 .

لقطة شاشة تعرض واجهة توجيه روبوت ، مع مربع النص وشرائح التمرير المذكورة سابقًا ، ولكن نص مربع يقرأ "/ robot_0 / cmd_vel". إلى اليمين أربعة مناظر للصورة. يُظهر المربعان العلويان (image_0 و image_1) مربعين باللون الأزرق ومربع أحمر ثلاثي الأبعاد. يُظهر الجزءان السفليان (العمق_ 0 والعمق_1) صورًا متشابهة للأعلى ، ولكن في التدرج الرمادي ، وعلى وجه الخصوص تظهر المربعات الملونة في المقدمة هنا بلون رمادي أغمق من الكائنات الموجودة في الخلفية.

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

 rosrun stage_ros stageros willow-four-erratics-multisensor.world

وأضف المكون الإضافي Robot Steering مع موضوع يسمى /robot_0/cmd_vel ، كنا سنحصل على نفس النتائج مع عناصر التحكم التي تكون منزلقات على الشاشة.

تطبيق النتائج على نظام حقيقي

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

بينما كانت النتيجة الأخيرة محاكاة لما نريد تحقيقه ، يمكن تحقيق الشيء نفسه من خلال التعديلات التالية:

  • قم بتثبيت ROS على جهاز الكمبيوتر الموجود على الروبوت الخاص بك
  • قم بإنشاء ملف إطلاق للكمبيوتر الموجود على اللوحة والذي يربط ROS بالمنصة الأساسية وجميع أجهزة الاستشعار عالية المستوى مثل الكاميرات ومكتشفات مدى الليزر وغيرها. يمكن أن تكون العقد المطلوبة موجودة بالفعل ، أو يمكن تنفيذها عن طريق إنشاء ناشر / مشترك في ROS من جهة ، ومحرك للاتصالات التسلسلية من جهة أخرى
  • قم بتشغيل ملف الإطلاق عند بدء التشغيل
  • على الكمبيوتر البعيد ، أضف export ROS_MASTER_URI=http://<robot_hostname>:11311/ إلى بدء تشغيل bash ، مما يجعل الكمبيوتر البعيد يبحث عن roscore على اسم المضيف والمنفذ المحدد
  • قم بتشغيل rqt و / أو أي نصوص برمجية لمراقبة الروبوت والتحكم فيه

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

خاتمة

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

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

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