PC⇔カメラ間のパケットロスが解決できない
パケットロスが解決できない
Baslerカメラ(Ace2シリーズ)を使用し、3,4枚/sの速度で撮影しています。
撮影した画像はPythonで受け取り諸々処理をしますが、受け取る際にエラーが起きます。
元々は、aceシリーズのカラーカメラで撮影しており
わけあってace2シリーズのモノクロカメラに変更しました。
aceシリーズは3年程使っていましたが当不具合に遭遇したことはありませんでした。
カメラに何か問題がある気がしますが、カメラが変わったことで周辺のネットワーク類も見直しが必要なのかどうかも正直検討がついていないため質問させて頂きます。
エラーコード
とりあえず以下2つのコードで情報を取得しました。
grab_Result.ErrorCode
# エラーコード > 3774873620
grab_Result.GetErrorDescription()
# The buffer was incompletely grabbed ~~
すみません、メッセージは諸事情ですぐ出せないですが、ネットワークの設定を見直してね、的なことが書かれていました。
エラーコードで調べる公式が提案する解決策は以下です。同じようにパケットサイズやインターパケットディレイの設定見直しが書かれています。
エラー時の画像確認
とりあえずnumpyの.shapeで確認しました。
出力は、0だったり、(0,3312)だったり…。パケットロスっぽい出力ではありました。
設備構成
1つのパソコンに別系統でカメラが2台、それぞれインジェクターを介して繋がっています。
LANケーブルは全てカテ6になります。
1Gbit/s通信を確保しているつもりです。
※ここでは必要ないと判断して図に入れてませんが、トリガーはハードウェアトリガーを使用しています。
Line1系統でRisingEdgeでトリガー設定しています。
(具体的には, ロボット → リレーコイル → カメラ の経路でトリガーを出しています)
それぞれの能力が分かるページリンクを載せておきます
カメラ
インジェクター
パソコン(Linux)
パソコンのNIC
カメラ ⇔ インジェクターのLAN
インジェクター ⇔ パソコンのLAN
python側の受け取り方(コード)
while True:
grab_Result = self.camera.RetrieveResult(pylon.waitForever, pylon.TimeoutHandling_Return)
if grab_Result.GrabSucceeded():
ImgNum = grab_Result.GetImageNumber() # 何枚目の画像か
img = grab_Result.GetArray() # 取得
dict_num_img = {"IMG":img,"NUM":ImgNum}
queue.put(dict_num_img)
if ImgNum == self.max_shot_num:
break
shot_num += 1
else:
Err_num = grab_Result.GetImageNumber()
ErrCode = grab_Result.ErrorCode
上記コードを自作関数で実装しています。
動作はThredingを使用して並列処理させています(カメラ2台同時撮影)
発生頻度
前提として、
1サイクルで、1カメラ約30枚程度撮影しています。
3~4枚/s撮影するような負荷で15%程度の確率で発生します。
傾向としては後半が出やすく前半が出にくいみたいな傾向も無いです。
補足(画像サイズ)
取得画像はモノクロで1枚3MBほどになります
試したこと
01. パケットサイズ変更
パソコンのMTU | カメラのパケットサイズ | 結果 |
---|---|---|
9000 | 8192 | x |
1500 | 1500 | x |
02.帯域幅オプティマイズ
カメラ側の帯域幅をPylonViewerの帯域マネージャーで最適化しました。
この操作により124MB > 112MBになりましたがパケロスでました。
極端に帯域幅を小さくしてももちろんパケロスでした。
03.送信データ量減
カラー画像の時より画像サイズが大きいため同等サイズに変更し、
カメラが送るデータ量を落としました
3312x2932 > 2500x2500
これもパケロスです。
04. Inter-Packet Delayの変更
これはどれだけいじってもダメでした。
デフォルト512で30000までいじりました。
他にも諸々やっていますが、一度質問として投稿させて頂きます
何でもいいのでお力を貸して頂けると幸いです…。