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