ایجاد فایلهای 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، یک رشته و دو پیام دیگر وجود دارد آورده شده است.
Header header string child_frame_id geometry_msgs/PoseWithCovariance pose geometry_msgs/TwistWithCovariance twist
فایلهای srv نیز شبیه فایلهای msg هستند، با این تفاوت که آنها شامل دو بخش درخواست و پاسخ هستند. این دو بخش توسط یک خط بهصورت ‘—‘ از هم جدا شدهاند. در زیر نمونهای از یک فایل srv آورده شده است.
int64 A int64 B --- int64 Sum
در مثال بالا A و B درخواست و sum پاسخ است.
بگذارید تا یک msg جدید را در بستهای که در آموزش قبلی ایجاد کرده بودیم تعریف کنیم.
roscd beginner_tutorials mkdir msg echo "int64 num" > msg/Num.msg
کد mkdir msg یک پوشه به نام msg درون پوشه بسته beginner_tutorials ایجاد میکند. در خط بعدی از کد echo استفاده شده است این کد عبارت داخل گیومه را در فایلی به نام Num.msg که در پوشه msg ایجاد کرده است قرار میدهد. شما البته میتوانید بدون استفاده از این کد نیز فایل Num.msg را ایجاد کنید. برای این کار یک فایل خالی ایجاد کنید و نام آن را به همراه پسوند.msg انتخاب کنید و با باز کردن آن کدهای مربوط را در آن وارد کنید.
فایل Num.msg که بهعنوانمثال در بالا آورده شده است، تنها ۱ خط دارد، البته شما میتوانید یک فایل پیچیدهتر با اضافه کردن چند المان دیگر هرکدام در یک خط، مشابه مثال زیر ایجاد کنید.
string first_name string last_name uint8 age uint32 score
در گام بعدی ما باید مطمئن شویم که فایلهای msg به سورس کد برای C++، پایتون و دیگر زبانهای برنامهنویسی تبدیلشدهاند. برای این کار package.xml را باز کنید و مطمئن شوید که این دو خط در آن وجود دارد و کامنت (بهصورت توضیحات) نباشد.
<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>
لازم به ذکر است که این دو خط بهصورت پیشفرض کامنت هست و برای رفع کامنت آن باید کاراکترهای “<!–“ را از ابتدا و کاراکترهای “–>” را از انتهای آن خط حذف کرد.
توجه کنید که در زمان کامپایل کردن، ما به “message_generation”نیاز داریم، درحالیکه درزمان اجرا فقط به “message_runtime”نیاز داریم.
CMakeLists.txt را با یک ویرایشگر متن دلخواه باز کنید، سپس وابستگی message_generation را در قسمت find_package که در CMakeLists.txt وجود دارد اضافه کنید، بهاینترتیب قادر خواهید بود تا پیامها را تولید کنید.
در زیر بخش موردنظر پس از اضافه شدن message_generation آورده شده است.
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation )
دقت کنید که عبارت message_generation قبل از بسته شدن پرانتز اضافه شود.
همچنین مطمئن شوید که وابستگی message runtime را بهصورت زیر وارد کردهاید.
catkin_package( ... CATKIN_DEPENDS message_runtime ... ...)
خطوط زیر را در فایل CMakeLists.txt پیدا کنید:
# add_message_files( # FILES # Message1.msg # Message2.msg # )
آنها را با حذف # از حالت کامنت خارج کنید و سپس Message*.msg ها را با فایلهای msg خودتان مانند زیر جایگذاری کنید.
add_message_files( FILES Num.msg )
با اضافه کردن فایلهای.msg بهصورت دستی CMake متوجه میشود که بعدازاینکه شما فایلهای.msg دیگر را اضافه کردید باید پروژه را مجدداً تنظیم کند.
اکنون ما باید از فراخوانی تابع generate_messages() اطمینان حاصل کنیم. برای این کار در توزیعهای Hydro به بعد باید خطوط زیر را از حالت کامنت خارج کنید.
# generate_messages( # DEPENDENCIES # std_msgs # )
در توزیعهای قدیمیتر تنها باید خط زیر را از کامنت خارج کرد:
generate_messages()
اکنون شما برای تولید فایلهای مرجع برای تعریف msg خودتان آمادهاید.
پسازاینکه یک msg ساختید، میتوانید با یک سری از دستورات در رآس اطلاعات آنها را مشاهده کنید.
بهعنوانمثال دستور زیر محتویات یک msg را نشان میدهد.
rosmsg show beginner_tutorials/Num
که طبق چیزی که قبلاً تعریف کردیم، خروجی آن بهصورت زیر است:
int64 num
اگر شما بستهای که msg در آن قرار دارد را فراموش کردهاید میتوانید از کد زیر استفاده کنید:
rosmsg show Num
که خروجی آن بهصورت زیر خواهد بود:
[beginner_tutorials/Num]: int64 num
با استفاده از دستور زیر میتوانید انواع دستورات rosmsg را مشاهده کنید.
rosmsg -h
و خواهید دید:
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
برای ساخت یک srv با استفاده از دستور زیر ابتدا به مسیر بسته موردنظر رفته و سپس پوشه srv را ایجاد میکنیم.
roscd beginner_tutorials mkdir srv
شما میتوانید بهجای ساخت یک srv جدید بهصورت دستی، یک مورد موجود را از بستههای دیگر کپی کنید. برای این کار از دستور roscp به فرمت زیر استفاده کنید:
roscp [package_name] [file_to_copy_path] [copy_path] mkdir srv
اکنون میتوانیم بهعنوانمثال یک سرویس را از بسته rospy_tutorials که بهصورت خودکار در هنگام نصب رآس اضافه شده است، به بسته خودمان کپی کنیم.
roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
در ادامه باید مشابه اقدامات انجامشده برای msg را انجام دهیم.
ابتدا دو خط زیر در فایل package.xml را از کامنت خارج میکنیم.
<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>
سپس عبارت message_generation را در بخش find_package از فایل CMakeLists.txt اضافه میکنیم.
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation )
و درنهایت خطوط زیر را از کامنت خارج کرده و srv خودمان را جایگذاری میکنیم.
# add_service_files( # FILES # Service1.srv # Service2.srv # )
مشابه زیر:
add_service_files( FILES AddTwoInts.srv )
مشابه با دستور rosmsg میتوان قابلیتهای یادشده را با جایگذاری rossrv بهجای rosmsg تحصیل نمود.
گامهای مرسوم برای msg و srv:
پس از اجرای مراحل توضیح دادهشده به مسیر فضای کاری خود رفته و دستور زیر را وارد کنید.
catkin_make install
پسازاین هرکدام از فایلهای.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
با تشکر از سایت خوبتون!