Калибровка камеры-imu с Kalibr

от автора


В данной публикации хотелось бы познакомить с пакетом калибровки камеры Kalibr, в том числе для целей его использования в пакете визуальной навигации ORB_SLAM3. Будет продемонстрирован процесс калибровки камеры fish-eye для raspberry pi. Камера будет калиброваться совместно с гироскопом/акселерометром imu-650 (GY-521). Предполагается, что данная пошаговая инструкция облегчит понимание процесса калибровки в случае возникновения необходимости в таковой.

Предисловие.

Данная статья будет перекликаться с предыдущей публикаций, в которой был рассмотрен процесс установки и использования ORB_SLAM3.

Как выяснилось, несмотря на наличие в ORB_SLAM3 нескольких файлов с настройками калибровки камеры для различных типов камер (fish-eye, pinhole), настроек в связке imu-camera в пакете ORB_SLAM3 ограниченное количество. Кроме того, возник вопрос — будет ли работать алгоритм быстрее на raspberry pi, чьи вычислительные ресурсы ограничены, если уменьшить разрешение кадра хотя бы в два раза.

К сожалению, установить Kalibr на Raspbian buster не удалось, поэтому далее будет использоваться один из рекомендованных самим Kalibroм дистрибутивов, а именно — Ubuntu 20.04 в связке с ROS Noetic.

О Kalibr.

Что такое Kalibr и чем он лучше/хуже других пакетов калибровки?

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

  • Multi-Camera Calibration: Intrinsic and extrinsic calibration of a camera-systems with non-globally shared overlapping fields of view with support for a wide range of camera models.
  • Visual-Inertial Calibration (CAM-IMU): Spatial and temporal calibration of an IMU w.r.t a camera-system along with IMU intrinsic parameters
  • Multi-Inertial Calibration (IMU-IMU): Spatial and temporal calibration of an IMU w.r.t a base inertial sensor along with IMU intrinsic parameters (requires 1-aiding camera sensor).
  • Rolling Shutter Camera Calibration: Full intrinsic calibration (projection, distortion and shutter parameters) of rolling shutter cameras.

Как правило, большинство калибровок камер ограничивается первым и последним пунктами, не обращая внимание на imu.

В принципе, этих двух калибровок вполне достаточно, чтобы запустить и поработать с ORB_SLAM3 например. Однако, если требуется точность, то придется выполнить CAM_IMU calibration.

Из плюсов kalibr также необходимо отметить подробную wiki с инструкциями и дополнительные инструменты, такие как настройка фокусного расстояния камеры, проверка параметров калибровки и т.д.

Нюансы установки Kalibr на ubuntu 20.04 raspberry pi.

В общении с ubuntu на raspberry из под windows рекомендую использовать x2go:

sudo apt-get install x2goserver x2goserver-xsession sudo systemctl status x2goserver

В репозитории Kalibra установке посвящена страничка wiki.

Однако, воспользоваться docker на raspberry не получится и придется все собирать из исходников.

Чтобы получать информацию с камеры и imu, потребуются также их ROS nodы, установка которых описана в статье про ORB_SLAM3, а также дополнительные ROS пакеты:

Установка этих пакетов не замысловата — скачиваем их в workspace/src и далее из workspace выполняем:

 cd ~/kalibr_workspace catkin build -DCMAKE_BUILD_TYPE=Release -j4

Все должно пройти штатно… кроме raspicam_node и imu node, установка и использование которых немного отличаются.

Raspicam node на ubuntu.

Конечно, возможно, отказаться от использования raspicam node и использовать usb camera node, так как в целом последняя повторяет функционал. Однако, как упоминалось в статье про ORB_SLAM3 между нодами есть отличия.

Этапы установки следующие.

Добавляем обнаружение камеры в системе и проверяем после перезагрузки, что камера определилась:

sudo nano /boot/firmware/config.txt start_x=1 gpu_mem=128 vcgencmd get_camera supported=1 detected=1

Устанавливаем зависимости:

sudo apt-get install libogg-dev libvorbis-dev libtheora-dev

Движемся по инструкции репо raspicam node от userland:

---userland--- *https://github.com/raspberrypi/userland/issues/597 git clone https://github.com/raspberrypi/userland.git cd userland sed -i 's/__bitwise/FDT_BITWISE/'  /home/ubuntu/userland/opensrc/helpers/libfdt/libfdt_env.h sed -i 's/__force/FDT_FORCE/'  /home/ubuntu/userland/opensrc/helpers/libfdt/libfdt_env.h ./buildme --aarch64

Чтобы проверить установку, запустим raspistill и сделаем снимок с камеры:

LD_PRELOAD="/home/ubuntu/userland/build/lib/libmmal_vc_client.so /home/ubuntu/userland/build/lib/libvcsm.so /home/ubuntu/userland/build/lib/libmmal_core.so /home/ubuntu/userland/build/lib/libmmal_util.so" /opt/vc/bin/raspistill -o cam.jpg

Либо так:

export LD_PRELOAD="/home/ubuntu/userland/build/lib/libmmal_vc_client.so /home/ubuntu/userland/build/lib/libvcsm.so /home/ubuntu/userland/build/lib/libmmal_core.so /home/ubuntu/userland/build/lib/libmmal_util.so" cd /opt/vc/bin ./raspistill -k

Imu node на ubuntu.

Чтобы заставить работать imu, также придется выполнить определённые шаги, а именно:

Для начала небходимо попытаться запустить

test_imu.py

 '''         Read Gyro and Accelerometer by Interfacing Raspberry Pi with MPU6050 using Python http://www.electronicwings.com ''' import smbus#import SMBus module of I2C from time import sleep          #import  #some MPU6050 Registers and their Address PWR_MGMT_1   = 0x6B SMPLRT_DIV   = 0x19 CONFIG       = 0x1A GYRO_CONFIG  = 0x1B INT_ENABLE   = 0x38 ACCEL_XOUT_H = 0x3B ACCEL_YOUT_H = 0x3D ACCEL_ZOUT_H = 0x3F GYRO_XOUT_H  = 0x43 GYRO_YOUT_H  = 0x45 GYRO_ZOUT_H  = 0x47   def MPU_Init(): #write to sample rate register bus.write_byte_data(Device_Address, SMPLRT_DIV, 7)  #Write to power management register bus.write_byte_data(Device_Address, PWR_MGMT_1, 1)  #Write to Configuration register bus.write_byte_data(Device_Address, CONFIG, 0)  #Write to Gyro configuration register bus.write_byte_data(Device_Address, GYRO_CONFIG, 24)  #Write to interrupt enable register bus.write_byte_data(Device_Address, INT_ENABLE, 1)  def read_raw_data(addr): #Accelero and Gyro value are 16-bit         high = bus.read_byte_data(Device_Address, addr)         low = bus.read_byte_data(Device_Address, addr+1)              #concatenate higher and lower value         value = ((high << 8) | low)                  #to get signed value from mpu6050         if(value > 32768):                 value = value - 65536         return value   bus = smbus.SMBus(1) # or bus = smbus.SMBus(0) for older version boards Device_Address = 0x68   # MPU6050 device address  MPU_Init()  print (" Reading Data of Gyroscope and Accelerometer")  while True:  #Read Accelerometer raw value acc_x = read_raw_data(ACCEL_XOUT_H) acc_y = read_raw_data(ACCEL_YOUT_H) acc_z = read_raw_data(ACCEL_ZOUT_H)  #Read Gyroscope raw value gyro_x = read_raw_data(GYRO_XOUT_H) gyro_y = read_raw_data(GYRO_YOUT_H) gyro_z = read_raw_data(GYRO_ZOUT_H)  #Full scale range +/- 250 degree/C as per sensitivity scale factor Ax = acc_x/16384.0 Ay = acc_y/16384.0 Az = acc_z/16384.0  Gx = gyro_x/131.0 Gy = gyro_y/131.0 Gz = gyro_z/131.0   print ("Gx=%.2f" %Gx, u'\u00b0'+ "/s", "\tGy=%.2f" %Gy, u'\u00b0'+ "/s", "\tGz=%.2f" %Gz, u'\u00b0'+ "/s", "\tAx=%.2f g" %Ax, "\tAy=%.2f g" %Ay, "\tAz=%.2f g" %Az)  sleep(1) 

