ZED2 カメラ キャリブレーション - 双眼、IMU、ジョイント キャリブレーション

VINS 構成ファイル内の関連パラメーターを取得し、双眼カメラと IMU センサーの実際の出力データをより正確にするために、カメラ キャリブレーション、IMU キャリブレーション、ジョイント キャリブレーションを含む ZED2 カメラのキャリブレーションが行われました。

1. キャリブレーションツールをインストールする

1. kalibr ツールを使用して、ZED2 双眼カメラを校正します。
2. imu_utils を使用して IMU を調整し、code_utils と imu_utils を順番にインストールしてコンパイルします。

この部分は以前にインストールされています。具体的なプロセスについては、ブログを参照してください: https://blog.csdn.net/xiaojinger_123/article/details/120849737?spm=1001.2014.3001.5501

ただし、システムがubuntu18.04から20.04に変更されたため、システムの依存関係に注意し、対応するバージョンに合わせて修正してください。

1 kalibr をダウンロードしてコンパイルする

sudo apt update
sudo apt-get install python3-setuptools python3-rosinstall ipython3 libeigen3-dev libboost-all-dev doxygen libopencv-dev ros-noetic-vision-opencv ros-noetic-image-transport-plugins ros-noetic-cmake-modules python3-software-properties software-properties-common libpoco-dev python3-matplotlib python3-scipy python3-git python3-pip libtbb-dev libblas-dev liblapack-dev libv4l-dev python3-catkin-tools python3-igraph libsuitesparse-dev 
pip3 install wxPython
sudo pip3 install python-igraph --upgrade
mkdir ~/kalibr_ws/src
cd ~/kalibr_ws/src
git clone --recursive https://github.com/ori-drs/kalibr

cd ~/kalibr_ws
source /opt/ros/noetic/setup.bash
catkin init
catkin config --extend /opt/ros/noetic
catkin config --merge-devel # Necessary for catkin_tools >= 0.4.
catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release

catkin build -DCMAKE_BUILD_TYPE=Release -j4

2 code_utils、imu_utils をダウンロードしてコンパイルします。
1) エラー 「Ceres」が提供するパッケージ構成ファイルが見つかりませんでした
解決策: ceres をインストールしますhttps://blog.csdn.net/weixin_48083022/article/details/118282363

2) ceres コンパイル エラー: 'integer_sequence' は 'std' のメンバーではありません。ceres を
使用する一部のプロジェクトをコンパイルすると、エラー: 'integer_sequence' は 'std' のメンバーではありません。これは新しいバージョンが原因です。 .Ceres には C++ バージョンの要件があります

エラーを報告しているプロジェクトの CMakeList で、
set(CMAKE_CXX_FLAGS “-std=c++11”)を set(CMAKE_CXX_STANDARD 14) に
変更します。

その他の問題に関するリファレンス: https://github.com/gaowenliang/imu_utils/issues/32

2. キャリブレーションボードの選択

キャリブレーション ボードの選択に関しては、チェッカーボードとエイプリルグリッドがより一般的に使用されます。(カメラは視野の 60% 以上を占める校正プレートから 1 ~ 2 m 離す必要があります)。Aprilgrid はシリアル番号情報を提供できるため、姿勢計算時のジャンプを防ぐことができます。したがって、キャリブレーションには Aprilgrid を使用することをお勧めします。

注: キャリブレーション プロセス中、キャリ​​ブレーション プレートはカメラの視野から出てはなりません。開始と終了は滑らかでなければならず、キャリブレーション プレートが視野の隅々に表示されるようにしてください。

チェッカーボード:
targetCols と targetRows は内側のコーナー ポイントの数をカウントします。

target_type: 'checkerboard' #gridtype
targetCols: 6               #number of internal chessboard corners
targetRows: 8               #number of internal chessboard corners
rowSpacingMeters: 0.17      #size of one chessboard square [m]
colSpacingMeters: 0.17      #size of one chessboard square [m]

aprilgrid:
tagSpacing=グリッドの辺の長さが小さい/グリッドの辺の長さが大きい

target_type: 'aprilgrid' #gridtype
tagCols: 6               #number of apriltags
tagRows: 6               #number of apriltags
tagSize: 0.088           #size of apriltag, edge to edge [m]
tagSpacing: 0.3          #ratio of space between tags to tagSize

キャリブレーションボードのダウンロード: https://github.com/ethz-asl/kalibr/wiki/downloads#calibration-targets

3つのZED2キャリブレーションデータ記録

ZED2 の現在の解像度は、ZED2_WS/src/zed-ros-wrapper/zed_wrapper/params フォルダーの common.yaml にあります。解像度は 3 (VGA モード) です。実際の解像度サイズは 672*376 です。

ZED2 ROS ノードを開始します。

roscore
roslaunch zed_wrapper zed2.launch

トピックを表示し、視覚化画像をオンにして、キャリブレーション プレートが左目と右目の画像内にあることを確認します。

rostopic list
rosrun image_view image_view image:=/zed2/zed_node/left/image_rect_color
rosrun image_view image_view image:=/zed2/zed_node/right/image_rect_color

1) エラー: コマンド「rosrun」が見つかりません
解決策:sudo apt install ros-noetic-rosbash

2) エラー: [rospack] エラー: パッケージ 'image_view' が見つかりません
解決策:sudo apt-get install ros-noetic-image-view

ZED カメラは通常約 60 Hz の周波数で記録し、kalibr キャリブレーションでは周波数が高すぎないことが必要であるため、4HZ が推奨されるため、元のトピックの公開頻度を減らす必要があります (キャリブレーションされた画像が多すぎると計算が過剰になります)。 、画像の縮小を参照してください。データは 4Hz に達し (一部のブログでは 20HZ を推奨していますが、どちらでも許容され、処理時間は長くなります)、IMU データは 200Hz に達します。ros のアプローチは、最初にサブスクライブしてから再公開することです。

フレームを下げるコマンドは次のとおりです。

rosrun topic_tools throttle messages old_topic 4.0 new_topic//kalibr推荐的帧率为4HZ

ここでのもう 1 つのポイントは、zed カメラには元の画像に対応するトピックがいくつかあることです (
/zed2/zed_node/left/image_rect_color など)。このトピックも使用できます: 解像度は変更されていませんが、画像のエッジ クロップ後です。元の画像が引き伸ばされるため、情報が失われる可能性があります。

画像の周波数を下げて、現在の周波数を表示します。

rosrun topic_tools throttle messages /zed2/zed_node/imu/data_raw  200 /zed2/zed_node/imu/data_raw2
rosrun topic_tools throttle messages /zed2/zed_node/left/image_rect_color 4.0 /zed2/zed_node/left/image_rect_color2
rosrun topic_tools throttle messages /zed2/zed_node/right/image_rect_color 4.0 /zed2/zed_node/right/image_rect_color2

rostopic hz /zed2/zed_node/left/image_rect_color2
rostopic hz /zed2/zed_node/right/image_rect_color2

キャリブレーション バッグ ファイルの記録を開始します。Youtube ビデオを参照してください: https://youtu.be/puNXsnrYWTY?t=57 :
注: 記録プロセス中、キャリ​​ブレーション ボードが画面を超えていないことを確認してください。画像が鮮明であることを確認し、激しく動かさないでください。IMU はあらゆる角度およびあらゆる方向で作動させることができます。

rosbag record -O Kalib_data_vga.bag /zed2/zed_node/imu/data_raw2 /zed2/zed_node/left/image_rect_color2 /zed2/zed_node/right/image_rect_color2

記録が完了すると、Kalib_data_vga.bag ファイルが取得されます。

記録されたデータを表示する
ここに画像の説明を挿入します

4. カメラのキャリブレーションを開始します

ここでは Aprilgrid キャリブレーション ボードが使用されており、対応する april.yaml (april_6x6_80x80cm.yaml) のパラメーターは次のとおりです。

target_type: 'aprilgrid' #gridtype
tagCols: 6               #number of apriltags
tagRows: 6               #number of apriltags
tagSize: 0.021           #size of apriltag, edge to edge [m]
tagSpacing: 0.285714          #ratio of space between tags to tagSize

kalibr フォルダーでキャリブレーションを実行します。ここで、april.yaml はキャリブレーション ボードと一緒にダウンロードされたパラメーター ファイルを表します。

単一ターゲット設定:

source ~/kalibr_workspace/devel/setup.bash
rosrun kalibr kalibr_calibrate_cameras --bag Kalib_data_vga.bag --topics /zed2/zed_node/left/image_rect_color2 --models pinhole-radtan --target april.yaml 

単一ターゲット判定および単一ターゲット + IMU ジョイント テーブル タイミングを実行すると、次のエラーが報告されます。

Cameras are not connected through mutual observations, please check the dataset. Maybe adjust the approx. sync. tolerance.
Traceback (most recent call last):
  File "/home/ipsg/tool/kalibr_ws/devel/bin/kalibr_calibrate_cameras", line 15, in <module>
    exec(compile(fh.read(), python_script, 'exec'), context)
  File "/home/ipsg/tool/kalibr_ws/src/aslam_offline_calibration/kalibr/python/kalibr_calibrate_cameras", line 447, in <module>
    main()
  File "/home/ipsg/tool/kalibr_ws/src/aslam_offline_calibration/kalibr/python/kalibr_calibrate_cameras", line 204, in main
    graph.plotGraph()
  File "/home/ipsg/tool/kalibr_ws/src/aslam_offline_calibration/kalibr/python/kalibr_camera_calibration/MulticamGraph.py", line 311, in plotGraph
    edge_label=self.G.es["weight"],
KeyError: 'Attribute does not exist'

解決:

ワークスペースの下の src/Kalibr/aslam_offline_calibration/kalibr/python/kalibr_calibrate_cameras で次のコードを見つけてコメントアウトします (201 行目)。

if not graph.isGraphConnected(): 
    obsdb.printTable() 
    print "Cameras are not connected through mutual observations, please check the dataset. Maybe adjust the approx. sync. tolerance." 
    graph.plotGraph() 
    sys.exit(-1)

コメントアウトするとキャリブレーション結果が得られます。

二重の目標設定:

source ~/kalibr_workspace/devel/setup.bash
rosrun kalibr kalibr_calibrate_cameras --bag Kalib_data_vga.bag --topics /zed2/zed_node/left/image_rect_color2 /zed2/zed_node/right/image_rect_color2 --models pinhole-radtan pinhole-radtan --target april.yaml 

–show-extraction を追加できます。キャリブレーション プロセス中に、コーナー検出が良好かどうかを視覚化できます。コーナーの再投影に重大なエラーがあることがわかります。--estimate-sync 0.04、そのうち 0.04 は、各カメラのデータを同期させる機能です。
–bag-from-to パラメータ。データセットの最初と最後にカメラを持ち上げる動きがあった場合、このパラメータを追加してデータのこの部分を削除してください。昇降動作はキャリブレーションに一定の影響を与えます。追加する必要はありません。

エラー 1):

[FATAL] [1636711641.843028]: No corners could be extracted for camera /zed2/zed_node/left/image_rect_color2! Check the calibration target configuration and dataset.
Traceback (most recent call last):
  File "/home/sjj/kalibr_workspace/devel/lib/kalibr/kalibr_calibrate_cameras", line 15, in <module>
    exec(compile(fh.read(), python_script, 'exec'), context)
  File "/home/sjj/kalibr_workspace/src/kalibr/aslam_offline_calibration/kalibr/python/kalibr_calibrate_cameras", line 447, in <module>
    main()
  File "/home/sjj/kalibr_workspace/src/kalibr/aslam_offline_calibration/kalibr/python/kalibr_calibrate_cameras", line 185, in main
    if not cam.initGeometryFromObservations(observations):
  File "/home/sjj/kalibr_workspace/src/kalibr/aslam_offline_calibration/kalibr/python/kalibr_camera_calibration/CameraCalibrator.py", line 56, in initGeometryFromObservations
    success = self.geometry.initializeIntrinsics(observations)
RuntimeError: [Exception] /home/sjj/kalibr_workspace/src/kalibr/aslam_cv/aslam_cameras/include/aslam/cameras/implementation/PinholeProjection.hpp:716: initializeIntrinsics() assert(observations.size() != 0) failed: Need min. one observation

この問題は、キャリブレーションプレートが小さすぎてカメラの解像度が不足していることが原因と考えられますが、変更後はコーナーポイント情報が検出できるようになりました。

エラー 2):
キャリブレーション プロセス中に、初期焦点距離を取得できないというメッセージが表示された場合は、export KALIBR_MANUAL_FOCAL_LENGTH_INIT=1 と設定できます。次に、プログラムを実行します。プログラムが失敗すると、手動で焦点距離を入力するように求められます。「焦点距離の初期化に失敗しました。手動で初期化を行う: この時点では、たとえば 400 と手動で入力します。」比較的大きな値を与えることで収束することもあります。

キャリブレーションが完了すると、ディレクトリに 3 つのファイルが生成されます

.yaml  主要作用为了后期IMU+相机联合标定
.pdf   以图的方式显示效果
.txt   含有相机的内参以及重投影误差

ここに画像の説明を挿入します添付ファイル: .yaml ファイルの紹介

camera_model//相机模型
T_cam_imu //IMU extrinsics:从IMU到相机坐标的转换(T_c_i)
camera projection type (pinhole / omni)
intrinsics//相机内参
vector containing the intrinsic parameters for the given projection type. elements are as follows:
pinhole: [fu fv pu pv]
omni: [xi fu fv pu pv]
distortion_model//畸变模型
lens distortion type (radtan / equidistant)
distortion_coeffs//畸变参数
parameter vector for the distortion model
T_cn_cnm1//左右摄像头的相对位姿
camera extrinsic transformation, always with respect to the last camera in the chain
(e.g. cam1: T_cn_cnm1 = T_c1_c0, takes cam0 to cam1 coordinates)
timeshift_cam_imu//在捕捉数据时,imu数据和图像时间偏移,相机和IMU时间戳之间的时间间隔,以秒为单位(t_imu = t_cam + shift)
timeshift between camera and IMU timestamps in seconds (t_imu = t_cam + shift)
rostopic //摄像机图像流的主题
topic of the camera's image stream
resolution //相机分辨率[width,height]
camera resolution [width,height]

