本节通过创建一个订阅者Subscriber来控制海龟。
我们先看要实现的这个小程序的图。
(部分图摘自:b站【古月居】古月·ROS入门21讲)
1 模型图
ROS Master管理两个主要节点: Publisher,海龟仿真器turtlesim Subscriber,Pose Listener 这次海龟仿真器turtlesim为Publisher,发布Message(传输的是动作信息 turtlesim::Pose),通过Topic(/turtle1/pose)的管道,将数据传输给Subscriber。Subscriber订阅得到的数据,获得Pose信息。

2 创建功能包
我们之前已经创建了工作空间和功能包learning topic了。 直接上代码。
3 创建Subscriber代码(C++)
如何实现一个Subscriber:
- 初始化ROS节点
- 订阅需要的话题
- 循环等待话题消息,接收到消息后进入回调函数
- 在回调函数中完成消息处理
(源码:https://github.com/guyuehome/ros_21_tutorials/blob/master/learning_topic/src/pose_subscriber.cpp) 
4 编译代码(C++)
有了代码,接下来编译。
配置代码编译规则
配置CMakeLists.txt中的编译规则:
将下列代码拷贝至CMakeLists.txt中: 直接加到之前那两行下面即可
add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})

执行编译
回到工作空间目录,执行编译.
cd ~/catkin_ws
catkin_make

source 一下 setup.bash
将source devel/setup.bash 放入环境变量.bashrc中,之前已完成。
运行
打开终端,分别运行:
roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic pose_subscriber
这时海龟的位置就会一直被pose_subscriber监听,现在因为海龟没动,所以x、y的坐标值是不会变的。 我们让海龟动起来,再建立一个之前用过的键盘控制节点:
rosrun turtlesim turtle_teleop_key
控制它移动,坐标就发生实时变化啦! 
5 Python实现
(源码:https://github.com/guyuehome/ros_21_tutorials/blob/master/learning_topic/scripts/pose_subscriber.py)
创建Python代码
源码拷贝到scripts下  右击文件→属性,打开执行权限。
配置代码编译规则
配置一下CMakeLists.txt中的编译规则: 之前已将文件中的catkin_install_python这段取消注释,并将默认的my_python_script改成了velocity_publisher.py 这次再加上一个关于pose_subscriber.py的catkin_install_python方法: 
编译代码
回到工作空间目录,执行编译.
cd ~/catkin_ws
catkin_make
source 一下 setup.bash
略过。
运行
打开终端,分别运行:
roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic pose_subscriber.py
rosrun turtlesim turtle_teleop_key
控制它移动,成功! 
试着查看一下系统当前的计算图
再打开一个终端,输入:
rqt_graph
调到所有活动active节点/话题视图,可看到: 
|