Como você é um dos poucos que conseguiu rodar o VINS-FUSION no modo VIO, volto para esclarecer alguns pontos e pedir seu feedback.
Estou tentando executar o VINS FUSION com um D435i (como muitas pessoas, eu acho). Usando o launch disponível realsense_stereo_imu_config.yaml eu experimentei o que muitas pessoas relataram, assim que você toca a câmera, a pose computada fica louca.
Então, usei o 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
Acho que a calibração está ok porque quando executo o VINS_FUSION com esses parâmetros (imu = 0), obtive um comportamento decente. Terei o maior prazer em compartilhar o relatório em PDF com você, se necessário, porque não sou um especialista nessa área.
accelerometer_noise_density: 0.0011060 #Noise density (continuous-time)
accelerometer_random_walk: 8.6056e-05 #Bias random walk
mas para o giroscópio eu sou claramente cético:
porque os valores são os seguintes:
gyroscope_noise_density: 50.427 #Noise density (continuous-time)
gyroscope_random_walk: 0.3480 #Bias random walk
Gostaria de saber a sua opinião sobre esses valores?
No entanto, consegui fazer uma calibração da câmera 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
Aqui também me surpreendo porque o timeshift é NEGATIVO! É possível?
Em relação à transformação da câmera, de um tópico relacionado a VINS_FUSION, entendi que body_T_cam0 / 1 é a transformação do quadro da câmera para o quadro IMU
p = body_T_cam0 * q
p: point in IMU coordinates
q: point in camera coordinates
e com Kalibr T_cam_imu é a extrínseca IMU: transformação de IMU em coordenadas de câmera (T_c_i), mas estou confuso até agora para obter o formato correto usado por VINS_FUSION.
No entanto, apesar de todo esse trabalho, ainda não consigo rodar o VINS com o IMU. Desculpe por demorar tanto, mas você vê algo de errado aqui que pode explicar por que não está funcionando?
Muito obrigado
@FaboNo consegui fazer funcionar com a configuração abaixo, não
Usei left.yaml e right.yaml fornecidos neste repo
Certifique-se de desligar a exposição automática e desligar o emissor de IV nas opções 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 Hi FaboNo. Eu sinto muito pelo atraso de resposta. Não reconheci que tenho um novo problema.
Em primeiro lugar, recomendo que você calibre o modelo de sua câmera com pinhold-radtan
, em vez de equidistant
, que você usou.
Após as calibrações corretas da câmera, tente executar o VINS-Fusion com 2 câmeras e modo 0 imu.
Deve funcionar bem primeiro (em movimentos fáceis, sem movimento rápido ou rotação pura)
Certifique-se de que o conjunto de body_T_cam
seja a matriz T_cam_imu
do resultado Kalibr .
Verifique também seu body_T_cam0 e 1 antes de executar o modo de apenas 2 câmeras (acima).
negativo timeshift_cam_imu
é o valor normal para d435i, o que significa que a câmera é posterior a IMU.
Você não precisa executar o Kalibr Allan para sua calibração IMU, o que não era adequado para d435i pela minha experiência,
em vez disso, encontrei o modelo IMU do d435i e apenas usei o parâmetro desse modelo específico como aqui
No entanto, eu recomendo usar apenas imu parameters
padrão como aqui
Eles devem ser o suficiente. (ou, apenas aumente-os ligeiramente, como 3 vezes dos valores padrão)
Eu recomendo que você execute IMU calibration
do D435i SDK conforme expliquei aqui
@FaboNo
A propósito, eu verifiquei os arquivos de parâmetro / yaml padrão dos autores originais para o D435i funcionar muito bem antes.
Mesmo com todos os valores de distorção 0 e apenas distâncias focais / valores de pontos principais e valores nominais de body_T_cam
.
Acho que os resultados da calibração intrínseca da câmera equidistant
com valores de distorção enormes são o principal problema.
@engcang obrigado pela sua mensagem, na verdade as imagens já estão retificadas então rode o Kalibr nele é quase inútil não?
À medida que são retificados, a distorção deve ser igual a 0 também.
@marufino muito obrigado pela sua mensagem, vou tentar amanhã e te avisar
@FaboNo
Alguma novidade para este problema? Você conseguiu fazer funcionar?
Recentemente, tive a chance de testar o VINS-Fusion (estéreo) com Intel D435i e aqui está o clipe de resultado , se você ainda estiver interessado.
@engcang Lamento responder tão tarde. Eu vi o vídeo e é impressionante. Portanto, tenho algumas perguntas para você, principalmente porque você usou o PixHawk4.
@FaboNo Hi.
@engcang obrigado por sua resposta. Eu gostaria de saber se você alterou os valores dos parâmetros imu no realsense_stereo_imu_config.yaml ou os manteve inalterados?
Vou tentar sua configuração de qualquer maneira
@FaboNo
Oi. Normalmente, eu não altero os parâmetros IMU no arquivo yaml. Eu também tentei definir parâmetros IMU como obtive de Kalibr_allan ,
entretanto, não consegui obter um melhor desempenho com eles.
Apenas para casos malucos, como robôs quadrúpedes em contato com o solo com força, tento definir parâmetros 10 vezes maiores ou menos, e funciona.
Comentários muito úteis
@FaboNo Hi.