使用服务质量设置处理有损网络 [待校准@7902]
背景
请阅读文档页 about QoS settings ,了解ROS 2中可用支持的背景信息。 [待校准@7903]
在此例程中,我们将生成一个发布相机图像的节点和另一个订阅图像并将其显示在屏幕上的节点。然后,我们将模拟它们之间的有损网络连接,并展示不同的服务质量设置如何处理不良链接。 [待校准@7904]
先决条件
本教程假设您有 working ROS 2 installation and OpenCV. See the OpenCV documentation 的安装说明。您还需要ROS包装 image_tools
。 [待校准@7905]
sudo apt-get install ros-foxy-image-tools
# Clone and build the demos repo using the branch that matches your installation
git clone https://github.com/ros2/demos.git -b foxy
运行例程 [待校准@7908]
在运行例程之前,请确保您的计算机上已连接了可正常工作的网络摄像头。 [待校准@7909]
安装ROS 2后,将安装文件源文件: [待校准@7910]
. <path to ROS 2 install space>/setup.bash
. <path to ROS 2 install space>/setup.bash
call <path to ROS 2 install space>/local_setup.bat
然后运行: [待校准@7808]
ros2 run image_tools showimage
什么都不会发生。 showimage
是一个订户节点,正在等待 image
话题的出版商。 [待校准@7911]
注意: 你必须稍后用 Ctrl-C
关闭 showimage
工艺。你不能就这么关上窗户。 [待校准@7912]
在单独的终端中,源文件安装文件并运行发布者节点: [待校准@7913]
ros2 run image_tools cam2image
这将从您的网络摄像头发布图像。如果你的电脑没有连接相机,有一个命令行选项可以发布预定义的图像。 [待校准@7914]
ros2 run image_tools cam2image --ros-args -p burger_mode:=True
在此窗口中,您将看到终端输出: [待校准@7915]
Publishing image #1
Publishing image #2
Publishing image #3
...
将弹出一个窗口,标题为 “ "view" ”,显示您的相机供稿。在第一个窗口中,您将看到订阅服务器的输出: [待校准@7916]
Received image #1
Received image #2
Received image #3
...
注解
macOS用户: 如果这些示例不起作用,或者您收到像 ddsi_conn_write failed -1
这样的错误,那么您需要增加系统范围内的UDP数据包大小: [待校准@7917]
$ sudo sysctl -w net.inet.udp.recvspace=209715
$ sudo sysctl -w net.inet.udp.maxdgram=65500
这些更改不会在重新启动时持续存在。如果您希望更改保持不变,请将这些行添加到 /etc/sysctl.conf
中 (如果文件尚不存在,请创建该文件): [待校准@7918]
net.inet.udp.recvspace=209715
net.inet.udp.maxdgram=65500
添加网络流量 [待校准@7921]
警告
这部分例程赢得了't work on RTI'的Connext DDS。当在同一主机上运行多个节点时,RTI Connext实现将使用共享内存和环回接口。降低环回接口吞吐量不会影响共享内存,因此两个节点之间的流量不会受到影响。参见RMW实施 code 和 RTI Connext Documentation _ 以供进一步参考。 [待校准@7922]
注解
下一节是特定于Linux的。 [待校准@7923]
但是,对于macOS和Windows,您可以分别使用实用程序 "Network Link Conditioner" (unix工具套件的一部分) 和 "Clumsy" (http://jagt.github.io/clumsy/index.html) 实现类似的效果,但是它们不会在本教程中介绍。 [待校准@7924]
我们将使用Linux网络流量控制实用程序 tc
(http://linux.die.net/man/8/tc)。 [待校准@7925]
sudo tc qdisc add dev lo root netem loss 5%
这个神奇的咒语将模拟本地环回设备上的5% 个数据包丢失。如果你使用更高分辨率的图像 (如 ”-- ros args -p宽度: = 640 p高度: = 480 ``) you might want to try a lower packet loss rate (e.g. `` 1 %'')。 [待校准@7926]
接下来,我们启动 cam2image
和 showimage
,我们很快就会注意到这两个程序似乎都减慢了图像的传输速度。这是由默认QoS设置的行为引起的。在有损信道上加强可靠性意味着发布者 (在本例中为 cam2image
) 将重新发送网络数据包,直到收到消费者的确认 (即 showimage
)。 [待校准@7927]
现在让我们尝试运行这两个程序,但使用更合适的设置。首先,我们将使用 “-p可靠性: = 最佳 _ 努力” 选项来启用最佳努力通讯。现在,发布者将仅尝试传递网络数据包,而不希望得到消费者的认可。我们现在看到 showimage
一侧的一些帧被丢弃了,运行 showimage
的壳中的帧号将不再是连续的: [待校准@7928]
完成后,请记住删除排队规则: [待校准@7930]
sudo tc qdisc delete dev lo root netem loss 5%