【ZED&SLAM】Ubuntu18.04系统ZED 2i双目相机SDK安装、联合标定、SLAM测试

0.设备、环境和说明

笔记本电脑i5-8300H、GTX 1060、32GRAM

因为后面要测试Vins-Fusion和ORB-SLAM3,所以推荐安装Ubuntu 18.04(或者Ubuntu 20.04) + ROS 1 (不建议用比Ubuntu18更低的版本)

ROS一键安装命令:

bash 复制代码
wget http://fishros.com/install -O fishros && . fishros

ZED 2i:双目相机配有9轴IMU

此前电脑已经配置好:Ubuntu 18.04,ROS 1,Vins-Fusion,OpenCV 3.2.0,ceres-solver 1.14.0,CMake 3.12,Eigen 3.3.3,g2o(20年版本),Pangolin-0.6,Kalibr,imu_code等。

相机的usb接口要插在电脑的usb3.0协议的插口中。

1.安装ZED SDK3.8.2

官方手册Linux版本: https://www.stereolabs.com/docs/installation/linux/

选择静默安装即可,跳过CUDA检查。ZED相机依赖CUDA加速,所以电脑必须要安装CUDA!

The installer can be launched in silent mode with the -- silent option (with a space between -- and silent).

其中关于CUDA的解释:

CUDA 是 ZED SDK 用来在显卡上运行快速 AI 和计算机视觉任务的 NVIDIA® 库。在 ZED SDK 安装过程中,如果您的计算机上未检测到 CUDA,ZED SDK会自动下载并安装 CUDA。

建议跳过CUDA检查,然后根据自己显卡版本手动安装CUDA,速度会快一些。

CUDA官网:https://developer.nvidia.com/cuda-toolkit-archive

所以,最后的安装SDK指令最后应该是加上: -- silent skip_cuda

安装完成后重启系统 。安装全程不要加sudo。

powershell 复制代码
z@h:~/zed/tools$ tree
.
├── ZED_Calibration
├── ZED_Depth_Viewer
├── ZED_Diagnostic
├── ZED_Explorer
├── ZEDfu
├── ZED_Sensor_Viewer
└── ZED_SVO_Editor

tools里面有一些小工具,可以检查相机原件是否正常。

例如打开/zed/tools中开发好的小工具,ZED_Calibration可以进行相机标定,ZED_Explorer可以查看相机分辨率和帧率参数以及标定信息等。

后续需要调整帧数和分辨率,所以可以看到ZED相机的配置参数:2k、1080p、720p和VGA,由于传输速度的限制,分辨率越高最大帧数越低。

2.安装ZED-ROS

上一步相当于是安装了相机驱动,保证了相机能够运行,下面是安装ZED相机的ROS节点,使用ROS来控制相机的话题和指令:https://www.stereolabs.com/docs/ros/

先创建一个zed的专属工作空间:

bash 复制代码
mkdir -p ~/zed_ws/src
cd zed_ws/src/
catkin_init_workspace

zed-ros-wrapper是一个catkin包,github下载链接:https://github.com/stereolabs/zed-ros-wrapper

下载完成后,将zed-ros-wrapper改成zed_ros_wrapper

找准自己安装的SDK对应的版本,在右侧的release中查找,手动下载压缩包,解压缩后放到src文件夹下。然后安装github中的命令开始编译:

bash 复制代码
cd ..
rosdep install --from-paths src --ignore-src -r -y

报错:

错误原因比较清楚,是没有找到zed_interfaces这个依赖项。依然是找到对应的版本v1.2:https://github.com/stereolabs/zed-ros-interfaces/releases/tag/v1.2,依然是改名为zed_ros_interfaces,解压缩后直接放到src文件夹下:

powershell 复制代码
z@h:~/zed_ws$ tree -L 2
.
└── src
    ├── CMakeLists.txt -> /opt/ros/melodic/share/catkin/cmake/toplevel.cmake
    ├── zed_ros_interfaces
    └── zed_ros_wrapper

继续重新上面的操作:

bash 复制代码
rosdep install --from-paths src --ignore-src -r -y
cd ..
catkin_make -DCMAKE_BUILD_TYPE=Release

安装完成!

为了后续启动方便,可以编辑环境变量将节点添加进去:

bash 复制代码
gedit ~/.bashrc
## 添加:
source ~/zed_ws/devel/setup.bash

ZED 2i附加驱动、功能很丰富,不需要的例如zed-ros-examle可以不安装。

3.ROS相关命令

ROS是一个负责通讯的机器人控制系统,其信号连接是通过节点之间的发布接收

正常来说,如果没有启动roscore打开ros是没有任何话题和节点的。

所以我们在终端中输入,打开相机,观察相机正面Logo旁边会亮起蓝色指示灯:

bash 复制代码
roslaunch zed_wrapper zed2i.launch

