مفهوم Topic و Message در ROS

این آموزش ادامه آموزش مفهوم Node و Topic در ROS است که پیشنهاد میشود ابتدا مطالعه شود.در این بخش Topic ها و ابزار کار با آن‌ها را بررسی خواهیم کرد و با نحوه ارسال Message به Topic و جزئیات آن آشنا خواهیم شد. به طور خلاصه؛ پیام ها از یک Node که publisher است از طریق یک Topic مشخص به Node دیگری که Subscriber است ارسال خواهند شد. به تصویر زیر دقت کنید:شکل کلی ارتباط Node ها در تصویر فوق قابل مشاهده است حالا بیایید از کل به جزء حرکت کنیم و جزئیات را نیز مورد بررسی قرار دهیم و البته در انتها نحوه ارسال پیام و جزئیات مربوط به آن را نیز بررسی خواهیم کرد.rostopicدستور rostopic این امکان رو میده تا اطلاعاتی درمورد ابزارهایی که برای Topic ها داریم را مشاهده کنیم: (از h- استفاده میکنیم تا کامنت های راهنما نیز نمایش داده شود)$ rostopic -hخروجی دستور فوق:rostopic bw display bandwidth used by topic rostopic echo print messages to screen rostopic hz display publishing rate of topic rostopic list print information about active topics rostopic pub publish data to topic rostopic type print topic typeچند مورد را که برایمان اهمیت دارد را بررسی کنیم :)rostopic echoاین دستور اطلاعاتی که در یک topic منتشر می‌شود را نمایش می‌دهد و در حالت کلی به شکل زیر نوشته میشود:rostopic echo [topic]برای مثال میتوانیم اطلاعات مربوط به سرعت لاک پشت که در بخش قبل مطرح شد و در گره turtle_teleop_key منتشر(publish) می‌شود را مشاهده کنیم(در یک ترمینال جدید):rostopic echo /turtle1/cmd_velممکن است هیچ خروجی مشاهده نکنید برای مشاهده نتیجه کار باید همانطور که در بخش قبل مطرح شد ترمینال مربوط به turtle_teleop_key در حالت فعال باشد و شما لاک پشت را با کلیدهای جهت دار کیبرد حرکت دهید سپس سرعت آن را در ترمینال جدید مشاهده کنید.linear: x: 2.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0 --- linear: x: 2.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0 ---حالا اگر نگاهی به rqt_graph بی‌اندازیم. (اگر از آموزش قبل هنوز پنجره مربوط به rqt_graph را باز نگه داشته اید کافیست روی علامت refresh کلیک کنید تا گراف جدید را مشاهده نمایید) در تصویر زیر rostopic echo با رنگ قرمز مشخص شده است. که به عنوان یک node شنونده(subscriber) عمل میکند.rostopic listاین دستور لیستی از topic های فعال را نمایش میدهد. در یک ترمینال جدید آن را اجرا و topic های فعال را خودتان مشاهده نمایید. اما بیایید ببینیم این دستور چه آرگومان های فرعی ای میتواند داشته باشد:در یک ترمینال جدید دستور زیر را اجرا کنید:$ rostopic list -hنتیجه به شکل زیر خواهد بود:Usage: rostopic list [/topic] Options: -h, --help show this help message and exit -b BAGFILE, --bag=BAGFILE list topics in .bag file -v, --verbose list full details about each topic -p list only publishers -s list only subscribersاگر از آرگومان verbos استفاده کنیم خواهیم دید که لیستی از topic ها و نوع آن‌ها نمایش داده خواهد شد:$ rostopic list -vخروجی دستور مذکور:Published topics: * /turtle1/color_sensor [turtlesim/Color] 1 publisher * /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher * /rosout [rosgraph_msgs/Log] 2 publishers * /rosout_agg [rosgraph_msgs/Log] 1 publisher * /turtle1/pose [turtlesim/Pose] 1 publisher Subscribed topics: * /turtle1/cmd_vel [geometry_msgs/Twist] 1 subscriber * /rosout [rosgraph_msgs/Log] 1 subscriberMessageارتباط در تاپیک ها با ارسال پیام بین node ها اتفاق می‌افتد. فرستنده یا publisher در مثال ما turtle_teleop_key و گیرنده، شنونده یا subscriber در مثال ما turtlesim_node است که با یکدیگر در ارتباط هستند. فرستنده و شنونده هر دو نوع مشخصی از پیام را ارسال و دریافت میکنند. نوع topic به وسیله نوع پیامی که در آن منتشر میشود مشخص میگردد.rostopic typeمیتوانیم نوع topic را با دستور rostopic type متوجه شویم. این دستور نوع پیام هر topic که در حال انتشار باشد را مشخص میکند. برای مثال:$ rostopic type /turtle1/cmd_velخروجی کد بالا:geometry_msgs/Twistهمچنین ما میتوانیم برای مشاهده جزئیات بیشتر در مورد پیام از rosmsg استفاده کنیم:$ rosmsg show geometry_msgs/Twistکه جزئیات بیشتری از پیام را نمایش میدهد:geometry_msgs/Vector3 linear float64 x float64 y float64 z geometry_msgs/Vector3 angular float64 x float64 y float64 zrostopic pub(ارسال پیام)حالا که با پیام ها آشنا شدیم بیایید از آنها استفاده کنیم. دستور rostopic pub اطلاعاتی را در یک topic مشخص که در حال اجرا است را منتشر میکند و ساختار کلی آن به شکل زیر است:rostopic pub [topic] [msg_type] [args]برای مثال:$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'دستور فوق یک تک پیام به topic مشخص شده که همان لاک پشتمان است ارسال میکند و آن را با سرعت خطی 2 و سرعت زاویه ای 1.8 حرکت میدهد. حاصل این حرکت به شکل زیر است:این کار به شدت ساده و پرکاربرد است :) بیایید به جزئیات دستور مذکور نگاهی بی‌اندازیم:این دستور پیام را برای یک topic مشخص ارسال میکند:rostopic pubبه شکل زیر میتوانیم مشخص کنیم که rostopc تنها یک بار این پیام را منتشر کند:-1این نام topic مدنظر ما برای انتشار پیام است:/turtle1/cmd_velاین نوع پیام مدنظر است:geometry_msgs/Twistبه شکل زیر مشخص میکنیم که هیچ کدام از آرگومان ها مجزا نیستند. این مورد در مواقعی ضروری است که که آرگومان های ما دارای خط تیره هستند(مثل اعداد منفی)--نوع پیام geometry_msgs/Twist msg دارای دو بردار که هرکدام شامل سه عدد اعشاری می باشد است و مشخص کننده سرعت خطی و زاویه میباشد.با استفاده از دستور مذکور لاک پشت پس از طی مسیر کوتاهی می‌ایستد اما برای حرکت مداوم آن می‌توانیم از دستور زیر استفاده کنیم و یک حرکت مداوم با فرکانس ۱ هرتز ایجاد کنیم:$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'این دستور سرعت را با نرخ ۱ هرتز در topic منتشر میکند.اکنون بیایید ببینیم در rqt_graph چه اتفاقی افتاد. روی کلید refresh در گوشه بالای پنجره rqt_graph کلیک کنید. rostopic pub node که در اینجا به رنگ قرمز است در ارتباط است با rostopic echo node که در اینجا با رنگ سبز قابل مشاهده است:وقتی که لاک پشت ما در حال حرکت است می‌توانیم در یک ترمینال جدید با استفاده از دستور زیر دیتا های منتشر شده را مشاهده نماییم:rostopic echo /turtle1/poserostopic hzاین دستور نرخ هر داده در حال انتشار را مشخص میکند و شکل کلی آن به شکل زیر است:rostopic hz [topic]برای مثال میتوانیم ببینیم با چه سرعتی turtlesim_node در حال انتشار /turtle1/pose می‌باشد:$ rostopic hz /turtle1/poseخروجی دستور فوق:subscribed to [/turtle1/pose] average rate: 59.354 min: 0.005s max: 0.027s std dev: 0.00284s window: 58 average rate: 59.459 min: 0.005s max: 0.027s std dev: 0.00271s window: 118 average rate: 59.539 min: 0.004s max: 0.030s std dev: 0.00339s window: 177 average rate: 59.492 min: 0.004s max: 0.030s std dev: 0.00380s window: 237 average rate: 59.463 min: 0.004s max: 0.030s std dev: 0.00380s window: 290بنابراین می‌توان گفت turtlesim در حال انتشار داده ها در مورد لاک پشت با نرخ 60HZ است. همچنین میتوانیم با استفاده از rostopic type و rosmsg همانطور که ذکر شد اطلاعات بیشتری درمورد یک topic بدست آورد:$ rostopic type /turtle1/cmd_vel | rosmsg showrqt_plotاین دستور یک نمایش در لحظه و روی نموداری در حال حرکت از داده هایی که در یک topic در حال نمایش هستند را ارائه میدهد.برای مثال میتوانیم از rqt_plot برای رسم داده هایی که در /turtle1/pose منتشر میشوند:$ rosrun rqt_plot rqt_plotدر پنجره ظاهر شده میتوانید در قسمت بالا سمت چپ اطلاعات هر topic که مدنظر شماست را انتخاب و نمودار آن را مشاهده نمایید. برای مثال در این قسمت /turtle1/pose/x را تایپ کنید روی + کلیک کنید و نمودار مربوط به /turtle1/pose/y را هم اضافه کنید. حالا می‌توانید نمودار مربوط مکان x-y لاک پشت را مشاهده نمایید.برای مشاهده دیگر اطلاعات نیز میتوانید با استفاده از گزینه − topic های دیگر را حذف کنید. در شکل زیر اطلاعات مربوط به /turtle1/pose/theta نمایش داده شده است.در این آموزش تلاش شده ابزارهای مهم برای کار و بررسی Topic ها و نحوه ارسال Message به یک Topic بررسی شود :))منبع: wiki.ros.org - docs.ros.org