ヒント: 記事を作成した後、目次を自動的に生成できます。生成方法は、右側のヘルプドキュメントを参照してください。
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 つは、次のような公開データセットを参照することです: EuRoC データセット (結局のところ、これは自分で収集したデータセットです)、Kalibr は、kalibr キャリブレーションを使用したダウンロード 彼らが使用する IMU モデルは adls16448 です。この imu は通常、 imu_utilの mintar バージョンなど、多くの imu 内部基準キャリブレーション ツールの例として使用されます。以下では、Kalibr で使用される imu ノイズ パラメータと imu Internalによって取得されたノイズを比較できます。パラメータの違い: Kalibr で使用される imu ノイズ パラメータは、imu 内部基準キャリブレーションで得られるノイズ パラメータよりも約 10 ~ 15 倍大きいこと
がわかります。理由については、以前の記事を参照してください。そこで、静的 imu で校正した内部基準を使用し、それを 10 ~ 15 倍に拡大する方法も考えられます (倍数はエフェクトによって異なります。エフェクトが良くない場合は、もう少し拡大しても構いません)。 - 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 によって校正されたパラメータは信頼できるものです。
没有允许不许转载!!