Vins-application: quelques entrées concernant D435i + vins_fusion

Créé le 16 sept. 2020  ·  9Commentaires  ·  Source: engcang/vins-application

Comme vous êtes l'un des rares à avoir pu faire tourner VINS-FUSION en mode VIO, je reviens vers vous pour clarifier certains points et vous demander votre avis.

J'essaie d'exécuter VINS FUSION avec un D435i (comme beaucoup de gens je suppose). En utilisant le lancement disponible realsense_stereo_imu_config.yaml, j'ai expérimenté ce que les gens ont rapporté, dès que vous touchez la caméra, la pose calculée est devenue folle.

J'ai donc utilisé Kalibr :

  • pour calibrer les caméras et j'ai obtenu le résultat suivant :
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

Je pense que le calibrage est correct car lorsque je lance VINS_FUSION avec ces paramètres (imu = 0), j'ai un comportement décent. Je serai plus qu'heureux de partager le rapport pdf avec vous si nécessaire car je ne suis pas un expert dans ce domaine.

  • L'étalonnage de la caméra IMu n'était pas si simple car je n'ai pas les valeurs de densité de bruit et de marche aléatoire. J'ai donc utilisé le logiciel Allan variance et du code de matlab et j'ai obtenu ceci pour l'accélération
    allan_acc
accelerometer_noise_density: 0.0011060    #Noise density (continuous-time)
accelerometer_random_walk:   8.6056e-05    #Bias random walk

mais pour le gyroscope je suis clairement sceptique :
allan_gyro

car les valeurs sont les suivantes :

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

J'aimerais ici avoir votre avis sur ces valeurs ?

Cependant j'ai pu faire un calibrage de l'imu-caméra :

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

Là aussi je suis surprise car le timeshift est NÉGATIF ​​! Est-il possible?
En ce qui concerne la transformation de la caméra, à partir d'un fil lié à VINS_FUSION, j'ai compris que body_T_cam0/1 est la transformation du cadre de la caméra vers le cadre IMU

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

et avec Kalibr T_cam_imu est l'extrinsèque de l'IMU : transformation de l'IMU en coordonnées de caméra (T_c_i) mais je suis jusqu'à présent perplexe pour obtenir le bon format utilisé par VINS_FUSION.

Cependant, malgré tout ce travail, je ne parviens toujours pas à exécuter VINS avec l'IMU. Désolé d'avoir été si long, mais voyez-vous quelque chose qui ne va pas ici qui pourrait expliquer pourquoi cela ne fonctionne pas ?

Merci beaucoup

Commentaire le plus utile

@FaboNo Salut.

  • Oui. Je pense que Pixhawk4 mini a une meilleure IMU que D435i. Cause Pixhawk 4 mini utilise deux IMU 6DOF et un magnétomètre, puis les filtre pour sortir un sujet ROS (pas sûr à 100% pour le filtrage, mais ils ont deux IMU).
  • J'ai utilisé 100 Hz.
  • Oui j'ai utilisé PX4 et MAVROS. Je me souviens que je pouvais obtenir environ 150 Hz au maximum, mais quelque part, j'ai vu que le rapport 3:1 pour l'IMU et le FPS de la caméra est optimal pour VINS. Nous utilisons généralement une caméra à 30 Hz, j'ai donc pensé que 100 Hz était approprié.

Tous les 9 commentaires

@FaboNo J'ai réussi à le faire fonctionner avec la configuration ci-dessous, je n'ai pas eu besoin d'exécuter mes propres étalonnages et, je suis sûr que cela pourrait mieux fonctionner avec un étalonnage approprié, mais cela fonctionne bien et ne diverge pas

J'ai utilisé les fichiers left.yaml et right.yaml fournis dans ce référentiel

