Navigation

ROS ببساطه – تعلم بيئة تطوير الروبوتات بالعربي

خلال الشرح سيتم استخدام اصدار Indigo فى ROS. فROS ايضا لديه اصدارات (Releases) مختلفه و يتم اصدار نسخه جديده كل 9 شهور تقريبا و يمتد الدعم لها حوالى سنه و نصف. و هناك بعض الاصدارات التى يمتد الدعم لها لحوالى 5 سنوات و هى اصدارات

ينقسم هذا الدرس مقسم الى اربعة جزاء رئيسية وهي كالتالي:
  • الجزء الاول تهيئه نظام التشغيل
  • الجزء الثانى تثبيت ROS
  • الجزء الثالث شرح مفصل لROS
  • الجزء الرابع مثال بسيط باستخدام ROS
الجزء الاول تهيئه نظام التشغيل
ملحوطه: خلال الشرح سيتم استخدام اصدار Indigo فى ROS. فROS ايضا لديه اصدارات (Releases) مختلفه و يتم اصدار نسخه جديده كل 9 شهور تقريبا و يمتد الدعم لها حوالى سنه و نصف. و هناك بعض الاصدارات التى يمتد الدعم لها لحوالى  5 سنوات و هى اصدارات LTS: Long Term Support. و هم حتى الان اصدارين Indigo  Igloo و Kinetic Kame.
ترتيب اصدارات ROS من الاحدث للاقدم:
Kinetic Kame
Jade Turtle
Indigo Igloo
البقيه انتهى الدعم لهم
Hydro Medusa
Groovy Galapagos
Fuerte Turtle
Electric Emys
Diamondback
C Turtle
Box Turtle
و يوجد تزامن بين اصدارات ubuntu و اصدارات ROS. سواء كانت اصدارات LTS او لا. فمثلا اصدار Indigo LTS يعمل مع  (ubuntu 14.14 LTS (Trusty Tahr و اصدار kinetic Kame يعمل مع (ubuntu 16.04 LTS (Xenial Xerus. ستجد اصدارت LTS من ubuntu او ROS تعمل مع اصدارات ليست LTS من اى منهما. لكن دائما ستجد اصدارات LTS من ROS تعمل مع LTS من ubuntu.
لا انصح باستخدام jade الان لانه انتهاء الدعم له اقترب من الانتهاء كما ان Kinetic احدث منه و تم اضافه دعم لكل الpackages له تقريبا.
ملحوظه اخرى: خلال هذه الدروس سيتم استخدام نظام ubuntu اذا كنت على معرفه باوامر لينكس و تعمل على توزيعه اخرى يمكنك استخدامها اذا شئت لكن سيزيد عليك الموضوع قليلا باضطرارك الى بناء كل الpackages من المصدر. فى كل الاحوال الموضوع بسيط. ستجد فى الروابط السابقه دروس للsource installation للمساعده على تثبيت ROS على بعض الانظمه الاخرى.
يمكنك ايضا استخدام Virtual Machine و ستجد نسخه لubuntu 14.04 و مثبت عليها Indigo فى صفحه تحميله (Nootrix built VM) . لم اجد نسخه بها Kinetic وقت كتابه هذا الشرح. و لكن تذكر استخدام VM لن يكون جيد اذا كان حجم التطبيق كبير (فى درس الSLAM باستخدام Kinect لا اعلم اذا كان استخدام VM سينجح او لا, طبعا هذا متوقف على امكانيات جهازك).
اذا كان لديك احدى اصدارات ubuntu و تريد معرفه اى من اصدارات ROS متوافر الدعم له من هنا. فمثلا اذا كنت تستخدم ubuntu xenial لن تجد دعم لIndigo و فى هذه الحاله يمكنك استخدام Kinetic Kame.
هذه الصفحه التى ذكر فيها الدعم تسمى REP, وهى عباره عن ملفات تفصل كل شيىء فى ROS (يمكن ان تعتبرها Standard), مثلا ستجد REP تحدد اى من نسخ OpenCV ستعمل مع اى نسخ من ROS و اخرى تقترح تسميه الTopics و وصف اللframes بين انواع الروبوتات المختلفه (joints). ستجد قائمه بكل الREPs من هنا
ببساطه:
اذا كان لديك اى توزيعه اخرى غير ubuntu ابحث اى من نسخ ROS يدعمها
يمكنك ايضا تجربه linux باستخدام virtual machine و يمكنك استخدام نسخه جاهزه محمل بها ROS مسبقا كما ذكرت –المتاح لindigo
هناك دعم لOSX و لكن لا يوجد لدى معلومات عنه
لا تحاول استخدام ROS على windows, لن تجد من يساعدك 😀 استخدم virtual machine افضل لك
طبعا هذا الشرح سيتغير عند صدور اصدارات جديده من ROS (و هو ما لن يحدث الا بعد 7 شهور على الاقل من تاريخ هذه الشرح)
فى جميع الحالات الفرق بيع اصدارت ROS ليس كبير و لن تجد مشاكل خلال العمل بين الاصدارات المختلفه خاصه خلال هذه الدروس.
و لا تنسى ايضا فى النهايه ان ROS يعمل على اى جهاز  و اى اصدار و لكن هنا الموضوع لتسهيل استخدامه
 هذا الجزء لمن ليس لديه نظام تشغيل ubuntu او ليس لديه معرفه باوامر نظام linux
يمكنك الاستعانه باحدى المصادر الاتيه:
كتاب ubuntu ببساطه و هو كتاب شامل لكل المعلومات التى تريد معرفتها عن نظام ubuntu و عن نظام لينكس عموما, ليس المطلوب منك قراءه الكتاب كله بل قراءه الفصل الاول اذا لم يكن لديك اى معرفه بنظام لينكس و  تنفيذ عمليه تثبيت ubuntu من الفصول التاليه فى الكتاب. ثم اتبعه بكتاب سطر اوامر لينكس هنا ايضا ليس مطلوب منك انهاء الكتاب كله بل تعلم بعض الاساسيات لتستطيع العمل على ROSS ثم تعلم باقى الاوامر بالتوازى مع عمل مشاريع, بهذه الطريقه لن تمل من العمل. , و لكن فى كل الاحوال يجب انها الفصول (1 2 3 4 11 14) قبل بدايه العمل على ROS.
موقع دكتور احمد العرباوى يشمل الموقع شرح لنظام لينكس من البدايه و يفضل استخدام الموقع هنا لانه مرتبط اكثر باستخدام لينكس فى الانظمه المدمجه كما ان الشرح هنا بواسطه فيديوهات و البعض يفضلها و يستوعبها بشكل اسرع.
ملحوظه: خلال الشرح يستخدم د/احمد العرباوى virtual machine (استخدام نظام ubuntu داخل windows) , يمكنك استخدامها خلال تعلم البدائيات لكن عند العمل على ROSS لا يفضل استخدامها خاصه اذا كان المشروع كبير كما ذكرت.
الجزء الثانى: تثبيت ROS:
اثناء تنزيل ROS بغض النظر عن اى طريقه تستخدمها ستجد خيار من ثلاث:
Desktop-full : عند تحمليها ستجد كل ادوات ROS و RVIZ و هو  (visualizer خاص ب ROS) و ادوات rqt و  الsimulators, طبعا عند العمل على اللابتوب استخدام هذه الخيار
Desktop :عند تحمليها ستجد كل ادوات ROS و RVIZ و هو  (visualizer خاص ب ROS) و ادوات rqt فقط
ROS-Base: Bare Bones : لن تجد بها الا الادوات الرئيسيه فى ROS – لا يوجد بها اى ادوات رسوميه GUI, عند استخدام ROS على اى بورده مدمجه ستكون هى اختيارك.
ايضا خلال تنزيل ROS ستجد فى الجزء الخاص بEnvironment setup:
echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
source ~/.bashrc
الامر الاول خاص باضافه هذا السطر “source /opt/ros/indigo/setup.bash” الى الملف .bashrc و هو ملف يتم تنفيذه عند بدأ اى bash فى نظام linux و لكل user له الملف الخاص به و يوجود فى الHOME Directory الخاص بكل user (لا تنسى ان الroot user له ملف مختلف). تنفيذ هذا الامر (source)  فى مجمله يكون لاضافه بعض الenvironment variable حتى يستطيع  ROS الوصول الى الpackages.
طبعا انت فى درس التنزيل تختار بين احد نوعى الshell اما bash او zsh ولكن الاغلب يستخدم bash.
سيتكرر تنفيذ هذا الامر بعد تنزيل كل packages لاضافه  امر الsource فى ملف .bashrc كالاتى:
echo "source PATH_TO_PACKAGE/devel/setup.bash" >> ~/.bashrc
فكل ما يفعله هذه الامر  هو اضافه هذا السطر “source PATH_TO_PACKAGE/devel/setup.bash” لملف .bashrc
هذا الامر غير مطلوب اذا تم تنزيل الpackage باستخدام الpackage manager ب (apt-get), سيتم شرح الموضوع بالتفصيل فى الدروس القادمه.
باقى المعلومات فى دروس  تحميل ROS على ROS Wiki واضحه ولا تحتاج اى شرح حتى اذا كنت مستخدم ضعيف لlinux
اكلم الان تنزيل ROS لمتابعه الدرس
الجزء الثالث شرح مفصل لROS
كما ذكرت فى الدرس السابق ROS يعمل على هيئه مجموعه من البرامج, كل برنامج منهم يسمى node و تتصل الnodes ببعضها عن طريق الmessages و يكون المكان الذى تنتقل عليه الmessages هو اما topic او service
الtopics تستخدمه فى حاله استخدام اكثر من node للنشر عليه (publish) و اكثر من node للقراءه (subscribe) – علاقه many to many
اما الservice ينشر عليها node واحده فقط و يقرا منها node واحده فقط – علاقه one to one
ROS nodes
ماذا عن طريقه تنظيم الاكواد المصدريه؟
يتم تنظيم الاكواد فى ROS على هيئه packages  (مثلها مثل باقى برامج لينكس) و كل package بها مجموعه من الnodes تعمل هذه الnodes معا لتأديه وظيفه معينه, و نادرا ما تجد package بها node واحده فقط (لا تنسى فلسفه ROS فى طريقه العمل و قليلا ما تجد من يكسر هذه القاعده) , و كتابه الاكواد بهذه الطريقه يسهل تطويرها من قبل اشخاص غير الكاتب الاصلى للكود.
ايضا اثناء كتابه الاكواد تجد الpackage بداخل workspace. يمكن ان يكون داخل الworkspace الواحده package واحده او اكثر. يستخدم ROS اداوت Cmake لبناء الاكواد (building), و يوفر ايضا مجموعه من ادوات الcmd linee لتسهيل استخدامها اكثر. سبب استخدام ادوات Cmake فى ROS هو تسهيل بناء الpackagess فى انظمه التشغيل المختلفه.
يوفر ROS مجموعه اداوت الcmd line ايضا للتعامل مع الnode و النظام عامه فى ROS, اهم هذه الادوات هى:
rosrun : تستخدم لبدء تشغيل node واحده فقط
roslaunch : تستخدم لبدء مجموعه من الnode (و يمكن ايضا ان تكون node واحده فقط) و لكن بparameters معينه, تقرا هذه الاداه ملفات بامتداد .launch , هذه الملفات عباره عن ملفات نصيه تكتب مثل ملفات XMLL , ببساطه هذه الملفات ستكون اكثر اداه تستخدمها لان عاده فى اى نظام يعمل بROS يكون هناك عدد كبيرمن الnodes (ليس هناك عدد محدد طبعا لكن اقل نظام حقيقى سيكون به على الاقل 10 nodes مثلا) , طبعا استخدام rosnode لكل node لتشغيلها سيكون عمل ساذج.
عادة يكون هناك command line arguments يتم اضافتها فى كل من هذه الادوات لتعديل بعض الparameters فى هذه الادوات, هذا يتوقف على الnode التى تريد ان تبدها بعض الnodes لن تحتاج الى اى parameters و لكن الاغلب سيحتاج.
طريقه العمل الطبيعيه ان تكتب كل تعديلاتك فى الlaunch file, استخدام الcmd line arguments يفترض ان يقتصر وقت التجربه بدلا من تعديله قبل كل تجربه.
rosnode : تستخدم للاستعلام عن الnodes التى تعمل
roscore : و هى الاداه الخاصه ببدا الnode الرئيسيه فى ROS الت تنظم العمل و الاتصال بباقى الnodes فى ROS
rostopic : تستخدم للاستعلام عن الtopics التى تعمل و تصفح متحوى الmessage المنقوله عليها
rosservice : تستخدم للاستعلام عن الservices التى تعمل و تصفح محتوى الmessage المنقوله عليها
rosparam : تستخدم لتعديل الparamerters قبل او اثناء وقت التشغيل (ملحوظه بعد الparameters التى تقرا فى البدايه لا  تتاثر بتعديلها لاحقا)
rqt tools هى مجموعه من الادوات الرسوميه التى تساعدك على مرقبه نظام ROS عامه, مثل:
rqt_graph تعطى لك رسمه بكامل الnodes التى تعمل و من اى منهم متصل ببعض
rqt_graph_example
rqt_tf_tree تعطى لك رسم بكامل ال joint و علاقتها ببعضها فى الروبوت,
rqt_tf_tree_example
لا تعتمد على الادوات الرسوميه فقط لانك فى بعض الاوقات لن تجد الا الcommand line, مثلا فى حاله ان الجهاز الذى عليه نظام ROS جهاز اخر غير الذى تعمل عليه و هذه الجهاز ليس جزءا من نظام ROS
تشغيل ادوات rqt مثلها مثل اى node اخرى فى ROS يتم باستخدام rosnode
ستجد مجموعه من اداوت rqt من مصادر كثيره و ليس لها documentation على ROS WIKI
الجزء الرابع مثال بسيط باستخدام ROS
اول مثال ساشرح عليه هو مثال بسيط, عباره عن 2 nodes واحده ترسل رساله بها hello world و تطبعها و الاخرى عندما تسمع الرساله تقوم ايضا بطباعتها, لا تنسى ان الطباعه على الشاشه شيىء و عمل الnode الفعلى شيىء اخر, ستجد لاحقا nodes لا تطبع اى شيىء لكن هى فعليا تعمل, لمشاهده محتوى الMsgs بين الnodes تستخدم اداه rostopic او rosservice
اول ما يجب ان تقوم به فى ROS هو استخدام اداه roscore, كما ذكرت هى اول node تبداها فى النظام و تسمى الMaster node و هى التى تربط بين الnodes المختلفه فى النظام, اذا كان نظامك متعدد الاجهزه فالجهاز الذى تفتح عليه roscore يكون الMaster, تعدد الاجهزه فى النظام سيتم شرحه فى درس لاحق.
بعد كتابه الامر ستجد التالى:
$ roscore
… logging to /home/anasibrahim/.ros/log/e35b0036-7bae-11e6-a578-84a6c8953e86/roslaunch-anas-ubuntu-6707.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.
started roslaunch server http://anas-ubuntu:38907/
ros_comm version 1.11.20
SUMMARY
========
PARAMETERS
* /rosdistro: indigo
* /rosversion: 1.11.20
NODES
auto-starting new master
process[master]: started with pid [6719]
ROS_MASTER_URI=http://anas-ubuntu:11311/
setting /run_id to e35b0036-7bae-11e6-a578-84a6c8953e86
process[rosout-1]: started with pid [6732]
started core service [/rosout]
الان ستقوم تنزيل الpackage التى بها ال2 nodes
sudo apt-get install ros-indigo-rospy-tutorials
اسم الpackage الخاصه بROS تكون على هذا الشكل, الpackage السابقه اسمها rospy-tutorials و خاصه بindigo
اذا اردت تنزيلها ل Kinetic
sudo apt-get install ros-kinetic-rospy-tutorials
بحيث يكون تسميه الpackage بهذا التنسيق
sudo apt-get install ros-ROSDISTRONAME-PACKAGENAME
بعد تنزيل الpackage افتح terminal جديده
,و ابدا الnode talker
rosrun rospy_tutorials talker
ستجد الاتى بدا فى الطباعه
anasibrahim@anas-ubuntu:~$ rosrun rospy_tutorials talker
[INFO] [WallTime: 1473966171.474366] hello world 1473966171.47
[INFO] [WallTime: 1473966171.574669] hello world 1473966171.57
[INFO] [WallTime: 1473966171.674713] hello world 1473966171.67
[INFO] [WallTime: 1473966171.774709] hello world 1473966171.77
[INFO] [WallTime: 1473966171.874666] hello world 1473966171.87
[INFO] [WallTime: 1473966171.974694] hello world 1473966171.97
[INFO] [WallTime: 1473966172.074671] hello world 1473966172.07
[INFO] [WallTime: 1473966172.174669] hello world 1473966172.17
و هى محتوى الرساله التى ترسلها هذه الnode على الtopic المسمى /chatter
استخدام اداه rosrun يكون كالتالى
rosrun PACKAGE_NAME NODE_NAME
لترى الtopics المفتوحه استخدم الاداه rostopic كالتالى
$ rostopic list
/chatter
/rosout
/rosout_agg
ستجد الtopic المسمى chatter
يوجد مجموعه من الخيارات باداه rostopic مثل bw echo find hz info list pub type , سنستخدم بعضهم لاحقا
و الان ابدا الlistener node فى terminal جديده
$ rosrun rospy_tutorials listener
[INFO] [WallTime: 1473966609.469985] /listener_24055_1473966609134I heard hello world 1473966609.47
[INFO] [WallTime: 1473966609.570146] /listener_24055_1473966609134I heard hello world 1473966609.57
[INFO] [WallTime: 1473966609.669744] /listener_24055_1473966609134I heard hello world 1473966609.67
[INFO] [WallTime: 1473966609.769918] /listener_24055_1473966609134I heard hello world 1473966609.77
[INFO] [WallTime: 1473966609.869854] /listener_24055_1473966609134I heard hello world 1473966609.87
[INFO] [WallTime: 1473966609.970012] /listener_24055_1473966609134I heard hello world 1473966609.97
[INFO] [WallTime: 1473966610.069804] /listener_24055_1473966609134I heard hello world 1473966610.07
ستجد ان الرساله  hello world ارسلت لها
الnode التى تقرا من topic تسمى subscriber node و التى تنشر على topic تسمى publisher
جرب الخروج من الtalker node باستخدام CTRL+C , ستجد ان الرسائل توقفت فى الlistener node
يمكنك ايضا استخدام الاداه rostopic لرؤيه محتوى الMsg – طبعا ستستخدم هذه الاداه فى حاله الnodes التى لا تطبع اى شيىء –
$ rostopic echo /chatter
data: hello world 1473966831.67

data: hello world 1473966831.77

data: hello world 1473966831.87

data: hello world 1473966831.97
ستجد هنا محتوى الرساله بالتفصيل, فى هذه الحاله الMsg هنا بسيطه جدا و بها string فقط (باستثناء الheader الذى يوجد فى كل الMsgs), ستيم شرح الMsgs فى الدروس القادمه بتفصيل اكبر
جرب ايضا استخدام rqt tools,جرب اداه rqt_graph و هى اداه ترسم لك كل الnodes فى النظام و الtopics و ايهم subscriber او publisher
rosrun rqt_graph rqt_graph
او اختصارا الامر مباشره
rqt_graph
ستجد البرنامج التالى بدا
rqt_graph
و يوضح البرنامج ال2 nodes الذين بدأناهم (talker & Listener nodes) و الchatter topic
الان يفترض انك فهمت المفاهيم الرئيسيه فى  ROS مثل node و Msg و topic و كيف يعمل نظام ROS و استخدام ادوات rqt
الدروس القادمه ستتضمن تنزيل packages من مصدرها  و بنائها و توصيل بعد الsensors و Micrcontroller و شرح اعمق لادوات ROS المستخدمه فى هذه الدرس
ملحوظه مهمه جداااا : يمكن اثناء اى وقت اثناء التشغيل ان تغلق اى node و تبداها مره اخره, الا الmaster node اذا اغلقتها يجب اغلاق كل الnodes الاخرى و بدا النظام كله من جديد.
ايضا اذا كنت تستخدم الاداه roslaunch, فهى عند بداها تبحث عن الmaster node و اذا لم تعثر عليه تبدأه هى و بالتالى الterminal التى تفتح فيها اول launch file و لم تفتح الmaster node قبلها تكون هى الterminal التى تفتح بها الmaster node و لذلك اغلاق هذه الterminal يؤدى لعطل النظام
افضل حل تقوم به فى هذه الحاله هو فتح الmaster node بمفردها فى terminal ثم تبدا عملك بعد ذلك.
الاتصال بين الnodes فى ROS يكون عباره عن Peer-To-Peer اى ان الMsg التى ترسل بين الnodes لا تعبر عن طريق الmaster nodes (تذكر هذه الملحوظه جيدا جدا لانك ستحتاجها عن استخدام ROS على اكثر من جهاز) و لذلك ستجد ان اغلاق الmaster nodes لا يؤثر على عمل الnodes التى بدات بالفعل بل على الnodes الجديده التى ستبدأها و اتصالها بالnodes القديمه التى بدات قبل اغلاق الmaster node.
مشاركة

أضف تعليق:

0 comments: