Vins-application: некоторые сведения о D435i + vins_fusion

Созданный на 16 сент. 2020  ·  9Комментарии  ·  Источник: engcang/vins-application

Поскольку вы один из очень немногих, кто смог запустить VINS-FUSION в режиме VIO, я возвращаюсь к вам, чтобы прояснить некоторые моменты и попросить ваших отзывов.

Я пытаюсь запустить VINS FUSION с D435i (как и многие люди, я думаю). Используя доступный запуск realsense_stereo_imu_config.yaml, я испытал то, о чем могут сообщать люди, как только вы касаетесь камеры, вычисленная поза становится сумасшедшей.

Итак, я использовал Калибр:

  • для калибровки камер и я получил следующий результат:
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

Я думаю, что калибровка в порядке, потому что, когда я запускаю VINS_FUSION с этими параметрами (imu = 0), я получаю приличное поведение. Я буду более чем счастлив поделиться с вами отчетом в формате pdf, если это необходимо, потому что я не являюсь экспертом в этой области.

  • Калибровка IMu камеры была не такой уж простой задачей, потому что у меня нет значений плотности шума и случайных значений ходьбы. Итак, я использовал программное обеспечение вариации Аллана и некоторый код из Matlab, и я получил это для ускорения
    allan_acc
accelerometer_noise_density: 0.0011060    #Noise density (continuous-time)
accelerometer_random_walk:   8.6056e-05    #Bias random walk

но к гироскопу я настроен явно скептически:
allan_gyro

потому что значения следующие:

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

Здесь хотелось бы узнать ваше мнение об этих ценностях?

Однако мне удалось выполнить калибровку 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

Здесь меня также удивляет, потому что сдвиг во времени ОТРИЦАТЕЛЬНЫЙ! Является ли это возможным?
Что касается преобразования камеры, из потока, связанного с VINS_FUSION, я понял, что body_T_cam0 / 1 - это преобразование из кадра камеры в кадр IMU

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

а с Kalibr T_cam_imu - это внешняя часть IMU: преобразование из IMU в координаты камеры (T_c_i), но я до сих пор озадачен, чтобы получить правильный формат, используемый VINS_FUSION.

Однако, несмотря на всю эту работу, я все еще не могу запускать VINS с IMU. Извините за то, что вы так долго, но видите ли вы здесь что-то не так, что может объяснить, почему он не работает?

Большое спасибо

Самый полезный комментарий

@FaboNo Привет.

  • да. Думаю, у Pixhawk4 mini IMU лучше, чем у D435i. Потому что Pixhawk 4 mini использует два IMU 6DOF и один магнитометр, а затем фильтрует их для вывода одной темы ROS (не на 100% уверен в фильтрации, но у них есть два IMU).
  • Я использовал 100 Гц.
  • Да, я использовал PX4 и MAVROS. Я помню, что мог получить около 150 Гц как максимум, но откуда-то я увидел, что соотношение 3: 1 для IMU и FPS камеры оптимально для VINS. Обычно мы используем камеру с частотой 30 Гц, поэтому я подумал, что 100 Гц - это правильно.

Все 9 Комментарий

@FaboNo Мне удалось заставить его работать с конфигурацией ниже, мне не нужно было запускать мои собственные калибровки, и я уверен, что он мог бы работать лучше с правильной калибровкой, но он работает хорошо и не расходится

Я использовал left.yaml и right.yaml, предоставленные в этом репо.

Убедитесь, что вы отключили автоэкспозицию и выключили ИК-излучатель в параметрах RealSense,

%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 Привет, FaboNo. Прошу прощения за поздний ответ. Я не узнал, что у меня возникла новая проблема.

  1. Прежде всего, я рекомендую вам откалибровать вашу модель камеры с помощью pinhold-radtan , а не equidistant , которое вы использовали.

  2. После правильной калибровки камеры попробуйте запустить VINS-Fusion с 2 камерами и режимом 0 imu.
    Сначала он должен хорошо работать (при легких движениях, без быстрых движений или чистого вращения).

  3. Убедитесь, что ваш body_T_cam является обратной матрицей T_cam_imu из результата Kalibr .
    Также проверьте body_T_cam0 и 1 перед запуском режима только с двумя камерами (см. Выше).

  4. отрицательное значение timeshift_cam_imu - нормальное значение для d435i, что означает, что камера более поздняя, ​​чем IMU.

  5. Вам не нужно запускать Kalibr Allan для
    скорее я нашел модель IMU d435i, а затем просто использовал параметр этой конкретной модели, как здесь

  6. Однако я рекомендую использовать только imu parameters умолчанию, как здесь
    Их должно хватить. (или просто немного увеличьте их, например, в 3 раза от значений по умолчанию)

  7. Я рекомендую вам запустить IMU calibration из D435i SDK, как я объяснил здесь

@FaboNo
Кстати, я проверял, что файлы параметров по умолчанию / yaml от оригинальных авторов для D435i работают довольно хорошо раньше.
Даже со всеми 0 значениями искажения и только значениями фокусных расстояний / главных точек и номинальными значениями body_T_cam .

Я думаю , что ваши equidistant камеры результатов внутренней калибровки с большими значениями искажений являются основной проблемой.

@engcang спасибо за ваше сообщение, на самом деле изображения уже исправлены, поэтому запускать Kalibr на нем почти бесполезно, нет?
По мере их исправления искажения тоже должны быть равны 0.

@marufino большое спасибо за ваше сообщение, я попробую завтра и дам вам знать

@FaboNo
Есть новости по этому вопросу? Получилось ли у вас работать?
Недавно у меня была возможность протестировать VINS-Fusion (стерео) с Intel D435i, и вот результат , если вам это еще интересно.

@engcang Извините, что отвечаю так поздно. Я видел видео, и оно впечатляет. Поэтому у меня к вам несколько вопросов, в основном потому, что вы использовали PixHawk4.

  • Значит ли это, что точность IMU лучше, чем у D435i?
  • На какой частоте вы читаете данные IMU: 100 Гц, 200 Гц?
  • Вы использовали PX4, и если да, то использовали ли вы Mavros для чтения данных? Лично я попробовал PixHawk2, и это было неубедительно, и мне не удалось увеличить частоту IMU более чем на 100 Гц.
    Очень хорошая работа!

@FaboNo Привет.

  • да. Думаю, у Pixhawk4 mini IMU лучше, чем у D435i. Потому что Pixhawk 4 mini использует два IMU 6DOF и один магнитометр, а затем фильтрует их для вывода одной темы ROS (не на 100% уверен в фильтрации, но у них есть два IMU).
  • Я использовал 100 Гц.
  • Да, я использовал PX4 и MAVROS. Я помню, что мог получить около 150 Гц как максимум, но откуда-то я увидел, что соотношение 3: 1 для IMU и FPS камеры оптимально для VINS. Обычно мы используем камеру с частотой 30 Гц, поэтому я подумал, что 100 Гц - это правильно.

@engcang спасибо за ваш ответ. Мне интересно, изменили ли вы значения параметров imu в realsense_stereo_imu_config.yaml или оставили их без изменений?
Я все равно попробую вашу настройку

@FaboNo
Привет. Обычно я не меняю параметры IMU в файле yaml. Я также попытался установить параметры IMU, как я получил от Kalibr_allan ,
однако я не смог добиться лучшей производительности, используя их.

Только для сумасшедших случаев, когда четвероногие роботы жестко касаются земли, я пытаюсь установить параметры в 10 раз больше или меньше, и это работает.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

Nothin99 picture Nothin99  ·  3Комментарии

rramsey picture rramsey  ·  3Комментарии

lightonflux picture lightonflux  ·  3Комментарии

sscarduzio picture sscarduzio  ·  3Комментарии

lardissone picture lardissone  ·  3Комментарии