Поскольку вы один из очень немногих, кто смог запустить 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, если это необходимо, потому что я не являюсь экспертом в этой области.
accelerometer_noise_density: 0.0011060 #Noise density (continuous-time)
accelerometer_random_walk: 8.6056e-05 #Bias random walk
но к гироскопу я настроен явно скептически:
потому что значения следующие:
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 Мне удалось заставить его работать с конфигурацией ниже, мне не нужно было запускать мои собственные калибровки, и я уверен, что он мог бы работать лучше с правильной калибровкой, но он работает хорошо и не расходится
Я использовал 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. Прошу прощения за поздний ответ. Я не узнал, что у меня возникла новая проблема.
Прежде всего, я рекомендую вам откалибровать вашу модель камеры с помощью pinhold-radtan
, а не equidistant
, которое вы использовали.
После правильной калибровки камеры попробуйте запустить VINS-Fusion с 2 камерами и режимом 0 imu.
Сначала он должен хорошо работать (при легких движениях, без быстрых движений или чистого вращения).
Убедитесь, что ваш body_T_cam
является обратной матрицей T_cam_imu
из результата Kalibr .
Также проверьте body_T_cam0 и 1 перед запуском режима только с двумя камерами (см. Выше).
отрицательное значение timeshift_cam_imu
- нормальное значение для d435i, что означает, что камера более поздняя, чем IMU.
Вам не нужно запускать Kalibr Allan для
скорее я нашел модель IMU d435i, а затем просто использовал параметр этой конкретной модели, как здесь
Однако я рекомендую использовать только imu parameters
умолчанию, как здесь
Их должно хватить. (или просто немного увеличьте их, например, в 3 раза от значений по умолчанию)
Я рекомендую вам запустить IMU calibration
из D435i SDK, как я объяснил здесь
@FaboNo
Кстати, я проверял, что файлы параметров по умолчанию / yaml от оригинальных авторов для D435i работают довольно хорошо раньше.
Даже со всеми 0 значениями искажения и только значениями фокусных расстояний / главных точек и номинальными значениями body_T_cam
.
Я думаю , что ваши equidistant
камеры результатов внутренней калибровки с большими значениями искажений являются основной проблемой.
@engcang спасибо за ваше сообщение, на самом деле изображения уже исправлены, поэтому запускать Kalibr на нем почти бесполезно, нет?
По мере их исправления искажения тоже должны быть равны 0.
@marufino большое спасибо за ваше сообщение, я попробую завтра и дам вам знать
@FaboNo
Есть новости по этому вопросу? Получилось ли у вас работать?
Недавно у меня была возможность протестировать VINS-Fusion (стерео) с Intel D435i, и вот результат , если вам это еще интересно.
@engcang Извините, что отвечаю так поздно. Я видел видео, и оно впечатляет. Поэтому у меня к вам несколько вопросов, в основном потому, что вы использовали PixHawk4.
@FaboNo Привет.
@engcang спасибо за ваш ответ. Мне интересно, изменили ли вы значения параметров imu в realsense_stereo_imu_config.yaml или оставили их без изменений?
Я все равно попробую вашу настройку
@FaboNo
Привет. Обычно я не меняю параметры IMU в файле yaml. Я также попытался установить параметры IMU, как я получил от Kalibr_allan ,
однако я не смог добиться лучшей производительности, используя их.
Только для сумасшедших случаев, когда четвероногие роботы жестко касаются земли, я пытаюсь установить параметры в 10 раз больше или меньше, и это работает.
Самый полезный комментарий
@FaboNo Привет.