【ROS入门21讲】订阅者Subscriber的编程使用
本文章是针对bilibili古月居up的【ROS入门21讲】所作的笔记,笔记从第8讲开始,主要记录一些关键内容方便查阅。
视频连接:【ROS入门21讲】
课件及源码:
链接: https://pan.baidu.com/s/1UUGTN1DI-2eCeRc80OUKcg?pwd=e23b
提取码: e23b
1、初始化工作空间与功能包
这里就不细讲了,与上一篇一致:【ROS入门21讲】发布者Publisher的编程使用
2、Subscriber代码编写:
#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)
{
// 1
ros::init(argc,argv,"pose_subscriber");
ros::NodeHandle n;
// 2
ros::Subscriber pose_sub = n.subscribe("/turtle1/pose",10,poseCallback);
ros::spin();
return 0;
}
1 “pose_subscriber” 必须这么写,表示创建了一个"pose_subscriber"的节点。
2 “/turtle1/pose” 必须这么写,表示订阅了"/turtle1/pose"这个话题。
3ros::Subscriber pose_sub = n.subscribe("/turtle1/pose",10,poseCallback)
中使用了回调函数poseCallback
,ros::spin()
会对消息进行监听,如果有消息接受到,则会调用poseCallback
回调函数进行消息处理。
如何实现一个订阅者
- 初始化ROS节点;
- 订阅需要的话题;
- 循环等待话题消息,接收到
- 消息后进入回调函数;
- 在回调函数中完成消息处理。
3、编写CMakeLists.txt
add_executable(subscriber src/subscriber.cpp)
target_link_libraries(subscriber ${catkin_LIBRARIES})
配置号task.json文件后,ctrl + shfit +b编译出subscriber可执行文件
4、vscode运行subscriber
所有指令都是通过ctrl + shfit + p完成,代替了终端。
这里结合上一篇文章编写的发布者程序进行测试。
- 执行ctrl + shfit + p,输入ROS:Start启动ROSMaster。
- 执行ctrl + shfit + p,输入ROS:Run a executable,然后输入turtlesim,然后输入turtlsim_node。目的启动小海龟节点。
- 执行ctrl + shfit + p,输入ROS:Run a executable,运行publisher程序。
- 执行ctrl + shfit + p,输入ROS:Run a executable,运行subscriber程序。
- 就可以在终端看见小海龟在移动,
publisher
会持续通过"/turtle1/cmd_vel"
话题控制小海龟移动,并且subscriber
会持续通过"/turtle1/pose"
话题获取小海龟的位姿信息并在终端中实时输出。
5、launch文件多节点运行
需求
上面这个例子你会发现需要启动多个节点,需要启动ROS Master、publisher、subscriber、turtlesim节点。如果每次都调用 rosrun 逐一启动,显然效率低下,官方给出的优化策略是使用 launch 文件,可以一次性启动多个 ROS 节点。
实现
1、选定功能包右击 —> 添加 launch 文件夹
2、选定 launch 文件夹右击 —> 添加 launch 文件
3、编辑 launch 文件内容
<launch>
<node pkg="learning_topic" type="publisher" name="publisher" output="screen" />
<node pkg="learning_topic" type="subscriber" name="subscriber" output="screen" />
<node pkg="turtlesim" type="turtlesim_node" name="t1"/>
</launch>
首先在这里先解释一下,launch文件各个关键字的解释:
node —> 包含的某个节点
pkg -----> 功能包
type ----> 被运行的节点文件
name --> 为节点命名
output-> 设置日志的输出目标
执行ctrl + shfit + p,输入ROS:Run a ROS launch file,然后输入learning_topic,然后输入learning_topic.launch,程序运行起来之后,输出会在vscode下方的终端交替输出。