警告
您正在阅读的 ROS 2 文档版本已达到 EOL(生命周期结束),不再受官方支持。如果您想了解最新信息,请访问 Jazzy.
使用有损网络的服务质量设置
背景介绍
请阅读文档页面 关于 QoS 设置 了解有关 ROS 2 可用支持的背景信息。
在这个演示中,我们将生成一个发布摄像机图像的节点和另一个订阅图像并将其显示在屏幕上的节点。然后,我们将模拟它们之间的有损网络连接,并展示不同的服务质量设置如何处理不良链接。
先决条件
本教程假定您拥有 安装运行中的 ROS 2 和 OpenCV。参见 OpenCV 文档 的安装说明。您还需要 ROS 软件包 图像工具
.
苏都 apt-get 安装 ros-foxy-image-tools
# 克隆并使用与您的安装相匹配的分支构建 demos repo
笨蛋 复制 https://github.com/ros2/demos.git -b 狐狸
运行演示
在运行演示程序之前,请确保您的电脑连接了一个正常工作的网络摄像头。
安装 ROS 2 后,请将设置文件源化:
. <path 至 ROS 2 安装 space>/setup.bash
. <path 至 ROS 2 安装 space>/setup.bash
致电 <path 至 ROS 2 安装 space>/local_setup.bat
那就跑吧
玫瑰2 运行 图像工具 显示图像
什么也不会发生。
显示图像
是一个用户节点,它正在等待 图像
主题。
注意:必须关闭 显示图像
过程 Ctrl-C
稍后。你不能直接关闭窗口。
在另一个终端中,输入安装文件并运行发布节点:
玫瑰2 运行 图像工具 cam2image
这将发布来自网络摄像头的图像。如果电脑上没有摄像头,也可以使用命令行选项发布预定义图像。
玫瑰2 运行 图像工具 cam2image --ros-args -p burger_mode:=正确
在该窗口中,您将看到终端输出:
出版 图像 #1
出版 图像 #2
出版 图像 #3
...
这时会弹出一个标题为 "查看 "的窗口,显示摄像机画面。在第一个窗口中,您将看到订阅者的输出:
已收到 图像 #1
已收到 图像 #2
已收到 图像 #3
...
备注
macOS 用户:如果这些示例不起作用或收到类似以下的错误信息 ddsi_conn_write 失败 -1
则需要增加系统范围内的 UDP 数据包大小:
$ 苏都 sysctl -w net.inet.udp.recvspace=209715
$ 苏都 sysctl -w net.inet.udp.maxdgram=65500
这些更改在重启后不会持续。如果您希望这些更改持续有效,请将这几行添加到 /etc/sysctl.conf
(如果文件不存在,则创建该文件):
net.inet.udp.recvspace=209715
net.inet.udp.maxdgram=65500
命令行选项
在其中一个终端中,为原始命令添加 -h 标志:
玫瑰2 运行 图像工具 显示图像 -h
添加网络流量
警告
这部分演示无法在 RTI 的 Connext DDS 上运行。在同一主机中运行多个节点时,RTI Connext 实现与环回接口一起使用共享内存。降低环回接口的吞吐量不会影响共享内存,因此不会影响两个节点之间的流量。参见 RMW 实现 代码 和 RTI Connext 文档 供进一步参考。
备注
下一部分是针对 Linux 的。
不过,在 macOS 和 Windows 系统中,您可以使用实用程序 "Network Link Conditioner"(xcode 工具套件的一部分)和 "Clumsy" (http://jagt.github.io/clumsy/index.html),但本教程将不涉及它们。
我们将使用 Linux 网络流量控制实用程序、 tc
(http://linux.die.net/man/8/tc).
苏都 tc qdisc 增加 设计 褊狭的 根基 netem 损失 5%
这个神奇的咒语将通过本地环回设备模拟 5% 的数据包丢失。如果使用更高分辨率的图像(如 --ros-args -p 宽度:=640 -p 高度:=480
),您可能需要尝试较低的数据包丢失率(例如 1%
).
接下来,我们启动 cam2image
和 显示图像
我们很快就会发现,这两个程序似乎都降低了图像传输的速度。这是默认 QoS 设置行为造成的。在有损信道上执行可靠性意味着发布者(在本例中为"......"、 cam2image
)将重新发送网络数据包,直到收到消费者的确认(即 显示图像
).
现在让我们尝试运行这两个程序,但要使用更合适的设置。首先,我们将使用 -p 可靠性:=尽力
选项启用尽力通信。现在,发布者将只尝试传送网络数据包,而不期待消费者的确认。现在我们可以看到,网络上的一些帧 显示图像
侧的帧号被删除,因此运行的外壳中的帧号 显示图像
将不再连续:

完成后,记得删除排队纪律:
苏都 tc qdisc 删去 设计 褊狭的 根基 netem 损失 5%