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:
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.
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:
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
@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.
En primer lugar, le recomiendo que calibre el modelo de su cámara con pinhold-radtan
, en lugar de equidistant
, que utilizó.
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)
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).
negativo timeshift_cam_imu
es el valor normal para d435i, lo que significa que la cámara es posterior a IMU.
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í
Sin embargo, recomiendo usar solo imu parameters
como aquí
Deberían ser suficientes. (o, simplemente, auméntelos ligeramente, como 3 veces los valores predeterminados)
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.
@FaboNo Hola.
@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.
Comentario más útil
@FaboNo Hola.