Selamat siang, para pembaca! Saya terus berbicara tentang berbagai fitur menarik dan berguna platform robot Sistem Operasi Robot (ROS). Dalam tutorial singkat ini, saya akan berbicara tentang kemungkinan masuk menggunakan ROS saat pemrograman di C ++. Saya pikir banyak orang akan setuju bahwa output dari pesan selama eksekusi program sangat penting dalam mengembangkan program, terutama ketika debugging. ROS menyediakan API yang nyaman untuk mengeluarkan berbagai jenis pesan ke terminal dengan kemampuan untuk memvisualisasikan dan memfilter pesan dalam alat ROS khusus. Ayo mulai!
Menggunakan metode perpustakaan console.h untuk menampilkan pesan dalam sebuah node
Jadi, mari kita tulis simpul sederhana, yang akan kita sebut logging_tutorial:
catkin_create_pkg logging_tutorial roscpp std_msgs
Tambahkan ke CMakeLists.txt:
add_executable(logging_node src/main.cpp) target_link_libraries(logging_node ${catkin_LIBRARIES} )
Sekarang mari kita mulai menulis kode main.cpp. Kami mengimpor file header konsol file header khusus. H dengan definisi fungsi logging:
#include <ros/console.h>
Tambahkan pesan sederhana ke metode utama:
int main(int argc, char** argv) { ros::init(argc, argv, "logging_node"); ros::NodeHandle n; ROS_INFO("logging_node start"); return 0; }
Kompilasi paket dan jalankan:
cd ~/catkin_ws catkin_make source devel/setup.bash rosrun logging_tutorial logging_node
Outputnya akan seperti ini:
[ INFO] [1492194213.009783103]: logging_node start
Pada awal pesan ditambahkan "level" atau tipe dan cap waktu dalam detik dan nanodetik mulai 1 Januari 1970. Dalam hal ini, kami memiliki pesan dengan level INFO.
Kami dapat mengirimkan parameter ke pesan yang mirip dengan metode printf:
int val = 5; ROS_INFO("message with argument: %d", val);
Anda dapat membuat pesan sebagai aliran standar seperti std :: cout:
ROS_INFO_STREAM("message with argument: " << val);
ROS mendukung "level detail" berikut (dalam urutan relevansi yang meningkat):
- DEBUG
- INFO
- PERINGATAN
- Kesalahan
- Fatal
Untuk menampilkan pesan pada tingkat tertentu, fungsi yang sesuai digunakan dalam format: ROS _ \ <LEVEL \>. Pesan dari berbagai jenis ditampilkan dengan warna tertentu: DEBUG - hijau, INFO - putih, PERINGATAN - kuning, KESALAHAN - merah, FATAL - ungu. Tujuan setiap jenis pesan mudah ditebak berdasarkan namanya. Misalnya, pesan DEBUG berguna untuk debugging.
Tambahkan beberapa pesan berbeda dan jalankan semuanya dalam satu lingkaran. Saya mendapat file berikut:
#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; }
Secara default, pesan dari semua jenis kecuali DEBUG ditampilkan selama eksekusi program. Ini ditentukan oleh tingkat minimum, yang disebut "tingkat kepentingan", menggunakan parameter ROSCONSOLE_MIN_SEVERITY. Parameter ROSCONSOLE_MIN_SEVERITY membatasi output pesan sedemikian rupa sehingga semua pesan dengan level yang sama dengan atau lebih tinggi dari minimum ditampilkan. Secara default, level minimum diatur ke DEBUG. Anda dapat mengubah tingkat minimum dengan menetapkan ROSCONSOLE_MIN_SEVERITY ke salah satu tingkat pesan (ROSCONSOLE_SEVERITY_DEBUG, ROSCONSOLE_SEVERITY_INFO, dll.) Atau tidak satupun dari mereka (ROSCONSOLE_SEVERITY_NONE) menggunakan makro di awal simpul file: awal file: awal file:
#define ROSCONSOLE_MIN_SEVERITY ROSCONSOLE_SEVERITY_DEBUG
Anda juga dapat mengatur tingkat keparahan untuk semua node dalam paket di file CMakeLists.txt:
add_definitions(-DROSCONSOLE_MIN_SEVERITY=ROSCONSOLE_SEVERITY_ERROR)
Metode ini memiliki satu batasan: hanya pesan tingkat yang lebih tinggi dari DEBUG akan ditampilkan, bahkan jika kita secara langsung menentukan ROSCONSOLE_SEVERITY_DEBUG. Masalah ini dapat diselesaikan dengan menggunakan file konfigurasi khusus. Buat folder config dan di dalamnya file custom_rosconsole.conf dengan konten berikut:
log4j.logger.ros.logging_tutorial=DEBUG
Selanjutnya, buat file launch logging.launch dan tentukan path ke file custom_rosconsole.conf dalam variabel 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>
Di sini kami menambahkan parameter output = "layar", yang memungkinkan keluaran pesan tingkat dimulai dengan INFO.
Kompilasi dan jalankan peluncur kami:
cd ~/catkin_ws catkin_make roslaunch logging_tutorial logging.launch
Kami mendapatkan kesimpulan yang serupa:

ROS memiliki kemampuan untuk memberi nama pesan. Secara default, pesan mendapatkan nama host. Pengguna dapat memberi nama ke berbagai pesan melalui fungsi ROS _ \ <LEVEL \> [_ STREAM] _NAMED:
ROS_INFO_STREAM_NAMED("named_msg", "named info stream message with argument: " << val);
Nama memungkinkan Anda untuk menetapkan level minimum berbeda untuk setiap pesan bernama dalam file konfigurasi dan mengubahnya secara terpisah. Nama pesan ditunjukkan setelah nama paket:
log4j.logger.ros.logging_tutorial.named_msg = ERROR
Pesan bersyarat yang dieksekusi dalam kondisi tertentu juga dapat bermanfaat. Untuk melakukan ini, gunakan fungsi ROS _ \ <LEVEL \> [_ STREAM] _COND [_NAMED]:
ROS_INFO_STREAM_COND(val < 2, "conditional stream message shown when val (" << val << ") < 2");
Pesan dapat dihasilkan pada frekuensi tertentu menggunakan fungsi ROS _ \ <LEVEL \> [_ STREAM] _THROTTLE [_NAMED]. Parameter pertama mengatur frekuensi dalam hitungan detik:
ROS_INFO_THROTTLE(3, "throttled message with period 3 seconds");
Menggunakan rqt_console untuk menampilkan pesan
Jalankan utilitas rqt_console:
rosrun rqt_console rqt_console
Dan mulai simpul kami menggunakan peluncuran:
roslaunch logging_tutorial logging.launch
Jendela rqt_console akan terlihat seperti ini:

Di sini, di tabel untuk setiap pesan, level, nama simpul, nama file, dan baris kode tempat pesan ditampilkan.
Dengan mengklik dua kali pada sebuah pesan, Anda dapat memperoleh informasi terperinci tentangnya:
Anda dapat memfilter pesan dengan mengecualikan semua pesan kesalahan. Untuk melakukan ini, tambahkan filter dengan mengklik tanda tambah di sebelah tabel Kecualikan pesan dan pilih opsi "... berisi":

Atau kecualikan pesan dengan tingkat Info:

Selain itu, pesan pada tingkat tertentu dapat dibedakan di antara semua menggunakan filter di bagian Pesan Sorotan:

Dengan demikian, rqt_console memungkinkan Anda untuk secara fleksibel mengkonfigurasi tampilan pesan dari berbagai node dan menyederhanakan program debugging di ROS.
Saya harap panduan ini terbukti bermanfaat dalam pekerjaan dan akan menyederhanakan solusi masalah yang timbul selama pemrograman. Saya berharap Anda semua berhasil dalam bekerja dengan ROS dan sampai jumpa lagi!