按照ZED官网提供的方式ZED2i的SDK和ros2 wrapper之后, 还有很多工作要做才能让ZED成功运行稳定的VINS
1. ZED2i用Kalibr标定IMU和相机
由于我的电脑怎么装Kalibr都装不上, 说是啥boost这个库版本不一样, 但是我程序都是写在当前boost库中的, 改了怕出bug, 于是我只有用Docker去安装Kalibr.
1. Ubuntu 20.04通过Docker准备Kalibr环境
- 在docker hub下载stereolabs/kalibr镜像
stereolabs/kalibr镜像链接: Kalibr
docker pull stereolabs/kalibr
一般运行docker需要管理员权限, sudo或者root都可.
- 创建并开启Kalibr容器, 并且挂载目录.
挂载的目录中的文件可以共享在主机和容器中, 如新建的目录/home/data, 就挂载在kalibr系统中的/data目录下,/home/data和 /data目录可以共享文件内容.
docker run -itd -v /home/data:/data --name kalibr stereolabs/kalibr bash
docker attach kalibr
- Kalibr的Docker排坑.
docker里由于无法可视化任何东西, 所以需要关闭kalibr的图像生成部分, 注释/kalibr_workspace/src/Kalibr/aslam_offline_calibration/kalibr/python/kalibr_calibrate_cameras 中的第201行到205行.
但是docker没有vim等编辑器, 需要下载vim.
又发现国内网太高, docker源在外面, 执行sudo apt-get下载不了任何东西. 又没有vim编辑器, 可以用一下方式
docker exec -it <容器名称/id> bash
cd /ect/apt
cp sources.list sources.list.bak
echo "">sources.list
echo "deb http://ftp2.cn.debian.org/debian/ buster main">>sources.list
echo "deb http://ftp2.cn.debian.org/debian/debian-security buster/updates main">>sources.list
echo "deb http://ftp2.cn.debian.org/debian/debian buster-updates main">>sources.list
cat sources.list
root@62be94cc90e7:/etc/apt
deb http://ftp2.cn.debian.org/debian/ buster main
deb http://ftp2.cn.debian.org/debian/debian-security buster/updates main
deb http://ftp2.cn.debian.org/debian/debian buster-updates main
root@62be94cc90e7:/etc/apt
apt-get update
apt-get install vim
rm sources.list
mv sources.list.bak sources.list
以上参考自Docker国内加速
然后就下载完vim.
注释/kalibr_workspace/src/Kalibr/aslam_offline_calibration/kalibr/python/kalibr_calibrate_cameras 中的第201行到205行.
vi /kalibr_workspace/src/Kalibr/aslam_offline_calibration/kalibr/python/kalibr_calibrate_cameras
2. ZED2i相机用Kalibr联合标定
Kalibr只支持ros1的数据格式, 于是又安装了zed的ros环境.
- 生成标定板:
在kalibr docker中生成标定板
kalibr_create_target_pdf --type apriltag --nx 6 --ny 6 --tsize 0.04 --tspace 0.3
具体的参数介绍见Kalibr官网
--type apriltag 标定板类型
--nx [NUM_COLS] 列个数
--ny [NUM_ROWS] 行个数
--tsize [TAG_WIDTH_M] 二维码方格长度,单位m
--tspace [TAG_SPACING_PERCENT] 小方格与二维码方格长度比例
遇到问题"ImportError: No module named pyx"
sudo apt-get install python-pyx
生成的target.pdf在docker中, 一般是访问不到的. 我们可以用主机的docker cp 把docker中的文件cp到交互文件夹下, 如/data, 然后我们就可从主机把/data文件夹下的东西拿出来.
我们还需要准备几个文件, 放到docker内
- april.yaml
- ZED的rosbag
april.yaml文件内容由生成target.pdf的命令变换, 如下
kalibr的rosbag录制的设备移动方法见官网的YouTube视频, B站上也有.
rosbag record -O Kalibr_data.bag /zed2i/zed_node/imu/data_raw /zed2i/zed_node/left/image_rect_color /zed2i/zed_node/right/image_rect_color
可以更改zed的ros配置内容, 去变换ZED发布的分辨率或者发布频率, 我的是VGA15hz+IMU200HZ
然后把录好的bag也放到docker的/data中
然后在Docker中运行
kalibr_calibrate_cameras --bag /data/Kalibr_data.bag --topics /zed2i/zed_node/left/image_rect_color /zed2i/zed_node/right/image_rect_color --models pinhole-radtan pinhole-radtan --target /data/april.yaml
然后会生成相机标定文件camchain-dataKalibr_data.yaml与results-cam-dataKalibr_data.txt. 这两个文件会在后面相机与IMU联合标定的时候用到.
我们还要准备一下imu_params.yaml这个文件. 因为没时间标定单独的IMU, 所以我直接用的官网的数据
然后联合标定
kalibr_calibrate_imu_camera --bag /data/Kalibr_data.bag --cam /data/camchain-dataKalibr_data.yaml --imu /data/imu_params.yaml --target /data/april.yaml
然后就会生成camchain-imucam-dataKalibr_data.yaml , imu-dataKalibr_data.yaml, results-imucam-dataKalibr_data.txt
具体camera到IMU外参可以看results-imucam-dataKalibr_data.txt生成的文件里. 再把这里面的东西写入VINS的配置文件中.
这里要注意的是, ROS2中ZED发布的message信息的分辨率是896*512, 并不是HD720P的, 所以我们要在VINS的相机配置文件改一下内参和分辨率.
把初始化的外参估计方式改为0, 就是完全相信配置的外参. 由于外参标定的比较准确, 所以就算没运行loop_fusion的情况下, 100m定位误差也只有厘米级.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)