首先让我们了解一下订阅者的作用是什么吧,按照我自己的理解订阅者就是能够实时获取机器人的位置信息之类的作用。
通过上一章我们已经创建好了工作空间,具体的操作流程大家可以参考上一篇文章的内容。
如何实现一个订阅者
1、初始化ROS节点;
2、订阅需要的话题;
3、循环等待话题消息,接收到消息后进入回调函数;
4、在回调函数中完成消息处理。
在了解了订阅者的实现步骤后,我们便可以开始编写代码啦,
我们需要在catkin_ws/src/learning_topic/src路径下创建一个名为pose_subscriber.cpp的C++文件。
cd catkin_ws/
cd src/
cd learning_topic/
cd src/
gedit pose_subscriber.cpp
将以上内容用代码来实现
#include<ros/ros.h>
#include"turtlesim/Pose.h"
//接收到订阅的消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
//将接收到的消息打印出来
ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f",msg->x,msg->y);
}
int main(int argc,char **argv)
{
//初始化ROS节点
ros::init(argc,argv,"pose_subscriber");
//创建节点句柄
ros::NodeHandle n;
//创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);
//循环等待回调函数
ros::spin();
return 0;
}
在完成代码的编写过程后,我们需要配置CMakeLists.txt的编译规则,我们在learning_topic路径中打开CMakeLists.txt文件。
cd learning_topic/
gedit CMakeLists.txt
然后在如图所示的位置加入一下两行代码:
add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})
保存后退出,我们返回工程文件的根文件catkin_ws,并在catkin_ws文件中编译。
cd catkin_ws/
catkin_make
编译完成后,我们检查我们的订阅者是否能实现啦。具体操作如下:
//打开一个新的终端运行ros
roscore
//再打开一个新的终端运行小乌龟节点
rosrun turtlesim turtlesim_node
//打开了小乌龟节点后我们便可以运行我们的订阅者程序
rosrun learning_topic pose_subscriber
//运行程序后,我们可以启动一个小乌龟的键盘控制或者启动一个发布者程序,让小乌龟动起来(上下左右方向键控制),再观察订阅者的信息变化
rosrun turtlesim turtle_teleop_key
实现的功能效果便是小乌龟运动过后位置信息会发生变化,订阅者程序打印出来的位置信息会随小乌龟位置的变化而变化。
恭喜你完成了一个订阅者程序的编写啦。