Если imu шлет данные, двигаемся дальше, если нет, то:

pip3 install smbus sudo nano /lib/udev/rules.d/60-i2c-tools.rules KERNEL=="i2c-0"     , GROUP="i2c", MODE="0660" KERNEL=="i2c-[1-9]*", GROUP="i2c", MODE="0666"  sudo groupadd gpio sudo usermod -a -G gpio ubuntu sudo grep gpio /etc/group sudo chown ubuntu.gpio /dev/gpiomem sudo chmod g+rw /dev/gpiomem

Также в процессе установки imu node (описанной в статье ORB_SLAM3), не забываем про патч, который там также упомянут:

download patch https://groups.google.com/g/bcm2835/c/BwZXVsDRtwI tar zxvf bcm2835-1.59.tar.gz cd bcm2835-1.59 patch -lNp1 --input=/path/to/patch/bcm2835_rpi4.diff 

Сборка ноды:

cd ~/kalibr_workspace/src catkin build -DCMAKE_BUILD_TYPE=Release -j4

Перед тем как начать калибровку.

В идеале kalibr должен запускаться командой

rosrun kalibr <command_you_want_to_run_here>

Однако, если этого не происходит, то можно запускать исполняемые файлы kalibra из директории:

/home/ubuntu/kalibr_workspace/src/kalibr/aslam_offline_calibration/kalibr/python

Все будет работать.

Также в этих файлах, чтобы они работали необходимо внести небольшие косметические изменения, а именно: переставить import cv2 в первые позиции перед другими импортами:

Алгоритм калибровки

будет выглядеть так:

  • настроить фокус камеры,
  • настроить сенсор камеры,
  • подготовить доску с aprilgrid,
  • записать rosbag для static dataset,
  • откалибровать со static dataset,
  • записать rosbag для dynamic dataset,
  • откалибровать с dynamic dataset.

Отчасти данный алгоритм приведен по ссылке.
Пройдемся по алгоритму и разберем нюансы.

Настроить фокус камеры.

Перед тем как приступить к калибровке камеры не лишним будет настроить ее фокус.

Можно это сделать «на глазок», убедившись, что камера четко видит изображение.

Но можно и воспользоваться средствами самого kalibra.

Последующие команды можно выполнять непосредственно на raspberry, а можно и через сессию x2go. Но для последнего варианта необходимо поправить raspicam ноду, добавив в launch файл viewer (перед закрывающим тегом launch):

<node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">     <remap from="image" to="image"/>     <param name="autosize" value="true" />   </node> </launch> 

Полностью launch файл

camerav2_320x240.launch

<launch>   <arg name="enable_raw" default="true"/>   <arg name="enable_imv" default="false"/>   <arg name="camera_id" default="0"/>   <arg name="camera_frame_id" default="raspicam"/>   <arg name="camera_name" default="camerav2_320x240"/>    <node type="raspicam_node" pkg="raspicam_node" name="raspicam_node" output="screen">     <param name="private_topics" value="false"/>      <param name="camera_frame_id" value="$(arg camera_frame_id)"/>     <param name="enable_raw" value="$(arg enable_raw)"/>     <param name="enable_imv" value="$(arg enable_imv)"/>     <param name="camera_id" value="$(arg camera_id)"/>      <param name="camera_name" value="$(arg camera_name)"/>     <param name="width" value="320"/>     <param name="height" value="240"/>      <param name="framerate" value="20"/>     <param name="exposure_mode" value="antishake"/>     <param name="shutter_speed" value="0"/>   </node> <node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">     <remap from="raspicam_node/image" to="image"/>     <param name="autosize" value="true" />   </node> </launch> 

