روبوتمقالات

المحاكي Gazebo في بيئة ROS: بناء ذراع روبوتي من الصفر

مقدمة

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

مدخل إلى المحاكي Gazebo

gazebo logo ROS

هو أحد برامج المحاكاة ثلاثية الأبعاد المستخدمة في ROS، يوفر Gazebo خيارات أختيار المحرك الفيزيائي مع كون المحرك الافتراضي هو Open dynamics engine، ومن مميزاته انك تستطيع محاكاة الحساسات بالإضافة للديناميك أيضاً. يتألف Gazebo من قسمين:

  1.  Server (gzserver) الخادم
  2.  Client (gzclient) العميل

يستخدم العميل gzclient من أجل إظهار الرسوم ولكن نستطيع استخدام المحاكي بدون الواجهة الرسومية عن طريق تشغيل gzserver فقط.

لاستخدام Gazebo مع ROS نستطيع استخدام حزمة (package) أسمها gazebo_ros. راجع كيفية تنزيل الحزمة.

لتشغيل المحاكي مع النموذج الافتراضي نستخدم الأمر التالي:

هذا الأمر سوف يقوم بتشغيل gzserver و gzclient

gazebo gui ROS

شرح الواجهة

gazebo gui

  1.  توقيف المحاكي أو إعادة تشغيله بعد توقيفه
  2. Real Time Factor يوضح كفاءة المحاكي يعني لو كانت القيمة 0.25 هذا يعني أن المحاكي يحتاج 4 ثواني ليحاكي 1 ثانية في أرض الواقع.
  3.  الوقت الذي حاكاه المحاكي غالبا أقل من Real Time بسبب Real Time Factor.
  4.  الوقت الحقيقي الذي أشتغل فيه المحاكي.
  5.  عدد المرات التي تم أستدعاء المحلل (LCP solver).
  6.  عدد الاطارات في الثانية (Frame Per Second).
  7.  إعادة تعيين Sim Time, Real Time, Iterations للصفر.
  8.  تحتوي على خصائص العالم الذي نحاكيه على سبيل المثال نستطيع تغيير الجاذبية بالضغط على Physics بعد ذلك تغيير قيمة gravity.
  9.  تستخدم لإدراج شيء جديد على سبيل المثال قمت بإدراج iRobot Create كما في الصورة التالية:

gazebo insert robot

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

بناء يد روبوتية من الصفر

قبل البدء ببناء اليد الروبوتية سنلقي نظرة سريعة على توزيعة الملفات

أولاً سنقوم بإنشاء ملف باسم الروبوت وبداخل الملف سننشئ ثلاث حزم

  1. robot_name_description هي الحزمة التي سنضع بداخلها الملفات المتعلقة بتصميم الروبوت.
  2. robot_name_gazebo هي الحزمة التي سنضع بداخلها الملفات المتعلقة بالمحاكي Gazebo.
  3.  robot_name_control هي الحزمة التي سنضع بداخلها الملفات المتعلقة بالمتحكمات المستخدم في الروبوت.

ملف وصف الروبوت URDF

لكن قبل البدء بكتابة الملف سأشرح  هذه الصيغة قليلاً Universal Robotic Description Format (URDF)سنبدأ بناء الروبوت بإنشاء ملف الــURDF وهو صيغة XML المستخدمة في نظام ROS لوصف كل مكونات الروبوت, الروبوت في هذه الصيغة يتألف من ( المربط )Link و (المفصل) Joint.

المفصل يوصل مربطين معاً والمربط يوصل مفصلين معاً وكلاهما يشكلان سلسلة (chain). شكل تعريف المفصل هو كالتالي، كما يوجد عناصر أخرى للمزيد يمكن الاطلاع عليها في الويكي الرسمي للمشروع.

سنعرف ثلاث عناصر للمربط

  1. visual :تعرف المزايا الظاهرية  للمربط هنا استخدمنا الشكل Box يوجد اشكال اخرى مثال اسطوانة أو كرة
  2. collision :تعرف مزايا الاصطدام للمربط بشكل عام(ليس دائما) هي مماثلة للعنصر visual
  3. inertial :تعرف المزايا الديناميكية للمربط للمزيد عن مصفوفة عزم العطالة في صفحة الويكيبيديا عن عزم العطالة.

إن  القانون بالنسبة للشكل الذي استخدمناه هو:

الروبوت الذي سنقوم بإنشائه اسمه [1] elbow arm وهو يتألف من ثلاث Joint وأربع Link (مع القاعدة) كما موضح في الصورة التالية:

اليد الروبوتية elbow armاليد الروبوتية elbow arm

أولا إذهب للملف المخصّص للحزم في حالتنا وقم بإنشاء ملف باسم الروبوت elbow_arm وادخل إلى الملف

بعد ذلك قم بإنشاء حزمة باسم elbow_arm_description

داخل الحزمة انشئ ملف باسم urdf وبداخل هذا الملف مستند باسم elbow_arm_description.urdf تستطيع استخدامأي محرر شخصياً استخدمت sublime ثم قم بلصق الكود فيه

