Vins-application: algunas entradas sobre D435i + vins_fusion

Creado en 16 sept. 2020  ·  9Comentarios  ·  Fuente: engcang/vins-application

Como usted es uno de los pocos que pudo ejecutar VINS-FUSION en un modo VIO, vuelvo a hablar con usted para aclarar algunos puntos y solicitar sus comentarios.

Estoy tratando de ejecutar VINS FUSION con un D435i (como muchas personas, supongo). Usando el lanzamiento disponible realsense_stereo_imu_config.yaml experimenté lo que la gente informó, tan pronto como tocas la cámara, la pose calculada se volvió loca.

Entonces usé Kalibr:

  • para calibrar las cámaras y obtuve el siguiente resultado:
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

Creo que la calibración está bien porque cuando ejecuto VINS_FUSION con estos parámetros (imu = 0), obtengo un comportamiento decente. Estaré más que feliz de compartir el informe en pdf con usted si es necesario porque no soy un experto en ese campo.

  • La calibración de la cámara IMu no fue tan sencilla porque no tengo la densidad de ruido y los valores de caminata aleatoria. Así que utilicé el software de varianza de Allan y algo de código de matlab y obtuve esto para la aceleración
    allan_acc
accelerometer_noise_density: 0.0011060    #Noise density (continuous-time)
accelerometer_random_walk:   8.6056e-05    #Bias random walk

pero para el giróscopo soy claramente escéptico:
allan_gyro

porque los valores son los siguientes:

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

¿Aquí me gustaría conocer su opinión sobre estos valores?

Sin embargo, pude hacer una calibración de la cámara 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

¡Aquí también estoy sorprendido porque el timehift es NEGATIVO! ¿Es posible?
Con respecto a la transformación de la cámara, de un hilo relacionado con VINS_FUSION, entendí que body_T_cam0 / 1 es la transformación del marco de la cámara al marco de la IMU.

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

y con Kalibr T_cam_imu es la extrínseca de IMU: transformación de IMU a coordenadas de cámara (T_c_i) pero estoy desconcertado hasta ahora para obtener el formato correcto utilizado por VINS_FUSION.

Sin embargo, a pesar de todo este trabajo, todavía no puedo ejecutar VINS con la IMU. Perdón por demorarme tanto, pero ¿ves algo mal aquí que pueda explicar por qué no funciona?

Muchas gracias

Comentario más útil

@FaboNo Hola.

  • Si. Creo que Pixhawk4 mini tiene mejor IMU que D435i. Porque Pixhawk 4 mini usa dos IMU 6DOF y un magnetómetro y luego los filtra para generar un tema ROS (no 100% seguro para el filtrado, pero tienen dos IMU).
  • Usé 100Hz.
  • Sí, usé PX4 y MAVROS. Recuerdo que podría obtener alrededor de 150Hz como máximo, pero desde algún lugar vi que la relación 3: 1 para IMU y FPS de cámara es óptima para VINS. Usualmente usamos una cámara de 30Hz, así que pensé que 100Hz es lo correcto.

Todos 9 comentarios

@FaboNo Logré que funcionara con la configuración a continuación, no necesité ejecutar mis propias calibraciones y, estoy seguro de que podría funcionar mejor con una calibración adecuada, pero funciona bien y no diverge

Usé left.yaml y right.yaml proporcionados en este repositorio

Asegúrese de que está desactivando la exposición automática y el emisor de infrarrojos en las opciones de sentido real,

