Vins-application: einige Eingaben zu D435i + vins_fusion

Erstellt am 16. Sept. 2020  ·  9Kommentare  ·  Quelle: engcang/vins-application

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:

  • die Kameras zu kalibrieren und ich habe folgendes Ergebnis erhalten:
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.

  • Kamera-IMu-Kalibrierung, war nicht so einfach, weil ich die Rauschdichte und die Randm-Walk-Werte nicht habe. Also habe ich die Allan Variance Software und etwas Code von Matlab verwendet und das habe ich zur Beschleunigung bekommen
    allan_acc
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:
allan_gyro

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

Hilfreichster Kommentar

@FaboNo Hallo.

  • Jawohl. Ich denke, Pixhawk4 mini hat eine bessere IMU als D435i. Ursache Pixhawk 4 mini verwendet zwei 6DOF-IMU und ein Magnetometer und filtert sie dann, um ein ROS-Thema auszugeben (nicht 100% sicher für die Filterung, aber sie haben zwei IMU).
  • Ich habe 100Hz verwendet.
  • Ja, ich habe PX4 und MAVROS verwendet. Ich erinnere mich, dass ich maximal 150 Hz erreichen konnte, aber irgendwo habe ich gesehen, dass das 3:1-Verhältnis für IMU und Kamera-FPS optimal für VINS ist. Wir verwenden normalerweise eine 30-Hz-Kamera, daher dachte ich, dass 100 Hz angemessen sind.

Alle 9 Kommentare

@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.

  1. Zunächst empfehle ich Ihnen, Ihr Kameramodell mit pinhold-radtan zu kalibrieren, anstatt mit equidistant , das Sie verwendet haben.

  2. 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)

  3. 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).

  4. negativ timeshift_cam_imu ist der normale Wert für die d435i, was bedeutet, dass die Kamera später als die IMU ist.

  5. 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

  6. 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)

  7. 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.

  • Bedeutet dies, dass die IMU-Genauigkeit besser ist als die des D435i?
  • Auf welcher Frequenz liest du die IMU-Daten 100hz, 200hz ?
  • Haben Sie PX4 verwendet und wenn ja, haben Sie Mavros zum Lesen der Daten verwendet? Persönlich habe ich PixHawk2 ausprobiert und es war nicht überzeugend und ich konnte die IMU-Frequenz nicht auf mehr als 100 Hz erhöhen
    Sehr gute Arbeit!

@FaboNo Hallo.

  • Jawohl. Ich denke, Pixhawk4 mini hat eine bessere IMU als D435i. Ursache Pixhawk 4 mini verwendet zwei 6DOF-IMU und ein Magnetometer und filtert sie dann, um ein ROS-Thema auszugeben (nicht 100% sicher für die Filterung, aber sie haben zwei IMU).
  • Ich habe 100Hz verwendet.
  • Ja, ich habe PX4 und MAVROS verwendet. Ich erinnere mich, dass ich maximal 150 Hz erreichen konnte, aber irgendwo habe ich gesehen, dass das 3:1-Verhältnis für IMU und Kamera-FPS optimal für VINS ist. Wir verwenden normalerweise eine 30-Hz-Kamera, daher dachte ich, dass 100 Hz angemessen sind.

@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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen