Vins-application: beberapa masukan mengenai D435i + vins_fusion

Dibuat pada 16 Sep 2020  ·  9Komentar  ·  Sumber: engcang/vins-application

Karena Anda adalah salah satu dari sedikit yang dapat menjalankan VINS-FUSION pada mode VIO, saya kembali kepada Anda untuk mengklarifikasi beberapa poin dan meminta tanggapan Anda.

Saya mencoba menjalankan VINS FUSION dengan D435i (seperti banyak orang saya kira). Menggunakan peluncuran yang tersedia realsense_stereo_imu_config.yaml Saya mengalami apa yang mungkin dilaporkan orang, segera setelah Anda menyentuh kamera, pose yang dihitung menjadi gila.

Jadi saya menggunakan Kalibr :

  • untuk mengkalibrasi kamera dan saya mendapatkan hasil berikut:
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

Saya pikir kalibrasinya ok karena ketika saya menjalankan VINS_FUSION dengan parameter ini (imu = 0), saya mendapatkan perilaku yang layak. Saya akan dengan senang hati membagikan laporan pdf dengan Anda jika perlu karena saya bukan ahli di bidang itu.

  • Kalibrasi IMu kamera, tidak begitu mudah karena saya tidak memiliki kepadatan noise dan nilai randm walk. Jadi saya menggunakan perangkat lunak varian Allan dan beberapa kode dari matlab dan saya mendapatkan ini untuk akselerasi
    allan_acc
accelerometer_noise_density: 0.0011060    #Noise density (continuous-time)
accelerometer_random_walk:   8.6056e-05    #Bias random walk

tetapi untuk gyro saya jelas skeptis:
allan_gyro

karena nilainya adalah sebagai berikut:

gyroscope_noise_density:     50.427    #Noise density (continuous-time)
gyroscope_random_walk:       0.3480    #Bias random walk

Di sini saya ingin mendapatkan pendapat Anda tentang nilai-nilai ini?

Namun saya dapat melakukan kalibrasi kamera-imu:

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

Disini saya juga kaget karena timeshiftnya NEGATIF! Apa itu mungkin?
Mengenai transformasi kamera, dari utas yang terkait dengan VINS_FUSION, saya memahami bahwa body_T_cam0/1 adalah transformasi dari bingkai kamera ke bingkai IMU

p = body_T_cam0 * q
p: point in IMU coordinates
q: point in camera coordinates

dan dengan Kalibr T_cam_imu adalah ekstrinsik IMU: transformasi dari IMU ke koordinat kamera (T_c_i) tapi sejauh ini saya bingung untuk mendapatkan format yang tepat yang digunakan oleh VINS_FUSION.

Namun terlepas dari semua pekerjaan ini, saya masih tidak dapat menjalankan VINS dengan IMU. Maaf karena terlalu lama, tetapi apakah Anda melihat sesuatu yang salah di sini yang dapat menjelaskan mengapa itu tidak berfungsi?

Terima kasih banyak

Komentar yang paling membantu

@FaboNo Hai.

  • Ya. Saya pikir Pixhawk4 mini memiliki IMU yang lebih baik daripada D435i. Penyebab Pixhawk 4 mini menggunakan dua 6DOF IMU dan satu magnetometer dan kemudian memfilternya untuk menghasilkan satu topik ROS (tidak 100% yakin untuk memfilter, tetapi mereka memiliki dua IMU).
  • Saya menggunakan 100Hz.
  • Ya, saya menggunakan PX4 dan MAVROS. Saya ingat saya bisa mendapatkan sekitar 150Hz secara maksimal, tetapi dari suatu tempat saya melihat bahwa rasio 3:1 untuk IMU dan FPS kamera optimal untuk VINS. Kami biasanya menggunakan kamera 30Hz, jadi saya pikir 100Hz sudah tepat.

Semua 9 komentar

@FaboNo Saya berhasil membuatnya bekerja dengan konfigurasi di bawah ini, tidak perlu menjalankan kalibrasi saya sendiri dan, saya yakin itu bisa bekerja lebih baik dengan kalibrasi yang tepat, tetapi berfungsi dengan baik dan tidak menyimpang

Saya menggunakan left.yaml dan right.yaml yang disediakan di repo ini

Pastikan Anda mematikan autoexposure dan mematikan pemancar IR di opsi realsense,