%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 Hola FaboNo. Lamento mucho haber respondido tarde. No reconocí que tengo un nuevo problema.

  1. En primer lugar, le recomiendo que calibre el modelo de su cámara con pinhold-radtan , en lugar de equidistant , que utilizó.

  2. Después de las calibraciones correctas de la cámara, intente ejecutar VINS-Fusion con 2 cámaras y 0 modo imu.
    Primero debería funcionar bien (con movimientos fáciles, sin movimiento rápido o rotación pura)

  3. Asegúrese de que su body_T_cam sea ​​la matriz inversa de T_cam_imu de su resultado de Kalibr .
    También verifique su body_T_cam0 y 1 antes de ejecutar solo el modo de 2 cámaras (arriba).

  4. negativo timeshift_cam_imu es el valor normal para d435i, lo que significa que la cámara es posterior a IMU.

  5. No tiene que ejecutar Kalibr Allan para su calibraiton IMU, que no era adecuado para d435i para mi experiencia,
    más bien encontré el modelo IMU de d435i y luego usé el parámetro de ese modelo específico como aquí

  6. Sin embargo, recomiendo usar solo imu parameters como aquí
    Deberían ser suficientes. (o, simplemente, auméntelos ligeramente, como 3 veces los valores predeterminados)

  7. Te recomiendo que ejecutes IMU calibration desde D435i SDK como expliqué aquí

@FaboNo
Por cierto, verifiqué los archivos de parámetro / yaml predeterminados de los autores originales para que D435i funcionara bastante bien antes.
Incluso con todos los valores de distorsión 0 y solo valores de distancias focales / puntos principales y valores nominales body_T_cam .

Creo que los resultados de calibración intrínsecos de su cámara equidistant con valores de distorsión enormes son el principal problema.

@engcang gracias por tu mensaje, en realidad las imágenes ya están rectificadas, así que ejecutar Kalibr es casi inútil, ¿no?
A medida que se rectifican, la distorsión también debe ser igual a 0.

@marufino muchas gracias por tu mensaje, lo intentaré mañana y te lo haré saber

@FaboNo
¿Alguna novedad para este tema? ¿Lo hiciste funcionar?
Recientemente tuve la oportunidad de probar VINS-Fusion (estéreo) con Intel D435i y aquí está el clip de resultados , si aún está interesado.

@engcang Lamento responder tan tarde. Vi el video y es impresionante. Así que tengo algunas preguntas para ti, principalmente porque usaste PixHawk4.

  • ¿Significa que la precisión de la IMU es mejor que la de la D435i?
  • ¿A qué frecuencia está leyendo los datos de IMU de 100 hz, 200 hz?
  • ¿Usó PX4 y, de ser así, usó Mavros para leer los datos? Personalmente probé PixHawk2 y no fue convincente y no pude aumentar la frecuencia IMU más de 100Hz
    ¡Muy buen trabajo!

@FaboNo Hola.

  • Si. Creo que Pixhawk4 mini tiene mejor IMU que D435i. Porque Pixhawk 4 mini usa dos IMU 6DOF y un magnetómetro y luego los filtra para generar un tema ROS (no 100% seguro para el filtrado, pero tienen dos IMU).
  • Usé 100Hz.
  • Sí, usé PX4 y MAVROS. Recuerdo que podría obtener alrededor de 150Hz como máximo, pero desde algún lugar vi que la relación 3: 1 para IMU y FPS de cámara es óptima para VINS. Usualmente usamos una cámara de 30Hz, así que pensé que 100Hz es lo correcto.

@engcang gracias por su respuesta. Me pregunto, ¿cambió los valores de los parámetros imu en realsense_stereo_imu_config.yaml o los mantuvo sin cambios?
Intentaré tu configuración de todos modos

@FaboNo
Hola. Por lo general, no cambio los parámetros de IMU en el archivo yaml. También intenté configurar los parámetros de IMU como obtuve de Kalibr_allan ,
sin embargo, no pude obtener un mejor rendimiento usándolos.

Solo para casos locos como los robots cuadrúpedos que entran en contacto con el suelo con fuerza, trato de establecer parámetros 10 veces más grandes o menos, y funciona.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

franciscolourenco picture franciscolourenco  ·  15Comentarios

andersk picture andersk  ·  81Comentarios

rburchell picture rburchell  ·  11Comentarios

ultimatexemnas picture ultimatexemnas  ·  37Comentarios

dictoon picture dictoon  ·  10Comentarios