0.设备、环境和说明
笔记本电脑i5-8300H、GTX 1060、32GRAM
因为后面要测试Vins-Fusion和ORB-SLAM3,所以推荐安装Ubuntu 18.04(或者Ubuntu 20.04) + ROS 1(不建议用比Ubuntu18更低的版本)
ROS一键安装命令:
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。
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的专属工作空间:
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中的命令开始编译:
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文件夹下:
z@h:~/zed_ws$ tree -L 2
.
└── src
├── CMakeLists.txt -> /opt/ros/melodic/share/catkin/cmake/toplevel.cmake
├── zed_ros_interfaces
└── zed_ros_wrapper
继续重新上面的操作:
rosdep install --from-paths src --ignore-src -r -y
cd ..
catkin_make -DCMAKE_BUILD_TYPE=Release
安装完成!
为了后续启动方便,可以编辑环境变量将节点添加进去:
gedit ~/.bashrc
## 添加:
source ~/zed_ws/devel/setup.bash
ZED 2i附加驱动、功能很丰富,不需要的例如zed-ros-examle可以不安装。
3.ROS相关命令
ROS是一个负责通讯的机器人控制系统,其信号连接是通过节点之间的发布和接收。
正常来说,如果没有启动roscore打开ros是没有任何话题和节点的。
所以我们在终端中输入,打开相机,观察相机正面Logo旁边会亮起蓝色指示灯:
roslaunch zed_wrapper zed2i.launch
a.查看节点,负责通信
rosnode list
b.查看话题
rostopic list
c.查看节点关系图(两端是节点,中间用话题传输)
rosrun rqt_graph rqt_graph
d.查看话题信息
例如打开相机后查看imu这个话题下的信息,确实就是查看imu实时工作状态。
rostopic echo /zed2i/zed_node/imu/data
e.查看话题频率
rostopic hz /zed2i/zed_node/imu/data
f.用rqt来看(rostopic list的可视化形式)
rosrun rqt_topic rqt_topic
勾选前面的对号,可以查看传输带宽和频率
g.修改话题频率
rosrun topic_tools throttle messages {topic1} {想要修改的频率} {topic2}
举例:
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
rostopic hz /zed2i/zed_node/imu/data_20
这些是后续运行SLAM常用的几个查看、修改指令,因为在标定过程中需要降低相机频率实现稳定等情况。
所有强烈建议使用X-超级终端窗口,不要使用Ubuntu自带的了。
sudo apt-get install terminator
Ctrl+Shift+O 和 Ctrl+Shift+E 实现一个窗口纵向和横向分栏。
可能遇到的小问题:
1.可能遇到Ctrl+Shift+E在terminator中失效的情况,这是因为安装的搜狗输入法快捷键冲突了。
2.有时候快捷键打不开terminator或者直接失灵了,检查一下你的Python版本是不是更换了,因为安装的时候默认绑定到了你的当前Python上。
h.录制rosbag
## 录制所有话题
rosbag record -a
#为文件命名
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。
resolution: 2 # '0': HD2K, '1': HD1080, '2': HD720, '3': VGA
# 修改后
resolution: 3 # '0': HD2K, '1': HD1080, '2': HD720, '3': VGA
重新打开相机,例如查看相机右目信息:
rostopic echo /zed2i/zed_node/right/camera_info
(2)帧率
设置帧率有两种方法,一种是跟上面一样,在配置文件common.yaml中设置配置参数,然后重启相机;第二种方法是利用topic_tools修改。为了不打开太多的终端,这次选用第一种方法。
4.3 可视化窗口
可以直接用ROS提供的接口来调用话题,类似于这样:
## 打开左右目
rosrun image_view image_view image:=/zed2i/zed_node/left/image_rect_gray
rosrun image_view image_view image:=/zed2i/zed_node/right/image_rect_gray
也可以使用rviz,rviz是ros系统下的一个可视化工具,可以添加需要的话题来显示。
rosrun rviz rviz
默认打开情况是什么话题都没有的。
这里说明一点,工业相机与网络usb摄像头(webcam)或者手机摄像头有区别的是,工业相机是做了出厂标定的,所以在相机话题下有类似raw-image和rect-image两种话题,为了更准确,这里直接选择黑白去畸变后的图像。
点击左边下方Add按钮,切换到By topic界面,我们之前是打开了zed-ros的节点的,所有zed相机的所有话题都在其中显示。这里选择zed2i/zed_node/left/image_rect_gray和zed2i/zed_node/right/image_rect_gray里面的Camera,点击OK。
说明一下,双目相机左右目是以前进方向为准,不要搞反了。