话题模型
图中,我们使用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,可直接拿来用。
创建功能包
这个上一节创建发布的功能已经创建了,可直接在功能包新增 监听的代码
创建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
补坑说明:
如果是新增的代码文件,如上面添加的 pose_subscriber CMakeKLists.txt 中的上面的方式是错的,因为编译后你会发现这个新增的文件根本不会被编译到,所以新增的要放到历史的上面
如下图所示:
然后再编译,会提示权限报错,切换到root 用户即可
测试
接下来再验证就可以了
rosrun learning_topic pose_subscriber
启动成功后会发现不会的监听小乌龟的点位信息,如下图所示: