Vins-application: algumas entradas sobre D435i + vins_fusion

Criado em 16 set. 2020  ·  9Comentários  ·  Fonte: engcang/vins-application

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:

  • para calibrar as câmeras e obtive o seguinte 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

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.

  • A calibração da câmera IMu não foi tão direta porque não tenho os valores de densidade de ruído e caminhada randm. Usei o software de variância Allan e alguns códigos do matlab e peguei isso para a aceleração
    allan_acc
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:
allan_gyro

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

Comentários muito úteis

@FaboNo Hi.

  • sim. Acho que o Pixhawk4 mini tem uma IMU melhor do que o D435i. Causa Pixhawk 4 mini usa dois 6DOF IMU e um magnetômetro e então os filtra para produzir um tópico ROS (não 100% seguro para filtragem, mas eles têm dois IMU).
  • Usei 100Hz.
  • Sim, usei PX4 e MAVROS. Lembro-me que poderia chegar a cerca de 150 Hz no máximo, mas de algum lugar vi que a proporção de 3: 1 para IMU e FPS de câmera é ideal para VINS. Normalmente usamos câmera de 30 Hz, então achei 100 Hz adequado.

Todos 9 comentários

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

  1. Em primeiro lugar, recomendo que você calibre o modelo de sua câmera com pinhold-radtan , em vez de equidistant , que você usou.

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

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

  4. negativo timeshift_cam_imu é o valor normal para d435i, o que significa que a câmera é posterior a IMU.

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

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

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

  • Isso significa que a precisão da IMU é melhor do que a do D435i?
  • Com que frequência você está lendo os dados IMU 100Hz, 200Hz?
  • Você usou o PX4 e, em caso afirmativo, você usou o Mavros para ler os dados? Pessoalmente, tentei PixHawk2 e não foi convincente e não fui capaz de aumentar a frequência IMU para mais de 100 Hz
    Muito bom trabalho!

@FaboNo Hi.

  • sim. Acho que o Pixhawk4 mini tem uma IMU melhor do que o D435i. Causa Pixhawk 4 mini usa dois 6DOF IMU e um magnetômetro e então os filtra para produzir um tópico ROS (não 100% seguro para filtragem, mas eles têm dois IMU).
  • Usei 100Hz.
  • Sim, usei PX4 e MAVROS. Lembro-me que poderia chegar a cerca de 150 Hz no máximo, mas de algum lugar vi que a proporção de 3: 1 para IMU e FPS de câmera é ideal para VINS. Normalmente usamos câmera de 30 Hz, então achei 100 Hz adequado.

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

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Nothin99 picture Nothin99  ·  3Comentários

lardissone picture lardissone  ·  3Comentários

Bardo-Konrad picture Bardo-Konrad  ·  3Comentários

AndreaOrru picture AndreaOrru  ·  3Comentários

sscarduzio picture sscarduzio  ·  3Comentários