我正在为机器人应用开发高速、高分辨率的摄像机。由于各种原因,我需要采用千兆以太网 (1Ge) 或 10Ge 将我的相机连接到 PC。要么,要么我需要开发自己的 PCIe 卡,我不想这样做(更多的工作,然后我必须创建驱动程序)。
阅读 linux 文档后,我有两个不确定的问题。
#1:我想要的以太网框架是:
8-byte interpacket pad + sync byte
6-byte MAC address (destination)
6-byte MAC address (source)
2-byte packet length (varies 6KB to 9KB depending on lossless compression)
n-byte image data (number of bytes specified in previous 2-byte field)
4-byte CRC32
问题是,如果应用程序告诉 linux 期望 AF_PACKETs(假设应用程序可以告诉 linux),linux 会接受这个数据包吗?如果控制相机(向其发送数据包)和接收数据包中的图像数据的应用程序必须以 root 权限运行是可以接受的。
#2:哪个会更快:
A: linux sockets with AF_PACKET protocol
B: libpcap application
速度至关重要,因为数据包之间的空间很小,因为每个数据包都包含我自己的无损压缩格式的水平像素行(除非我能找到更好的算法,也可以在 FPGA 中以实时速度实现) . 帧之间会有暂停,但那是在 1200 或更多水平行(以太网帧数据包)之后。
因为应用程序是机器人,每个水平行将立即解压缩并存储在一个简单的 RGBA 像素打包数组中,就像 OpenGL 接受纹理一样。因此,机器人软件可以在图像逐行到达时立即检查每张图像,并可能以非人道的速度做出反应。
每行中第一个 RGBA 像素的数据紧跟在前一行中的最后一个 RGBA 像素之后,因此在最后一个水平像素行的末尾,图像是完整的,可以传输到 GPU 和/或保存到磁盘。每个水平行将是 16 像素的倍数,因此不需要“填充”。
注意:摄像机必须直接插入 RJ45 插孔,摄像机和 PC 之间没有路由器或其他设备。