Vins-application: D435i + vins_fusionに関するいくつかの入力

作成日 2020年09月16日  ·  9コメント  ·  ソース: engcang/vins-application

あなたは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レポートを共有させていただきます。

  • カメラのIMuキャリブレーションは、ノイズ密度とランダムウォークの値がないため、それほど単純ではありませんでした。 だから私はアランバリアンスソフトウェアとmatlabからのいくつかのコードを使用しましたそして私は加速のためにこれを手に入れました
    allan_acc
accelerometer_noise_density: 0.0011060    #Noise density (continuous-time)
accelerometer_random_walk:   8.6056e-05    #Bias random walk

しかし、ジャイロについては、私は明らかに懐疑的です:
allan_gyro

値は次のとおりです。

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こんにちは。

  • はい。 Pixhawk4miniのIMUはD435iよりも優れていると思います。 原因Pixhawk4 miniは、2つの6DOF IMUと1つの磁力計を使用し、それらをフィルタリングして1つのROSトピックを出力します(フィルタリングについては100%確実ではありませんが、2つのIMUがあります)。
  • 100Hzを使用しました。
  • はい、PX4とMAVROSを使用しました。 最大で約150Hzを取得できたのを覚えていますが、どこかからIMUとカメラFPSの3:1の比率がVINSに最適であることがわかりました。 普段は30Hzのカメラを使っているので、100Hzが適切だと思いました。

全てのコメント9件

@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。 返信が遅くなってすみません。 新しい問題が発生したことに気づきませんでした。

  1. まず、使用したpinhold-radtanではなく、 equidistant pinhold-radtanを使用してカメラモデルをキャリブレーションすることをお勧めします。

  2. 正しいカメラキャリブレーションの後、2台のカメラと0のimuモードでVINS-Fusionを実行してみてください。
    それは最初にうまく機能するはずです(速い動きや純粋な回転なしで、簡単な動きの下で)

  3. body_T_camが、 Kalibrの結果からのT_cam_imu行列であることを確認してください。
    また、2台のカメラモード(上記)のみを実行する前に、body_T_cam0と1を確認してください。

  4. 負のtimeshift_cam_imuは、d435iの通常の値です。これは、カメラがIMUよりも遅いことを意味します。

  5. あなたは、私の経験のためにd435iには適していませんでしたあなたのIMUのcalibraiton、用Kalibrアランを実行する必要はありません
    むしろ、d435iのIMUモデルを見つけて、その特定のモデルのパラメーターをここのように使用し

  6. ただし、ここではデフォルトのimu parametersのみを使用することをお勧めします
    彼らは十分なはずです。 (または、デフォルト値の3倍のように、わずかに増やします)

  7. ここで説明しD435i SDKからIMU calibrationを実行することをお勧めします

@FaboNo
ちなみに、D435iの元の作者からのデフォルトのparameter / yamlファイルはかなり前に動作することを確認しました。
すべて0の歪み値があり、焦点距離/主点の値と公称body_T_cam値のみの場合でも。

大きな歪み値を持つequidistantカメラ固有のキャリブレーション結果が主な問題だと思います。

@engcangメッセージありがとうございます。実際、画像はすでに修正されているので、Kalibrを実行してもほとんど
それらは修正されるので、歪みも0に等しくなければなりません。

@marufinoメッセージありがとうございます。明日試してみてお知らせします。

@FaboNo
この問題に関するニュースはありますか? うまくいきましたか?
最近、Intel D435iでVINS-Fusion(ステレオ)をテストする機会がありました。まだ興味がある場合は、結果クリップを次に示します。

@engcang返信が遅くなってすみません。 私はビデオを見ました、そしてそれは印象的です。 ですから、主にPixHawk4を使用したため、質問はほとんどありません。

  • IMUの精度がD435iよりも優れているということですか?
  • IMUデータを100Hz、200Hzのどの周波数で読み取っていますか?
  • PX4を使用しましたか?使用している場合は、Mavrosを使用してデータを読み取りましたか? 個人的にPixHawk2を試しましたが、説得力がなく、IMU周波数を100Hz以上に上げることができませんでした。
    とてもいい仕事です!

@FaboNoこんにちは。

  • はい。 Pixhawk4miniのIMUはD435iよりも優れていると思います。 原因Pixhawk4 miniは、2つの6DOF IMUと1つの磁力計を使用し、それらをフィルタリングして1つのROSトピックを出力します(フィルタリングについては100%確実ではありませんが、2つのIMUがあります)。
  • 100Hzを使用しました。
  • はい、PX4とMAVROSを使用しました。 最大で約150Hzを取得できたのを覚えていますが、どこかからIMUとカメラFPSの3:1の比率がVINSに最適であることがわかりました。 普段は30Hzのカメラを使っているので、100Hzが適切だと思いました。

@engcang
とにかくセットアップを試してみます

@FaboNo
やあ。 通常、yamlファイルのIMUパラメーターは変更しません。 また、 Kalibr_allanから取得したIMUパラメータを設定しようとし
しかし、私はそれらを使用してより良いパフォーマンスを得ることができませんでした。

四足歩行ロボットが地面に強く接触するようなクレイジーな場合にのみ、パラメーターを10倍以下に設定しようとしますが、それは機能します。

このページは役に立ちましたか?
0 / 5 - 0 評価