ロボット工学アプリケーション用の高速、高解像度のビデオ カメラを開発しています。さまざまな理由から、カメラを PC に接続するためにギガビット イーサネット (1Ge) または 10Ge を採用する必要があります。それか、私がやりたくない独自の PCIe カードを開発する必要があります (さらに作業が必要で、さらにドライバーを作成する必要があります)。
Linux のドキュメントを読んでもよくわからない質問が 2 つあります。
#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_PACKET を期待するように指示した場合 (アプリケーションが Linux にこれを伝えることができると仮定して)、Linux はこのパケットを受け入れるかどうかです。カメラを制御 (カメラにパケットを送信) し、画像データをパケットで受信するアプリケーションが root 権限で実行する必要がある場合は、許容されます。
#2:どちらが速くなりますか:
A: linux sockets with AF_PACKET protocol
B: libpcap application
各パケットには、独自のロスレス圧縮形式でピクセルの水平行が 1 行含まれているため、パケットはパケット間にほとんどスペースがなく到着するため、速度は非常に重要です (リアルタイム速度で FPGA に実装できるより良いアルゴリズムを見つけられない限り)。 . フレーム間に一時停止がありますが、それは 1200 以上の水平行 (イーサネット フレーム パケット) の後です。
アプリケーションはロボット工学であるため、OpenGL がテクスチャとして受け入れるのと同じように、水平方向の各行はすぐに圧縮解除され、RGBA ピクセルの単純なパック配列に格納されます。そのため、ロボット工学ソフトウェアは、画像が行ごとに到着するとすぐに各画像を検査し、おそらく非人道的に可能な限り迅速に反応することができます.
各行の最初の RGBA ピクセルのデータは、前の行の最後の RGBA ピクセルの直後に続くため、ピクセルの最後の水平行の終わりで、画像が完成し、GPU に転送したり、ディスクに保存したりできるようになります。各水平行は 16 ピクセルの倍数になるため、「パディング」は必要ありません。
注: カメラと PC の間にルーターやその他のデバイスを介さずに、カメラを RJ45 ジャックに直接接続する必要があります。