MID360 & Seeker 全向相机硬件时间同步教程 ESP32_mid360时间同步
使用简单易上手的ESP32进行MID360激光雷达和Seeker全向视觉相机的硬件时间同步(偶尔的付费文章,长期内容输出的动力~)WEIXIN:
MID360 & Seeker 全向相机硬件时间同步教程 ESP32mp.weixin.qq.com/s/8cReydXWpfOmTTTKXEJFRw编辑https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/8cReydXWpfOmTTTKXEJFRw
简述
前段时间的FAST-LIVO2很火热,其可以利用相机图像给激光雷达点云上色,效果很不错。为了实现良好的算法效果,这需要进行相机和激光雷达的硬件时间同步(软件同步应该也可以)。而硬件时间同步的操作其实就是:将不同传感器设备的时间戳统一到同一个时钟源上,即统一时间的坐标系。
当然,不同设备其硬件时间同步操作不同,此文也主要是记录一下MID360激光雷达和Seeker全向视觉相机的同步操作,前后也折腾了几天。对于外部的硬件同步设备,选择其实有很多,不过我最终选取的是ESP32-S3作为外部触发设备,其尺寸很小(一节儿大指拇),编程简单,只是相对有点贵(30RMB)。最终的一个硬件时间同步效果如下图所示,左侧为Livox的imu数据话题,右侧为Seeker的imu数据话题,二者频率都是200hz,时间戳基本上对齐。
画了个简易的固定支架,seeker基本上不挡mid360的视野。后面可能会尝试跑一下FAST-LIVO2,不知道效果会咋样,seeker的四个鱼眼矫正之后畸变还是有点明显。
有关于MID360&SEEKER的硬件同步原理部分内容无需付费即可查看,付费主要是针对于使用EPS32-S3进行硬件触发的内容。大佬直接基于原理部分内容写个定时器+串口一下就可以实现同步,此文付费内容主要针对于小白(EPS32用于时间同步有些大材小用,但是耐不住它确实入门简单&尺寸超级mini)。本文内容概览如下:
一、基本原理
内容包括MID360、Seeker的时间同步原理简述、硬件接线、触发设备选择与是否成功触发硬件时间同步的检查方式。
1.1 MID360
mid360的硬件同步相关资料很多,如下:
官方示例,NUC+ STM32+Avia+Camera: https://github.com/xuankuzcr/LIV_handhold
B站UP主, Jetson + Mid360+Camera: https://www.bilibili.com/video/BV1T142197ci
MID360同步原理: https://livox-wiki-cn.readthedocs.io/zh-cn/latest/tutorials/new_product/common/time_sync.html
官方的同步原理:Livox设备接收到PPS信号上升沿,并由GPRMC数据解析出正确的时间信息后,会设置点云时间为GPS时间,并保持此时间基准持续累加,来实现和GPS设备的时间同步。
PPS信号和GPRMC信号的时序要求:
由上可知:PPS和GPRMC的周期都是1s,其中PPS输出的上升沿高电平维持时间可以设置100ms,并记录上升沿的时间。而后,可以在上升沿结束的时候发送GPRMC数据(使用上升沿记录的时间)。同时,Mid360外接的GPIO管脚需要是3.3v电平 !
简而言之:GPS时钟源的PPS端口每秒发送一次硬件脉冲(PPS信号),随后数据端口发送一次对应这个脉冲上升沿的时间信息(GPRMC格式)。如果硬件触发成功,打开windows下的livoxviewer,点击右侧齿轮(设置),可以看见如下图的GPS Sync
。
1.2 SEEKER
https://gitee.com/nochain/seeker1/blob/master/pps/pps_s.c#
Seeker相机目前还没官方提供的原理说明,但是其提供了一个利用Jetson系列机载电脑的GPIO进行时间同步的代码。基于该代码,我分析整理得到Seeker的同步原理(与MID360基本一致,只是串口数据不用发送GPS而是其自定义的数据格式):
- PPS:1s的定时器回调,每次输出的PWM保证100ms的高电平,剩余时间为低电平,并返回输出高电平时的系统时间
- UART: 当PPS中开始输出低电平时,将其输出高电平时的系统时间返回,并打包发送出去。
seeker 启动launch文件时,默认使用软件同步 ~ 替换为系统时间戳。使用硬件同步时需要将time_sync
设置为false。之后,发布的数据话题将使用设备默认的上电时间 or 硬件同步这里发送的基准时间。Seeker也是需要3.3V的电平触发。
如果触发成功,启动对应的launch文件,rostopic echo任一一个相机数据话题,其对应的时间戳是将以硬件同步的基准时间为基础的。
1.3 硬件接线
MID360 雷达需要三根线:
- M12管脚8:获取外部输入的1HZ的PWM信号 ~ 外部设备随便一个GPIO端口
- M12管脚10:获取外部输入的GPS时间同步信息 ~ 外部设备的硬件串口的TX端,输出GPS报文给雷达
- M12管脚2或3:默认外部设备与MID360共地则不用接,最好接一下。
我自己做的MID360线是按照下面的颜色线序规则,和MID360接口的序号完全一致。
Seeker 相机也需要三根线。(海康威视的相机只需一根线即可)
- PPS:获取外部输入的1HZ的触发信号 ~ 外部设备随便一个GPIO端口
- RX:获取外部输入的时间戳 ~ 外部设备的硬件串口的TX端
- 默认外部设备与 Seeker 共地可以不接,但是最好还是接一下。
1.4 触发设备
前面介绍了两台设备的时间同步触发原理,我们便可以基于此进行触发设备的选取(两个硬件串口+两个GPIO)。目前有两种设备,一种是机载电脑,如Jetson系列或树莓派或香橙派,其GPIO基本都是3.3V的。另一种为单片机,如Arduino、STM32、ESP32等,其中带32的GPIO都是3.3V的,常用的Arduino则是5V。Arduino 的 UART 信号电平 和 PPS(Pulse Per Second)信号电平 取决于具体的 Arduino 版本:
- Arduino Uno / Mega / Nano(基于 ATmega328/ATmega2560):5V TTL (也可以串联电阻转为3.3V)
- Arduino Due / Zero / MKR 系列(基于 ARM Cortex):3.3V TTL
我目前使用的设备为NUC,自然无法采用机载电脑的GPIO进行触发,为此可以选择STM32或ESP32。鉴于STM32在本科时给我留下了不咋好开发的映像(本科后面一直用的Arduino Mega 2560进行开发的),所以这次选了没有用过但是依旧可以用Arduino IED开发的ESP32。ESP具有3个硬件串口,其中两个可用,刚好满足本次的需求,并且买的板子尺寸为【23.5mmx18mm】,比常见的STM32最小系统板小,一块30RMB(比STM32贵),Type-c接口,可以一键式下载程序(arduino ide点一下上传代码就行了)。
当然,实际上用STM32开发也挺好的,价格便宜,硬件串口数目也足够。下图为常见的STM32最小系统板,使用micro-usb,尺寸53x15mm,差不多10RMB一块(应该也有和esp32类似的小板子)。
二、ESP32-S3使用
相关资料链接如下,我们选用Arduino IDE作为开发工具:
https://www.waveshare.net/wiki/ESP32-S3-Zero
Arduino IDE配置: https://docs.espressif.com/projects/arduino-esp32/en/latest/installing.html
ESP32-PIN-OUTS: https://lingshunlab.com/book/esp32/esp32-s3-pin-reference
要进行MID360和Seeker的时间同步,触发设备需要使用到2个硬件串口和2个GPIO端口(PWM)。ESP32有3个硬件串口,任何 GPIO 都可以配置为硬件 UART,只需在构造时提供TX和RX引脚映射端口号即可。下面是ESP32-S3 UART的默认引脚,串口0被默认占用了,串口1和2可以选用任意GPIO端口。
此外,ESP32-S3 使用 GPIO21 连接了一个 WS2812 RGB LED。这个灯可以用于状态提示,但是需要我们单独写控制程序才能启用(烧录的程序如果没有对应的控制程序,这个灯就不会亮,我当时都怀疑板子是不是坏了,啥状态灯都没有... )。
后面的内容就得去WEIXIN咯,毕竟是一篇付费文章。
MID360 & Seeker 全向相机硬件时间同步教程 ESP32mp.weixin.qq.com/s/8cReydXWpfOmTTTKXEJFRw编辑https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/8cReydXWpfOmTTTKXEJFRw