了解 Linux 上的 USBFS
适用产品
- 所有 USB 摄像头
应用说明简介
本应用说明介绍了 USB-FS 如何影响 Linux 用户以及正确的设置为什么会影响性能。
什么是缓冲区?
图像被摄像头拍摄后,会自动传输到 PC 并存储在 RAM 中。 内存中为存储图像分配的空间称为缓冲区。
流缓冲区计数模式可以配置为自动或手动。
- 自动:根据摄像头最大帧率,内存的缓冲区数量默认自动分配。
- 手动:摄像头相关的缓冲区数量可以通过向手动流缓冲区计数分配一个值来手动配置。
更多关于缓冲区的信息,请参见我们的 TAN“了解缓冲区处理”。
为什么配置 USB-FS?
Linux 系统上的 USB-FS 对所有 USB 设备默认仅允许 16 MB 的缓冲区内存。 这样可能会造成从高分辨率摄像头或多摄像头环境采集图像时出现问题。 必须提高此限值,以完全利用成像硬件的能力。
FLIR 建议用户将 USB-FS 缓冲区内存配置为 1000 MB,以确保对传入图像的缓冲。 如果使用多个 USB 摄像头,USB-FS 内存限值可能需要超过 1000(本文末尾的示例 B);这有助于防止启动摄像头时因缓冲区分配出现的崩溃问题。
配置 USB-FS
此方法适用于 Ubuntu 16.04/18.04 标准安装。 对于 ARM 板,请参见《在 ARM 和嵌入式系统上使用 Spinnaker》文章。
Spinnaker 安装程序会要求自动设置适当的 USB-FS 内存,但您也可以在任何时候运行附带的配置脚本(位于安装脚本同一目录):
$ sudo sh configure_usbfs.sh
如需手动配置 USB-FS 内存:
1. 如果您的系统上还没有 /etc/rc.local 文件,请运行一下命令以创建并使之可执行
$ sudo touch /etc/rc.local
$ sudo chmod 744 /etc/rc.local
2 在任意文本编辑器中打开 /etc/rc.local 文件:
$ sudo nano /etc/rc.local
如果该文件刚刚才创建,请在其中添加以下代码:
#!/bin/sh -e
echo 1000 > /sys/module/usbcore/parameters/usbfs_memory_mb
exit 0
如果该文件已存在,请在 exit 0 行前面添加以下代码:
echo 1000 > /sys/module/usbcore/parameters/usbfs_memory_mb
3. 保存更改并关闭文件。
4 重启机器。
如果要确认内存限值已更新,请运行以下命令:
$ cat /sys/module/usbcore/parameters/usbfs_memory_mb
如果此方法无法设置内存限值,可以运行以下命令临时修改 USB-FS 内存直至下一次重启:
$ sudo sh -c 'echo 1000 > /sys/module/usbcore/parameters/usbfs_memory_mb'
了解需要多少 USB-FS 内存
USB-FS 所需内存取决于两个参数:图像尺寸和流缓冲区的分配数量(最终流缓冲区计数)。
1. 图像尺寸按分辨率和位深计算。
图像尺寸 = 分辨率 X 位深
2 USB-FS 需要的内存大小可以通过图像尺寸和最终流缓冲区计数计算,适用于所有 USB 摄像头。
USB-FS 所需内存 = ∑ 图像尺寸 X 最终流缓冲区计数
示例 A:
一台摄像头以 1920 x 1080 分辨率和 8 位像素格式进行流传输。
图像尺寸 = 1920 X 1080 X 8 位 = 16,588,800 位(2,073,600 字节)= ~2 MB
如果分配了 300 个流缓冲区(最终流缓冲区计数 = 300),那么至少需要 600 MB (2 MB X 300) 的可用 USB-FS 内存。
示例 B:
两台摄像头同时以 1920 x 1080 分辨率和 8 位像素格式进行流传输。如果每个摄像头分配了 300 个流缓冲区(最终流缓冲区计数 = 300),那么
USB-FS 所需内存 = 2 MB X 300 X 2 = 1200 MB
这种情况下,USB-FS 需要至少配置 1200 MB(建议超过 1200 MB)。
相反地,如果 USB-FS 内存大小最好配置为 1000 MB,那么要如何分配缓冲区? 流缓冲区计数模式需要设置为手动,而手动流缓冲区计数需要设置为低于 300 的值(如 200)。 这样,全部摄像头所需的总缓冲区内存 (2 MB X 200 X 2 = 800 MB) 不超过配置的 USB-FS 内存 (1000 MB)。