对有损网络使用服务质量设置

背景

请阅读文档页面“关于 QoS 设置 <../../Concepts/Intermediate/About-Quality-of-Service-Settings>”以获取有关 ROS 2 中可用支持的背景信息。

在此演示中,我们将生成一个发布相机图像的节点和另一个订阅该图像并将其显示在屏幕上的节点。 然后,我们将模拟它们之间的有损网络连接,并展示不同的服务质量设置如何处理坏链接。

先决条件

本教程假设您有一个 正在​​运行的 ROS 2 安装 和 OpenCV。 有关其安装说明,请参阅 OpenCV 文档。 您还需要 ROS 包“image_tools”。

sudo apt-get install ros-rolling-image-tools

运行演示

在运行演示之前,请确保您的计算机已连接可正常工作的网络摄像头。

安装 ROS 2 后,获取您的安装文件:

. <path to ROS 2 install space>/setup.bash

然后运行:

ros2 run image_tools showimage

什么都不会发生。 showimage 是一个订阅者节点,正在等待 image 主题上的发布者。

注意:稍后您必须使用 Ctrl-C 关闭 showimage 进程。 您不能直接关闭窗口。

在单独的终端中,获取安装文件并运行发布者节点:

ros2 run image_tools cam2image

这将发布来自网络摄像头的图像。 如果您的计算机没有连接摄像头,则可以使用命令行选项发布预定义的图像。

ros2 run image_tools cam2image --ros-args -p burger_mode:=True

在此窗口中,您将看到终端输出:

[INFO] [1715662452.055277255] [cam2image]: Publishing image #1
[INFO] [1715662452.119336061] [cam2image]: Publishing image #2
[INFO] [1715662452.187315139] [cam2image]: Publishing image #3
...

将会弹出一个标题为“查看”的窗口,其中显示您的摄像头供稿。 在第一个窗口中,您将看到来自订阅者的输出:

[INFO] [1715662452.188906764] [showimage]: Received image #camera_frame
Received image #camera_frame
[INFO] [1715662452.252836919] [showimage]: Received image #camera_frame
Received image #camera_frame
[INFO] [1715662452.320878578] [showimage]: Received image #camera_frame
Received image #camera_frame
...

Note

macOS users: If these examples do not work or you receive an error like ddsi_conn_write failed -1 then you’ll need to increase your system wide UDP packet size:

$ sudo sysctl -w net.inet.udp.recvspace=209715
$ sudo sysctl -w net.inet.udp.maxdgram=65500

这些更改不会在重启后保留。如果您希望更改保留,请将这些行添加到“/etc/sysctl.conf”(如果文件尚不存在,请创建该文件):

net.inet.udp.recvspace=209715
net.inet.udp.maxdgram=65500

命令行选项

在您的一个终端中,向原始命令添加 -h 标志:

ros2 run image_tools showimage -h

添加网络流量

Warning

演示的此部分不适用于 RTI 的 Connext DDS 和 Fast-DDS。 在同一主机中运行多个节点时,这些 DDS 实现将使用共享内存和环回接口。 降低环回接口吞吐量不会影响共享内存,因此两个节点之间的流量不会受到影响。

Note

下一节是针对 Linux 的。

但是,对于 macOS 和 Windows,您可以分别使用实用程序“Network Link Conditioner”(xcode 工具套件的一部分)和“Clumsy”(http://jagt.github.io/clumsy/index.html)实现类似的效果,但本教程不会介绍它们。

我们将使用 Linux 网络流量控制实用程序“tc”(http://linux.die.net/man/8/tc)。

sudo tc qdisc add dev lo root netem loss 5%

这个神奇的咒语将模拟本地环回设备上 5% 的数据包丢失。 如果您使用更高分辨率的图像(例如 --ros-args -p width:=640 -p height:=480),您可能需要尝试较低的数据包丢失率(例如 1%)。

接下来我们启动 cam2imageshowimage,我们很快就会注意到这两个程序似乎都减慢了图像传输的速度。 这是由默认 QoS 设置的行为引起的。 在有损通道上强制可靠性意味着发布者(在本例中为 cam2image)将重新发送网络数据包,直到收到消费者的确认(即 showimage)。

现在让我们尝试运行这两个程序,但使用更合适的设置。 首先,我们将使用 -p availability:=best_effort 选项来启用尽力而为的通信。 发布者现在只会尝试传送网络数据包,而不会期望消费者的确认。 我们现在看到“showimage”端的一些帧被丢弃了,因此运行“showimage”的shell中的帧号将不再连续:

Best effort image transfer

完成后,记得删除排队规则:

sudo tc qdisc delete dev lo root netem loss 5%