سیستم عامل ربات (به انگلیسی: Robot Operating System) یا ROS یک میانافزار رباتیک (یعنی مجموعه ای از چارچوبهای نرمافزاری برای توسعه نرمافزار ربات) است. اگر چه ROS یک سیستم عامل نیست اما سرویسهایی را مثل فراهم کردن یک لایه انتزاعی برای سختافزار، کنترل دستگاه در سطح پایین، پیادهسازی عملیاتهای معمول رباتیک، انتقال پیام بین فرایندها و مدیریت بسته فراهم میکند.
مفاهیم Node و Topic از جمله مباحث اجتنابناپذیر برای شروع کار با سیستم عامل رباتها هستند و در یک تعریف ساده میتوان گفت که Node ها در قالب Topic ها با هم در ارتباط هستند. به عبارت سادهتر Topic ها مانند کانال ارتباطی مشخصی بین Node ها عمل میکنند. در ادامه این مطلب تلاش شده تا با طرح یک مثال ساده این دو مفهوم بیشتر توضیح داده شوند.
پیش از شروع اگر هنوز ROS را نصب نکردهاید میتوانید از طریق این لینک ورژن مورد نظر خود را انتخاب و آنرا نصب کنید. مراحل نصب بسیار ساده است.
تمام کدهایی که در ادامه آمده در (Ubuntu(18.04.6 LTS و ROS(melodic) تست شده است.
یک Node چیزی بیشتر از یک فایل قابل اجرا توسط ROS package نیست. (توضیح بیشتر اینکه: به همین دلیل در حین ایجاد package برای پایتون rospy را جزو وابستگی های package تعریف میکنیم تا بتوانیم در آن فایلهایی به زبان پایتون اجرا کنیم, در صورتی که بخواهیم از زبان C++ استفاده کنیم میتوانیم roscpp را هم جزو وابستگی ها تعریف کنیم) یک node میتواند در یک Topic نقش publisher و یا subscriber داشته باشد.(با این مفاهیم در ادامه آشنا خواهیم شد)
بیایید با یک پروژه جالب ادامه دهیم:
برای شروع اولین کاری که باید انجام شود اجرای دستور زیر در ترمینال است:
$ roscore
حالا بیایید نگاهی به node های در حال اجرا بیاندازیم. (ترمینال قبلی را باز نگه دارید) یک ترمینال جدید باز کنید و دستور زیر را به منظور مشاهده لیست node های در حال اجرا وارد کنید:
$ rosnode list
نتیجه دستور فوق به شکل زیر است:
/rosout
این یعنی تنها یک نود در حال اجرا است. در صورتی که بخواهیم اطلاعات یک node را ببینیم میتوانیم از دستور زیر استفاده کنیم:
$ rosnode info /rosout
حالا بیایید node های بیشتری ببینیم. برای اجرای یک node که در یک package خاص قرار دارد در حالت کلی از دستور زیر استفاده میکنیم:
$ rosrun [package_name] [node_name]
برای مثال در یک ترمینال جدید turtlesim_node را به شکل زیر اجرا میکنیم:
$ rosrun turtlesim turtlesim_node
حالا پنجره مربوط به لاک پشت برای ما ظاهر میشود. (ممکن است شکل لاک پشت برای شما متفاوت باش. جای نگرانی نیست:) )
یک ترمینال جدید باز کنید و دستور زیر را برای مشاهده لیست node های در حال اجرا وارد کنید:
$ rosnode list
مشاهده خواهید کرد که حالا دو node در حال اجرا هستند که یکی مربوط به لاک پشت تازه متولد شده ماست :)
/rosout /turtlesim
میتوانید نام node ها را به شکل زیر تغییر دهید(ترمینال مربوط به لاک پشت را متوقف کنید یا آن را ببندید):
$ rosrun turtlesim turtlesim_node __name:=my_turtle
حال اگر دوباره به لیست node ها نگاهی بیاندازیم:
$ rosnode list
خواهیم دید که نام node تغییر کرده است:
/my_turtle /rosout
تغییر نام node به دلخواه شماست. در ادامه ما با نام پیش فرض ادامه خواهیم داد:
$ rosrun turtlesim turtlesim_node
بیایید لاک پشت را حرکت دهیم. دستور زیر را که گره turtle_teleop_key از package به نام turtlesim را اجرا میکند را در یک ترمینال جدید اجرا کنید:
$ rosrun turtlesim turtle_teleop_key
حالا با کلیدهای جهت دار کیبرد میتوانید لاک پشت را حرکت دهید. (ترمینال مدنظر باید در حالت انتخاب باشد)
حال شما توانستید لاک پشت را حرکت دهید اما برای فهمیدن مفهوم topic بیایید نگاهی به آنچه در پشت صحنه نمایش اتفاق میافتد بیاندازیم:
دو node به نام های turtlesim_node و turtle_teleop_key در تحت یک Topic در ارتباط با یکدیگر هستند. turtle_teleop_key در حال ارسال(publishing) وضعیت کلیدها به topic است و turtlesim_node و در حال دریافت(subscribe) از همان topic است. برای نمایش گرافیکی وضعیت node ها و topic ها میتوانیم از rqt_graph استفاده کنیم.
نکته: در صورت نصب نبودن میتوانید با دستور زیر rqt package را متناسب با distribution خود(indigo, jade, kinetic, lunar و...) نصب کنید:
$ sudo apt-get install ros-<distro>-rqt
$ sudo apt-get install ros-<distro>-rqt-common-plugins
حالا در یک ترمینال جدید دستور زیر را برای رسم گراف اجرا کنید:
$ rosrun rqt_graph rqt_graph
و سپس پنجرهای مشابه شکل زیر مشاهده خواهید کرد:
اگر موس خود را روی /turtle1/command_velocity ببرید. نوشته ها رنگی خواهند شد. در اینجا node ها به رنگ آبی و سبز و topic به رنگ قرمز قابل مشاهد است. همانطور که مشخص است دو node به نام های turtlesim_node و turtle_teleop_key با یکدیگر از طریق یک topic به نام /turtle1/command_velocity در ارتباط هستند.
برای تمرین بیشتر میتوانید Node های بیشتری را اجرا و گراف آنها را مشاهده و تحلیل کنید.
در ادامه این آموزش بخوانید: مفهوم Topic و Message در ROS
منبع: wiki.ros.org - wikipedia.org