ملاحظة: أنشأنا الملف بصيغة xacro وليس urdf السبب هو أن هذه الصيغة ستسهل علينا كتابة الملف لانها تسمح لنا بإنشاء ثوابت وتقوم بحسابات رياضية بسيطة.

ملاحظات حول الكود أعلاه:

  • السطر التالي لتعريف الروبوت وإعطائه أسم هنا elbow_arm
  • طريقة تعريف ثابت في ملف xacro
  • الشعار التالي {تعبير رياضي}$ يعني تنفيذ التعبير الرياضي داخل القوسين مثال:
    وتعني عوض قيمة التعبير الرياضي بالتالي، وهي مماثلة للسطر التالي:
    ولكي نقوم بإضافة الروبوت للمحاكي سنقوم بإنشاء حزمة بإسم elbow_arm_gazebo داخل الملف elbow_arm  ونقوم بإنشاء ملف launch داخل هذه الحزمة

داخل هذا الملف أنشأ ملف بإسم elbow_arm_world.launch

ثم قم بلصق النص التالي بداخله. الملف التالي سيقوم بتشغيل المحاكي وإضافة الروبوت إليه

ملف launch يستخدم لبدء عدة برامج وضبط بعض المعامل (Parameter) ولكنه يحتاح درس بحد ذاته لذلك سأكتفي بشرح سطحي وفي مقال أخر سأقوم بشرحه

الأن لكي تقوم بتشغيل الروبوت سنقوم بتنفيذ هذا الأمر

انتظر قليلا سيبدأ المحاكي وسترى الروبوت ولكن بعد فترة زمنية بسيطة سيسقط الروبوت لأننا لم نضيف محركات ونضيف متحكم لهم وهي خطوتنا التالية

إضافة المحرك والمتحكمات

كما هو ملاحظ الروبوت الذي بنيناه إلى الأن لا يقوم بأشياء مثيرة، ولكي نقوم بالتحكم فيه علينا أولا إضافة محرك لكل مفصل عن طريق إضافة النص التالي إلى نهاية الملف elbow_arm_description/urdf/elbow_arm.xacro

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

العنصر hardwareInterface قد يكون :

  1. hardware_interface/PositionJointInterface
  2. hardware_interface/EffortJointInterface
  3. hardware_interface/VelocityJointInterface

وهي تحدد نوع الأوامر التي سيتم إرسالها. هنا قد اخترنا النوع الثاني.

الأن، إذا قمت بتشغيل المحاكي فإن الروبوت سيقع مرة أخرة؛ هذا لأننا لم نقم بعد ببناء متحكم للتحكم بالمحرك, ولحسن الحظ فإن Gazebo توفر لنا إضافة لمتحكم من نوع PID للتحكم بالمحرك لكن هذا الإضافة تحتاج لملف Configuration لكل متحكم.

قبل البدأ سنقوم بإنشاء حزمة بإسم catkin_create_pkg elbow_arm_control

داخل هذه الحزمة سنقوم بإنشاء ملف launch و ملف config

سنبدأ بملف الإعدادات، ويمكن قراءة المزيد عن ملف الـYAML من الويكي الرسمي.

سنحتاج متحكم لكل مفصل

هذا القسم يستخدم لنشر حالة المفاصل للموضوع (Topic) بإسم joint_states/

الأن سنقوم بإخبار Gazebo بتشغيل الأداة عن طريق إضافة السطور التالية إلى نهاية الملف elbow_arm_description/urdf/elbow_arm.xacro قبل </robot>

لقد بقي لنا خطوة واحدة وسنكون قادرين على تشغيل الروبوت والتحكم فيه، وهي إنشاء ملف elbow_arm_contrtol.launch

لكي نقوم بتشغيل الروبوت والمتحكم كل أمر في Terminal منفصل

كما تلاحظ لن يسقط الروبوت، للتحكم بالروبوت سنقوم بإرسال ثلاث أوامر لكل محرك

الخاتمة

كان هذا المقال عن المحاكي Gazebo وكيفية إنشاء يد روبوتية وإضافتها للمحاكي للتحكم فيه، ولا يقتصر المحاكي على هذه اليد، وإنما نستطيع أيضا إضافة حساسات للروبوتات أو إضافة روبوتات أكثر تعقيدا مثل Baxter أو الروبوتات البشرية(humanoid robot)،  حتى إن مسابقة وكالة ناسا الأخيرة SRC كانت بإستخدام هذا المحاكي، و للسنة الثانية على التوالي مسابقة Agile تستخدمه أيضاً، وكما تم سابقاً تغطية تجربة استخدام هذا النظام لبناء نظام روبوتات متعاونة Multi-agent Robots بواسطة فريق إيليت من مصر.

المراجع

  1. صفحة 12 من كتاب Robot Modeling and control
  2. Gazebo Tutorials
  3. Ros Control

Jafar Abdi

يدرس هندسة الميكاترونيكس ومهتم في علم الروبوتات وتحديداً نظام تشغيل الروبوت ROS ويطمح للمساعدة في إثراء المحتوى العربي.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

هذا الموقع يستخدم Akismet للحدّ من التعليقات المزعجة والغير مرغوبة. تعرّف على كيفية معالجة بيانات تعليقك.