مفهوم service و parameters در ROS : در مبحث تاپیکها گفته شد که نودها توسط تاپیکها با یکدیگر در ارتباط اند. اما نودها از طریق دیگری هم میتوانند با یکدیگر ارتباط برقرار کنند. این راه دوم در واقع همان Services هستند. نودها میتوانند درخواستی را به یک سرویس بفرستند و از آن سرویس یک پاسخی را دریافت کنند . برای این منظور در ROS ابزاری به نام rosservice وجود دارد.
این دستور دارای آپشنهای زیر است:
- rosservice list: با اجرای این دستور اطلاعاتی در مورد service های فعال چاپ خواهد شد.
- rosservice call: با استفاده از آرگومان ورودی service فراخوانی میشود.
- rosservice type: نوع سرویس را نمایش میدهد.
- rosservice find: با کمک نوع سرویس، سرویس مورد نظر را پیدا میکند.
- rosservice uri: سرویس ROSRPC uriرا چاپ میکند.
دستور rosservice list
به منظور مشاهده لیست تمام service هایی که موجود است از این دستور استفاده میکنیم.
[sourcecode language=”plain”]$ rosservice list[/sourcecode]
ابتدا مثال مربوط به لاکپشت را اجرا نمایید. برای این کار مطابق گام پنجم : مفهوم تاپیک در ROS نود turtle_sim را فعال نمایید. در صورتی که مثال مربوطه را اجرا نمودید دستور بالا را وارد نماید. با این کار لیست تما سرویس ها را مشاهده میکنیم که به صورت زیر است:
[sourcecode language=”plain”]
/clear
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/spawn
/teleop_turtle/get_loggers
/teleop_turtle/set_logger_level
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_loggers
/turtlesim/set_logger_level[/sourcecode]
از بین سرویس های بالا دو سرویس /rosout/get_loggers و /rosout/set_logger_level مرتبط با نود rosout است.
توجه : در ادامه این گزارش نیاز است تا مثال مربوط به لاکپشت در حال اجرا باشد.
سرویسهای مختلفی که در بالا مشاهده میکنید هرکدام دارای کار خاصی است. به عنوان نمونه سرویس Clear بک گراند مربوط به پنجره لاکپشت را پاک میکند (اگر با اجرای نود turtle_teleop_key بک گراند را خط خطی کردهاید از این سرویس استفاده کنید) و یا سرویس Spawn ، به ما این امکان را میدهد تا یک ربات دیگر ایجاد نماییم. خب حالا فرض کنید که میخواهیم در خواستی برای سرور بفرستیم که با استفاده از سرویس Spawn یک ربات دیگر در پنجره ایجاد نماید.
اولین سوالی که ذهنمان را درگیر میکند این است که چگونه در خواست خود را به سرور بفرستیم؟؟؟ در ادامه پاسخ این سوالتان را خواهید یافت.
به منظور ارسال در خواست به سرور باید از این دستور به صورت زیر استفاده کنیم.
[sourcecode language=”plain”]rosservice call [service] [args][/sourcecode]
[service] : این در واقع نام سرویسی است که میخواهید به سرور درخواست بدهید.
[args] : در واقع آرگومانهای ورودی سرویس مورد نظر شما است. ( ممکن است برخی سوریسها نیازمند آرگومان ورودی نباشد)
خب اجازه بدهید که در خواستی مبتنی بر ایجاد یک ربات دیگر در کنار ربات موجود در پنجره شبیهساز به سرور بدهیم. همانطور که قبلاً ذکر شد با استفاده از دستور Spawn میتوان یک ربات دیگر ایجاد نمود. اما این سرویس چه آرگومانهایی را به عنوان ورودی میگیرد؟
برای پاسخ به این سوال نیاز است تا دستوری به فرمت زیر را در ترمینال وارد نمایید:
[sourcecode language=”plain”]$ rosservice info [service][/sourcecode]
با استفاده از این سرویس اطلاعات مربوط به سرویس را مشاهده خواهید نمود برای نمونه با وارد کردن دستور زیر
[sourcecode language=”plain”] $ rosservice info /spawn[/sourcecode]
در ترمینال این اطلاعات را مشاهده میکنید:
[sourcecode language=”plain”]
Node: /turtlesim
URI: rosrpc://localhost:60245
Type: turtlesim/Spawn
Args: x y theta name [/sourcecode]
که آخرین پارامتر آن همان آرگومانهای ورودی است. که به ترتیب موقعیت، زاویه و نام رباتی که میخواهید توسط سرور ایجاد نمایید را مشخص میکند.
حالا که نوع آرگومانهای موردنیاز را فهمیدیم، میتوانیم با دستور زیر یک لاکپشت دیگر رو به صفحه نمایشمون اضافه کنیم.
[sourcecode language=”plain”]rosservice call /spawn 2 3 0.3 "my_turtle" [/sourcecode]
با اجرای این دستور یک لاکپشت با نام my_turtle و در مختصات [۳ ،۲] و با زاویه ۰٫۳ رادیان ایجاد میشود. توجه کنید که اگر داخل ” ” نامی را وارد نکنید به صورت پیشفرض turtle1 برای آن انتخاب میشود.
در صورتی که مراحل فوق را به درستی انجام داده باشید باید در صفحه نمایش تصویری مشابه زیر ببینید.
شما میتوانید به همین منوال نحوه عملکرد سایر سرویسها را نیز مشاهده کنید. (به شرطی که آرگومانهای ورودی هر سرویس را مطابق اطلاعات داده شده در rosservice info مربوط به هر یک از آنها وارد کنید).
برای استفاده از این دستور از فرمت زیر استفاده کنید.
[sourcecode language=”plain”]rosservice type [service][/sourcecode]
به عنوان مثال بیایید تا نوع سرویس clear که در لیست فوق بود را ببینیم.
[sourcecode language=”plain”]
$ rosservice type /clear
std_srvs/Empty[/sourcecode]
خروجی این دستور به ما میگوید که این سرویس خالی است! یعنی زمانیکه این سرویس فراخوانی میشود نیاز به هیچ آرگومانی ندارد، در صورتی که سرویس spawn به نام و موقعیت ربات به عنوان آرگومانهای ورودی نیاز داشت. (به عبارت دیگر، این سرویس زمانی که با درخواستی روبرو میشود هیچ دادهای نمیفرستد و زمانی که پاسخی را میگیرد نیز عملاً دادهای دریافت نمیکند.)
این دستور به شما اجازه میدهد تا اطلاعات موجود روی پارامترسرور ROS را ذخیره و یا دستکاری کنید.
برای مشاهده پارامترهایی که هماکنون در پارامتر سرور هستند از دستور زیر استفاده کنید.
[sourcecode language=”plain”]$ rosparam list[/sourcecode]
که نتیجه آن با توجه به نودهای درحال اجرا به صورت زیر میباشد.
[sourcecode language=”plain”]
/background_b
/background_g
/background_r
/rosdistro
/roslaunch/uris/host_57aea0986fef__34309
/rosversion
/run_id[/sourcecode]
در ادامه میخواهیم یکی از این پارامترها را با دستور rosparam set تغییر دهیم.
فرض کنید میخواهیم رنگ پس زمینه صفحه نمایش رباتها را تغییر دهیم، برای این کار بایستی پارامترهای rgb رنگ مورد نظر را وارد کنیم. (همانطور که میدانید هر رنگ را میتوان با ترکیبی از سه رنگ اصلی سبز، قرمز و آبی ایجاد کرد، که پارامترهای اول تا سوم در واقع مقدار عددی این رنگها در صفحه فعلی است).
ابتدا شما میتوانید با استفاده از دستور زیر به عنوان مثال مقدار عددی رنگ قرمز را ببینید.
[sourcecode language=”plain”]$ rosparam get /background_r[/sourcecode]
برای تغییر هر کدام از پارامترها (به دلخواه خودتان) به صورت زیر عمل کنید.
[sourcecode language=”plain”]$ rosparam set /background_r 150[/sourcecode]
برای مشاهده تغییرات ایجاد شده لازم است تا ابتدا سرویس clear را فراخوانی کنیم.
[sourcecode language=”plain”]$ rosservice call /clear[/sourcecode]
مشاهده خواهید کرد که رنگ پسزمینه تغییر میکند.
2 دیدگاه
rosservice call /spawn 2 3 0.3 "my_turtle"
برای من با این دستور اررو داد و وقتی دستور خود سایت مرجع را نوشتم لاکپشت اضافه شد
$ rosservice call /spawn 2 2 0.2 “”
با سلام
با تشکر از همراهی شما
مورد ذکر شده یک اشتباه تایپی بود که اصلاح گردید.
از اینکه با نظرات خودتان ما را در بهبود هرچه بیشتر سایت کمک میکنید سپاسگذاریم.
تیم ایران رآس