Apex AD10 GMSL相机进阶#

说明#

会使用本文档,意味着您遇到了以下问题:

  • 遇到了CPU占用率过高的问题

  • 必须要相机工作在外触发模式,并且需要获取时间戳

注意事项#

NTP授时情况下,相机时间戳将由于NTP的抖动,而造成较大误差,甚至出现错误的时间戳。

如果需要使用时间戳,请使用GPS授时,或者没有授时。

名词解释#

名词

解释

备注

自触发

指摄像头不受外部触发信号控制,自己进行快门。

一般相机都支持这种模式。只要外部不给触发信号就是工作在这种模式。

外触发

指摄像头接受外部信号控制,在同时进行快门。

需要相机固件支持。购买相机的时候请和厂商确认是否支持。

同时需要外部给触发信号。

性能问题解决方案#

cameras_egl_demo:EGL Demo 直接使用v4l和opencv来获取摄像头图像。

/opt/miivii/features/gmsl_camera/bin/cameras_egl_demo -s 1280x720 -d /dev/video0

兼顾性能和易用性的方案#

cameras_opencv_demo:OpenCV Demo,使用egl来作为显示部分实现,显示部分效率高。

/opt/miivii/features/gmsl_camera/bin/cameras_opencv_demo -s 1280x720 -d /dev/video0

获取时间戳的方案#

cameras_sdk_demo:SDK Demo,兼容GMSL1的SDK,使用ASIC来进行图像格式的转换,运行效率高。并且可以通过SDK获取触发快门的时间戳。

请注意获取时间戳需要相机支持外触发。

#打开一路相机,并且获取时间戳
/opt/miivii/features/gmsl_camera/bin/cameras_sdk_demo -s 1280x720 -d /dev/video0
#打开两路相机,并且获取时间戳
/opt/miivii/features/gmsl_camera/bin/cameras_sdk_demo -s 1280x720 -d /dev/video0 -m 2
#打开两路相机,设置相机帧率为30Hz,并且获取时间戳
/opt/miivii/features/gmsl_camera/bin/cameras_sdk_demo -s 1280x720 -d /dev/video0 -m 2 -r 30-0

示例代码编译#

cp -r /opt/miivii/features ~/
cd ~/features/gmsl_camera
sudo make;

GMSL/GMSL2时间戳相关测试方法#

如何获取详细日志及日志说明?#

只有当丢帧的时候才会生成log文件。

运行方式

# export CHECK_TIME=1   调试使用log 测试时不需要执行,否则log太多会阻塞程序
sudo jetson_clocks
rm /tmp/cameras_sdk_demo.log
./bin/cameras_sdk_demo -s 1280x720 -d /dev/video0

确认方式

  • 在屏幕打印中会增加打印日志

  • 在/tmp/下,会生成cameras_sdk_demo.log文件

日志文件说明

字段

单位

物理含义

测试方法

Timestamp

纳秒

触发该帧的时间

根据传输延迟,从队列中获得的触发时间

FrameInterval

纳秒

帧间隔

两帧之间的触发时间间隔

与前一Timestamp的差值

FrameTransferDelay

纳秒

帧传输延迟

LinuxGetFrameTime - Timestamp

LinuxGetFrameTime

纳秒

Linux获取帧时的系统时间

收到帧时候的Linux系统时间

LinuxFrameInterval

纳秒

Linux获取帧的Linux时间间隔

与前一LinuxGetFrameTime的差值

如何确认时间戳是否准确?#

在代码中,会通过检查FrameInterval的方式,来确认时间戳是否准确。

执行命令:

# export CHECK_TIME=1   调试使用log 测试时不需要执行,否则log太多会阻塞程序
sudo jetson_clocks
rm /tmp/cameras_sdk_demo.log
./bin/cameras_sdk_demo -s 1280x720 -d /dev/video0

如果时间戳正常,则在/tmp/cameras_sdk_demo.log的内容如下,只有一行

Timestamp : 1620897955083817280 FrameInterval : 1620897955083817280 FrameTransferDelay : 66992720 LinuxGetFrameTime : 1620897955150810000 LinuxFrameInterval : 1620897955150810000

如果时间戳异常,则在/tmp/cameras_sdk_demo.log中会记录多组时间戳,为多行

Timestamp : 1620958367246484576 FrameInterval  :  1620958367246484576 FrameTransferDelay : 67111424 LinuxGetFrameTime : 1620958367313596000 LinuxFrameInterval : 1620958367313596000
Timestamp : 1620958739646034432 FrameInterval  :  1620958739646034432 FrameTransferDelay : 67403568 LinuxGetFrameTime : 1620958739713438000 LinuxFrameInterval : 1620958739713438000
Timestamp : 1620958748796023808 FrameInterval  :  1620958748796023808 FrameTransferDelay : 80901192 LinuxGetFrameTime : 1620958748876925000 LinuxFrameInterval : 1620958748876925000
Timestamp : 1620958789795973504 FrameInterval  :  1620958789795973504 FrameTransferDelay : 72186496 LinuxGetFrameTime : 1620958789868160000 LinuxFrameInterval : 1620958789868160000
Timestamp : 1620959793244763712 FrameInterval  :  1620959793244763712 FrameTransferDelay : 73185288 LinuxGetFrameTime : 1620959793317949000 LinuxFrameInterval : 1620959793317949000
Timestamp : 1620959854794691840 FrameInterval  :  1620959854794691840 FrameTransferDelay : 68099160 LinuxGetFrameTime : 1620959854862791000 LinuxFrameInterval : 1620959854862791000
Timestamp : 1620960274844196896 FrameInterval  :  1620960274844196896 FrameTransferDelay : 68391104 LinuxGetFrameTime : 1620960274912588000 LinuxFrameInterval : 1620960274912588000
Timestamp : 1620960283994186240 FrameInterval  :  1620960283994186240 FrameTransferDelay : 71857760 LinuxGetFrameTime : 1620960284066044000 LinuxFrameInterval : 1620960284066044000
Timestamp : 1620960291394178080 FrameInterval  :  1620960291394178080 FrameTransferDelay : 68419920 LinuxGetFrameTime : 1620960291462598000 LinuxFrameInterval : 1620960291462598000

如何确认时间戳精度?#

执行命令

# export CHECK_TIME=1   调试使用log 测试时不需要执行,否则log太多会阻塞程序
sudo jetson_clocks
./bin/cameras_sdk_demo -s 1280x720 -d /dev/video0 > log

确认方法

  • 把log导入excel

  • 对FrameInterval取最大最小值

  • 通过最大最小值的差,可以获取时间戳精度。

确认摄像头图像帧传输延迟#

先验知识

GMSL类型

图像分辨率

典型相机

传输延迟

GMSL1

720p

SG1-AR0143-0101-GMSL-Hxxx

60ms左右

GMSL1

1080p

SG2-AR0231-0202-GMSL-Hxxx

100ms左右

使用低于传输延迟的帧率,打开摄像头。由于此时传输延迟小于帧间隔,因此时间戳的缓存为1,因此不会因为软件引入其他问题,所测的的就是真实的物理延迟。

请注意不要使用传输延迟附近所对应的帧率,传输延迟的抖动,会造成时间戳不准。

执行命令

# export CHECK_TIME=1   仅在调试使用,否则log太多会阻塞程序
#-r 10表示设置的摄像头外触发帧率为10。
sudo jetson_clocks
./bin/cameras_sdk_demo -s 1280x720 -d /dev/video0 -r 10

确认方式

通过FrameTransferDelay确认得到实际的传输延迟。