Zivid キャリブレーションオブジェクトで高品質なデータを取得する方法
注釈
Zivid ハンドアイキャリブレーションツール は、すぐに使える良質な点群を提供します。点群の品質に関連するハンドアイキャリブレーションの問題が発生している場合は、このチュートリアルを参照してください。
This tutorial presents how to acquire good quality point clouds of the calibration object for hand-eye calibration. This is a crucial step to get the hand-eye calibration algorithm to work as well as to achieve the desired accuracy. The goal is to configure camera settings that provide high-quality point clouds regardless of where the calibration object is located in the FOV. While the tutorial provides point cloud examples for the Zivid calibration board (7x8 30mm, 300x300mm), the same principles can be applied to ArUco markers.
キャリブレーション対象物の点群を取得するロボットの姿勢は、すでに指定済みであることを前提としています。次の記事では、ハンドアイキャリブレーションに適切な姿勢を選択する方法について解説します。
注釈
To calibrate using the Zivid calibration board (7x8 30mm, 300x300mm), ensure that the entire board, including the ArUco marker, is fully visible for each pose.
注釈
ArUco マーカーを使用してキャリブレーションを行うには、各姿勢において少なくとも1つのマーカーが完全に視認できることを確認してください。より多くのマーカーが視認できるほど、より良い結果が得られますが、必須ではありません。
ここでは、「近接」姿勢と「遠方」姿勢の2つの姿勢について説明します。「近接」姿勢とは、カメラとキャリブレーション対象物との間の撮像距離が最小となるロボットの位置を指します。アイ・イン・ハンドシステムでは、ロボットに搭載されたカメラがキャリブレーション対象物に最も近い位置にあるときです。アイ・トゥ・ハンドシステムでは、ロボットがキャリブレーション対象物を固定カメラに最も近い位置に配置するときです。
「遠方」姿勢とは、カメラとキャリブレーション対象物との間の撮像距離が最大となるロボットの位置を指します。アイ・イン・ハンドシステムでは、ロボットに搭載されたカメラがキャリブレーション対象物から最も遠い位置にあるときです。アイ・トゥ・ハンドシステムでは、ロボットがキャリブレーション対象物を固定カメラから最も遠い位置に配置するときです。
Tip
Zivid キャリブレーションボードを使用している場合は、最も近い姿勢と最も遠い姿勢について Calibration Board presets をダウンロードして試してみてください。点群の品質が良好であれば、チュートリアルの残りの部分をスキップして、これらの設定を使用できます。ただし、これらのプリセット設定は ArUco マーカーには適していません。
期待される結果を以下に示します。
Tip
ArUco マーカーを使用している場合は、最も近い姿勢と最も遠い姿勢について ArUco Marker presets をダウンロードして試してみてください。点群の品質が良好であれば、チュートリアルの残りの部分をスキップして、これらの設定を使用できます。
ハンドアイキャリブレーション用に適切な点群を取得するための段階的なプロセスを以下に示します。
考えられるシナリオ
次のチュートリアルでは、 SNR マップを使用して黒と白のピクセルの信号品質を確認します。 SNR 値が増加するにつれ、カラーインジケータが赤から濃い青に変わります。以下に、 SNR スケールとこのチュートリアルで遭遇する可能性のあるすべてのケースを示します。
基本設定
まず、このチュートリアルの基本設定を定義します。
ロボットを「近接」姿勢に移動します
Zivid Studio を起動してカメラに接続します
Vision Engine を、アプリケーションで使用しているものに設定します。プリセットを使用している場合は、プリセットで使用されている Vision Engine を確認してください。
サンプリング、カラー を rgb に設定します。
サンプリング、ピクセル を、アプリケーションで使用しているものに設定します。プリセットを使用している場合は、プリセットで使用されているサンプリングを確認してください。
露光時間 を、 50Hz グリッド周波数の場合は 10000μs、 60Hz グリッド周波数の場合は 8333μs に設定します。
お使いのカメラが対応している場合は、 被写界深度計算機 を使用して f値 を設定します。
最小焦点深度 (mm): 最遠作動距離 - 最短作動距離
最短作動距離(mm):カメラとキャリブレーション対象物との最短距離
最遠作動距離(mm):カメラとキャリブレーション対象物との間の最遠距離
許容可能なぼかし半径(ピクセル): 1
プロジェクターの明るさ を最大に設定します
ゲイン を 1 に設定します
ノイズフィルター を 5 に設定します。
外れ値フィルター を 10 に設定します。
反射フィルター をグローバルに設定します
他のすべてのフィルターをオフにし、その他の設定はすべてデフォルト値のままにします。
「近接」姿勢のカメラ設定を最適化する
「近接」ポーズの白領域の微調整(Acquisition 1)
この段階では、黒い面は無視して、白い面に関する良好なデータを取得することに集中してください。キャリブレーション対象物の白い領域をキャプチャして分析します。白い領域の微調整を行う際には、以下の画像を参考にしてください。
画像が露出不足です(白いピクセルが暗すぎます)
画像が露出オーバーになっています(白いピクセルが飽和しています)
露光時間 を短縮します
露光時間を短くすると、 周囲光からの干渉 (電力網からの)により、点群に波状の模様が現れることがあります。波状の模様が見られない場合は、白い領域で良好なデータが得られるまで露光時間を短くし続けてください。
露光時間の制限に達し、データが十分でない場合、または点群が波打っている場合は、次のオプションに従ってください。
お使いのカメラが対応している場合は、 f値 を大きくしてください。
プロジェクターの明るさ を下げます
この時点で、4つの取得のうちの1つ(「 Acquisition 1」)が調整されました。
「近接」ポーズの黒領域の微調整(Acquisition 2)
「 Acquisition 1」をオフにして複製します。この「 Acquisition 2」は、キャリブレーション対象物の黒い部分で良好なデータが得られるように調整する必要があります。そのため、白い領域は露出オーバーになることが予想されます。以下の画像をご覧ください。白いピクセルが露出オーバーになっているため、チェッカーボードの白い部分にデータがありません。
暗い表面には、より高い光露出が必要です。
画像が露出不足です(黒いピクセルが暗すぎます)
プロジェクターの明るさ を上げます。
露光時間 を長くします
キャリブレーション対象物の黒い領域で良好なデータが得られるまで、露光時間を 10000μs(50Hz)または 8333μs(60Hz)ずつ増やしてください。制限に達してもデータがまだ十分でない場合は、次のオプションに進んでください。
お使いのカメラが対応している場合は、 f値 を小さくしてください。
ゲイン を上げます
「遠方」姿勢のカメラ設定を最適化する
「遠方」ポーズの白領域の微調整(Acquisition 3)
「 Acquisition 2」をオフにして、「 Acquisition 1」を複製します。ここでも、黒い面は無視して、白い面だけに注目しましょう。キャリブレーション対象物の白い領域をキャプチャして分析します。
画像が露出不足です(白いピクセルが暗すぎます)
プロジェクターの明るさ を上げます。
露光時間 を長くします
キャリブレーション対象物の黒い領域で良好なデータが得られるまで、露光時間を 10000μs(50Hz)または 8333μs(60Hz)ずつ増やしてください。制限に達してもデータがまだ十分でない場合は、次のオプションに進んでください。
お使いのカメラが対応している場合は、 f値 を小さくしてください。
画像が露出オーバーになっています(白いピクセルが飽和しています)
露光時間 を短縮します
露光時間を短くすると、 周囲光からの干渉 (電力網からの)により、点群に波状の模様が現れることがあります。波状の模様が見られない場合は、白い領域で良好なデータが得られるまで露光時間を短くし続けてください。
露光時間の制限に達し、データが十分でない場合、または点群が波打っている場合は、次のオプションに従ってください。
お使いのカメラが対応している場合は、 f値 を大きくしてください。
プロジェクターの明るさ を下げます
「遠方」ポーズの黒領域の微調整(Acquisition 4)
「 Acquisition 3」をオフにして、「 Acquisition 2」を複製します。
この「 Acquisition 4」は、キャリブレーション対象物の黒い部分で良好なデータが得られるように調整する必要があります。そのため、白い領域は露出オーバーになることが予想されます。
暗い表面には、より高い光露出が必要です。
画像が露出不足です(黒いピクセルが暗すぎます)
プロジェクターの明るさ を上げます。
露光時間 を長くします
キャリブレーション対象物の黒い領域で良好なデータが得られるまで、露光時間を 10000μs(50Hz)または 8333μs(60Hz)ずつ増やしてください。制限に達してもデータがまだ十分でない場合は、次のオプションに進んでください。
お使いのカメラが対応している場合は、 f値 を小さくしてください。
ゲイン を上げます
この段階で、4つの取得に関する設定が完了しました。残っている手順は、最終的なフィルターの設定です。
フィルターの最適化
ガウシアンスムージング を 5 に設定します。
Contrast Distortion filter、補正 を 0.4 に設定します。
Contrast Distortion filter、除去 を 0.5 に設定します。
ガウシアンスムージング を 5 に設定します。
Contrast Distortion filter、補正 を 0.4 に設定します。
Contrast Distortion filter、除去 はオフのままにしてください。
点群は、チュートリアルの冒頭に示されている 点群 と似ているはずです。
注釈
ほとんどの場合、「近接」と「遠方」の姿勢それぞれに最適化された2つの取得を行うことで、キャリブレーション対象物に関する高品質なデータが得られます。適切な撮像設定を決定するもう1つの方法は、キャプチャアシスタントを使用することです。ただし、キャプチャアシスタントは現在、チェッカーボードではなくシーン全体に対する最適な設定のみを提供しています。キャプチャアシスタントはこの目的にも有効ですが、常に良好な結果が得られるため、上記の方法を使用することをお勧めします。
キャプチャと検出
これで、点群データの中からキャリブレーション対象物を検出できるかどうかを確認できます。
const auto detectionResult = Zivid::Calibration::detectCalibrationBoard(frame);
if(detectionResult.valid())
{
std::cout << "Calibration board detected " << std::endl;
handEyeInput.emplace_back(robotPose, detectionResult);
currentPoseId++;
}
else
{
std::cout << "Failed to detect calibration board. " << detectionResult.statusDescription() << std::endl;
}
using (var frame = camera.Capture2D3D(settings))
{
var detectionResult = Detector.DetectCalibrationBoard(frame);
if (detectionResult.Valid())
{
Console.WriteLine("Calibration board detected");
handEyeInput.Add(new HandEyeInput(robotPose, detectionResult));
++currentPoseId;
}
else
{
Console.WriteLine("Failed to detect calibration board, ensure that the entire board is in the view of the camera");
}
}
detection_result = zivid.calibration.detect_calibration_board(frame)
if detection_result.valid():
print("Calibration board detected")
hand_eye_input.append(zivid.calibration.HandEyeInput(robot_pose, detection_result))
current_pose_id += 1
else:
print(f"Failed to detect calibration board. {detection_result.status_description()}")
それでは ハンドアイキャリブレーションに関する注意事項と推奨事項 を見てみましょう。
バージョン履歴
SDK |
変更点 |
|---|---|
2.15.0 |
点群データからキャリブレーション対象物を検出できるかどうかを確認する方法を追加しました。 |