海康威视、LIVOX与PTP时间同步

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,继续解压后是海康打包的soSamples
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 EdgeLine 0 上升沿
Line0 Falling EdgeLine 0 下降沿
Frame Start Over Trigger帧开始过触发
Over Run过载
Stream Transfer Overflow相机缓存内图像被覆盖
Frame Trigger Wait帧触发等待,相机可被触发时输出event
Software Active软触发有效
Image Error图像错误

在MVS中,设置操作方法:

  1. 在相机参数中,开启所要选择的事件,以Exposure Start事件为例
    在这里插入图片描述
  2. 开始相机取流曝光,在事件监视器中,获取事件信息
    在这里插入图片描述

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时钟的网络中时,设备会自动同步自己的时间到主时钟。

在这里插入图片描述
对应的pdf是https://www.livoxtech.com/3296f540ecf5458a8829e01cf429798e/downloads/Livox%20Viewer/Livox%20Viewer%20%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.pdf
在这里插入图片描述

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不能正常工作。
在这里插入图片描述

3.3 配置文件

…详情请参照古月居

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敢敢のwings

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值