校正結果の検出:

The distortion_coeffs values should be small, even if not equal to zero
The last value of the first row of the T_cn_cnm1 matrix should be very near to -0.06
The last value of the second row of the T_cn_cnm1 matrix should be near to zero
The last value of the third row of the T_cn_cnm1 matrix should be near to zero
The values on the diagonal of the T_cn_cnm1 matrix should be very near to 1.0
The remaining values of the T_cn_cnm1 matrix should be near to zero

5つのIMUパラメータ校正

この部分は、次の 2 つの方法で取得できます。
1) 静的データ (2 時間以上) を記録することにより、起動ファイルを変更し、調整に imu_utils を使用して、調整結果ファイルを取得します。これにより、対応する imu-params.yaml が作成されます。 (校正結果 Acc と Gyr の平均値を取得し、imu.yaml ファイルに記入します)
2) 独自に校正した IMU パラメータ情報を使用するほか、公式 Web サイトで提供されているパラメータを直接使用することもできます。キャリブレーション後にシステムでも実行できることを確認しました。

ここでは imu.yaml を設定する 2 番目の方法を選択します。公式パラメータにはある程度の信頼性があります。後の実験データが良くない場合は、手動で再調整できます。参考: https://blog.csdn.net/sinat_16643223/article/details/115416277?spm=1001.2014.3001.5506

imu-params.yaml を作成する

gedit imu-params.yaml

そして、次の内容を入力します。

#Accelerometers
accelerometer_noise_density: 1.4e-03   #Noise density (continuous-time)
accelerometer_random_walk:   8.0e-05   #Bias random walk
 
#Gyroscopes
gyroscope_noise_density:     8.6e-05   #Noise density (continuous-time)
gyroscope_random_walk:       2.2e-06   #Bias random walk
 
rostopic:                    /zed2/zed_node/imu/data_raw2      #the IMU ROS topic
update_rate:                 200.0     #Hz (for discretization of the values above)

6 台のカメラ IMU の共同キャリブレーション

ジョイントキャリブレーションは主にカメラと IMU 軸系の間の変換関係を取得することです。

rosrun kalibr kalibr_calibrate_imu_camera --bag Kalib_data_vga.bag --cam camchain-Kalib_data_vga.yaml --imu imu-params.yaml --target april.yaml

エラーが報告されました:

[ERROR] [1637115378.140707]: Optimization failed!
Traceback (most recent call last):
  File "/home/sjj/kalibr_workspace/devel/lib/kalibr/kalibr_calibrate_imu_camera", line 15, in <module>
    exec(compile(fh.read(), python_script, 'exec'), context)
  File "/home/sjj/kalibr_workspace/src/kalibr/aslam_offline_calibration/kalibr/python/kalibr_calibrate_imu_camera", line 246, in <module>
    main()
  File "/home/sjj/kalibr_workspace/src/kalibr/aslam_offline_calibration/kalibr/python/kalibr_calibrate_imu_camera", line 209, in main
    iCal.optimize(maxIterations=parsed.max_iter, recoverCov=parsed.recover_cov)
  File "/home/sjj/kalibr_workspace/src/kalibr/aslam_offline_calibration/kalibr/python/kalibr_imu_camera_calibration/icc_calibrator.py", line 179, in optimize
    raise RuntimeError("Optimization failed!")
RuntimeError: Optimization failed!

このエラーレポートは、対応する imu 情報と単眼情報を正常に読み取ることができます。したがって、確率が高いデータであると言って問題ありません。最後に、kalibr の問題で問題の解決策を見つけました。
kalibr の実行中に問題が発生した場合は、公式 Web サイトで検索すると、通常、発生した問題のほとんどは誰かが解決するのに役立ちます。

解決策:
kalibr/aslam_offline_calibration/kalibr/python/kalibr_calibrate_imu_camera.py ファイルを開いて、timeOffsetPadding を検索してください。最初にその値を確認したところ、0.03 でした。その後、この変数の値を増やしました。最初は 0.3 に増やしましたが、動作しませんでした。3 に増やすと、最適化時間が長すぎてスタック状況が発生します。再度下げて、独自の状況に応じてデバッグできます。(追記: 大きすぎることはできません。最初は 100 に変更しましたが、ダイレクト メモリが使い果たされてしまいました)。

再実行して、ジョイント キャリブレーション結果の camchain-imucam-Kalibr_data.yaml ファイルと完全な PDF レポートを取得します。
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/xiaojinger_123/article/details/121232948#comments_28397014