poko_amu
@poko_amu (poko amu)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

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になります。

{4180EFE7-FDCA-436E-BF8C-10B44803464C}.png

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までいじりました。


他にも諸々やっていますが、一度質問として投稿させて頂きます
何でもいいのでお力を貸して頂けると幸いです…。

0

1Answer

まずは問題が起きているのがどこなのかを判断しましょう

資料関係は登録しないと読めなさそうなので断念しましたがカメラに専用ソフトがあるようです。
一時的にこれを使用してパケットロスが発生するか判断出来ますか?
専用ソフトでパケットロスが発生しないのであればPython側の問題かも知れません
ほか色々書こうと思いましたがもっと詳しく書かれている記事があったので貼っておきます
このへんは参考にしてますか?

0Like

Comments

  1. @poko_amu

    Questioner

    コメントくださりありがとうございます。

    専用ソフトが恐らくPylonViewerのことだと思います。

    結論は、専用ソフトを使ってもパケットロスが発生していると思われます。
    構成はPythonをPylonViewerに置き換えたのみです

    先ほどはっきりパケロス発生してます!と断言出来ていない理由としては、パケットロスを表しそうなステータスが2つあるためです。

    ①Failed Buffer Count
    ②Failed Packet Count

    それぞれ説明は公式から引用します(以下の添付画像)

    {D582A381-604B-42F3-8E98-0E3ADC18D93E}.png

    どちらが発生してもパケットロスだと個人的には思っています。

    ここの正確な切り分けは直接Basler社の方へ問い合わせ中です。
    (そもそもこの問題のことも問い合わせてはいます)

  2. @poko_amu

    Questioner

    サイトのリンクもありがとうございます
    PylonViewerでも出ていそう、という判断でPython側の深追いはあまりしてないです

    とはいえ一度原点に返って、シンプルに画像を取得するだけのPythonコードを作成して検証しています

Your answer might help someone💌