- الجزء الأول: مقدمة
- الجزء الثاني:الحزم Packages
استعرضنا في المقالين السابقين ماهو نظام الـROS إضافة لمكوناته وقد تعرفنا أنه أحد ميزات النظام هي إمكانية فصل كل مهمة من مهام الروبوت إلى عقدة حتى لا يتم إيقاف كافة مهام الروبوت عن العمل في حال تواجد خطأ أو توقف أحد أجزاء الكود ولكن لا بدّ لهذه العقد من التواصل مع بعضها البعض وإرسال معلومات فيما بينها لإجراء تكامل في عمل الروبوت. يتم التواصل بين العقد بواسطة الـTopics وهذا ما سنتطرق إليه في هذا المقال.
ما هي الـ Topics؟
يمكننا تشبيه الـTopics كقناة تنتقل عبرها المعلومات من عقدة إلى عقدة أخرى، كما يمكننا نشر المعلومات و قراءتها عبر هذا الموضوع. كما استعرضنا في الدرس السابق، حيث قمنا بإرسال رسالة عبر rostopic وتم استقبالها من قبل قارئ(subscriber).
يتوفر في ROS حزمة package مخصصّة لفهم الأدوات وتعلّم النظام بشكل أكثر بساطة تُدعَى بـturtlesim.
بداية نشغل العقدة الرئيسية في ROS عبر التعليمة:
roscore
لاستعراض قائمة بالمواضيع الموجودة في النظام:
rostopic list
ولاستعراض قائمة بالعقد المفعلة:
rosnode list
توفّر Turtlesim محاكي بسيط لتعليم مفاهيم الـROS الأساسية، ولتشغيل المحاكي:
rosrun turtlesim turrlesim_node
حيث:
- rosrun:تسمح بإجراء تنفيذ لعقدة ما.
- Turtlesim:اسم الـpackage.
- turtlesim_node:اسم العقدة التي سنقوم بتنفيذها.
عند تنفيذ التعليمة السابقة نلاحظ انبثاق النافذة التالية:
لنستعرض من جديد قائمة العقد المفعلة وقائمة المواضيع، لنرى هل طرأ أي تغيير عليها؟
نجد المواضيع التالية: /turtle1/cmd_vel،/turtle1/color_sensor،/turtle/pose جديدة!، بالإضافة إلى وجود عقدة جديدة في قائمة العقد تدعى turtlesim. من أين أتت هذه المواضيع؟ أتت من المحاكي turtlesim التي قمنا بتشغيله.
ولكن ماذا إذا أردنا معرفة معلومات عن هذه العقدة؟ بكل بساطة عن طريق التعليمة:
rosnode info /turtlesim
نلاحظ بأنها تقوم بإجراء نشر لموضوعين: Color_sensor & pose وأن هناك قارئ يدعى cmd_vel وهو يمثل السرعة المطلوبة. ولكن ماهو الـ cmd_vel؟ لمعرفة معلومات أكثر عنه نكتب:
rostopic info /turtle1/cmd_vel
أول خيار هو type حيث يمثّل الـ geometry_msgs اسم الحزمة(package) والتي تحوي مجموعة من أنواع الرسائل ومنها Twist فهو يمثل نوع الرسائل التي تُرسَل إلى الروبوت ليقوم بالحركة وهو متواجد داخل الحزمة geometry_msgs ولا يوجد أي ناشر لهذا الموضوع. للتعرّف على مضمون رسالة الـTwist نكتب :
rosmsg show geometry_msgs/Twist
فنرى أنها مكونة من شعاعين:السرعة الخطية والسرعة الزاوية على المحاور x وy وz. إضافة إلى أن لهذا الموضوع قارئ وحيد وهو الـturtlesim .
كما يمكننا أيضا رؤية مضمون رسالة الموضوع الثاني عن طريق:
rosmsg show turtlesim/Pose
فنرى أنها تحوي على الإحداثيات x,y إضافة إلى الاتجاه theta و السرعة الخطية والسرعة الزاوية.
لنقم الآن بتحريك الروبوت، ولكن كيف ذلك!! وذلك بإجراء تفعيل للعقدة المسؤولة عن تحريك الروبوت بواسطة لوحة المفاتيح وتُدعَى هذه العقدة بـ turtle_teleop_key حيث تسمح بإرسال أوامر السرعة إلى الروبوت عبر الموضوع cmd_vel.
rosrun turtlesim turtle_teleop_key
يتم التحكم بالسلحفاة عن طريق الأسهم في لوحة التحكم. للتأكد من أن العقدة turtle_teleop_key ترسل أوامر السرعة عبر الموضوع cmd_vel نضع التعليمة:
rostopic info /turtle1/cmd_vel
نجد بأنه قد أصبح هناك ناشر للموضوع وهي العقدة التي قمنا بإجراء تفعيل لها لتحريك الروبوت.
نذهب الآن لنافذة الـturtle_teleop_key ونحرّك أسهم لوحة المفاتيح ونرى بأن الروبوت بدأ بالحركة.ومن الممكن أيضاً رؤية قيم السرعة التي يتحرك بها الروبوت :
rostopic echo /turtle1/cmd_vel
هذا يعني أن السلحفاة تتحرك إلى الأمام بسرعة خطية قدرها. 2m/sec ومن الممكن أيضاً رؤية موضع الروبوت وذلك:
rostopic echo /turtle1/Pose
وهناك طريقة أخرى لإرسال قيم السرعة إلى الروبوت بواسطة نافذة سطر الأوامر :
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist
- rostopic pub:تعليمة الإرسال.
- /turtle1/cmd_vel:اسم الموضوع.
- geometry_msgs/Twist: نوع الرسالة التي سيتم إرسالها.
تتمة التعليمة هي قيمة الرسالة المراد إرسالها للعقدة المحددة بالنوع المحدّد.
ملاحظة: نستطيع عرض كل العقد والمواضيع الفعالة على النظام بشكل مخطط باستخدام rqt_graph:
rosrun rqt_graph rqt_graph
يمكننا ملاحظة أن العقدتين teleop_turtle و turtlesim متصلتين مع بعضهما البعض بواسطة موضوع يُدعَى turtle1/cmd_vel/.
في النهاية وكتلخيص لقد تعرّفنا على أحد الطرق التي يمكن للعقد أن تتواصل عن طريقها وهي الـtopics حيث يمكننا بواسطتها إرسال معلومات للروبوت وأخذ معلومات عن طريق الحساسات الموجود عليه.ولكن ليست هذه الطريقة الوحيدة للتواصل بين العقد وإنما هناك طريقتين أخرتين سنتعرّف عليها في المقالات اللاحقة. يمكنك أيضاً في هذه الأثناء الاطلاع على كيفية بناء يد روبوتية من الصفر باستخدام ROS.
المراجع
http://wiki.ros.org/ROS/Tutorials/UnderstandingTopics