a.查看节点,负责通信

bash 复制代码
rosnode list

b.查看话题

bash 复制代码
rostopic list

c.查看节点关系图(两端是节点,中间用话题传输)

bash 复制代码
rosrun rqt_graph rqt_graph

d.查看话题信息

例如打开相机后查看imu这个话题下的信息,确实就是查看imu实时工作状态。

bash 复制代码
rostopic echo /zed2i/zed_node/imu/data

e.查看话题频率

bash 复制代码
rostopic hz /zed2i/zed_node/imu/data

f.用rqt来看(rostopic list的可视化形式)

bash 复制代码
rosrun rqt_topic rqt_topic

勾选前面的对号,可以查看传输带宽和频率

g.修改话题频率

bash 复制代码
rosrun topic_tools throttle messages {topic1}  {想要修改的频率}  {topic2}

举例:

bash 复制代码
rosrun topic_tools throttle messages /zed2i/zed_node/imu/data 20.0 /zed2i/zed_node/imu/data_20

再次rostopic hz这个话题/zed2i/zed_node/imu/data_20

bash 复制代码
rostopic hz /zed2i/zed_node/imu/data_20

这些是后续运行SLAM常用的几个查看、修改指令,因为在标定过程中需要降低相机频率实现稳定等情况。

所有强烈建议使用X-超级终端窗口,不要使用Ubuntu自带的了。

bash 复制代码
sudo apt-get install terminator

Ctrl+Shift+O 和 Ctrl+Shift+E 实现一个窗口纵向和横向分栏。

可能遇到的小问题:

1.可能遇到Ctrl+Shift+E在terminator中失效的情况,这是因为安装的搜狗输入法快捷键冲突了。

2.有时候快捷键打不开terminator或者直接失灵了,检查一下你的Python版本是不是更换了,因为安装的时候默认绑定到了你的当前Python上。

h.录制rosbag

bash 复制代码
## 录制所有话题
rosbag record -a
bash 复制代码
#为文件命名
rosbag record -O bag_name.bag /topics.. 
#为文件名字做前缀
rosbag record -o bag_name /topics.. 

关于rosbag的录制和播放命令很多,详细可以查看官网或者参考博客:rosbag数据记录工具命令详解

4.双目相机标定

4.1 说明

像之前的介绍INDEMIND相机标定的博客一样,依然使用kalibr工具箱来标定。

Kalibr工具箱安装参考博客:【INDEMIND相机运行SLAM】

首先相机标定对稳定性要求很高,所以要对相机降频为4hz(官方推荐);其次要打开一个可视化窗口来观察是否保证整个标定板信息全部位于图像中央;最后供kalibr处理的rosbag里面的数据格式(分辨率)要和后续测试数据相同(这一点容易被忽视)。

文献Porting A Visual Inertial SLAM Algorithm To Android Devices 中:

These two different inputs led to the calibration results printed in Table 1 & 2. ...Modern flat-panel displays serve the purpose of a perfect plane reasonably well.

可以看出,与显示器屏幕的重投影误差相比,印刷棋盘的误差要打大。其原因大概是由于打印机墨水量较多,打印的纸张上出现了轻微不均匀的波浪。表面不完全平坦导致误差增加两倍以上。现代平板显示器相当好的实现了完美平面的目的。

所以在标定的时候用显示器或者Pad是可以的。

之前在进行相机标定的时候都是没有安装严格规范流程:相机标定 的时候是相机固定,标定板目标移动;后续联合标定 的时候需要加入惯导信息所以是标定板固定,相机做6自由度激活运动

这次尝试固定相机,将其架在三脚架上,手持平板运动。kalibr官方介绍:

The camera system is fixed and the calibration target is moved in front of the cameras to obtain the calibration images.

It is recommended to lower the frequency of the camera streams to around 4 Hz while capturing the calibration data. This reduces redundant information in the dataset and thus lowering the runtime of the calibration.

相机系统固定,标定目标在相机前面移动以获得标定图像。

建议在捕获校准数据时将相机流的频率降低至 4 Hz 左右。这减少了数据集中的冗余信息,从而缩短了校准的运行时间。

4.2 修改相机分辨率和话题频率

(1)分辨率(注意下采样设置)

在zed_ws/src/zed_ros_wrapper/zed_wrapper/params中找到common.yaml通用配置文件,第26行general栏中找到resolution,默认情况下是720p&15hz。只是修改了配置文件,不需要重新make

powershell 复制代码
    resolution:                 2                              # '0': HD2K, '1': HD1080, '2': HD720, '3': VGA

    # 修改后
    resolution:                 3                              # '0': HD2K, '1': HD1080, '2': HD720, '3': VGA

重新打开相机,例如查看相机右目信息,发现ZED相机分辨率是原来的1/2,为啥呢?

bash 复制代码
rostopic echo /zed2i/zed_node/right/camera_info

再回到common.yaml中,找到video栏中的图像下采样因子( img_downsample_factor)设置为1.0。下采样是为了降低图像分辨率,减少内存计算,但是为造成图像过度失真,我们已经选择了VGA最低分辨率,所以可以不需要下采样:

powershell 复制代码
video:
    img_downsample_factor:      1.0                             # Resample factor for images [0.01,1.0] The SDK works with native image sizes, but publishes rescaled image.

这样操作修改之后,重新查看分辨率info,分辨率为672*376

也可以选择分辨率为720P,下采样选择0.5,最后实际分辨率为640*360。 这个我没试过。

(2)帧率(两种方法)

设置帧率有两种方法,第一种是跟上面一样,在配置文件common.yaml中设置配置参数,然后重启相机;

为了不打开太多的终端,这次选用第一种方法

再打开common.yaml文件,在第19行发布帧率(pub_frame_rate)修改为4hz。

bash 复制代码
z@h:~/zed_ws$ rostopic hz /zed2i/zed_node/right/image_rect_gray
subscribed to [/zed2i/zed_node/right/image_rect_gray]
average rate: 4.280
	min: 0.201s max: 0.267s std dev: 0.03301s window: 3
average rate: 4.085
	min: 0.201s max: 0.267s std dev: 0.02924s window: 7
....

第二种方法是利用topic_tools修改。

bash 复制代码
rosrun topic_tools throttle messages /zed2i/zed_node/left/image_rect_gray 4.0 /zed2/zed_node/left/image_rect_gray4hz
rosrun topic_tools throttle messages /zed2i/zed_node/right/image_rect_gray 4.0 /zed2/zed_node/right/image_rect_gray4hz

用ros topic_tools来修改

4.3 可视化窗口(两种方法)

(1)image_view

可以直接用ROS提供的接口Viewer来调用话题显示,类似于这样:

bash 复制代码
## 直接打开双目
rosrun image_view image_view image:=/zed2i/zed_node/stereo/image_rect_color

(2)RViz

也可以使用rviz,rviz是ros系统下的一个可视化工具,可以添加需要的话题来显示。

bash 复制代码
## 启动rviz
rosrun rviz rviz

默认打开是什么话题都没有的,需要什么就添加。

这里说明一点,工业相机与网络usb摄像头(webcam)或者手机摄像头有区别的是,工业相机是做了出厂标定的,所以在相机话题下有类似raw-image和rect-image两种话题。

点击左边下方Add按钮,切换到By topic界面,我们之前是打开了zed-ros的节点的,所有zed相机的所有话题都在其中显示。这里选择/zed2i/zed_node/stereo/image_rect_color的Image,点击OK。

说明一下,双目相机左右目是以前进方向为准,不要搞反了。

4.4 双目相机标定

(1)kalibr Camera标定

kalibr标定更加离线一点,是先打包,后处理rosbag格式的数据。这意味着需要用的rosbag record命令。

在标定之前先理清楚需要将什么话题添加到bag当中,实现检查一下是否达到了需要的分辨率和帧数

powershell 复制代码
## 右目话题
/zed2i/zed_node/right/image_rect_gray
## 左目话题
/zed2i/zed_node/left/image_rect_gray

随后将相机架在桌子上,我是找了一个11寸的pad,显示的标定板用的是6*6的aprilgrid。

bash 复制代码
rosrun kalibr kalibr_calibrate_cameras --bag /home/z/zed_ws/test1.bag --topics /zed2i/zed_node/left/image_rect_gray /zed2i/zed_node/right/image_rect_gray --models pinhole-radtan  pinhole-radtan --target /home/z/zed_ws/april_6x6_80x80cm.yaml --show-extraction
相关推荐
z樾11 分钟前
Github界面学习
学习
道爷我悟了43 分钟前
Vue入门-指令学习-v-html
vue.js·学习·html
计算机学姐2 小时前
基于SpringBoot+Vue的在线投票系统
java·vue.js·spring boot·后端·学习·intellij-idea·mybatis
彤银浦2 小时前
python学习记录7
python·学习
少女忧2 小时前
51单片机学习第六课---B站UP主江协科技
科技·学习·51单片机
邓校长的编程课堂3 小时前
助力信息学奥赛-VisuAlgo:提升编程与算法学习的可视化工具
学习·算法
missmisslulu4 小时前
电容笔值得买吗?2024精选盘点推荐五大惊艳平替电容笔!
学习·ios·电脑·平板
yunhuibin4 小时前
ffmpeg面向对象——拉流协议匹配机制探索
学习·ffmpeg
hengzhepa4 小时前
ElasticSearch备考 -- Search across cluster
学习·elasticsearch·搜索引擎·全文检索·es
蜡笔小新星5 小时前
Python Kivy库学习路线
开发语言·网络·经验分享·python·学习