ROS C++ ile Abone Yayıncı örneği olarak bir Konu (Topic) Örneği
# Listen and Publish Topics
Bu derste çalışan robotun yayınladığı verilere abone olarak bu veriler üzerinden işlem yapmayı öğreneceğiz.
Bu dersi uygulamak için ROS’un içine entegre olarak gelen küçük bir simulatör olan turtlesim sümulasyonunu kullanacağız.
## Topic Dinlemek ve Yayınlamak
Daha önceki listener and talker örneğine benzer şekilde bu derste de dinleme ve konuşma yapacağız, önceki dersten farklı olarak bu konu biraz daha karışık gelebilir. Bundan dolayı önceki dersi iyice kavradığınıza emin olun.
Öncelikle kodu inceleyelim
#include "ros/ros.h" #include "turtlesim/Pose.h" // Burada subscribe edeceğimiz topicin veri tipini include ediyoruz. ros::Publisher chatter_pub; // Publish edebilmek için global bir publisher tanımlıyoruz. void chatterCallback(const turtlesim::Pose::ConstPtr& msg) // Bu fonksiyon subscribere verdiğimiz frekansta veri geldikçe çağırılacak olan fonksiyon. { // Fonksiyonun aldığı değişken tipi ise turtlesim::Pose tipinde yani subscribe edeceğimiz topicin veri tipi double x = msg->x; // Pose tipindeki msg değişkenimizin içindeki x ve y değerlerinin atamasını yapıyoruz. double y = msg->y; ROS_INFO("Alinan: [%f][%f]", x, y); // Ekrana yazdırıyoruz gelen değerleri. chatter_pub.publish(msg); // Burada ise aldığımız veriyi aşağıda tanımladığımız publisher ile tekrar " giden_veri " topici altından yayınlıyoruz. } int main(int argc, char **argv) { ros::init(argc, argv, "listenandtalk"); // ROS başlatılıyor. ros::NodeHandle n; chatter_pub = n.advertise("giden_veri", 10); // Global olarak tanımladığımız publisher nesnesini oluşturuyoruz. " giden_veri " adlı topice Pose tipinde 10 frekansında değer göndereceğimizi belirtioyruz. ros::Subscriber sub = n.subscribe("/turtle1/pose", 10, chatterCallback); // " turtle1/pose " topicini 10 frekans değerinde subscire ediyoruz ve gelen veriyi işlemek için chatterCallBack fonksiyonunu çağırıyoruz. ros::spin(); // Döngü return 0; }
Terminali açın, sırasıyla
cd ~/catkin_ws/beginner_tuttorials/src touch listenandtalk.cpp gedit listenandtalk.cpp
yazın ve yukarıdaki kodları yazıp kaydedin.
## giden_veri adlı Topici Dinleme
Yukarıda bir topic dinledik ve gelen x ve y değerlerini ekrana yazdıktan sonra bu Pose verisini başka bir topic oluşturup onunla publish ettik. Şimdi burada ise yayınladığımız Pose verisinin ” Tetha, Açısal Hız ve Lineer Hız ” değerlerini bu topicten alıp ekrana yazdıracağız.
#include "ros/ros.h" #include "turtlesim/Pose.h" // Burada publish yapmadığımız için global değişkeni kullanmıyoruz. void chatterCallback(const turtlesim::Pose::ConstPtr& msg) { double theta = msg->theta; double linear_velocity = msg->linear_velocity; double angular_velocity = msg->angular_velocity; ROS_INFO("\nTetha: %f\nLineer Hiz: %f\nAcisal Hiz: %f", theta, linear_velocity, angular_velocity); // Burada değerleri ekrana yazdırıyoruz. } int main(int argc, char **argv) { ros::init(argc, argv, "listen_giden_veri"); ros::NodeHandle n; ros::Subscriber sub = n.subscribe("giden_veri", 10, chatterCallback); // Yukarıdan farklı olarak burada "giden_veri" adlı topici subscribe ediyoruz. ros::spin(); return 0; }
Terminali açın, sırasıyla
cd ~/catkin_ws/beginner_tuttorials/src touch listengidenveri.cpp gedit listengidenveri.cpp
yazın ve yukarıdaki kodları yazıp kaydedin. Sonra
cd ~/catkin_ws/beginner_tuttorials/ gedit package.xml
yazın ve aşağıdaki satıları ekleyin gerekli yere.
<build_depend>turtlesim</build_depend> <run_depend>turtlesim</run_depend>
kaydedin ve gedit CMakeLists.txt yazın ve gerekli yerlere aşağıdaki satırları ekleyin.
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs nav_msgs message_generation turtlesim ) generate_messages( DEPENDENCIES std_msgs nav_msgs turtlesim ) catkin_package( CATKIN_DEPENDS message_runtime roscpp rospy nav_msgs turtlesim ) add_executable(listenandtalk src/listenandtalk.cpp) target_link_libraries(listenandtalk ${catkin_LIBRARIES}) add_dependencies(listenandtalk beginner_tutorials_generate_messages_cpp) add_executable(listengidenveri src/listengidenveri.cpp) target_link_libraries(listengidenveri ${catkin_LIBRARIES}) add_dependencies(listengidenveri beginner_tutorials_generate_messages_cpp)
kayıt edip çıkın ve terminale
cd ~/catkin_ws catkin_make
yazın ve kodları derleyin. Hata almadan biterse başarılısınız. Eğer hata alırsanız atladığınız yerleri düzeltin.
## Turtlesim ile Test
Şimdi yazdığımız kodları turtlesim simulatörü üzerinde çalışarak neler olduğunu göreceğiz. Aşağıdaki youtube videosundaki adımları takip edin.
https://youtu.be/XHbJAT0VHyI
hata almadım, oldu, çalıştı, tşk.