В данной публикации хотелось бы познакомить с пакетом калибровки камеры 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:
Спасибо за внимание.