Запустив мастер-ноду:

sudo bash -c "source /home/ubuntu/kalibr_workspace/devel/setup.bash; roscore"

В другом терминале запустим raspicam node (ноду камеры):

export LD_PRELOAD="/home/ubuntu/userland/build/lib/libmmal_vc_client.so /home/ubuntu/userland/build/lib/libvcsm.so /home/ubuntu/userland/build/lib/libmmal_core.so /home/ubuntu/userland/build/lib/libmmal_util.so" sudo bash -c "source /home/ubuntu/kalibr_workspace/devel/setup.bash; roslaunch raspicam_node camerav2_320x240.launch"

Убедимся, что все работает:

и запустим файл, который выведет картинку с фокусом камеры:

cd /home/ubuntu/kalibr_workspace/src/kalibr/aslam_offline_calibration/kalibr/python python3 kalibr_camera_focus --topic /image/compressed

Задача после запуска исполняемого файла:
крутить оптику камеры, чтобы fde был минимален (на выводимой картинке виден параметр). При этом -11 лучше, чем -9. Да и визуально будет понятно, когда камера расфокусирована, а когда нет.

Фокусироваться желательно на той поверхности, на которой будет висеть или стоять калибровочная доска.

Настроить сенсор камеры.

Этот шаг, несмотря на его наличие в официальном wiki kalibra можно пропустить, если взять с себя обещание не делать резких движений при съемке с камеры и наличии достаточного освещения снимаемой калибровочной поверхности.

Тем не менее, если этот шаг в числе рекомендуемых, пройдемся по нему.

Запустив roscore, запустим raspicam node (camerav2_640x480.launch или иной), чтобы видеть картинку:

sudo bash -c "source /home/ubuntu/kalibr_workspace/devel/setup.bash; roslaunch raspicam_node camerav2_320x240.launch"

В третьем терминале запустим пакет перенастройки камеры:

sudo bash -c "source /home/ubuntu/kalibr_workspace/devel/setup.bash; rosrun rqt_reconfigure rqt_reconfigure"

Откроется окно, в котором можно на лету менять настройки камеры и одновременно наблюдать эффект на выводимом raspicam node изображении.

В этом окне необходимо поменять настройки, которые должны привести к уменьшению размытия изображения при движении камеры:

Далее эти параметры можно через окно reconfigure сохранить в yaml файл, но можно и не сохранять, т.к. эти параметры, которые вы изменили — параметры по умолчанию до момента пока вы их снова не поменяете.

Подготовить доску с aprilgrid.

Kalibr предлагает для калибровки три типа «досок»:

  • aprilgrid;
  • сheckerboard(шахматная доска);
  • circlegrid.

Как правило, на практике при калибровке используется шахматная доска как наиболее понятное и доступное.

Особой разницы между досками нет, но сам kalibr рекомендует использовать aprilgrid:

It is recommended to use the Aprilgrid due to the following benefits:

  • partially visible calibration boards can be used
  • pose of the target is fully resolved (no flips)

Поэтому калибровка будет производиться с aprilgrid.

Что такое aprilgrid ?

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

Саму картинку с aprilgrid можно скачать с wiki kalibra — здесь.

Понадобятся как картинка в pdf, так и yaml файл к ней:


Данная картинка должна в идеале быть 80 на 80 см, но не у каждого есть такой принтер, поэтому обычная распечатка на А4 тоже сгодится.

Однако есть следующие рекомендации:

— не печатать в градациях серого, т.е. квадраты должны быть черного цвета без искажений,
— клеить aprilgrid на матовую ровную поверхность без глянца и бликов,
— понадобятся два экземляра картинки:

  • один приклеить на ровную поверхность, которую нужно будет перемещать перед неподвижной камерой, создавая таким образом static dataset
  • второй экземпляр — приклеить на стену или закрепить на штативе, он будет неподвижен во время перемещения камеры вокруг него — dynamic dataset.

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

С произвольно сконфигурированным aprilgrid может не запуститься калибровка, выдав ошибку:

[FATAL] [1663165566.276776]: No corners could be extracted for camera /raspicam_node/image/compressed! Check the calibration target configuration and dataset.

— обратить внимание на маленькие оси на картинке, картинка должна их учесть. То есть после распечатки картинки, не переворачивать ее, не зеркалить и т.п.

— не оставлять слишком много белого пространства листа вокруг картинки.

Резюмируя: если вы просто выведите на А4 картинку без искажений (лист А4 вертикально) и наклеите ее на ровную поверхность, все будет хорошо.

Далее нужно будет поправить yaml файл для aprilgrid. Здесь ничего сложного.

Необходимо на распечатанной картинке с aprilgrid измерить расстояния и внести правки:

Записать rosbag для static dataset.

После того как доски калибровки готовы, можно перейти к записи rosbag.

Rosbag — это условно говоря «сумка», в которую ROS складывает данные из топиков. Из каких именно топиков и как долго складывает — решает пользователь. Похоже на запись аудио-/видео- файлов только в особом формате.

Перед тем как запустить непосредственно калибровку необходимо записать rosbag, из которого программа далее будет извлекать данные и по ним калибровать. О том, ЧТО записалось в rosbag и записалось ли вообще будет указано далее.

Перед стартом необходимо:

— подготовить доску с aprilgrid для static dataset, которую предстоит перемещать перед камерой, записывая rosbag.
— запустить и убедиться, что работают топики roscore и raspicam node (или usb node)

sudo bash -c "source /home/ubuntu/kalibr_workspace/devel/setup.bash; roscore" export LD_PRELOAD="/home/ubuntu/userland/build/lib/libmmal_vc_client.so /home/ubuntu/userland/build/lib/libvcsm.so /home/ubuntu/userland/build/lib/libmmal_core.so /home/ubuntu/userland/build/lib/libmmal_util.so" sudo bash -c "source /home/ubuntu/kalibr_workspace/devel/setup.bash; roslaunch raspicam_node camerav2_320x240.launch"

— доска хорошо освещена.

В терминале запускаем запись:

rosbag record /image --duration=60 -O static.bag #60секунд записи только видеокамеры

Далее необходимо плавно, не спеша перемещать доску с aprilgrid перед камерой из края в край в зоне ее видимости на фокусном расстоянии (которое ранее настроили). Приближать-удалять или совсем убирать доску не нужно, так как данные кадры отбракуются скорее всего как размытые или в связи с отсутствием доски. Также лучше не дрожать, не дергать руками и двигаться достаточно медленно, чтобы минимизировать размытие, которое все равно будет возникать на rolling shutter камерах.

После записи в директории появится файл static.bag и этого файла будет достаточно, если цель — откалибровать только камеру без учета imu.

Откалибровать со static dataset.

После того, как получен rosbag, можно приступить к собственно калибровке.

Команда калибровки для static dataset (без imu):

cd ~/kalibr_workspace/src/kalibr/aslam_offline_calibration/kalibr/python python3 kalibr_calibrate_cameras --model pinhole-equi --topics /image --bag static.bag --target aprilgrid_6x6.yaml

Соответственно, для fish-eye камеры с rolling shutter:

python3 kalibr_calibrate_rs_cameras --model pinhole-radtan-rs --topic /image --bag 320x240_static.bag --target aprilgrid_6x6.yaml --inverse-feature-variance 1 --frame-rate 20

По результатам калибровки со static dataset kalibr выдаст файл

320x240_static-camchain.yaml

cam0:   camera_model: pinhole   distortion_coeffs: [-0.29585544183959606, 0.06950559854738034, 0.000981636728463331, 0.0010529550643745315]   distortion_model: radtan   intrinsics: [155.59508048438533, 155.001082471171, 148.3289996162289, 128.18248085164035]   line_delay: 8.839452618620747e-05   resolution: [320, 240]   rostopic: /image 

, который будет нужен для дальнейшей калибровки уже с imu.

*Во время запуска калибровки может выскочить ошибка:

Это произошло потому, что при записи rosbag использовался launch файл raspicam nodы, который не ссылается на yaml файл настроек камеры.

Чтобы заново не записывать rosbag необходимо вручную указать FOCAL_LENGTH.
Перед запуском калибровки ввести:

export KALIBR_MANUAL_FOCAL_LENGTH_INIT=1

И, далее, когда программа попросит ввести значение:

Значение 158 получено расчетным путем:
Технические характеристики камеры Waveshare Camera H:
Диагональ ¼ дюйма
Длина фокуса 3.15 мм
Разрешение кадра: 320х240
3,15мм/6,35ммx320=158

**Вышеуказанная ошибка не возникнет, если, например записать rosbag, используя стандартный launch файл raspicam node, у которого есть yaml файл настроек, например camerav2_640x480.launch и далее запустить калибровку:

python3 kalibr_calibrate_rs_cameras --model pinhole-radtan-rs --topic /image --bag 640x480_static.bag --target aprilgrid_6x6.yaml --inverse-feature-variance 1 --frame-rate 30

При старте программа покажет FOCAL_LENGTH:

Если посчитать его вручную:
317,48 (3,15мм/6,35ммx640). Похоже на правду.

Записать rosbag для dynamic dataset.

Подготовка к записи немного отличается от предыдущего пункта:
— в launch файле камеры (raspicam node) выставить частоты кадров (fps) 20Hz, в launch imu частоту- 200Hz.
— aprilgrid закреплен на стене неподвижно, так как камера с imu будет совершать движения вокруг aprilgrid.
— запустить предварительно необходимые ноды с roscore, raspicam и imu:

1st: sudo bash -c "source /home/ubuntu/kalibr_workspace/devel/setup.bash; roscore" 2d: export LD_PRELOAD="/home/ubuntu/userland/build/lib/libmmal_vc_client.so /home/ubuntu/userland/build/lib/libvcsm.so /home/ubuntu/userland/build/lib/libmmal_core.so /home/ubuntu/userland/build/lib/libmmal_util.so" sudo bash -c "source /home/ubuntu/kalibr_workspace/devel/setup.bash; roslaunch raspicam_node camerav2_320x240.launch" 3d: sudo bash -c "source /home/ubuntu/kalibr_workspace/devel/setup.bash; roslaunch ros_mpu6050_node mpu6050.launch"

Далее можно запускать запись rosbag (dynamic dataset):

rosbag record /raspicam_node/image/compressed --duration=180 /imu/data -O dynamiс_320x240_30fps_with_imu.bag #180секунд записи видеокамеры и imu

Сам процесс таинственных движений с камерой и imu перед aprilgrid (pitch,yaw,roll) можно посмотреть на видео, размещенном на странице калибра. При всем при этом, движения на видео чрезмерно быстрые, что может сказаться на снимках с использованием камеры с rolling shutter.

Какого размера может получиться rosbag? Добавление imu не сильно сказывается на размере файла на выходе, так как львиную долю там занимают картинки с камеры. Чем выше разрешение камеры и дольше запись rosbag, тем больше размер rosbag.

Откалибровать c dynamic dataset.

Калибровка с dynamic dataset:

 cd ~/kalibr_workspace/src/kalibr/aslam_offline_calibration/kalibr/python python3 kalibr_calibrate_imu_camera --cam 320x240_static-camchain.yaml --target aprilgrid_6x6.yaml --imu imu0.yaml --bag dynamiс_320x240.bag

Здесь все используемые файлы ранее встречались кроме imu0.yaml. Как можно понять из названия, это файл с настройками для imu. В нем должны содержаться параметры imu либо из datasheet либо полученные при калибровке самого imu.

Вот пример содержимого

imu0.yaml

rostopic: /imu/data accelerometer_noise_density: 0.05 #continous accelerometer_random_walk: 0.001 gyroscope_noise_density: 0.02 #continous gyroscope_random_walk: 4.0e-05 update_rate: 200 

По завершении калибровки для dynamic dataset, которая занимает от 15 мин и более в зависимости от размера rosbag, kalibr выдаст итоговые файлы, один из которых будет содержать сведения калибровки camera-imu.

