مقدمة لنظام تشغيل الروبوت: إطار عمل تطبيق الروبوت النهائي
نشرت: 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
مجموعة متنوعة من المكونات الإضافية التي يمكن تهيئتها في أي تكوين مرئي وأي عدد من طرق العرض المحددة مسبقًا.
كبداية ، لنقم بتشغيل المكون الإضافي Robot Steering ، باختياره في Plugins > Robot Tools > Robot Steering
. ما نحصل عليه هو منزلقان يمثلان الحركة الخطية والدورانية التي نريد أن يمتلكها الروبوت. في الجزء العلوي من المكون الإضافي ، نرى مربع نص به /cmd_vel
. يمكننا إعادة تسميته إلى أي شيء نريد. إنه يمثل اسم الموضوع الذي ينشر التوجيه عليه. تعد الأدوات الطرفية هي أفضل مكان لمعرفة ما يحدث في الخلفية.
أدوات المحطة الطرفية
يحتوي نظام 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
.
داخل المرحلة المعروضة ، يوجد مربع أزرق يمثل الروبوت الذي تتحكم فيه. باستخدام الكود الخاص بنا أو توجيه الروبوت ، يمكننا التحكم في هذا الروبوت. حاول.
إعداد نظامنا عبر ملفات التشغيل
دعنا ننشئ مجلد 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
، لضبط أسمائهم على النموذج الجديد. بهذا المعنى ، يمكنك التفكير في أسماء الموضوعات كمجلدات في نظام ملفات.
لتشغيل 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
.
ما نحصل عليه هو رؤية ستريو مع إدراك العمق ، مع كاميرات منخفضة الدقة. ضع في اعتبارك أنه كان بإمكاننا الحصول على هذه النتيجة بدون نظام الإدخال الخاص بنا. إذا قمنا للتو بتشغيل هذا (من داخل 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
(المضمنة أيضًا في إصدار سطح المكتب الكامل) بإنشاء عوالم ثلاثية الأبعاد باستخدام الفيزياء وأجهزة الاستشعار المعقدة ، ويمكن أن تمنحك تجربة النتائج النهائية والمنتج قبل وقت طويل من تطويره.
كانت هذه المقدمة أساسية للغاية ، ولكن الأمل هو أن تصبح مهتمًا أكثر بالعمل مع هذا الإطار متعدد الاستخدامات.