ROS日记:ROS开始使用_主题(或称为话题)

理解了节点怎样运行,以及怎样查看节点的信息,现在来看看节点之间是怎样实现互相通信的。

节点之间基本的通信方式有三种:

1、主题通信,通过发布和订阅的形式;

2、服务通信,通过请求和响应的形式;

3、参数服务器,通过定义参数键值对的形式,保存和加载参数信息。

 

我们先来看看主题通信的形式。

首先还是先打开命令终端运行roscore,这是一切开始的前提:

roscore

接着我们试着运行乌龟节点(turtlesim_node),记住要在新的命令终端运行:

rosrun turtlesim turtlesim_node

此时有一个小乌龟出现:

接着在新的终端再运行另外一个节点:

rosrun turtlesim turtle_teleop_key

这个节点我们可以翻译成“乌龟键盘控制节点”,此节点开启之后,我们就可以使用键盘来控制小乌龟的运动了。控制时注意,请选中turtle_teleop_key所在的终端窗口以确保我们的按键输入能够被捕获:

但是这两个节点之间究竟做了什么不为人知的事情?

答案是两个节点之间存在主题(或话题)的发布和订阅关系,即turtlesim_node节点和turtle_teleop_key节点之间是通过一个ROS主题来互相通信的,也就是说如果一个节点要向另一个节点发送数据,就要发布主题消息,另一个节点再订阅这个主题,以此接收消息,这个发布和订阅的主题名称要一致。
那这个主题是什么呢?要理解,得先使用ROS的一个脚本程序来显示节点和主题之间的关系图,程序是:rqt_graph,它是rqt程序包中的一部分,如果没有安装它,可以使用下面的命令安装:

sudo apt-get install ros-indigo-rqt

注:这里的indigo可以替换为其他ROS版本。

装完之后,我们新开一个命令终端,运行它:

rosrun rqt_graph rqt_graph

或者直接:

rqt_graph

此时我们可以看到两个节点和一个主题之间的关系图:

没错,上面两个节点(turtlesim_node节点和turtle_teleop_key节点)就是通过/turtle1/cmd_vel这个主题进行互相通信的。如果我们是用ROS Hydro之前的版本,这个主题就是/turtle1/command_velocity。

那这个主题里面的信息都有什么,结构是怎么样的……没问题,我们可以使用一个命令工具进行查询:rostopic

比如我们想查询刚才联系两个节点的主题/turtle1/cmd_vel的内部信息和结构,那么使用以下命令:

rostopic info /turtle1/cmd_vel

这时我们会发现显示了这个主题的消息类型、发布者和订阅者有关的信息,这个主题的发布者就是节点teleop_turtle,订阅者就是乌龟节点turtlesim,如图:

当然我们可以显示“乌龟键盘控制节点”turtle_teleop_key在这个主题/turtle1/cmd_vel上发布的消息数据,查看的格式是:

rostopic echo topic_name

例如:打开新的终端,输入:

rostopic echo /turtle1/cmd_vel

这时我们就可以按键盘的上下左右键来查看了,当然前提是已经运行了节点turtle_teleop_key:

rosrun turtlesim turtle_teleop_key

并且处于活动的窗口也是这个turtle_teleop_key所在的终端窗口,以确保我们的按键输入能够被捕获:

在turtle_teleop_key所在的终端窗口按了上下左右键之后,/turtle1/cmd_vel所在终端窗口可能出现下面显示内容:

注:ROS版本不同显示内容不同,ROS Hydro之前的版本显示的内容为:

---
linear: 2.0
angular: 0.0
---
linear: 2.0
angular: 0.0
---

综上所述,我们对ROS主题这一概念有一个比较清晰的认识了,概括的说就是:

两个节点之间通过发布主题和订阅主题进行通信,主题的发布和订阅对象都是节点(通过rosnode info查看一个运行的节点,我们会发现节点信息里包含它发布的主题和订阅的主题)。另外,节点之间在发布和订阅同一个主题时,主题的名称和消息类型要一致。

用上面的“乌龟节点”和“键盘控制乌龟节点”例子来解释就是:

turtle_teleop_key(键盘控制乌龟节点/teleop_turtle):发布者;

turtlesim_node(乌龟节点/turtlesim):订阅者;

/turtle1/cmd_vel:主题。

此时如果我们用命令:rostopic info /turtle1/cmd_vel,去查这个主题的内容的话,我们会发现里面确实有上面两个节点的名字,分别在发布者和订阅者项里。geometry_msgs/Twist指主题发布的消息类型,即节点要通过主题发送出去的消息数据类型,这也意味着节点之间通过主题发布和主题订阅进行通信时,消息类型要一致。

主题命令行工具rostopic的其余参数选项的使用,会在之后继续深入了解。

如有说得不准确的地方欢迎各位指正。

这些代码行似乎是用于初始化ROS(Robot Operating System)中的发布者(Publisher)对象。ROS是一个用于机器人软件开发的灵活框架,它提供了一种标准的方法来进行通信和服务。在这个上下文中,`ros::Publisher` 是ROS中用于向特定话题(topic)发布消息的类。 每个 `ros::Publisher` 对象都关联着一个特定的话题,这个话题是节点间交换消息的通道。例如: - `right_rectangles`:这个发布者可能用于发布与右方矩形相关的信息,比如在一个视觉处理系统中,可能包含了右视图中检测到的所有矩形的位置和尺寸等信息。 - `left_rectangles`:与 `right_rectangles` 类似,但可能用于发布左视图中的矩形信息。 - `right_yoloPub`:可能用于发布右视图中使用YOLO(You Only Look Once)算法检测到的目标检测信息。 - `left_yoloPub`:同 `right_yoloPub`,但用于左视图的目标检测信息。 在ROS中,发布者创建后需要指定它们将要发布的消息类型,以及它们将要发布到的话题名。例如,如果它们用于发布标准的ROS消息类型如 `std_msgs::String` 或者自定义的消息类型,那么在使用这些发布者之前,需要将它们与相应的消息类型和话题名绑定。 例如: ```cpp right_rectangles = nh.advertise<geometry_msgs::PolygonStamped>("right_rectangles_topic", 1000); left_rectangles = nh.advertise<geometry_msgs::PolygonStamped>("left_rectangles_topic", 1000); right_yoloPub = nh.advertise<yolo_msgs::Detection>("right_yolo_topic", 1000); left_yoloPub = nh.advertise<yolo_msgs::Detection>("left_yolo_topic", 1000); ``` 在这个例子中,`nh` 是一个 `ros::NodeHandle` 对象,它用于节点与ROS系统的交互。`advertise` 方法用于创建发布者并将其绑定到特定的话题上,同时设置发布消息的缓存大小。这里 `geometry_msgs::PolygonStamped` 和 `yolo_msgs::Detection` 分别是用于矩形和YOLO目标检测信息的消息类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jimson_zhu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值