画像の取り込みと処理#
Smart blaze カメラでの画像取得と処理は、任意の x86 Linux ホストコンピューター上の場合と同様に動作します。VM とカメラ間の仮想ネットワーク接続によりこれが可能になるため、ソフトウェアがホスト上で実行されるか、Smart blaze上の VM で実行されるかに関わらず、制御や画像取得に違いはありません。
Smart blaze 上の VM 内で実行されるソフトウェアについては、現在、C++ および pypylon を使用した Python がサポートされています。pylon の C# バインディングは、Smart blaze カメラではまだテストされていません。
この一貫した動作は、VM とカメラの間に仮想ネットワーク接続を確立することで実現されており、ソフトウェアがホスト上で実行されるか、Smart blaze上の VM で実行されるかに関わらず、制御や画像取得に違いはありません。
ドキュメントとサンプル#
blaze カメラの設定およびグラブループのセットアップ手順については、blaze Programmer's Guideを参照してください。開発用コンピューターに Basler pylon および pylon Supplementary Package for blaze をインストールした後、インストールディレクトリにサンプルコードがあります:
- /opt/pylon/share/pylon/Samples/blaze/cpp/
- /opt/pylon/share/pylon/Samples/blaze/Python/pypylon/
Basler pylon および Supplementary Package for blaze は、Basler ウェブサイトからダウンロードできます。
CPUリソースの管理#
Smart blaze カメラで利用可能な CPU リソース(4x Cortex-A53、1.5 GHz)は、ネイティブカメラファームウェアと顧客 VM の間で共有されます。安定した画像取得と深度処理を確保するために、カメラファームウェアはリアルタイム優先度で実行され、顧客 VM は通常のタスク優先度で実行されます。
この設計により、VM 内のソフトウェアは、画像取得や深度計算に影響を与えることなく、4 つの仮想 CPU コアすべてを最大限に活用できます。仮想 CPU コアには、画像取得と深度処理に現在必要とされていない物理コアの割合のみが割り当てられます。
画像取得の進行中、カメラファームウェアは 3 つの物理コアを使用します。ファームウェアがフレームの取得と処理を完了すると、VM が CPU コアをほぼ独占的に利用できる時間枠が存在します。この時間枠は、次のフレーム取得がトリガーされたときに終了します。現在、この時間枠の約 20 ms が、ファームウェアと VM 間の仮想ネットワーク経由での画像データの転送に費やされており、1 つのコアのかなりの部分を占有しています。今後の最適化により、この転送がより高速になり、リソース消費が削減されることが期待されます。
X11 フォワーディングは追加のレイテンシーを発生させ、グラブループを遅延させたり、フレームのドロップを引き起こしたりする可能性があります。
アプリケーションが処理に追いつかなくなり、フレームのドロップが発生し始めた場合は、フレームレートを下げることを検討してください。
フレームレートの制御#
ホストコンピューター上の 3D Viewer を使用して手動でフレームレートを制御するか(カメラの電源を切ると設定が保持されないことに注意してください)、アプリケーションで関連するカメラパラメータを設定することで制御できます。
カメラでフレーム取得をトリガーするには、いくつかの方法があります:
- Hardware trigger:カメラは、ハードウェアトリガー信号を受信したときにのみフレームを取得します。
- Software trigger:カメラは、アプリケーションからソフトウェアトリガー信号を受信したときにのみフレームを取得します。
- Free run:カメラは、内部の周期的トリガーを使用して連続的にフレームを取得します。Free run はデフォルトの Trigger Mode です。
フレームレート制御を有効または無効にするには、 AcquisitionFrameRateEnable パラメータを使用します。有効にすると、以下を設定できます: AcquisitionFrameRate フレームレート(秒間フレーム数:fps)を指定するためのパラメータです。フリーランモードでは、指定されたフレームレートを達成するようにカメラが内部タイミングを自動的に調整します。
トリガーモードでは、フレームレートの設定によって、トリガー信号に許可される最大周波数が定義されます。トリガー信号が速すぎる間隔で到着した場合、最小インターバルより前に発生した信号は無視されます。
ソフトウェアトリガーを使用する場合、 AcquisitionStatus パラメータを確認して、カメラが次のトリガーを受け入れる準備ができているかどうかを判断できます。
堅牢なアプローチとして、アプリケーションが次のフレームを処理する準備ができたときのみ取り込みが開始されるようにソフトウェアトリガーを使用する方法があります。これにより、VM内のアプリケーションは、次のフレームを要求する前に、利用可能なすべてのCPUリソースを処理のために使用できるようになります。
ソフトウェアトリガーを使用する場合の影響
ソフトウェアトリガー方式では通常、最大可能なフレームレートよりも低いフレームレートになります。これは、1フレームの処理と次のトリガーの実行後、アプリケーションが露光、深度計算、およびVMへのネットワーク転送の完了を待機する必要があるためです。
温度が精度に与える影響#
深度データの精度は、一定の動作温度を維持することに依存します。トリガー周波数の変動は温度変化を引き起こし、深度の精度に影響を与える可能性があります。
これを防ぐため、 TriggerThermalDriftStabilization パラメータはデフォルトで有効になっています。ソフトウェアまたはハードウェアの Trigger Mode で有効にすると、カメラファームウェアはバックグラウンドで一定のフレームレートで画像を継続的に取得・処理し、トリガーを受信した際に現在または次に利用可能な画像を配信します。
バックグラウンド処理はCPUリソースを消費するため、ソフトウェアトリガーモードでは、 AcquisitionFrameRate の値を下げるか、または TriggerThermalDriftStabilization パラメータ。
同じネットワーク内で複数の blaze カメラを使用する#
を無効にする必要があります。
情報
CreateFirstDevice をシリアル番号フィルターなしで使用すると、必ずしもホストカメラが開くとは限りません。
ネットワーク内に複数のカメラが存在する場合、ホストカメラはそのシリアル番号で識別できます。シリアル番号はカーネルコマンドライン経由でVMに渡されます。これは次のコマンドを実行して確認できます。
出力例:
$ cat /proc/cmdline
root=/dev/vda1 rw console=ttyAMA0 earlycon rootwait ip=192.168.1.127:::255.255.255.0:::off:: blazeSerial=40560199 blazeFirmwareVersion=fw-6.0.0-20260428134100;fw-6.0.0+gf1b86064cda6
C++ の例:シリアル番号によるホストカメラのオープン#
#include <regex>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <pylon/PylonIncludes.h>
#include <pylon/BlazeInstantCamera.h>
using namespace Pylon;
int main() {
std::string serial_number = "40560199";
std::string cmdline = (std::stringstream() << std::ifstream("/proc/cmdline").rdbuf()).str();
std::smatch match;
if (std::regex_search(cmdline, match, std::regex("blazeSerial=(\\d+)")))
serial_number = match[1];
PylonInitialize();
CBlazeInstantCamera camera(CTlFactory::GetInstance().CreateFirstDevice(
CDeviceInfo().SetDeviceClass(BaslerGenTlBlazeDeviceClass).SetSerialNumber(serial_number.c_str())));
camera.RegisterConfiguration(new CBlazeDefaultConfiguration, RegistrationMode_ReplaceAll, Cleanup_Delete);
camera.Open();
std::cout << "Connected to camera " << camera.GetDeviceInfo().GetFriendlyName() << std::endl;
std::cout << "Serial Number: " << camera.GetDeviceInfo().GetSerialNumber() << std::endl;
}
Python の例:シリアル番号によるホストカメラのオープン#
rom pypylon import pylon
import re
serial_number = "40560199" # default
with open("/proc/cmdline") as f:
match = re.search(r'blazeSerial=(\d+)', f.read())
if match:
serial_number = match.group(1)
factory = pylon.TlFactory.GetInstance()
device_info = pylon.DeviceInfo()
device_info.SetSerialNumber(serial_number)
camera = pylon.InstantCamera(factory.CreateDevice(device_info))
camera.Open()
print(f"Connected to camera {camera.GetDeviceInfo().GetFriendlyName()}")
print(f"Serial Number: {camera.GetDeviceInfo().GetSerialNumber()}")
Smart blaze ファームウェアの管理#
ユースケースによっては、VM内から Smart blaze カメラのファームウェアをアップデートする必要が生じる場合があります。これは、VM内からポート <cameraip>:8080 のソフトウェアアップデートWeb/RESTインターフェースにアクセスし、Baslerが提供する適切な *.swu ファイルをアップロードすることで可能です。
情報
アップデートが成功すると、実行中のVMを含め、カメラが自動的に再起動します。したがって、VM内のプロセスは、.swu ファイルのアップロード完了後に強制終了されても耐えうる堅牢なものである必要があります。
ファームウェアアップデートが成功したことを確認するには、GenICam レジスタから取得した現在のファームウェアバージョンと、期待されるファームウェアバージョンを比較します。便宜上、現在のファームウェアバージョンも、 DeviceFirmwareVersion 想定されるファームウェア バージョンとともに。簡略化のため、現在のファームウェア バージョンもカーネル コマンドラインを介して VM に渡されます。 blazeFirmwareVersion 引数を使用してカーネルコマンドライン経由でVMに渡されます。
出力例: