あなたはVIOモードでVINS-FUSIONを実行できた数少ない人の一人なので、いくつかのポイントを明確にし、フィードバックをお願いするために戻ってきます。
私はD435iでVINSFUSIONを実行しようとしています(私が推測する多くの人々のように)。 利用可能な起動realsense_stereo_imu_config.yamlを使用して、人々が報告する可能性のあることを体験しました。カメラに触れるとすぐに、計算されたポーズがおかしくなりました。
だから私はKalibrを使用しました:
cam0:
cam_overlaps: [1]
camera_model: pinhole
distortion_coeffs: [0.3775752250096366, -0.08329757139021714, 0.6504570262599587, -0.4530039925701512]
distortion_model: equidistant
intrinsics: [395.5922288679944, 395.5957501002353, 319.88738279106286, 239.07386401539998]
resolution: [640, 480]
rostopic: /camera/infra1/image_rect_raw
cam1:
T_cn_cnm1:
- [0.9999953397168069, 9.448668958037214e-05, 0.0030514942108417595, -0.04984248508758902]
- [-9.749429725933605e-05, 0.9999995096576434, 0.0009854843073503579, 6.189814698173665e-05]
- [-0.0030513995994150846, -0.0009857772179980872, 0.9999948585886561, 0.00015202509092000083]
- [0.0, 0.0, 0.0, 1.0]
cam_overlaps: [0]
camera_model: pinhole
distortion_coeffs: [0.31220975539351176, 0.48299676137352554, -1.4010717249687126, 2.191483852686]
distortion_model: equidistant
intrinsics: [396.5827833428163, 396.75838144377565, 319.1950768721882, 238.53973946284336]
resolution: [640, 480]
rostopic: /camera/infra2/image_rect_raw
これらのパラメーター(imu = 0)を使用してVINS_FUSIONを実行すると、適切な動作が得られたため、キャリブレーションは問題ないと思います。 私はその分野の専門家ではないので、必要に応じてPDFレポートを共有させていただきます。
accelerometer_noise_density: 0.0011060 #Noise density (continuous-time)
accelerometer_random_walk: 8.6056e-05 #Bias random walk
しかし、ジャイロについては、私は明らかに懐疑的です:
値は次のとおりです。
gyroscope_noise_density: 50.427 #Noise density (continuous-time)
gyroscope_random_walk: 0.3480 #Bias random walk
ここで、これらの価値観についてあなたの意見を聞きたいと思いますか?
しかし、私はimu-cameraキャリブレーションを行うことができました:
cam0:
T_cam_imu:
- [0.999848715163262, 0.0018345448477758066, 0.017296856118190283, -0.009035083963879727]
- [-0.001867318311452875, 0.999996491602708, 0.0018788040335944412, 0.002129300542443833]
- [-0.01729334868368733, -0.0019108185351930207, 0.9998486329759259, -0.005593943362795322]
- [0.0, 0.0, 0.0, 1.0]
cam_overlaps: [1]
camera_model: pinhole
distortion_coeffs: [0.3775752250096366, -0.08329757139021714, 0.6504570262599587,
-0.4530039925701512]
distortion_model: equidistant
intrinsics: [395.5922288679944, 395.5957501002353, 319.88738279106286, 239.07386401539998]
resolution: [640, 480]
rostopic: /camera/infra1/image_rect_raw
timeshift_cam_imu: -0.028184396371617668
cam1:
T_cam_imu:
- [0.9997911085949877, 0.0019231918046627172, 0.020347985347160178, -0.058894395640646836]
- [-0.0019818392674274344, 0.999993939322739, 0.0028624519050287085, 0.0021865657711008357]
- [-0.02034235698054308, -0.002902180399802527, 0.9997888606407872, -0.005416418875488448]
- [0.0, 0.0, 0.0, 1.0]
T_cn_cnm1:
- [0.9999953397168102, 9.448668958037212e-05, 0.003051494210841759, -0.04984248508758902]
- [-9.749429725933604e-05, 0.9999995096576467, 0.0009854843073503574, 6.189814698173665e-05]
- [-0.003051399599415084, -0.0009857772179980868, 0.9999948585886594, 0.00015202509092000083]
- [0.0, 0.0, 0.0, 1.0]
cam_overlaps: [0]
camera_model: pinhole
distortion_coeffs: [0.31220975539351176, 0.48299676137352554, -1.4010717249687126,
2.191483852686]
distortion_model: equidistant
intrinsics: [396.5827833428163, 396.75838144377565, 319.1950768721882, 238.53973946284336]
resolution: [640, 480]
rostopic: /camera/infra2/image_rect_raw
timeshift_cam_imu: -0.028184788415138273
タイムシフトがネガティブなので、ここでも驚きます! 出来ますか?
カメラ変換に関しては、VINS_FUSIONに関連するスレッドから、body_T_cam0 / 1がカメラフレームからIMUフレームへの変換であることがわかりました。
p = body_T_cam0 * q
p: point in IMU coordinates
q: point in camera coordinates
そしてKalibrではT_cam_imuはIMUの外因性です:IMUからカメラ座標(T_c_i)への変換ですが、VINS_FUSIONで使用される正しい形式を取得するのは今のところ困惑しています。
ただし、このすべての作業にもかかわらず、IMUでVINSを実行することはできません。 長い間申し訳ありませんが、なぜそれが機能しないのかを説明するかもしれない何かがここに間違っているのを見ますか?
どうもありがとう
@FaboNo私はそれを以下の設定で動作させることができ、独自のキャリブレーションを実行する必要はありませんでした。適切なキャリブレーションでうまく動作すると確信していますが、うまく動作し、発散しません。
このリポジトリで提供されているleft.yamlとright.yamlを使用しました
リアルセンスオプションで自動露出をオフにし、IRエミッターをオフにしていることを確認してください。
%YAML:1.0
#common parameters
#support: 1 imu 1 cam; 1 imu 2 cam: 2 cam;
imu: 1
num_of_cam: 2
imu_topic: "/camera/imu"
image0_topic: "/camera/infra1/image_rect_raw"
image1_topic: "/camera/infra2/image_rect_raw"
output_path: "/home/dji/output/"
cam0_calib: "left.yaml"
cam1_calib: "right.yaml"
image_width: 640
image_height: 480
# 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: [ 1,0,0,0.00552,
0,1,0,-0.0051,
0,0,1,-0.01174,
0., 0., 0., 1. ]
body_T_cam1: !!opencv-matrix
rows: 4
cols: 4
dt: d
data: [ 1,0,0,-0.04464144,
0,1,0,-0.0051,
0,0,1,-0.01174,
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: 10 # 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.1 # accelerometer measurement noise standard deviation. #0.2 0.04
gyr_n: 0.01 # gyroscope measurement noise standard deviation. #0.05 0.004
acc_w: 0.001 # accelerometer bias random work noise standard deviation. #0.002
gyr_w: 0.0001 # 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.072 # 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: "/home/dji/output/pose_graph/" # save and load path
save_image: 0 # save image in pose graph for visualization prupose; you can close this function by setting 0
@FaboNoこんにちはFaboNo。 返信が遅くなってすみません。 新しい問題が発生したことに気づきませんでした。
まず、使用したpinhold-radtan
ではなく、 equidistant
pinhold-radtan
を使用してカメラモデルをキャリブレーションすることをお勧めします。
正しいカメラキャリブレーションの後、2台のカメラと0のimuモードでVINS-Fusionを実行してみてください。
それは最初にうまく機能するはずです(速い動きや純粋な回転なしで、簡単な動きの下で)
body_T_cam
が、 Kalibrの結果からのT_cam_imu
逆行列であることを確認してください。
また、2台のカメラモード(上記)のみを実行する前に、body_T_cam0と1を確認してください。
負のtimeshift_cam_imu
は、d435iの通常の値です。これは、カメラがIMUよりも遅いことを意味します。
あなたは、私の経験のためにd435iには適していませんでしたあなたのIMUのcalibraiton、用Kalibrアランを実行する必要はありません
むしろ、d435iのIMUモデルを見つけて、その特定のモデルのパラメーターをここのように使用し
ただし、ここではデフォルトのimu parameters
のみを使用することをお勧めします
彼らは十分なはずです。 (または、デフォルト値の3倍のように、わずかに増やします)
ここで説明しD435i SDKからIMU calibration
を実行することをお勧めします
@FaboNo
ちなみに、D435iの元の作者からのデフォルトのparameter / yamlファイルはかなり前に動作することを確認しました。
すべて0の歪み値があり、焦点距離/主点の値と公称body_T_cam
値のみの場合でも。
大きな歪み値を持つequidistant
カメラ固有のキャリブレーション結果が主な問題だと思います。
@engcangメッセージありがとうございます。実際、画像はすでに修正されているので、Kalibrを実行してもほとんど
それらは修正されるので、歪みも0に等しくなければなりません。
@marufinoメッセージありがとうございます。明日試してみてお知らせします。
@FaboNo
この問題に関するニュースはありますか? うまくいきましたか?
最近、Intel D435iでVINS-Fusion(ステレオ)をテストする機会がありました。まだ興味がある場合は、結果クリップを次に示します。
@engcang返信が遅くなってすみません。 私はビデオを見ました、そしてそれは印象的です。 ですから、主にPixHawk4を使用したため、質問はほとんどありません。
@FaboNoこんにちは。
@engcangご
とにかくセットアップを試してみます
@FaboNo
やあ。 通常、yamlファイルのIMUパラメーターは変更しません。 また、 Kalibr_allanから取得したIMUパラメータを設定しようとし
しかし、私はそれらを使用してより良いパフォーマンスを得ることができませんでした。
四足歩行ロボットが地面に強く接触するようなクレイジーな場合にのみ、パラメーターを10倍以下に設定しようとしますが、それは機能します。
最も参考になるコメント
@FaboNoこんにちは。