订阅者,接收发布者发布的数据,然后进入其回调函数,在回调函数里边处理接收到的数据。其核心内容是回调函数,每个订阅者订阅的话题都有回调函数。
1)、初始化ROS节点
2)、创建句柄
3)、订阅需要的话题
4)、循环等待话题消息,接收到消息后进入回调函数
5)、在回调函数中完成消息处理。
1)、在“发布者”教程中,创建的功能包的src文件夹下,新建一个c++文件,命名为turtle_pose_subscriber.cpp
2)、把下边的程序代码复制粘贴到turtle_pose_subscriber.cpp文件中
x/*创建一个小海龟的当前位姿信息接收*/
// 接收消息后,会进入消息回调函数,回调函数里边会对接收到的数据进行处理
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)、运行程序
xxxxxxxxxx
roscore
xxxxxxxxxx
rosrun turtlesim turtlesim_node
xxxxxxxxxx
rosrun learning_topic turtle_pose_subscriber
7)、运行截图
8)、程序运行说明
/turtle1/pose
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。