05.订阅者
5、订阅者
5.1、订阅者
订阅者,接收发布者发布的数据,然后进入其回调函数,在回调函数里边处理接收到的数据。其核心内容是回调函数,每个订阅者订阅的话题都有回调函数。
5.2 创建一个订阅者
5.2.1、创建步骤
1)、初始化ROS节点
2)、创建句柄
3)、订阅需要的话题
4)、循环等待话题消息,接收到消息后进入回调函数
5)、在回调函数中完成消息处理。
5.2.2、C++语言实现
1)、在“发布者”教程中,创建的功能包的src文件夹下,新建一个c++文件,命名为turtle_pose_subscriber.cpp
2)、把下边的程序代码复制粘贴到turtle_pose_subscriber.cpp文件中
xxxxxxxxxx /*创建一个小海龟的当前位姿信息接收*/ #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节点 ros::NodeHandle n ; //这里是创建句柄 // 创建一个订阅者,订阅的话题是/turtle1/pose的topic,poseCallback是回调函数 ros::Subscriber pose_sub = n . subscribe ( "/turtle1/pose" , 10 , turtle_poseCallback ); ros::spin (); // 循环等待回调函数 return 0 ; }
3)、程序流程图,可对应5.2.1内容查看

4)、在CMakelist.txt中配置,build区域下,添加如下内容
xxxxxxxxxx add_executable(turtle_pose_subscriber src/turtle_pose_subscriber.cpp) target_link_libraries(turtle_pose_subscriber ${catkin_LIBRARIES})
5)、工作空间目录下编译代码
xxxxxxxxxx cd ~/catkin_ws catkin_make source devel/setup.bash #需要配置环境变量,否则系统无法找到运行程序
6)、运行程序
- 运行roscore
xxxxxxxxxx roscore
- 运行小海龟节点
xxxxxxxxxx rosrun turtlesim turtlesim_node
- 运行订阅,持续接收小海龟发送位姿数据
xxxxxxxxxx rosrun learning_topic turtle_pose_subscriber
7)、运行截图

8)、程序运行说明
- 在运行小海龟的节点后,小海龟会不断的发送自身的位姿信息,发送的话题名字是
/turtle1/pose
- 而turtle_pose_subscriber运行后,它会接收小海龟发送过来的数据消息,然后在回调函数里边把这些信息打印出来。
5.2.3、python语言实现
1)、在功能包目录下,新建以一个文件夹scripts,然后在scripts文件夹下新建一个python文件(文件后缀.py),命名为turtle_pose_subscriber.py
2)、把下边的程序代码复制粘贴到turtle_pose_subscriber.py文件中
xxxxxxxxxx #!/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 ) # ROS节点初始化 # 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback rospy . Subscriber ( "/turtle1/pose" , Pose , poseCallback ) rospy . spin () # 循环等待回调函数 if __name__ == '__main__' : turtle_pose_subscriber ()
3)、程序流程图

4)、运行程序
- 运行roscore
xxxxxxxxxx roscore
- 运行小海龟节点
xxxxxxxxxx rosrun turtlesim turtlesim_node
- 运行订阅者,持续接收小海龟发送位姿数据
xxxxxxxxxx rosrun learning_topic turtle_pose_subscriber.py
5)、运行效果和程序说明参考5.2.2。