跳到主要内容

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内容查看

sub_c++

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)、运行截图

image-20220225102205852

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)、程序流程图

image-20220225103401539

4)、运行程序

  • 运行roscore

xxxxxxxxxx roscore

  • 运行小海龟节点

xxxxxxxxxx rosrun turtlesim turtlesim_node

  • 运行订阅者,持续接收小海龟发送位姿数据

xxxxxxxxxx rosrun learning_topic turtle_pose_subscriber.py

5)、运行效果和程序说明参考5.2.2。