目录
- 一、话题模型
- 二、创建功能包
- 三、创建Subscriber代码
- 四、编译代码
- 五、运行
一、话题模型
图中,我们使用ROS Master管理节点。
有两个主要节点:
Publisher,名为Turtle Velocity(即海龟的速度)
Subscriber,即海龟仿真器节点 /turtlesim
Publisher(Turtle Velocity),发布Message(即海龟的速度信息,以geometry_msgs::Twist的数据结构,包括线速度和角速度),通过Topic(/turtle1/cmd_vel)总线管道,将数据传输给Subscriber。Subscriber订阅得到的速度信息,来控制海龟发生运动。
“/turtle1/cmd_vel”这个topic是海归仿真器节点/turtlesim下自带的topic,可直接拿来用。
二、创建功能包
在ROS:发布者Publisher的编程实现(C++)中已经创建功能包
三、创建Subscriber代码
步骤:
初始化ROS节点
订阅需要的话题
循环等待话题消息,接收到消息后进入回调函数
在回调函数中完成消息处理
我们需要在src里创建C++的代码文件以输入代码,文件名称为:pose_subscriber.cpp
/**
* 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
*/
#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中的编译规则:
设置需要编译的代码和生成的可执行文件
设置链接库
将下列代码拷贝至CMakeLists.txt中:
add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})
回到工作空间目录,执行编译.
cd ~/catkin_ws
catkin_make
五、运行
roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic pose_subscriber
这时海龟的位置就会一直被pose_subscriber监听,现在因为海龟没动,所以x、y的坐标值是不会变的。
我们让海龟动起来,再建立一个之前用过的键盘控制节点:
rosrun turtlesim turtle_teleop_key
控制它移动,坐标就发生实时变化啦
参考视屏:古月居ROS入门21讲