Membuat Node Publisher Menggunakan C++
Tutorial Robot Operating System (Bagian 3)
Sekarang tinggalkan si kura – kura, dan mari membangun program ROS sendiri. Pada sesi kali ini embeddednesia akan membahas bagaimana membuat program sederhana yang berfungsi publisher dan subscriber sebuah topic.
Karena cukup panjangnya bahasan ini, maka embeddednesia membaginya menjadi dua judul terpisah yaitu,
- Membuat Node Publisher
- Membuat Node Subscriber (coming soon)
Dalam tutorial ini embeddednesia menggunakan Sistem Operasi Ubuntu 16.04 LTS dan ROS Kinetic Kame. Script editor yang membuat program, digunakan Visual Studio Code. Namun anda bebas menggunakan script editor sesuai yang anda sukai.
Tutorial ini juga dibuat dalam versi video yang telah diupload di Youtube. Jangan lupa like dan subscribe serta gunakan kolom komentar untuk memberikan komentar, saran dan pertanyaan.
ROS adalah framework robotik yang bersifat netral, dalam artian tidak terikat kepada salah satu bahasa pemrograman. Node akan tetap bisa saling berkomunikasi node yang lain meskipun dibangun dengan bahasa pemrogaman yang berbeda. Hal ini memberikan kebebasan kepada seorang software developer untuk memilih bahasa pemrograman yang akan digunakan.
Adverstiment
- Package ROS
Semua program ROS diorganisasikan ke dalam package – package. Misalkan, seperti yang sudah pernah dibahas sebelumnya, turtlesim_node dan turtle_teleop_key berada dalam satu package turtlesim. Karena itu sebelum node dibuat, terlebih dahulu harus disiapkan package yang menampungnya.
Ada dua jenis pacakge untuk ROS. Menggunakan rosbuild dan catkin. Namun penggunaan rosbuild telah deprecated dan akan digantikan oleh catkin, membuat package baru di dalam catkin digunakan perintah sebagai berikut
catkin_create_pkg [nama_package] [dependensi_1] [dependensi_2 dst]
Dalam sesi kali ini dibuat package bernama tutorial_ros dengan dependensi
std_msgs(tipe message ros yang nanti digunakan sebagai topic)rospy(ros client, library diperlukan jika ingin membangun node menggunakan python)roscpp(ros client, library yang diperlukan jika ingin membangun node menggunakan c++)
[simterm]
$ catkin_create_pkg tutorial_ros2 std_msgs rospy roscpp
Created file tutorial_ros2/package.xml
Created file tutorial_ros2/CMakeLists.txt
Created folder tutorial_ros2/include/tutorial_ros2
Created folder tutorial_ros2/src
Successfully created files in /home/robot/kinetic_workspace/src/tutorial_ros/tutorial_ros2. Please adjust the values in package.xml.
[/simterm]
Sebuah package ROS memiliki struktur file dan direktori seperti sebagai berikut
- Include/package_name/ : Direktori yang berisi header library yang dibutuhkan
- msg/ : berisi deskripsi message kustom
- scripts/ : tempat developer menempatkan script yang bisa dieksekusi seperti Bash, Python ataupun bahasa scripting yang lain
- src/ : Direktori dimana disimpan berkas kode sumber dari program.
- srv/ : Direktori tipe service
- txt : File deskripsi CMake
- xml: Package manifest
Karena dalam tutorial ini digunakan bahasa pemrograman C++, maka source program akan disimpan pada subdirektori src. Jalankan aplikasi script editor, dan buat file baru bernama simple_talker.cpp
Adverstiment