Примеры файлов:
320x240_dynamic-results-imucam.txt
320x240_dynamic-report-imucam.pdf

На этом калибровка с kalibr закончена!

Посмотреть в rosbag.

Иногда, по непонятным причинам калибровка не запускается либо проводится неудачно.
В этих случаях может помочь изучение записавшегося rosbag, его распаковка. При этом не имеет значение static или dynamic rosbag.

В kalibr есть пакет bagextractor:

python3 kalibr_bagextractor --image-topics /image --output-folder . --bag static.bag

С помощью команды выше bagextractor извлечет bag, сложив все снимки, которые были сделаны при калибровке в cam0 папку. Далее, просмотрев эти снимки, визуально можно будет понять, что пошло не так.

Перенос параметров в файл настроек ORB_SLAM3.

Чтобы использовать полученные параметры при калибровке, их необходимо внести в файл настроек, который используется при старте ORB_SLAM3:

nano /home/pi/ORB_SLAM3/Examples/Monocular/TUM1.yaml

TUM1.yaml

%YAML:1.0  System.SaveAtlasToFile: "my_01" #System.LoadAtlasFromFile: "my_01" #-------------------------------------------------------------------------------------------- # Camera Parameters. Adjust them! #-------------------------------------------------------------------------------------------- File.version: "1.0" Camera.type: "PinHole"  # Camera calibration and distortion parameters (OpenCV)  #Camera1.fx: 517.306408 #Camera1.fy: 516.469215 #Camera1.cx: 318.643040 #Camera1.cy: 255.313989 Camera1.fx: 155.595080 Camera1.fy: 155.00108 Camera1.cx: 148.389000 Camera1.cy: 128.182481  #Camera1.k1: 0.262383 #Camera1.k2: -0.953104 #Camera1.p1: -0.005358 #Camera1.p2: 0.002628 #Camera1.k3: 1.163314 Camera1.k1: -0.295855 Camera1.k2: 0.069506 Camera1.p1: 0.000982 Camera1.p2: 0.001053  # Camera frames per second  Camera.fps: 5  # Color order of the images (0: BGR, 1: RGB. It is ignored if images are grayscale) Camera.RGB: 0  # Camera resolution Camera.width: 320 Camera.height: 240  #-------------------------------------------------------------------------------------------- # ORB Parameters #--------------------------------------------------------------------------------------------  # ORB Extractor: Number of features per image ORBextractor.nFeatures: 1000  # ORB Extractor: Scale factor between levels in the scale pyramid  ORBextractor.scaleFactor: 1.2  # ORB Extractor: Number of levels in the scale pyramid ORBextractor.nLevels: 1  #8  # ORB Extractor: Fast threshold # Image is divided in a grid. At each cell FAST are extracted imposing a minimum response. # Firstly we impose iniThFAST. If no corners are detected we impose a lower value minThFAST # You can lower these values if your images have low contrast ORBextractor.iniThFAST: 20 ORBextractor.minThFAST: 7  #-------------------------------------------------------------------------------------------- # Viewer Parameters #-------------------------------------------------------------------------------------------- Viewer.KeyFrameSize: 0.05 Viewer.KeyFrameLineWidth: 1.0 Viewer.GraphLineWidth: 0.9 Viewer.PointSize: 2.0 Viewer.CameraSize: 0.08 Viewer.CameraLineWidth: 3.0 Viewer.ViewpointX: 0.0 Viewer.ViewpointY: -0.7 Viewer.ViewpointZ: -1.8 Viewer.ViewpointF: 500.0 Viewer.imageViewScale: 0.3 

и

nano /home/pi/ORB_SLAM3/Examples/Monocular-Inertial/TUM-VI.yaml

TUM-VI.yaml

%YAML:1.0  #-------------------------------------------------------------------------------------------- # Camera Parameters. Adjust them! #-------------------------------------------------------------------------------------------- File.version: "1.0"  Camera.type: "KannalaBrandt8"  # Camera calibration and distortion parameters (OpenCV)  #Camera1.fx: 190.978477 #Camera1.fy: 190.973307 #Camera1.cx: 254.931706 #Camera1.cy: 256.897442 Camera1.fx: 155.595080 Camera1.fy: 155.001082 Camera1.cx: 148.329000 Camera1.cy: 128.182481   # Equidistant distortion 0.0034823894022493434, 0.0007150348452162257, -0.0020532361418706202, 0.00020293673591811182 #Camera.bFishEye: 1 #Camera1.k1: 0.003482389402 #Camera1.k2: 0.000715034845 #Camera1.k3: -0.002053236141 #Camera1.k4: 0.000202936736 Camera1.k1: -0.29585544183959606 Camera1.k2: 0.06950559854738034 Camera1.k3: 0.000981636728463331 Camera1.k4: 0.0010529550643745315      # Camera resolution Camera.width: 320 Camera.height: 240  # Camera frames per second  Camera.fps: 3  # Color order of the images (0: BGR, 1: RGB. It is ignored if images are grayscale) Camera.RGB: 1  # Transformation from body-frame (imu) to camera IMU.T_b_c1: !!opencv-matrix    rows: 4    cols: 4    dt: f #   data: [-0.9995250378696743, 0.0075019185074052044, -0.02989013031643309, 0.045574835649698026,  #          0.029615343885863205, -0.03439736061393144, -0.998969345370175, -0.071161801837997044, #         -0.008522328211654736, -0.9993800792498829, 0.03415885127385616, -0.044681254117144367, #          0.0, 0.0, 0.0, 1.0]    data: [0.98598023, 0.05458661, 0.15768097, 0.09686663,          -0.04210964, -0.83299201,  0.55168024,  0.13264273,          0.16146134, -0.5505857, -0.81901503, -0.32186711,          0.0, 0.0, 0.0, 1.0]   # IMU noise (Use those from VINS-mono) IMU.NoiseGyro: 0.02 #0.004 # 0.00016 (TUM) # 0.00016    # rad/s^0.5  IMU.NoiseAcc: 0.05  #0.04  # 0.0028 (TUM) # 0.0028     # m/s^1.5 IMU.GyroWalk: 4e-05 #0.000022 #(VINS and TUM) rad/s^1.5 IMU.AccWalk: 0.001  #0.0004 # 0.00086 # 0.00086    # m/s^2.5 IMU.Frequency: 200.0 System.thFarPoints: 7.0  #-------------------------------------------------------------------------------------------- # ORB Parameters #--------------------------------------------------------------------------------------------  # ORB Extractor: Number of features per image ORBextractor.nFeatures: 1000 # Tested with 1250  # ORB Extractor: Scale factor between levels in the scale pyramid  ORBextractor.scaleFactor: 1.2  # ORB Extractor: Number of levels in the scale pyramid ORBextractor.nLevels: 3 #8  # ORB Extractor: Fast threshold # Image is divided in a grid. At each cell FAST are extracted imposing a minimum response. # Firstly we impose iniThFAST. If no corners are detected we impose a lower value minThFAST # You can lower these values if your images have low contrast ORBextractor.iniThFAST: 20 ORBextractor.minThFAST: 7  #-------------------------------------------------------------------------------------------- # Viewer Parameters #-------------------------------------------------------------------------------------------- Viewer.KeyFrameSize: 0.05 Viewer.KeyFrameLineWidth: 1.0 Viewer.GraphLineWidth: 0.9 Viewer.PointSize: 2.0 Viewer.CameraSize: 0.08 Viewer.CameraLineWidth: 3.0 Viewer.ViewpointX: 0.0 Viewer.ViewpointY: -0.7 Viewer.ViewpointZ: -3.5 Viewer.ViewpointF: 500.0 

Несколько пояснений, что куда попадает из файла калибровки 320x240_dynamic-results-imucam.txt:

Спасибо за внимание.


ссылка на оригинал статьи https://habr.com/ru/post/689778/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *