ارتباط MATLAB و ROS
شاید شما هم از اون دسته از افرادی باشید که سالهای زیادی برای انجام پروژههای درسی و حتی عملی خودتون از نرمافزار قدرتمند متلب استفاده میکردهاید و حالا به تازگی با رآس و امکانات بینظیر اون آشنا شدهاید و البته هنوز نسبت به متلب تعلق خاطر دارید! اگر همین طور هست، پس خوب است بدانید که رآس و متلب قابلیت ارتباط با یکدیگر را دارند و ما در این آموزش قصد داریم تا نحوه ارتباط بین matlab و ROS را آموزش بدهیم.
بیایید ابتدا دلایلی که ما را ترغیب میکند تا این ارتباط را برقرار کنیم بررسی کنیم.
- بی شک متلب یک نرمافزار محاسباتی قدرتمند است که با امکانات و تولباکسهای متنوعی که دارد کار برنامهنویسی و پیادهسازی الگوریتمهای گوناگون را آسان کرده است. در حوزه رباتیک نیز سیمولینک و تولباکسهای کنترلی متلب بسیار کارگشاست. لذا ممکن است برای بسیاری از افراد، پیاده سازی اولیه الگوریتم مورد نظرشان و رفع عیب آن با متلب منطقیتر بهنظر برسد.
- یکی از مشکلاتی که همواره محققین با آن درگیر بودهاند مسئله شبیهسازی دینامیکی مدل مورد مطالعه هست که معمولاً وقت زیادی از آنها میگیرد. این درحالی است که در ROS رباتهای بسیار زیادی با دقت بسیار خوبی مدلسازی شدهاند و همچنین ROS شبیه ساز قدرتمندی به نام Gazebo در اختیار دارد که رفتارهای دینامیکی در آن تعریف شده است و نیازی به کدنویسیهای پیچیده برای رفتارهایی نظیر برخورد و مقامت هوا و … نیست.
- دیدن یک نمای گرافیکی مناسب از مدل در حین اجرای الگوریتم نیز یکی از مواردی است که کمک زیادی به تشخیص صحت عملکرد الگوریتمها و کنترلکنندههای طراحی شده میکند که رسیدن به این خواسته در متلب معمولاً دشوار است. اما در ROS نمایش گرافیکی مدل به آسانی توسط Gazebo قابل دسترس است.
- ممکن است شما قبلاً الگوریتمی را در متلب پیادهسازی کرده باشید و حالا که با ROS آشنا شدهاید دوست دارید تا آن را بر روی رباتهای شبیهسازی شده در ROS تست کنید اما تسلط کافی به زبان C++ یا پایتون برای تبدیل کدهایتان ندارید، از اینرو ارتباط متلب و ROS برای شما خوشایند خواهد بود.
تا اینجا برخی از دلایلی که ممکن است این ارتباط را توجیه کند برشمردیم. حالا میرویم سراغ اصل مطلب.
خب ممکن است این سوال برای شما پیش آمده باشد که این ارتباط در چه حالتهایی ممکن است ایجاد شود؟
در جواب باید گفت که شما در سه حالت زیر ممکن است که متلب و ROS را در اختیار داشته باشید:
- سیستم عامل شما ویندوز است و متلب را روی آن نصب کردهاید و برای ROS از ماشین مجازی استفاده میکنید.
- از سیستم عامل Ubuntu استفاده میکنید و علاوه بر ROS نسخه لینوکس متلب را نیز نصب کردهاید.
- شما از دو کامپیوتر مجزا استفاده میکنید که متلب روی یکی از آنها و ROS روی دیگری قرار دارد.
شما از هر کدام از موارد بالا که استفاده میکنید تفاوتی ندارد چرا که در هر سه حالت فوق میتوان بین متلب و رآس ارتباط برقرار کرد.
مراحل کار در سه حالت فوق مشابه هم هست و تفاوت چندانی با هم ندارد. ما در اینجا حالت اول را درنظر میگیریم.
ابتدا ماشین مجازی خودتان (نظیر VMware) که ROS روی آن نصب است را باز کنید.
یک ترمینال جدید باز کرده و دستور زیر را در آن وارد کنید.
با اجرای این دستور باید اطلاعات شبکه مربوط به سیستم عامل شما، همانند تصویر زیر، نشان داده میشود.
توجه: اگر با اجرای دستور فوق خروجی مانند شکل بالا مشاهده نکردید از دستور ifconfig –a
استفاده کنید.
عبارت مشخص شده درواقع IP سیستم شماست که برای برقراری ارتباط با متلب باید از آن استفاده کنید.
گام بعدی تنظیم دو متغیر محیطی ROS_MASTER_URI و ROS_HOSTNAME در ROS است.
echo export ROS_MASTER_URI=http://IP_OF_VM:11311 >> ~/.bashrc
echo export ROS_HOSTNAME=IP_OF_VM >> ~/.bashrc
که در آن به جای IP_OF_VM باید IP ماشین مجازی خودتان که قبلاً به دست آوردید قرار بگیرد. به عنوان مثال این دستورات برای سیستم ما به صورت زیر خواهد بود.
echo export ROS_MASTER_URI=http://192.168.154.144:11311 >> ~/.bashrc
echo export ROS_HOSTNAME=192.168.154.144 >> ~/.bashrc
این دستورات درواقع دو خط زیر را در فایل bashrc قرار میدهد. (اگر به فایل bashrc مراجعه کنید این دو خط را مشاهده خواهید کرد).
export ROS_MASTER_URI=http://192.168.154.144:11311
export ROS_HOSTNAME=192.168.154.144
شما همچنین میتوانستید به صورت مستقیم این دو خط را به انتهای فایل bashrc اضافه کنید.
حال برای اطمینان از صحت تنظیم این دو متغیر دستورات زیر را در ترمینال وارد کنید.
echo $ROS_MASTER_URI
echo $ROS_HOSTNAME
اگر خروجی مشابه زیر مشاهده کردید، این تنظیمات به درستی انجام شده است.
گام بعدی شناساندان این IP آدرس به متلب است. برای این کار در صورتی که متلب و ROS هر دو بر روی یک سیستم نصب شده باشند تنها با وارد کردن دستور زیر در متلب و قرار دادن IP موردنظر در آن ارتباط متلب و ROS برقرار میشود.
ipaddress='192.168.154.144 ';
rosinit(ipaddress);
در صورتی که مراحل بالا به درستی انجام شده باشد با پیغامی مشابه زیر رویرو خواهید شد.
Initializing global node /matlab_global_node_38658 with NodeURI http:// 192.168.154.144.251:60724/
درصورتی که از دو سیستم مجزا استفاده میکنید و روی یک سیستم ROS و روی دیگری متلب را اجرا میکنید، ابتدا از ایجاد ارتباط بین دو سیستم چه از طریق وایرلس و یا کابل LAN مطمئن شوید سپس دستور فوق را اجرا کنید.
برای اطمینان از اتصال دو سیستم به یکدیگر میتوانید در محیط cmd ویندوز IP موردنظر را ping کنید، اگر خروجی مشابه زیر بود اتصال به درستی برقرار شده است.
درصورتیکه از ماشین مجازی استفاده میکنید نیز میتوانید بهصورت فوق عمل کنید. همچنین با وارد کردن دستور ipconfig در cmd خروجی مشابه زیر را مشاهده خواهید کرد که در آن بایستیIP ماشین مجازی شما نمایش داده شود.
شروع کار با متلب
نحوه ارتباط نودها در ROS مطابق شکل زیر است.
در ادامه برای استفاده از متلب، ابتدا باید هسته ROS در اوبونتو فراخوانی شود، برای این منظور میتوان از دستور roscore
استفاده کرد یا اینکه پروژه موردنظر را توسط فایل لانچ فراخوانی کرد.
برای مشاهده تاپیکهای موجود میتوان از دستور rostopic list
در متلب استفاده کرد که با اجرای این دستور در متلب خروجی مشابه با اجرای در ترمینال لینوکس مشاهده خواهید کرد.