%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 Hai FaboNo. Saya sangat menyesal karena terlambat membalas. Saya tidak menyadari bahwa saya mendapat masalah baru.

  1. Pertama-tama, saya sarankan Anda untuk mengkalibrasi model kamera Anda dengan pinhold-radtan , daripada equidistant , yang Anda gunakan.

  2. Setelah kalibrasi kamera yang benar, coba jalankan VINS-Fusion dengan 2 kamera dan 0 mode imu.
    Ini harus bekerja dengan baik terlebih dahulu (di bawah gerakan mudah, tanpa gerakan cepat atau rotasi murni)

  3. Pastikan bahwa set body_T_cam adalah matriks invers T_cam_imu dari hasil Kalibr Anda.
    Periksa juga body_T_cam0 dan 1 Anda sebelum menjalankan hanya 2 mode kamera (di atas).

  4. negatif timeshift_cam_imu adalah nilai normal untuk d435i, yang berarti kamera lebih lambat dari IMU.

  5. Anda tidak harus menjalankan Kalibr Allan untuk
    alih-alih saya menemukan model IMU d435i dan kemudian hanya menggunakan parameter model spesifik itu seperti di sini

  6. Namun, saya sarankan untuk menggunakan default imu parameters seperti di sini
    Mereka harus cukup. (atau, naikkan sedikit saja, seperti 3 kali lipat dari nilai default)

  7. Saya sarankan Anda untuk menjalankan IMU calibration dari D435i SDK seperti yang saya jelaskan di sini

@FaboNo
Omong-omong, saya memeriksa parameter default/ file yaml dari penulis asli untuk D435i bekerja cukup baik sebelumnya.
Bahkan dengan semua 0 nilai distorsi dan hanya nilai panjang fokus/titik utama dan nilai nominal body_T_cam .

Saya pikir hasil kalibrasi intrinsik kamera equidistant dengan nilai distorsi yang besar adalah masalah utama.

@engcang terima kasih atas pesannya, sebenarnya gambar sudah diperbaiki jadi menjalankan Kalibr di atasnya hampir tidak berguna bukan?
Saat mereka diperbaiki, distorsi harus sama dengan 0 juga.

@marufino terima kasih banyak atas pesan Anda, saya akan mencobanya besok dan memberi tahu Anda

@FaboNo
Ada berita untuk masalah ini? Apakah Anda berhasil?
Baru-baru ini saya berkesempatan untuk menguji VINS-Fusion (stereo) dengan Intel D435i dan inilah klip hasilnya , jika Anda tertarik.

@engcang maaf saya telat membalasnya. Saya melihat videonya dan itu sangat mengesankan. Jadi saya punya beberapa pertanyaan untuk Anda, terutama karena Anda menggunakan PixHawk4.

  • Apakah ini berarti akurasi IMU lebih baik dari D435i?
  • Pada frekuensi berapa Anda membaca data IMU 100hz, 200hz ?
  • Apakah Anda menggunakan PX4 dan jika demikian, apakah Anda menggunakan Mavros untuk membaca data? Secara pribadi saya mencoba PixHawk2 dan itu tidak meyakinkan dan saya tidak dapat meningkatkan frekuensi IMU lebih dari 100Hz
    Kerja yang sangat bagus!

@FaboNo Hai.

  • Ya. Saya pikir Pixhawk4 mini memiliki IMU yang lebih baik daripada D435i. Penyebab Pixhawk 4 mini menggunakan dua 6DOF IMU dan satu magnetometer dan kemudian memfilternya untuk menghasilkan satu topik ROS (tidak 100% yakin untuk memfilter, tetapi mereka memiliki dua IMU).
  • Saya menggunakan 100Hz.
  • Ya, saya menggunakan PX4 dan MAVROS. Saya ingat saya bisa mendapatkan sekitar 150Hz secara maksimal, tetapi dari suatu tempat saya melihat bahwa rasio 3:1 untuk IMU dan FPS kamera optimal untuk VINS. Kami biasanya menggunakan kamera 30Hz, jadi saya pikir 100Hz sudah tepat.

@engcang terima kasih atas tanggapannya. Saya ingin tahu apakah Anda mengubah nilai parameter imu di realsense_stereo_imu_config.yaml atau membiarkannya tidak berubah?
Saya akan mencoba pengaturan Anda

@FaboNo
Hai. Biasanya, saya tidak mengubah parameter IMU di file yaml. Saya juga mencoba mengatur parameter IMU seperti yang saya dapatkan dari Kalibr_allan ,
namun saya tidak bisa mendapatkan kinerja yang lebih baik dengan menggunakannya.

Hanya untuk kasus gila seperti robot berkaki empat yang menyentuh tanah dengan keras, saya mencoba mengatur parameter 10 kali lebih besar atau lebih kecil, dan berhasil.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat