Membangun Node Subscriber Menggunakan C++
Tutorial Robot Operating System (Bagian 4)
Sebelumnya, embeddednesia telah membahas mengenai bagaimana membuat Node pada ROS yang berfungsi sebagai Publisher. Pada tulisan kali ini, embeddednesia akan melanjutkan membuat program Node yang berfungsi sebagai Subscriber dari Node yang telah dipublish oleh node publisher dari program yang sebelumnya pernah dibahas.
Jika anda belum mengikuti tulisan sebelumnya tentang bagaimana membuat node publisher pada ROS, disarankan untuk membaca terlebih dahulu tulisan sebelumnya sebagai pondasi sebelum menginjak ke bahasan ini.
Hal pertama yang perlu diketahui sebelum menulis program untuk mensubscribe sebuah topic adalah, anda harus mengetahui nama topic yang ingin disubscribe, beserta jenis tipe data pada message-nya. Untuk melihat topic yang sedang dipublish pada suatu environment ROS, gunakan perintah rostopic list
[simterm]
$ rostopic list
/chatter
/rosout
/rosout_agg
[/simterm]
Dalam tutorial ini, topic yang ingin disubscribe adalah /chatter . Untuk mengetahui lebih rinci tentang topic /chatter gunakan perintah rostopic info [nama topic]
[simterm]
$ rostopic info /chatter
Type: std_msgs/String
Publishers:
* /my_talker (http://ROS-16:46041/)
Subscribers: None
[/simterm]
Dari informasi tersebut, diketahui bahwa topic chatter memiliki message yang berjenis std_msgs/String. Oke, mari dibuat programnya, buka text editor pada workspace di package tutorial_ros pada tutorial sebelumnya, buat file bernama listener.cpp
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include "ros/ros.h" | |
| #include "std_msgs/String.h" | |
| void chatterCallback(const std_msgs::String::ConstPtr& msg) | |
| { | |
| ROS_INFO("I heard: [%s]", msg->data.c_str()); | |
| } | |
| int main(int argc, char **argv) | |
| { | |
| ros::init(argc, argv, "listener"); | |
| ros::NodeHandle n; | |
| ros::Subscriber sub=n.subscribe("chatter",1000, chatterCallback); | |
| ros::spin(); | |
| return 0; | |
| } |
Program tersebut terdiri dar dua bagian besar, fungsi main yang merupakan titik awal eksekusi program, dan fungsi callback yang diberi nama chatterCallback. fungsi callback ini akan dipanggil secara internal apabila message diterima dari topic yang ingin disubscribe.
Perintah subscribe diberikan oleh fungsi subscribe di nomer 11, fungsi ini memiliki 3 argumen. Argumen pertama, diisi oleh nama topic yang ingin disubscribe, argumen kedua adalah antrian message yang bisa dibuffer oleh program, sedangkan yang ketiga adalah nama fungsi callback yang ingin dipanggil apabila satu message baru berhasil diterima.
Fungsi subscriber pada baris 11 akan memberikan return object ros::Subscriber yang mesti ditampung hingga dilakukan unsubscribe. ketika object tersebut didestruct maka node akan otomatis me-subscribe topic. Sedangkan fungsi ros::spin(), berlaku seperti superloop yang akan melakukan listening dan mentrigger fungsi callback secepat mungkin begitu sebuah message diterima.
Sama seperti di tulisan sebelumnya, untuk mengcompile, menjadikan source code menjadi binary. Ubah CMakelist.xml, tambahkan 3 baris sebagai berikut
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| add_executable(simple_listener src/simple_listener.cpp) | |
| target_link_libraries(simple_listener | |
| ${catkin_LIBRARIES} | |
| ) | |
| add_dependencies(simple_listener tutorial_ros_generate_messages_cpp) |
Gunakan perintah catkin_make, untuk meng-compile program. Jangan lupa untuk selalu berada posisi root workspace ketika akan melakukan compile program
Jika tidak ada error, maka proses build berjalan sukses, jalankan program dengan menggunakan perintah rosrun. Sebelumnya, pastikan master ros (roscore) dan node simple_publisher telah running sebelum node simple_listener dijalankan, masing – masih di jendela terminal yang terpisah
Perhatikan pada jendela terminal simple_listener menampilkan data yang dikirim pada jendela terminal simple_publisher
[simterm]$ rosrun tutorial_ros simple_listener
[ INFO] [1517350009.193051310]: I heard: [Hi, this is my_talker 104]
[ INFO] [1517350009.292889810]: I heard: [Hi, this is my_talker 105]
[ INFO] [1517350009.392951414]: I heard: [Hi, this is my_talker 106]
[ INFO] [1517350009.492990666]: I heard: [Hi, this is my_talker 107]
[ INFO] [1517350009.592750328]: I heard: [Hi, this is my_talker 108]
[ INFO] [1517350009.692884766]: I heard: [Hi, this is my_talker 109]
[/simterm]
Untuk menampilkan info dari node listener, gunakan rosnode info nama_node
$ rosnode info /listener
——————————————————————————–
Node [/listener]
Publications:
* /rosout [rosgraph_msgs/Log]
Subscriptions:
* /chatter [std_msgs/String]
Services:
* /listener/set_logger_level
* /listener/get_loggers
contacting node http://ROS-16:33887/ …
Pid: 5022
Connections:
* topic: /rosout
* to: /rosout
* direction: outbound
* transport: TCPROS
* topic: /chatter
* to: /my_talker (http://ROS-16:36681/)
* direction: inbound
* transport: TCPROS
Sedangkan untuk melihat visualisasi yang terjadi pada masing – masing node, gunakan rqt_graph.

Dari gambar dapat diketahui bahwa node my_talker mempublish topic bernama /chatter dan disubscribe oleh node /listener (perhatikan arah tanda panah).