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确认得到实际的传输延迟。