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 :
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.
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 :
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
@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.
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é.
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)
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).
négatif timeshift_cam_imu
est la valeur normale pour d435i, ce qui signifie que la caméra est postérieure à l'IMU.
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
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)
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.
@FaboNo Salut.
@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.
Commentaire le plus utile
@FaboNo Salut.