0. 简介
最近在开发相机和激光雷达融合的slam算法,主要用于三维重建,想实时的得到彩色点云地图。这里我们选择了视的工业相机和大疆的固态激光雷达。对于海康威视摄像头,我们可以使用PTP来对摄像头、雷达这些完成时间同步。
1. 海康威视软件安装
海康的相机没有ros驱动,而且对linux开发不太用好(windows的支持还是不错的),就重写了sdk接口,并创建了ros节点封装成ros包,方便linux环境下ros的调用,用于开发后面的算法,完整版ros驱动:https://github.com/luckyluckydadada/HIKROBOT-MVS-ROS-package
海康的打开设备的方式在MvUsb3VDevice.h和MvGigEDevice.h中实现(分别对应usb3.0相机和以太网相机),具体过程并没有开源,只提供了相应的so文件,海康提供了统一的接口MV_CC_EnumDevices实现对两种设备(usb3.0接口和以太网接口)的调用,因此开发一个ros驱动包是两种相机都适用的。
这里建议使用支持IEEE1588(即PTP同步)的GigE 2.0相机,这样所有设备和时钟可以通过linuxptp进行同步。建议使用GigE 2.0相机的原因是其简化了硬件同步,无需修改驱动或增加外部触发硬件。相机连接只需一根网线,这条网线负责供电、数据传输和时钟同步。
下面我们就得安装海康MVS了,下载地址为:https://www.hikrobotics.com/cn
如果是Linux,则需要下载Linux版本:https://www.hikrobotics.com/machinevision/service/download?module=0选linux的最新版:机器视觉工业相机客户端MVS V2.1.0(Linux)
1.1 解压
MVS_Linux_STD_V2.1.0_201228.zip解压后,目录中含有多种架构已经编译好并打包的*.dpkg包,另外还有tar.gz(也含编译好的so和bin文件)。
MVS-2.1.0_aarch64_20201228.deb MVS-2.1.0_i386_20201228.deb
MVS-2.1.0_aarch64_20201228.tar.gz MVS-2.1.0_i386_20201228.tar.gz
MVS-2.1.0_armhf_20201228.deb MVS-2.1.0_x86_64_20201228.deb
MVS-2.1.0_armhf_20201228.tar.gz MVS-2.1.0_x86_64_20201228.tar.gz
MVS-2.1.0_arm-none_20201228.tar.gz
树莓派选armhf
架构,jetson选aarch64
,pc机选x86_64
,i386是32位pc。
armhf和aarch64区别就是armhf是armv7架构,如树莓派。aarch64是armv8架构,如jetson nano。
arm-none只有Samples,没有编译好的bin,也没有dpkg包,海康也没有提供源码,所以用不上。
所有的tar包都包含另一个MVS.tar.gz
,继续解压后是海康打包的so
和Samples
。
Samples说明参照MVS/Samples/README-CH
,安装完sdk后可以在每个sample子目录敲make编译生成可执行程序。
因为海康没有提供源码,只提供编译好的so来给我们调用,所以下面的tar包安装也不用编译。
1.2 dpkg包安装(二选一)
dpkg -i MVS-2.1.0_x86_64_20201228.deb
安装在 /opt/MVS
下,这里有个问题,运行需要去cd /opt/MVS/bin/
再./MVS.sh
运行。
可选操作:
虽然环境变量配置了lib目录,但是没有配置bin目录,而且即使配置了bin目录,在其他目录也会运行失败,因为MVS调用的很多lib没有在/opt/MVS/lib
目录,而在bin目录,可能是担心lib重名吧。
可以按如下方法修改方法,找到对应行:
vim ~/.bashrc
export PATH=$PATH:/opt/MVS/bin:
export MVCAM_COMMON_RUNENV=/opt/MVS/lib
export LD_LIBRARY_PATH=/opt/MVS/lib/64:/opt/MVS/lib/32:/opt/MVS/bin:$LD_LIBRARY_PATH
任意目录命令行敲MVS打开设备。
上面谨慎修改,因为/opt/MVS/bin目录加入到LD_LIBRARY_PATH后,会同样将这个目录里的libQt5*等库引入全局可见,跟系统安装的libQt版本不一致,比如我的rviz在调用Qt这个库的时候出现了不匹配打不开的情况,使用系统自带的则正常打开,所以谨慎修改。
1.3 tar包安装(二选一)
tar -xvf MVS-2.1.0_x86_64_20201228.tar.gz
cd MVS-2.1.0_x86_64_20201228
sudo bash setup.sh
可选操作同上。
1.4 时间同步
海康相机可以通过简单的参数配置,在参数配置Transport layer下启用IEEE 1588 V2(即PTP v2)功能,通过设置相机为主时钟(Master)或从时钟(Slave),并利用交换机等网络设备实现纳秒级的同步拍照。因此,在适当的网络配置下,海康工业相机能够利用PTP功能满足对时间同步有严格要求的应用场景。
开通PTP协议,使用交换机实现多个工业相机纳秒级同步拍照。
Basler 相机设置:先设置外触发
(1)设置主相机:选择一个相机在Transport layer 下IEEE 1588 V2 Enabled 勾选,点击IEEE1588 Data Set Latch 的Execute按钮,查看IEEE1588 Status 该相机为“主”。
(2)设置从相机:选择其他的相机在Transport layer 下IEEE 1588 V2 Enabled 勾选,点击IEEE1588 Data Set Latch 的Execute按钮,查看IEEE1588 Status 该相机为“从”。
(3)查看每个相机获取照片的时间戳,最后一位为纳秒,可以看到相差约十几纳秒以内。
海康工业相机支持多种事件,每一种事件产生,都会有时间戳记录
事件类型 | 简介 |
---|---|
Acquisition Start | 采集开始 |
Acquisition End | 采集结束 |
Frame Start | 帧开始 |
Frame End | 帧结束 |
Frame Burst Start | 帧触发开始 |
Frame Burst End | 帧触发结束 |
Exposure Start | 曝光开始 |
Exposure End | 曝光结束 |
Line0 Rising Edge | Line 0 上升沿 |
Line0 Falling Edge | Line 0 下降沿 |
Frame Start Over Trigger | 帧开始过触发 |
Over Run | 过载 |
Stream Transfer Overflow | 相机缓存内图像被覆盖 |
Frame Trigger Wait | 帧触发等待,相机可被触发时输出event |
Software Active | 软触发有效 |
Image Error | 图像错误 |
在MVS中,设置操作方法:
- 在相机参数中,开启所要选择的事件,以Exposure Start事件为例
- 开始相机取流曝光,在事件监视器中,获取事件信息
1.5 各种时间戳的时序关系
以相机常用的时间戳为例,梳理了下工业相机比较场景的时间戳关系,以相机相对时间为基准,具体如下图:
3. Line0RisingEdge:触发信号通过line0给到相机
4. FrameStart:图像输出开始
5. nDevTimeStamp:时间戳打包到leader包时刻
6. ExposureStart:sensor开始曝光时刻
7. ExposureEnd:sensor结束曝光时刻
8. nHoststamp: 图像头包到达主机时间,主机时间,非相机时间戳
9. FrameEnd:相机端图像输出结束
1.6 ROS相机话题
然后按照Github来运行,就可以得到下面的效果。这是对应的文档说明。
2. Livox同步
这里主要参考https://livox-wiki-cn.readthedocs.io/zh-cn/latest/tutorials/new_product/common/index.html官网的文档。同步过程使用IEEE 1588v2.0 PTP的Delay request-response机制(two steps),Livox设备作为slave端(和海康一致),和master时钟设备进行ptp时间同步。当Livox LiDAR连接到有ptp master时钟的网络中时,设备会自动同步自己的时间到主时钟。
3. PTP时间同步
这里我们参考了Linux 使用 PTP 进行时间同步,这篇文章的内容,当然ptpd也是可以完成同步的
3.1 安装 LinuxPTP
首先,需要在 Linux 系统中安装 LinuxPTP。Ubuntu 系统使用 apt 命令安装:
sudo apt install linuxptp
如果想安装最新版本的 LinuxPTP,可以采用源码编译安装方式:
sudo git clone git://git.code.sf.net/p/linuxptp/code linuxptp
cd linuxptp
sudo make
sudo make install
安装完成后可通过 ptp4l -v
命令检查是否安装成功:
$ ptp4l -v
1.92
3.2 检查网卡驱动
为了使用 PTP ,网络接口的内核网络驱动程序必须支持软件或硬件时间戳功能。除了驱动程序中存在的硬件时间戳支持之外,NIC 还必须能够在物理硬件中支持此功能。验证特定驱动程序和 NIC 的时间戳功能的最佳方法是使用 ethtool 查询接口。
例如:检查 eth0 网卡对硬件时间戳的支持
sudo ethtool -T eth0
执行上述命令后的输出结果可能如下:
Time stamping parameters for eth0:
Capabilities:
hardware-transmit (SOF_TIMESTAMPING_TX_HARDWARE)
software-transmit (SOF_TIMESTAMPING_TX_SOFTWARE)
hardware-receive (SOF_TIMESTAMPING_RX_HARDWARE)
software-receive (SOF_TIMESTAMPING_RX_SOFTWARE)
software-system-clock (SOF_TIMESTAMPING_SOFTWARE)
hardware-raw-clock (SOF_TIMESTAMPING_RAW_HARDWARE)
PTP Hardware Clock: 0
Hardware Transmit Timestamp Modes:
off (HWTSTAMP_TX_OFF)
on (HWTSTAMP_TX_ON)
one-step-sync (HWTSTAMP_TX_ONESTEP_SYNC)
Hardware Receive Filter Modes:
none (HWTSTAMP_FILTER_NONE)
all (HWTSTAMP_FILTER_ALL)
对于软件时间戳支持,参数列表应包括:
SOF_TIMESTAMPING_SOFTWARE
SOF_TIMESTAMPING_TX_SOFTWARE
SOF_TIMESTAMPING_RX_SOFTWARE
对于硬件时间戳支持,参数列表应包括:
SOF_TIMESTAMPING_RAW_HARDWARE
SOF_TIMESTAMPING_TX_HARDWARE
SOF_TIMESTAMPING_RX_HARDWARE
下图的例子中,表明eth0网卡支持硬件时间戳。
下图的例子中wlan0网卡不支持硬件和软件时间戳,linuxptp/ptp4l不能正常工作。