Assurez-vous que vous désactivez l'exposition automatique et désactivez l'émetteur IR dans les options 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 Salut FaboNo. Je suis vraiment désolé pour la réponse tardive. Je ne savais pas que j'avais un nouveau problème.

  1. Tout d'abord, je vous recommande de calibrer votre modèle de caméra avec pinhold-radtan , plutôt que equidistant , que vous avez utilisé.

  2. Après les bons étalonnages de la caméra, essayez d'exécuter VINS-Fusion avec 2 caméras et 0 mode imu.
    Cela devrait bien fonctionner en premier (sous des mouvements faciles, sans mouvement rapide ni rotation pure)

  3. Assurez-vous que votre body_T_cam est une matrice T_cam_imu partir de votre résultat Kalibr .
    Vérifiez également vos body_T_cam0 et 1 avant d'exécuter uniquement le mode 2 caméras (ci-dessus).

  4. négatif timeshift_cam_imu est la valeur normale pour d435i, ce qui signifie que la caméra est postérieure à l'IMU.

  5. Vous n'êtes pas obligé d'exécuter Kalibr Allan pour votre étalonnage IMU, qui ne convenait pas au d435i pour mon expérience,
    J'ai plutôt trouvé le modèle IMU du d435i, puis j'ai simplement utilisé le paramètre de ce modèle spécifique comme

  6. Cependant, je recommande d'utiliser uniquement par défaut imu parameters comme ici
    Ils devraient suffire. (ou, augmentez-les légèrement, comme 3 fois les valeurs par défaut)

  7. Je vous recommande d'exécuter IMU calibration partir du SDK D435i comme je l'ai expliqué ici

@FaboNo
Au fait, j'ai vérifié que les fichiers de paramètres/yaml par défaut des auteurs originaux pour D435i fonctionnaient assez bien auparavant.
Même avec toutes les valeurs de distorsion 0 et uniquement les valeurs focales/points principaux et les valeurs nominales body_T_cam .

Je pense que les résultats d'étalonnage intrinsèque de votre caméra equidistant avec des valeurs de distorsion énormes sont le principal problème.

@engcang merci pour ton message, en fait les images sont déjà rectifiées donc lancer Kalibr dessus c'est presque inutile non ?
Comme elles sont rectifiées, la distorsion doit également être égale à 0.

@marufino merci beaucoup pour votre message, je vais essayer demain et je vous tiens au courant

@FaboNo
Des nouvelles de ce problème ? L'avez-vous fait fonctionner ?
J'ai récemment eu la chance de tester VINS-Fusion (stéréo) avec Intel D435i et voici le clip du

@engcang, je suis désolé de répondre si tard. J'ai vu la vidéo et elle est impressionnante. J'ai donc quelques questions à vous poser, principalement parce que vous avez utilisé le PixHawk4.

  • Cela signifie-t-il que la précision de l'IMU est meilleure que celle du D435i ?
  • A quelle fréquence lisez-vous les données IMU 100hz, 200hz ?
  • Avez-vous utilisé PX4 et si oui, avez-vous utilisé Mavros pour lire les données ? Personnellement j'ai essayé PixHawk2 et ce n'était pas convaincant et je n'ai pas pu augmenter la fréquence IMU de plus de 100Hz
    Très bon travail!

@FaboNo Salut.

  • Oui. Je pense que Pixhawk4 mini a une meilleure IMU que D435i. Cause Pixhawk 4 mini utilise deux IMU 6DOF et un magnétomètre, puis les filtre pour sortir un sujet ROS (pas sûr à 100% pour le filtrage, mais ils ont deux IMU).
  • J'ai utilisé 100 Hz.
  • Oui j'ai utilisé PX4 et MAVROS. Je me souviens que je pouvais obtenir environ 150 Hz au maximum, mais quelque part, j'ai vu que le rapport 3:1 pour l'IMU et le FPS de la caméra est optimal pour VINS. Nous utilisons généralement une caméra à 30 Hz, j'ai donc pensé que 100 Hz était approprié.

@engcang merci pour votre réponse. Je me demande si vous avez modifié les valeurs des paramètres imu dans realsense_stereo_imu_config.yaml ou les avez-vous conservées inchangées ?
je vais quand même essayer ta configuration

@FaboNo
Salut. Habituellement, je ne modifie pas les paramètres IMU dans le fichier yaml. J'ai également essayé de définir les paramètres de l'IMU comme je l'ai obtenu de Kalibr_allan ,
Cependant, je n'ai pas pu obtenir de meilleures performances en les utilisant.

Seulement pour les cas fous comme les robots quadrupèdes en contact dur avec le sol, j'essaie de définir des paramètres 10 fois plus gros ou moins, et ça marche.

Cette page vous a été utile?
0 / 5 - 0 notes