Kalibr を使用してカメラと IMU (ZED+px4) 外部パラメータを調整する

ヒント: 記事を作成した後、目次を自動的に生成できます。生成方法は、右側のヘルプドキュメントを参照してください。


序文

本文仅使用kalibr中cam-imu的联合标定,关于camera内参默认已经知道了。主要会总结一些标定上的小经验,有不对的地方,希望网友可以指出。文章最后将使用标定的cam-imu外参在VINS-Fusion中进行验证


1. Kalibr の概要

Kalibrは、ZTH bigwigs がオープンソース化したキャリブレーション ツールボックスで、カメラの内部パラメータのキャリブレーション、cam-imu の外部パラメータのキャリブレーション、マルチ imu、マルチカメラのキャリブレーションなどを実行できます。多くのデータセットでは、calibre が cam-imu の外部パラメータ行列の校正に使用されており、信頼性が高く、論文執筆や実験に役立ちます。
この記事ではKalibrのインストールは行っていませんが、公式サイトに従って自分でインストールすることも可能ですが、以下ではcalibreのキャリブレーション内容と体験談を紹介します。
この記事で使用する機材はZEDカメラとpx4の内蔵imuで、左目カメラとimuの外部パラメータはキャリブレーション済みです。

2. CAM-IMUの外部パラメータの校正

キャリブレーションには、
カメラの内部基準のzed_left_raw.yaml 、imu ノイズ パラメータの px4_imu.yaml、およびキャリブレーション ボードに対応する april_7x5.yaml ファイルの合計 3 つの yaml ファイルが必要です。
カメラ内部リファレンス、IMU ノイズ、およびターゲット セクションの内容。
注意这里的文件名可以根据自己习惯命名,不是固定的。

1. カメラの内部基準

カメラの内部パラメータのキャリブレーションに関しては、matlab のキャリブレーション ツールボックスがよく使用されます。Kalibr 自体も複数のカメラの内部パラメータのキャリブレーションをサポートしています。必要に応じて、 「複数のカメラのキャリブレーション」セクションを参照してください
ZED カメラの内部パラメータに関しては、工場出荷時に調整されたデータを使用するだけで十分です。ZED SDK をインストールするときにデフォルトのインストール パスが使用される場合は、/usr/local に SN****.conf ファイルがあります。 /zed/settings 、設定したカメラ解像度に従って、対応する解像度を見つけますカメラリファレンスディストーションパラメータ, ここでは VGA モードを使用しており、
conf ファイル内の対応する内部パラメータと歪みパラメータは次のとおりです。
画像の説明を追加してください
取得したカメラの内部パラメータと歪みパラメータに従って、zed_left_raw.yamlファイル(ファイル名は自分で決めます)、内容は以下の通りです。

cam0:
  cam_overlaps: [] 
  camera_model: pinhole   #相机模型,kalibr也支持鱼眼模型
  distortion_coeffs: [-0.173778, 0.0266126, 0.0010566, -0.000836547] #相机畸参数
  distortion_model: radtan #畸变模型
  intrinsics: [349.46, 349.46, 346.59, 181.41225]
  resolution: [672, 376]
  rostopic: /zed/zed_node/left_raw/image_raw_gray

ディストーションモデルカメラモデルは、それぞれのニーズに応じて選択されることに注意してください。これについては、「Kalibr でサポートされるモデル」で紹介されています。
ZED カメラはピンホール モデルで、歪みパラメータは k1、k2、p1、p2 で、対応する歪みモデルはラジアル-タンジェンシャルです。

2. IMUノイズパラメータ


知らせ:
以前にIMU の内部基準校正に関する記事を書きました。必要な友人はそれを参照してください。
しかし!実は、IMU 内部基準校正のデータは使用しておりません。その理由については、 「 IMU 内部基準校正」の記事でも紹介していますので、知りたい学生はご自身で調べてください。 IMU ノイズ モデルStudent についてさらに詳しく知りたい場合は、私の以前の記事もお読みください。


imu の内部パラメータのキャリブレーションの結果は重要ではありませんが、imu の内部パラメータは cam-imu の外部パラメータのキャリブレーションに影響を与えます。問題です。
選択するにはいくつかの方法があります。

  1. 1 つは、次のような公開データセットを参照することです: EuRoC データセット (結局のところ、これは自分で収集したデータセットです)、Kalibr は、kalibr キャリブレーションを使用したダウンロード 彼らが使用する IMU モデルは adls16448 です。この imu は通常、 imu_utilの mintar バージョンなど、多くの imu 内部基準キャリブレーション ツールの例として使用されます。以下では、Kalibr で使用される imu ノイズ パラメータと imu Internalによって取得されたノイズを比較できます。パラメータの違い: Kalibr で使用される imu ノイズ パラメータは、imu 内部基準キャリブレーションで得られるノイズ パラメータよりも約 10 ~ 15 倍大きいこと画像の説明を追加してください
    がわかります。理由については、以前の記事を参照してください。そこで、静的 imu で校正した内部基準を使用し、それを 10 ~ 15 倍に拡大する方法も考えられます (倍数はエフェクトによって異なります。エフェクトが良くない場合は、もう少し拡大しても構いません)。
  2. 2 番目の方法は、VINS imu ノイズのデフォルト パラメータを使用する方法で、提供されるデフォルト パラメータは非常に使いやすく、デフォルト パラメータに基づいて微調整することもできます。この記事では、VINS によって指定されたデフォルトのパラメーターに基づいていくつかの微調整を使用します。px4_imu.yamlファイルの内容は次のとおりです。
rostopic: /mavros/imu/data
update_rate: 195 #Hz

accelerometer_noise_density: 0.1 #VINS默认 0.2
accelerometer_random_walk: 0.03 #0.05
gyroscope_noise_density: 0.02 #0.02
gyroscope_random_walk: 0.00004 #4e-5

3.target (キャリブレーションボードパラメータ)

キャリブレーション ボードの yaml ファイルについては特に言うことはありません。Kalibrのダウンロードを参照してください。
私は数百ドルのキャリブレーション ボードを使用しています。7x5 ボードです。yaml ファイルは次のとおりです。

#example for aprilgrid
  target_type: 'aprilgrid' #gridtype
  tagCols: 7                  #number of apriltags
  tagRows: 5                  #number of apriltags
  tagSize: 0.03              #size of apriltag, edge to edge [m]
  tagSpacing: 0.2             #ratio of space between tags to tagSize a=3cm b=0.6cm

A4用紙に自分で印刷することもできますが、値を測定する必要があり、両方試してみましたが、実際にはそれほど大きな差はありませんが、キャリブレーションプレートを使用した場合の再投影誤差の方が小さいです。

4.バッグファイルの記録

ここでは px4 の内蔵 imu を使用しており、imu のデータは mavros を通じて公開されていますが、デフォルトの周波数は 30hz のみです。imu の周波数を 200hz に変更するには、次のコマンドを実行する必要があります。

rosrun mavros mavcmd long 511 31 5000 0 0 0 0 0

ここには、イメージのトピックと imu のトピックという 2 つのサブスクライブされたメッセージがあります。

rosbag record /mavros/data/raw zed/zed_node/left_raw/image_raw_gray

記録する際は、できるだけ滑らかな動きを心がけ、速すぎないように注意してください カメラの画質が悪すぎると特徴点が抽出できない場合があり、遅すぎないように注意してください. イムを十分に刺激する必要があります データの収集方法はkalibrにあります githubのホームページにYoutubeに動画があって、B局の人もそれを移して、その動画を参考に録画しました。バッグの長さはあまり影響しません。40 ~ 120 秒程度です。主に計算時間に影響します。急いでいない場合は問題ありません。

5.kalibr: cam-imu ジョイントキャリブレーション

//source 一下kalibr的工作空间
rosrun kalibr kalibr_calibrate_imu_camera --imu /YOUR_FOLDER/px4_imu.yaml --cam /YOUR_FOLDER/zed-left-raw.yaml --target /YOUR_FOLDER/april_7x5.yaml --bag /YOUR_FOLDER/xxx.bag --show-extraction --bag-from-to 5 85

パラメータの説明:
–show-extraction は画像を表示し、抽出された特徴点を確認できます。
–bag-from-to 5 85 は、バッグの 5 番目から 85 番目までの読み取りを指します。これは、最初と最後に激しいジッターが発生する可能性があるため、最初から最後までの一部を切り取ることを意味します。非常に安定しており、途切れることもありません。

キャリブレーション結果:

Calibration results
===================
Normalized Residuals
----------------------------
Reprojection error (cam0):     mean 0.615012956118, median 0.536132055556, std: 0.392602996383
Gyroscope error (imu0):        mean 0.253306360314, median 0.222449089297, std: 0.165059194168
Accelerometer error (imu0):    mean 0.461800885522, median 0.367774639131, std: 0.37771279501

Residuals
----------------------------
Reprojection error (cam0) [px]:     mean 0.615012956118, median 0.536132055556, std: 0.392602996383
Gyroscope error (imu0) [rad/s]:     mean 0.0176861541002, median 0.0155316624023, std: 0.011524631044
Accelerometer error (imu0) [m/s^2]: mean 0.128973968357, median 0.102713866857, std: 0.105489442742

Transformation (cam0):
-----------------------
T_ci:  (imu0 to cam0): 
[[-0.01744988 -0.99908438 -0.03906278  0.05493455]
 [ 0.01391445  0.03882229 -0.99914925 -0.0962123 ]
 [ 0.99975091 -0.01797857  0.01322427 -0.04775604]
 [ 0.          0.          0.          1.        ]]

T_ic:  (cam0 to imu0): 
[[-0.01744988  0.01391445  0.99975091  0.05004149]
 [-0.99908438  0.03882229 -0.01797857  0.05776085]
 [-0.03906278 -0.99914925  0.01322427 -0.09335301]
 [ 0.          0.          0.          1.        ]]

timeshift cam0 to imu0: [s] (t_imu = t_cam + shift)
0.0060200053287647135


Gravity vector in target coords: [m/s^2]
[ 0.08307977 -9.67015417 -1.62777118]


Calibration configuration
=========================

cam0
-----
  Camera model: pinhole
  Focal length: [349.46, 349.46]
  Principal point: [346.59, 181.41225]
  Distortion model: radtan
  Distortion coefficients: [-0.173778, 0.0266126, 0.0010566, -0.000836547]
  Type: aprilgrid
  Tags: 
    Rows: 5
    Cols: 7
    Size: 0.03 [m]
    Spacing 0.006 [m]



IMU configuration
=================

IMU0:
 ----------------------------
  Model: calibrated
  Update rate: 195
  Accelerometer:
    Noise density: 0.02 
    Noise density (discrete): 0.279284800875 
    Random walk: 0.0001
  Gyroscope:
    Noise density: 0.005
    Noise density (discrete): 0.0698212002188 
    Random walk: 1e-06
  T_i_b
    [[1. 0. 0. 0.]
     [0. 1. 0. 0.]
     [0. 0. 1. 0.]
     [0. 0. 0. 1.]]
  time offset with respect to IMU0: 0.0 [s]

ここに画像の説明を挿入
結果分析:
インジケーターは主に投影誤差に焦点を当ててい。それが1 ピクセル未満であれば問題ありません (厳密なインジケーターはありません。大きすぎないでください。1 ピクセルを超える誤差は非常に大きくなるはずです)。これについては、EuRoC データを参照してください。セットのキャリブレーション結果 (元のデータはダウンロードにあります)。以下は、私自身のコンピューターで kalibr を使用したキャリブレーションの結果です。

Calibration results
===================
Normalized Residuals
----------------------------
Reprojection error (cam0):     mean 0.418843991251, median 0.356960966203, std: 0.283661622772
Gyroscope error (imu0):        mean 0.112183412747, median 0.0980577964024, std: 0.0659293249494
Accelerometer error (imu0):    mean 0.348599885514, median 0.313983260978, std: 0.202874498275

Residuals
----------------------------
Reprojection error (cam0) [px]:     mean 0.418843991251, median 0.356960966203, std: 0.283661622772
Gyroscope error (imu0) [rad/s]:     mean 0.00793256518902, median 0.00693373327843, std: 0.00466190727508
Accelerometer error (imu0) [m/s^2]: mean 0.0492994685936, median 0.0444039386034, std: 0.028690786692

ここに画像の説明を挿入
EuRoC データセットの校正には比較的大型の専門的な校正ボードが使用されており、IMU も比較的優れているため、効果はより優れているはずです。再投影誤差は約 0.4 であることがわかり、私はそれを約 0.6 で校正しました。この効果は悪くなく、VINS の外部基準としても直接使用できます。

3. VINS-Fusion ランニング単眼鏡 + imu

VINSのインストールについては公式サイトの紹介を参照してください。
ここではconfigのyamlファイルを変更する方法を中心に紹介しますが、私が使用するyamlファイルは以下の通りです。

%YAML:1.0

#common parameters
#support: 1 imu 1 cam; 1 imu 2 cam: 2 cam; 
imu: 1         
num_of_cam: 1  

imu_topic: "/mavros/imu/data"
image0_topic: "/zed/zed_node/left_raw/image_raw_gray"
output_path: "~/output/"

cam0_calib: "left.yaml"
image_width: 672
image_height: 376
   

# Extrinsic parameter between IMU and Camera.
estimate_extrinsic: 1   # 0  Have an accurate extrinsic parameters. We will trust the following imu^R_cam, imu^T_cam, don't change it.
                        # 1  Have an initial guess about extrinsic parameters. We will optimize around your initial guess.

body_T_cam0: !!opencv-matrix
   rows: 4
   cols: 4
   dt: d
   data: [-0.01711133, 0.01180156, 0.99978394, 0.03898149,
           -0.99917567, 0.03661386, -0.01753311,  0.05820492,
           -0.03681287, -0.9992598, 0.01116532, -0.0870125,
           0, 0, 0, 1]

#Multiple thread support
multiple_thread: 1

#feature traker paprameters
max_cnt: 150            # max feature number in feature tracking
min_dist: 30            # min distance between two features 
freq: 15                # frequence (Hz) of publish tracking result. At least 10Hz for good estimation. If set 0, the frequence will be same as raw image 
F_threshold: 1.0        # ransac threshold (pixel)
show_track: 1           # publish tracking image as topic
flow_back: 1            # perform forward and backward optical flow to improve feature tracking accuracy

#optimization parameters
max_solver_time: 0.04  # max solver itration time (ms), to guarantee real time
max_num_iterations: 8   # max solver itrations, to guarantee real time
keyframe_parallax: 10.0 # keyframe selection threshold (pixel)

#imu parameters       The more accurate parameters you provide, the better performance
acc_n: 0.2          # accelerometer measurement noise standard deviation. #0.2   0.04
gyr_n: 0.05         # gyroscope measurement noise standard deviation.     #0.05  0.004
acc_w: 0.02        # accelerometer bias random work noise standard deviation.  #0.02
gyr_w: 4.0e-5       # gyroscope bias random work noise standard deviation.     #4.0e-5
g_norm: 9.805       # gravity magnitude

#unsynchronization parameters
estimate_td: 1                      # online estimate time offset between camera and imu
td: 0.0                             # initial value of time offset. unit: s. readed image clock + td = real image clock (IMU clock)

#loop closure parameters
load_previous_pose_graph: 0        # load and reuse previous pose graph; load from 'pose_graph_save_path'
pose_graph_save_path: "~/output/pose_graph/" # save and load path
save_image: 1                   # save image in pose graph for visualization prupose; you can close this function by setting 0 

これが必要な点:
1.外部パラメータ マトリックスは、 Kalibr キャリブレーション結果のT_ic
に対応します2. imu パラメータについては、最初は vins のデフォルト パラメータを使用することを推奨します 可能であれば、微調整を行うことができます条件が許せば、Vicon を使用して調整用のデータセットを収集できます。imu で直接調整できないパラメータ。
3.estimate_td : 1 : このパラメータはオンにすると遅延推定され、オンにすると精度が向上します。この結果は 2018 IROS, Online Temporal Calibration for Monocular Visual-Inertial Systemsで公開されました。 1 : Kalibr により調整済み 外部パラメータを真の値として直接使用できます。真の値として 0 を設定し、初期値として 1 を設定します。バックエンドでは、外部パラメータも最適化として最適化されます私は 0 に設定しましたが、初期化フェーズが比較的良好な場合にのみ実行でき、1 に設定するとより堅牢になります。5. mono+imu モードを実行する場合、初期化フェーズはあまり速く進むことはできませんが、IMU は完全に刺激される必要があります。また、初期化フェーズはできる限り豊富な特徴点を持つシーンで実行する必要があります。一部の変数の初期化が不正確になりやすく、その後の最適化結果に影響を与えます。6. カメラのパラメータファイルについては特に言うことはなく、vins の euroc データセットの設定ファイルを参照して書き込めます。


以下はrviz上で可視化した軌跡です シーンは廊下と教室です 廊下はシーン内で特徴点が比較的少ないと考えられるので、最初は教室で初期化しました(教室には本がたくさんあります) 、特徴点が比較的豊富です) 私も廊下で初期化を試みましたが、ついに失敗しました。画像の説明を追加してください
まず特徴点が豊富な教室からスタートし、初期化後に廊下まで歩き、3階から2階まで歩き、最後に3階の教室に戻ります。終点の位置推定 (原点に戻り、理論的な位置推定は 0、0、0 であるはずです) から判断すると、最終的な VIO にはある程度のドリフトがありますが、これは避けられない正常な現象です。
全体として、Kalibr によって校正されたパラメータは信頼できるものです。

没有允许不许转载!!

おすすめ

転載: blog.csdn.net/weixin_42681311/article/details/127687412