Tuliskan program seperti 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
| #include "ros/ros.h" | |
| #include "std_msgs/String.h" | |
| #include <sstream> | |
| int main(int argc, char **argv){ | |
| ros::init(argc, argv, "my_talker"); | |
| ros::NodeHandle n; | |
| ros::Publisher chatter_pub=n.advertise<std_msgs::String>("chatter",1000); | |
| ros::Rate loop_rate(10); | |
| int count = 0; | |
| while(ros::ok()){ | |
| std_msgs::String msg; | |
| std::stringstream ss; | |
| ss << "Hi, this is my_talker " << count; | |
| msg.data=ss.str(); | |
| ROS_INFO("%s",msg.data.c_str()); | |
| chatter_pub.publish(msg); | |
| ros::spinOnce(); | |
| loop_rate.sleep(); | |
| ++count; | |
| } | |
| return 0; | |
| } |
Pembahasan lebih rinci dari program tersebut tidak akan dibahas dalam tulisan ini, dapat anda pelajari sendiri melalui dokumentasi ROS yang berada di alamat ROS.org. Namun secara umum, program tersebut
- Menginisialisasi sistem ROS dengan ros::init dan construct dengan ros::NodeHandle
- Advertise dengan fungsi advertise
- Mempublikasikan message di dalam blok superloop while. dengan menggunakan fungsi publish
Berikutnya 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_talker src/simple_talker.cpp) | |
| target_link_libraries(simple_talker | |
| ${catkin_LIBRARIES} | |
| ) | |
| add_dependencies(simple_talker tutorial_ros_generate_messages_cpp) |
Setelah semuanya beres, kini saatnya membuat binary dari source code program yang telah dibuat. Compile program menggunakan perintah catkin_make. Jangan lupa untuk selalu berada posisi root workspace ketika akan melakukan compile program
[simterm]
$ catkin_make
Base path: /home/robot/kinetic_workspace
Source space: /home/robot/kinetic_workspace/src
Build space: /home/robot/kinetic_workspace/build
Devel space: /home/robot/kinetic_workspace/devel
Install space: /home/robot/kinetic_workspace/install
####
#### Running command: “make cmake_check_build_system” in “/home/robot/kinetic_workspace/build”
####
####
#### Running command: “make -j1 -l1” in “/home/robot/kinetic_workspace/build”
####
[100%] Built target simple_talker
[/simterm]
Jika tidak ada error maka proses build berjalan sukses, jalankan program dengan menggunakan perintah rosrun. Pastikan selalu bahwa master ros (roscore) telah running sebelum node apapun dijalankan.
- Advertisement -
[simterm]
$ rosrun tutorial_ros simple_talker
[ INFO] [1514262783.711070537]: Hi, this is my_talker 0
[ INFO] [1514262783.811136895]: Hi, this is my_talker 1
[ INFO] [1514262783.911086725]: Hi, this is my_talker 2
[ INFO] [1514262784.011079764]: Hi, this is my_talker 3
[ INFO] [1514262784.111078253]: Hi, this is my_talker 4
[ INFO] [1514262784.211088402]: Hi, this is my_talker 5
[ INFO] [1514262784.311075562]: Hi, this is my_talker 6
[ INFO] [1514262784.411080863]: Hi, this is my_talker 7
[ INFO] [1514262784.511087133]: Hi, this is my_talker 8
[ INFO] [1514262784.611057449]: Hi, this is my_talker 9
[/simterm]
Yeay, sekarang kita telah bisa membuat aplikasi pertama di ROS. Kita bisa memeriksanya menggunakan rosnode list dan rosnode info untuk mengetahui lebih rinci tentang node yang baru saja dibuat
[simterm]
$ rosnode list
/my_talker
/rosout
/rqt_gui_py_node_10180
$ rosnode info /my_talker
——————————————————————————–
Node [/my_talker]
Publications:
* /chatter [std_msgs/String]
* /rosout [rosgraph_msgs/Log]
Subscriptions: None
Services:
* /my_talker/set_logger_level
* /my_talker/get_loggers
contacting node http://ROS-16:34191/ …
Pid: 10119
Connections:
* topic: /rosout
* to: /rosout
* direction: outbound
* transport: TCPROS
[/simterm]
Pada tulisan berikutnya, embeddednesia akan melanjutkan tutorial dengan membangun program node subscriber yang berfungsi men-subscribe topic chatter yang telah dibuat pada sesi ini.