ایجاد فایلهای msg و srv در ROS: در ROS نوع پیامها با استفاده از فایلهای متنی به نام msg مشخص میشوند. در این آموزش نحوه ساختن فایلهای msg و srv و دستوراتی نظیر rosmsg, rossrv, roscp آشنا میشوید. در ابتدا این فایلها را معرفی میکنیم.
ایجاد فایلهای msg و srv در ROS: در ROS نوع پیامها با استفاده از فایلهای متنی به نام msg مشخص میشوند. در این آموزش نحوه ساختن فایلهای msg و srv و دستوراتی نظیر rosmsg, rossrv, roscp آشنا میشوید. در ابتدا این فایلها را معرفی میکنیم.
msg: فایلهای msg، فایلهای متنی سادهای هستند که نوع پیامها در رآس را توصیف میکند. این فایلها برای تولید سورس کد برای پیامها در زبانهای برنامهنویسی دیگر استفاده میشود.
Srv: یک فایل srv یک سرویس را توصیف میکند و از دو بخش درخواست و پاسخ تشکیل شده است.
فایلهای msg و فایلهای srv نیز در مسیر بسته و در پوشهای به همان نام قرار دارند. msg ها فایلهای متنی هستند که در یک خط نوع رشته و نام رشته در آن مشخص شده است. نوع رشتههایی که میتوانید استفاده کنید بهصورت زیر است:
همچنین یک نوع خاص به اسم Header در رآس وجود دارد که شامل یک برچسب زمان و اطلاعات دستگاه مختصات است که معمولاً استفاده از آن در رآس مرسوم است. غالباً خط اول در یک فایل msg بهصورت Header header است.
در زیر نمونهای از یک فایل msg که در آن، یک Header، یک رشته و دو پیام دیگر وجود دارد آورده شده است.
[code lang=”js”]
Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist
[/code]
فایلهای srv نیز شبیه فایلهای msg هستند، با این تفاوت که آنها شامل دو بخش درخواست و پاسخ هستند. این دو بخش توسط یک خط بهصورت ‘—‘ از هم جدا شدهاند. در زیر نمونهای از یک فایل srv آورده شده است.
[code lang=”js”]
int64 A
int64 B
—
int64 Sum
[/code]
در مثال بالا A و B درخواست و sum پاسخ است.
بگذارید تا یک msg جدید را در بستهای که در آموزش قبلی ایجاد کرده بودیم تعریف کنیم.
[code lang=”js”]
roscd beginner_tutorials
mkdir msg
echo "int64 num" > msg/Num.msg
[/code]
کد mkdir msg یک پوشه به نام msg درون پوشه بسته beginner_tutorials ایجاد میکند. در خط بعدی از کد echo استفاده شده است این کد عبارت داخل گیومه را در فایلی به نام Num.msg که در پوشه msg ایجاد کرده است قرار میدهد. شما البته میتوانید بدون استفاده از این کد نیز فایل Num.msg را ایجاد کنید. برای این کار یک فایل خالی ایجاد کنید و نام آن را به همراه پسوند.msg انتخاب کنید و با باز کردن آن کدهای مربوط را در آن وارد کنید.
فایل Num.msg که بهعنوانمثال در بالا آورده شده است، تنها ۱ خط دارد، البته شما میتوانید یک فایل پیچیدهتر با اضافه کردن چند المان دیگر هرکدام در یک خط، مشابه مثال زیر ایجاد کنید.
[code lang=”js”]
string first_name
string last_name
uint8 age
uint32 score
[/code]
در گام بعدی ما باید مطمئن شویم که فایلهای msg به سورس کد برای C++، پایتون و دیگر زبانهای برنامهنویسی تبدیلشدهاند. برای این کار package.xml را باز کنید و مطمئن شوید که این دو خط در آن وجود دارد و کامنت (بهصورت توضیحات) نباشد.
[code lang=”js”]<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>[/code]
لازم به ذکر است که این دو خط بهصورت پیشفرض کامنت هست و برای رفع کامنت آن باید کاراکترهای “<!–“ را از ابتدا و کاراکترهای “–>” را از انتهای آن خط حذف کرد.
توجه کنید که در زمان کامپایل کردن، ما به “message_generation”نیاز داریم، درحالیکه درزمان اجرا فقط به “message_runtime”نیاز داریم.
CMakeLists.txt را با یک ویرایشگر متن دلخواه باز کنید، سپس وابستگی message_generation را در قسمت find_package که در CMakeLists.txt وجود دارد اضافه کنید، بهاینترتیب قادر خواهید بود تا پیامها را تولید کنید.
در زیر بخش موردنظر پس از اضافه شدن message_generation آورده شده است.
[code lang=”js”]
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
[/code]
دقت کنید که عبارت message_generation قبل از بسته شدن پرانتز اضافه شود.
همچنین مطمئن شوید که وابستگی message runtime را بهصورت زیر وارد کردهاید.
[code lang=”js”]
catkin_package(
…
CATKIN_DEPENDS message_runtime …
…)
[/code]
خطوط زیر را در فایل CMakeLists.txt پیدا کنید:
[code lang=”js”]
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )
[/code]
آنها را با حذف # از حالت کامنت خارج کنید و سپس Message*.msg ها را با فایلهای msg خودتان مانند زیر جایگذاری کنید.
[code lang=”js”]
add_message_files(
FILES
Num.msg
)[/code]
با اضافه کردن فایلهای.msg بهصورت دستی CMake متوجه میشود که بعدازاینکه شما فایلهای.msg دیگر را اضافه کردید باید پروژه را مجدداً تنظیم کند.
اکنون ما باید از فراخوانی تابع generate_messages() اطمینان حاصل کنیم. برای این کار در توزیعهای Hydro به بعد باید خطوط زیر را از حالت کامنت خارج کنید.
[code lang=”js”]
# generate_messages(
# DEPENDENCIES
# std_msgs
# )[/code]
در توزیعهای قدیمیتر تنها باید خط زیر را از کامنت خارج کرد:
[code lang=”js”]
generate_messages()[/code]
اکنون شما برای تولید فایلهای مرجع برای تعریف msg خودتان آمادهاید.
پسازاینکه یک msg ساختید، میتوانید با یک سری از دستورات در رآس اطلاعات آنها را مشاهده کنید.
بهعنوانمثال دستور زیر محتویات یک msg را نشان میدهد.
[code lang=”js”]rosmsg show beginner_tutorials/Num[/code]
که طبق چیزی که قبلاً تعریف کردیم، خروجی آن بهصورت زیر است:
[code lang=”js”]int64 num[/code]
اگر شما بستهای که msg در آن قرار دارد را فراموش کردهاید میتوانید از کد زیر استفاده کنید:
[code lang=”js”]rosmsg show Num[/code]
که خروجی آن بهصورت زیر خواهد بود:
[code lang=”js”][beginner_tutorials/Num]:
int64 num
[/code]
با استفاده از دستور زیر میتوانید انواع دستورات rosmsg را مشاهده کنید.
[code lang=”js”]rosmsg -h[/code]
و خواهید دید:
[code lang=”js”]Commands:
rosmsg show Show message description
rosmsg list List all messages
rosmsg md5 Display message md5sum
rosmsg package List messages in a package
rosmsg packages List packages that contain messages[/code]
برای ساخت یک srv با استفاده از دستور زیر ابتدا به مسیر بسته موردنظر رفته و سپس پوشه srv را ایجاد میکنیم.
[code lang=”js”]roscd beginner_tutorials
mkdir srv
[/code]
شما میتوانید بهجای ساخت یک srv جدید بهصورت دستی، یک مورد موجود را از بستههای دیگر کپی کنید. برای این کار از دستور roscp به فرمت زیر استفاده کنید:
[code lang=”js”]roscp [package_name] [file_to_copy_path] [copy_path] mkdir srv
[/code]
اکنون میتوانیم بهعنوانمثال یک سرویس را از بسته rospy_tutorials که بهصورت خودکار در هنگام نصب رآس اضافه شده است، به بسته خودمان کپی کنیم.
[code lang=”js”]roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
[/code]
در ادامه باید مشابه اقدامات انجامشده برای msg را انجام دهیم.
ابتدا دو خط زیر در فایل package.xml را از کامنت خارج میکنیم.
[code lang=”js”]<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>[/code]
سپس عبارت message_generation را در بخش find_package از فایل CMakeLists.txt اضافه میکنیم.
[code lang=”js”]find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
[/code]
و درنهایت خطوط زیر را از کامنت خارج کرده و srv خودمان را جایگذاری میکنیم.
[code lang=”js”]# add_service_files(
# FILES
# Service1.srv
# Service2.srv
# )
[/code]
مشابه زیر:
[code lang=”js”]add_service_files(
FILES
AddTwoInts.srv
)
[/code]
مشابه با دستور rosmsg میتوان قابلیتهای یادشده را با جایگذاری rossrv بهجای rosmsg تحصیل نمود.
گامهای مرسوم برای msg و srv:
پس از اجرای مراحل توضیح دادهشده به مسیر فضای کاری خود رفته و دستور زیر را وارد کنید.
[code lang=”js”]catkin_make install
[/code]
پسازاین هرکدام از فایلهای.msg موجود در پوشه msg، کدهای مورداستفاده برای سایر زبانهای برنامهنویسی که پشتیبانی میشوند را تولید خواهد کرد. فایلهای مربوط به C++، پایتون،lisp به ترتیب در مسیرهای زیر ایجاد خواهند شد.
C++: ~/catkin_ws/devel/include/beginner_tutorials/ |
Paython: ~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg |
Lisp: ~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/ |
به طریق مشابه، هر فایل.srv نیز کدها را در مسیرهایی مشابه ایجاد کرده است.
برای اطلاعات بیشتر راجع به فرمت پیامها میتوانید به این صفحه مراجعه کنید.
2 دیدگاه
rosmsg show beginner_tutorials/Num <— rosmsg show beginner_tutorials/Nu
با سلام
به نظر می رسه که یک typo در بخش ساخت یک msg به شرح زیر موجود می باشد:
typo: echo "int64 num" > msg/Num.msg
correct version: echo “int64 num” > msg/Num.msg
با تشکر از سایت خوبتون!