【ROS入门21讲】订阅者Subscriber的编程使用
本文章是针对bilibili古月居up的【ROS入门21讲】所作的笔记,笔记从第8讲开始,主要记录一些关键内容方便查阅。
视频连接:【ROS入门21讲】
课件及源码:
链接: /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){// 1ros::init(argc,argv,"pose_subscriber");ros::NodeHandle n;// 2ros::Subscriber pose_sub = n.subscribe("/turtle1/pose",10,poseCallback);ros::spin();return 0;}
1 “pose_subscriber” 必须这么写,表示创建了一个"pose_subscriber"的节点。
2 “/turtle1/pose” 必须这么写,表示订阅了"/turtle1/pose"这个话题。
3
ros::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下方的终端交替输出。
如果觉得《【ROS入门21讲】订阅者Subscriber的编程使用》对你有帮助,请点赞、收藏,并留下你的观点哦!