5. Subscribers
5.1 Subscribers
The subscriber receives the data published by the publisher and then enters its callback function, where the received data is processed. The core logic of a subscriber is the callback function, which is executed whenever a new message arrives on a subscribed topic.
5.2 Create a Subscriber
5.2.1 Creation Steps
- Initialize the ROS node
- Create a node handle
- Subscribe to the required topic
- Wait for topic messages in a loop, and upon receiving the message, enter the callback function
- Complete message processing inside the callback function
5.2.2 C++ Language Implementation
turtle_pose_subscriber.cpp
#include <ros/ros.h>
#include "turtlesim/Pose.h"
void turtle_poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
ROS_INFO("Turtle pose: x:%0.3f, y:%0.3f", msg->x, msg->y);
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "turtle_pose_subscriber");
ros::NodeHandle n;
ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, turtle_poseCallback);
ros::spin();
return 0;
}

add_executable(turtle_pose_subscriber src/turtle_pose_subscriber.cpp)
target_link_libraries(turtle_pose_subscriber ${catkin_LIBRARIES})
cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic turtle_pose_subscriber

5.2.3 Python Language Implementation
turtle_pose_subscriber.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
from turtlesim.msg import Pose
def poseCallback(msg):
rospy.loginfo("Turtle pose: x:%0.3f, y:%0.3f", msg.x, msg.y)
def turtle_pose_subscriber():
rospy.init_node('turtle_pose_subscriber', anonymous=True)
rospy.Subscriber("/turtle1/pose", Pose, poseCallback)
rospy.spin()
if __name__ == '__main__':
turtle_pose_subscriber()

roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic turtle_pose_subscriber
Summary
This section demonstrated how to implement ROS subscribers using both C++ and Python, subscribe to the /turtle1/pose topic, and continuously receive and process turtle pose data through callback functions.