Da Sie einer der ganz wenigen sind, die VINS-FUSION in einem VIO-Modus betreiben konnten, komme ich auf Sie zurück, um einige Punkte zu klären und um Ihr Feedback zu bitten.
Ich versuche, VINS FUSION mit einem D435i zu betreiben (wie viele Leute, denke ich). Mit dem verfügbaren Launch realsense_stereo_imu_config.yaml erlebte ich, was viele Leute berichteten, sobald man die Kamera berührte, wurde die berechnete Pose verrückt.
Also habe ich Kalibr verwendet:
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
Ich denke, die Kalibrierung ist in Ordnung, denn wenn ich VINS_FUSION mit diesen Parametern (imu = 0) ausführe, habe ich ein anständiges Verhalten. Den pdf-Bericht teile ich Ihnen bei Bedarf gerne mit, da ich kein Experte auf diesem Gebiet bin.
accelerometer_noise_density: 0.0011060 #Noise density (continuous-time)
accelerometer_random_walk: 8.6056e-05 #Bias random walk
aber beim gyro bin ich eindeutig skeptisch:
denn die Werte sind folgende:
gyroscope_noise_density: 50.427 #Noise density (continuous-time)
gyroscope_random_walk: 0.3480 #Bias random walk
Hier würde ich gerne Ihre Meinung zu diesen Werten erfahren?
Ich konnte jedoch eine imu-Kamerakalibrierung durchführen:
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
Hier wundere ich mich auch, denn die Zeitverschiebung ist NEGATIV! Ist es möglich?
In Bezug auf die Kameratransformation habe ich aus einem Thread zu VINS_FUSION verstanden, dass body_T_cam0/1 die Transformation vom Kamerarahmen zum IMU-Rahmen ist
p = body_T_cam0 * q
p: point in IMU coordinates
q: point in camera coordinates
und mit Kalibr T_cam_imu ist die IMU extrinsics: Transformation von IMU zu Kamerakoordinaten (T_c_i) aber ich bin bisher ratlos, das richtige Format von VINS_FUSION zu verwenden.
Aber trotz all dieser Arbeit kann ich VINS immer noch nicht mit der IMU ausführen. Entschuldigen Sie, dass es so lange dauert, aber sehen Sie hier etwas falsch, das möglicherweise erklärt, warum es nicht funktioniert?
Danke vielmals
@FaboNo Ich habe es mit der folgenden Konfiguration geschafft, meine eigenen Kalibrierungen auszuführen, und ich bin mir sicher, dass es mit einer richtigen Kalibrierung besser funktionieren könnte, aber es funktioniert gut und weicht nicht ab
Ich habe die in diesem Repository bereitgestellten left.yaml und right.yaml verwendet
Stellen Sie sicher, dass Sie die automatische Belichtung und den IR-Sender in den Realsense-Optionen deaktivieren.
%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 Hallo FaboNo. Es tut mir so leid für die späte Antwort. Ich habe nicht erkannt, dass ich ein neues Problem habe.
Zunächst empfehle ich Ihnen, Ihr Kameramodell mit pinhold-radtan
zu kalibrieren, anstatt mit equidistant
, das Sie verwendet haben.
Versuchen Sie nach der Kalibrierung der richtigen Kamera, VINS-Fusion mit 2 Kameras und 0 imu-Modus auszuführen.
Es sollte erstmal gut funktionieren (bei leichten Bewegungen, ohne Zeitraffer oder reine Rotation)
Stellen Sie sicher, dass Ihr body_T_cam
eine inverse Matrix von T_cam_imu
aus Ihrem Kalibr- Ergebnis ist.
Überprüfen Sie auch Ihre body_T_cam0 und 1, bevor Sie nur den 2-Kamera-Modus ausführen (oben).
negativ timeshift_cam_imu
ist der normale Wert für die d435i, was bedeutet, dass die Kamera später als die IMU ist.
Sie müssen Kalibr Allan für Ihre IMU-Kalibrierung nicht ausführen, die meiner Erfahrung nach nicht für d435i geeignet war.
Stattdessen habe ich das IMU-Modell von d435i gefunden und dann einfach den Parameter dieses spezifischen Modells wie hier verwendet
Ich empfehle jedoch, nur die Standardeinstellungen von imu parameters
wie hier zu verwenden
Sie sollten reichen. (oder erhöhen Sie sie einfach leicht, z. B. um das Dreifache der Standardwerte)
Ich empfehle Ihnen, IMU calibration
vom D435i SDK auszuführen, wie ich es hier beschrieben habe
@FaboNo
Übrigens habe ich die Standardparameter-/Yaml-Dateien der Originalautoren für D435i vorher ziemlich gut überprüft.
Sogar mit allen 0-Verzerrungswerten und nur Brennweiten/Hauptpunktwerten und nominellen body_T_cam
Werten.
Ich denke , Ihre equidistant
kameraintrinsische Kalibrierungsergebnisse mit großen Verzerrungswerten das Hauptproblem sind.
@engcang danke für deine Nachricht, eigentlich sind die Bilder bereits korrigiert, also läuft Kalibr darauf fast nutzlos, nein?
Da sie gleichgerichtet sind, muss auch die Verzerrung gleich 0 sein.
@marufino vielen Dank für deine Nachricht, ich werde es morgen ausprobieren und dir Bescheid geben
@FaboNo
Gibt es Neuigkeiten zu diesem Thema? Hast du es hinbekommen?
Ich hatte vor kurzem die Gelegenheit, VINS-Fusion (stereo) mit Intel D435i zu testen und hier ist der Ergebnisclip , falls Sie noch daran interessiert sind.
@engcang Es tut mir leid, so spät zu antworten. Ich habe das Video gesehen und es ist beeindruckend. Daher habe ich einige Fragen an Sie, hauptsächlich weil Sie den PixHawk4 verwendet haben.
@FaboNo Hallo.
@engcang danke für deine Antwort. Ich frage mich, ob Sie die imu-Parameterwerte in der realsense_stereo_imu_config.yaml geändert oder unverändert beibehalten haben?
Ich werde dein Setup trotzdem ausprobieren
@FaboNo
Hi. Normalerweise ändere ich keine IMU-Parameter in der yaml-Datei. Ich habe auch versucht, die IMU-Parameter so einzustellen , wie ich sie von
Allerdings konnte ich mit ihnen keine bessere Leistung erzielen.
Nur für verrückte Fälle wie vierbeinige Roboter, die harten Bodenkontakt haben, versuche ich, Parameter zehnmal größer oder kleiner einzustellen, und es funktioniert.
Hilfreichster Kommentar
@FaboNo Hallo.