تسجيل الدخول إلى برنامج ROS

مساء الخير أيها القراء! ما زلت أتحدث عن العديد من الميزات المثيرة للاهتمام والمفيدة للمنصة الروبوتية لنظام تشغيل الروبوت (ROS). في هذا البرنامج التعليمي القصير ، سأتحدث عن إمكانيات التسجيل باستخدام ROS عند البرمجة في C ++. أعتقد أن الكثيرين سيوافقون على أن إخراج الرسائل أثناء تنفيذ البرنامج له أهمية كبيرة عند تطوير البرامج ، خاصة عند تصحيح الأخطاء. يوفر ROS واجهة برمجة تطبيقات مناسبة لإخراج أنواع مختلفة من الرسائل إلى المحطة الطرفية مع القدرة على تصور الرسائل وتصفيتها في أدوات ROS الخاصة. دعنا نبدأ!

استخدام أساليب مكتبة console.h لعرض الرسائل في العقدة


لذا ، دعنا نكتب عقدة بسيطة ، والتي سوف نسميها logging_tutorial:

catkin_create_pkg logging_tutorial roscpp std_msgs 

أضف إلى CMakeLists.txt:

 add_executable(logging_node src/main.cpp) target_link_libraries(logging_node ${catkin_LIBRARIES} ) 

الآن دعونا نبدأ في كتابة كود main.cpp. نقوم باستيراد في رأس الملف وحدة تحكم ملف رأس خاصة. h مع تعريف وظائف التسجيل:

 #include <ros/console.h> 

أضف رسالة بسيطة إلى الطريقة الرئيسية:

 int main(int argc, char** argv) { ros::init(argc, argv, "logging_node"); ros::NodeHandle n; ROS_INFO("logging_node start"); return 0; } 

قم بتجميع الحزمة وتشغيلها:

 cd ~/catkin_ws catkin_make source devel/setup.bash rosrun logging_tutorial logging_node 

سيكون الإخراج على النحو التالي:

 [ INFO] [1492194213.009783103]: logging_node start 

في بداية الرسالة ، تتم إضافة "مستوى" أو نوع وطابع زمني بالثواني والثواني النانوية من 1 يناير 1970. في هذه الحالة ، لدينا رسالة بمستوى INFO.

يمكننا تمرير المعلمات إلى الرسالة بطريقة مماثلة لطريقة printf:

 int val = 5; ROS_INFO("message with argument: %d", val); 

يمكنك إنشاء رسالة كتدفق قياسي مثل std :: cout:

 ROS_INFO_STREAM("message with argument: " << val); 

تدعم ROS "مستويات التفاصيل" التالية (بترتيب متزايد من حيث الصلة):

  • ديبوج
  • INFO
  • تحذير
  • خطأ
  • قاتلة

لعرض رسالة بمستوى معين ، يتم استخدام الوظيفة المقابلة في التنسيق: ROS _ \ <LEVEL \>. يتم عرض الرسائل من أنواع مختلفة بلون معين: DEBUG - أخضر ، INFO - أبيض ، WARN - أصفر ، خطأ - أحمر ، FATAL - أرجواني. من السهل تخمين الغرض من كل نوع من الرسائل حسب اسمه. على سبيل المثال ، رسائل DEBUG مفيدة لتصحيح الأخطاء.

أضف بعض الرسائل المختلفة وقم بتشغيل كل شيء في حلقة. حصلت على الملف التالي:

 #include <ros/ros.h> #include <ros/console.h> int main(int argc, char** argv) { ros::init(argc, argv, "logging_node"); ros::NodeHandle n; ros::Rate rate (1); while(ros::ok()) { ROS_DEBUG("debug message"); ROS_INFO("logging_node start"); int val = 5; ROS_INFO("message with argument: %d", val); ROS_INFO_STREAM("stream message with argument: " << val); ROS_WARN("My warning"); ROS_ERROR("Some error"); ROS_FATAL("Fatal error"); ros::spinOnce(); rate.sleep(); } return 0; } 

بشكل افتراضي ، يتم عرض الرسائل من جميع الأنواع باستثناء DEBUG أثناء تنفيذ البرنامج. يتم تحديد ذلك من خلال المستوى الأدنى ، ما يسمى "مستوى الأهمية" ، باستخدام معلمة ROSCONSOLE_MIN_SEVERITY. تحدد المعلمة ROSCONSOLE_MIN_SEVERITY إخراج الرسائل بطريقة يتم فيها عرض جميع الرسائل ذات مستوى يساوي أو أقل من الحد الأدنى. بشكل افتراضي ، يتم تعيين المستوى الأدنى على DEBUG. يمكنك تغيير الحد الأدنى للمستوى عن طريق تعيين ROSCONSOLE_MIN_SEVERITY على أحد مستويات الرسائل (ROSCONSOLE_SEVERITY_DEBUG ، ROSCONSOLE_SEVERITY_INFO ، إلخ) أو على أي منها (ROSCONSOLE_SEVERITY_NONE) باستخدام الماكرو في بداية الملف العقدة:

 #define ROSCONSOLE_MIN_SEVERITY ROSCONSOLE_SEVERITY_DEBUG 

يمكنك أيضًا تعيين مستوى الخطورة لجميع العقد في الحزمة في ملف CMakeLists.txt:

 add_definitions(-DROSCONSOLE_MIN_SEVERITY=ROSCONSOLE_SEVERITY_ERROR) 

هذه الطريقة لها حد واحد: سيتم عرض الرسائل ذات المستوى الأعلى من DEBUG فقط ، حتى إذا حددنا ROSCONSOLE_SEVERITY_DEBUG مباشرة. يمكن حل هذه المشكلة باستخدام ملف تكوين خاص. قم بإنشاء مجلد تكوين وداخله ملف custom_rosconsole.conf بالمحتويات التالية:

 log4j.logger.ros.logging_tutorial=DEBUG 

بعد ذلك ، قم بإنشاء ملف تسجيل التشغيل Launchunch وحدد المسار إلى ملف custom_rosconsole.conf في متغير ROSCONSOLE_CONFIG_FILE:

 <launch> <env name="ROSCONSOLE_CONFIG_FILE" value="$(find logging_tutorial)/config/custom_rosconsole.conf"/> <node pkg="logging_tutorial" type="logging_node" name="logging_node" output="screen"/> </launch> 

أضفنا هنا المعلمة output = "screen" ، التي تسمح بإخراج رسائل المستوى بدءًا من INFO.

تجميع وتشغيل قاذفة لدينا:

 cd ~/catkin_ws catkin_make roslaunch logging_tutorial logging.launch 

نحصل على استنتاج مماثل:

الصورة

لدى ROS القدرة على تسمية الرسائل. بشكل افتراضي ، تحصل الرسائل على اسم المضيف. يمكن للمستخدمين إعطاء أسماء لرسائل مختلفة من خلال وظيفة ROS _ \ <LEVEL \> [_ STREAM] _NAMED:

 ROS_INFO_STREAM_NAMED("named_msg", "named info stream message with argument: " << val); 


تتيح لك الأسماء تعيين مستويات دنيا مختلفة لكل رسالة مسماة في ملف التكوين وتغييرها بشكل فردي. يشار إلى اسم الرسالة بعد اسم الحزمة:

 log4j.logger.ros.logging_tutorial.named_msg = ERROR 


يمكن أن تكون الرسائل الشرطية التي يتم تنفيذها تحت شرط معين مفيدة أيضًا. للقيام بذلك ، استخدم الدالة ROS _ \ <LEVEL \> [_ STREAM] _COND [_NAMED]:

 ROS_INFO_STREAM_COND(val < 2, "conditional stream message shown when val (" << val << ") < 2"); 


يمكن إخراج الرسائل بتردد معين باستخدام وظيفة ROS _ \ <LEVEL \> [_ STREAM] _THROTTLE [_NAMED]. تحدد المعلمة الأولى التردد بالثواني:

 ROS_INFO_THROTTLE(3, "throttled message with period 3 seconds"); 


استخدام rqt_console لعرض الرسائل


قم بتشغيل الأداة المساعدة rqt_console:

 rosrun rqt_console rqt_console 

وابدأ العقدة باستخدام التشغيل:

 roslaunch logging_tutorial logging.launch 

ستبدو نافذة rqt_console كما يلي:

الصورة

هنا في الجدول لكل رسالة يتم عرض المستوى واسم العقدة واسم الملف وسطر التعليمات البرمجية حيث يتم إنشاؤها.

بالنقر المزدوج على رسالة ، يمكنك الحصول على معلومات تفصيلية عنها:

الصورة

يمكنك تصفية الرسائل عن طريق استبعاد جميع رسائل الخطأ. للقيام بذلك ، قم بإضافة عامل تصفية بالنقر فوق علامة الجمع بجانب جدول استبعاد الرسائل وتحديد الخيار "... تحتوي على":

الصورة

أو استبعاد الرسائل بمستوى المعلومات:

الصورة

أيضًا ، يمكن تمييز الرسائل من مستوى معين بين جميع المستخدمين باستخدام الفلاتر في قسم الرسائل المميزة:

الصورة

وبالتالي ، يتيح لك rqt_console تكوين عرض الرسائل من العقد المختلفة بمرونة وتبسيط برامج التصحيح في ROS.

آمل أن يكون هذا الدليل مفيدًا في العمل ويبسط حل المشكلات الناشئة أثناء البرمجة. أتمنى لكم كل النجاح في العمل مع ROS وأراكم قريباً!

Source: https://habr.com/ru/post/ar403191/


All Articles