PCIe-GL26设备将GMSL相机图像发送至HOST端

FunnyWii
FunnyWii
发布于 2024-08-02 / 68 阅读
0
0

PCIe-GL26设备将GMSL相机图像发送至HOST端

PCIe-GL26

先看看 PCIe-GL26 是个什么设备

本质上是个自带 Jetson Xavier 系统,且带有6路GMSL2接口的图像采集卡。

GMSL2:Gigabit Multimedia Serial Link 2,注意这个和 GIGABYTE 技嘉科技 没啥关系……GMSL翻译一下就是千兆多媒体串行链路,是ADI公司的产品。GMSL 设备可以通过同轴电缆或双绞线是实现视频数据以及控制数据的双向通信。GMSL1 代产品的前向通道链路速率可达 1.5Gbps 或 3Gbps,反向通道速率为 1Mbps;GMSL2 代产品的前向通道速率可达 3Gbps 或 6Gbps,反向通道速率为 187.5Mbps 或 1.5Gbps。此外,相比CSI相机300mm的传输距离,GMSL传输距离可达20m。

HOST

GL26图像采集卡需要通过PCIe接口接到X86的主板上,X86的HOST设备的环境配置参见:Getting Started | NRU Series (gitbook.io),推荐手动安装。然后安装GStreamer:

sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio 

然后设置HOST对应网络端口 Aquantia Ethernet 的IPv4地址为:26.26.50.51 ,子网掩码:255.255.255.0

GL26里应有一个Ubuntu18.04的系统,而且在路径 /home/nvidia/Desktop/PCIe-GL26-Release/GMSL2-Camera-Release 下面应该有很多相机配置文件。如没有这些文件,恭喜你,你的系统可能有问题,重新刷系统吧;如果连系统都没有,那么更恭喜你,重刷系统吧。

重新刷HOST

一般情况下不需要重新刷HOST,系统安装方式和其他X86的Ubuntu安装方式一样

重新刷GL26

重新刷系统参见 Reflash PCIe-GL26 | NRU Series (gitbook.io)

所需硬件:

  • Ubuntu 18.04 的 X86 架构的带有 USB-A 接口的电脑。啥是USB-A?就是你正着插插不进去,又反过来插还是插不进去,然后再正过来插,结果插进去了 的那个USB-A。

  • USB-A转Micro-USB的线,注意这些线有的只有充电功能而不支持数据传输,我们需要能够传输数据的。

所需软件:

首先找neousys的工程师要一份刷机用系统镜像(约12GB)。Welcome (neousys-tech.com),需要密码,如果你没密码,我也没有,去找厂家要。

趁着这功夫,把HOST和GL26都关机,并断电(物理)【确保】。将GL26的4pin拨码中的3号拨码拨上去以进入Recovery mode,什么你找不到拨码?都要刷系统了你不会还没把外壳拆开吧……插上USB-A(Ubuntu18电脑)到Micro-USB(GL26)的那根线。然后HOST开机。

Ubuntu18设备上运行 sdkmanager --archivedversions ,Manager从Step01运行到 Step04,注意Step01的OS选择Jetpack4.6.1,最终会在 $HOME/nvidia/nvidia_sdk/JetPack_4.6.1_Linux_JETSON_XAVIER_NX_TARGETS/Linux_for_Tegra 目录下生成一堆文件。然后将将系统镜像放到这个目录中,运行脚本 flash_withimage_xxxxxxxxx.sh ,相比官方教程中使用的 flash.sh ,这个名字很长的脚本会使用目录中的系统镜像安装系统。

其实上述方法在 Reflash PCIe-GL26 | NRU Series (gitbook.io) 的第3点中也有提及。

GL26中的相机配置文件

可以使用ssh方法在HOST上访问GL26,如果外壳还没装回去,也可以插DP线和键鼠直接操作GL26。

/home/nvidia/Desktop/PCIe-GL26-Release/GMSL2-Camera-Release 中的 data.cfg 中应有如下内容:

# data.cfg
CAM_MODEL="AC-IMX390"  #Options: AC-IMX390, AC-AR0233
DETECTED_CAM="0 1 2 3 4 5 "
TRIGGER_MODE="FREERUN" #Options: FREERUN, MCU
VIDEO_ENCODE="RAW" #Options: RAW, H264
VIDEO_STREAMING="HOST" #Options: STANDALONE, HOST
  • CAM_MODEL:相机型号,注意 IMX390C型号的相机需要使用 AC-AR0233 配置

  • DETECTED_CAM:检测到的相机ID,GL26上靠近黑色端子的编号为5。如果上电前已经插好相机,应该会自动识别出。

  • TRIGGER_MODE:选福瑞润。

  • VIDEO_ENCODE:RAW和H264皆可,不过我使用H264存在果冻现象,所以我用RAW了。

  • VIDEO_STREAMING:HOST

修改好后在GL26上运行sudo ./init_GMSL.sh ,然后根据你的相机配置,运行 sudo ./init_6x_xxxxxxxxxxx.sh 初始化脚本

HOST上使用GSTREAMER获取相机图像

命令行获取

每次重启HOST后,先设置网口带宽:

sudo -s

sudo ifconfig enp1s0 mtu 16000
sudo /sbin/sysctl -w net.core.rmem_max=671088640
sudo /sbin/sysctl -w net.core.wmem_max=671088640
sudo /sbin/sysctl -w net.core.rmem_default=671088640
sudo /sbin/sysctl -w net.core.wmem_default=671088640

建议写成开机自启脚本,如果我微不足道的脑容量能让我记得这件事,我会写一个脚本回来贴上。

读取RAW格式的相机图像用如下命令,其中port 对应相机编号。

# Host (30FPS)
gnome-terminal -- gst-launch-1.0 udpsrc buffer_size=9216000 port=10000 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YCbCr-4:2:2, depth=(string)8,  width=(string)1920, height=(string)1080, colorimetry=(string)BT601-5, payload=(int)96, a-framerate=(string)30" ! rtpjitterbuffer latency=30 ! rtpvrawdepay ! videoconvert ! fpsdisplaysink name=fps video-sink=xvimagesink sync=false 
gnome-terminal -- gst-launch-1.0 udpsrc buffer_size=9216000 port=10001 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YCbCr-4:2:2, depth=(string)8,  width=(string)1920, height=(string)1080, colorimetry=(string)BT601-5, payload=(int)96, a-framerate=(string)30" ! rtpjitterbuffer latency=30 ! rtpvrawdepay ! videoconvert ! fpsdisplaysink name=fps video-sink=xvimagesink sync=false 
gnome-terminal -- gst-launch-1.0 udpsrc buffer_size=9216000 port=10002 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YCbCr-4:2:2, depth=(string)8,  width=(string)1920, height=(string)1080, colorimetry=(string)BT601-5, payload=(int)96, a-framerate=(string)30" ! rtpjitterbuffer latency=30 ! rtpvrawdepay ! videoconvert ! fpsdisplaysink name=fps video-sink=xvimagesink sync=false
gnome-terminal -- gst-launch-1.0 udpsrc buffer_size=9216000 port=10003 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YCbCr-4:2:2, depth=(string)8,  width=(string)1920, height=(string)1080, colorimetry=(string)BT601-5, payload=(int)96, a-framerate=(string)30" ! rtpjitterbuffer latency=30 ! rtpvrawdepay ! videoconvert ! fpsdisplaysink name=fps video-sink=xvimagesink sync=false
gnome-terminal -- gst-launch-1.0 udpsrc buffer_size=9216000 port=10004 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YCbCr-4:2:2, depth=(string)8,  width=(string)1920, height=(string)1080, colorimetry=(string)BT601-5, payload=(int)96, a-framerate=(string)30" ! rtpjitterbuffer latency=30 ! rtpvrawdepay ! videoconvert ! fpsdisplaysink name=fps video-sink=xvimagesink sync=false
gnome-terminal -- gst-launch-1.0 udpsrc buffer_size=9216000 port=10005 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YCbCr-4:2:2, depth=(string)8,  width=(string)1920, height=(string)1080, colorimetry=(string)BT601-5, payload=(int)96, a-framerate=(string)30" ! rtpjitterbuffer latency=30 ! rtpvrawdepay ! videoconvert ! fpsdisplaysink name=fps video-sink=xvimagesink sync=false

代码获取

将下面字符串,作为GStreamer的pipeline,即可使用OpenCV读取相机图像。

udpsrc port=10000 caps="application/x-rtp, media=(string)video, encoding-name=(string)RAW, sampling=(string)YCbCr-4:2:2, depth=(string)8, width=(string)1920, height=(string)1080, payload=(int)96, framerate=(string)30, interlace-mode=(string)progressive, format=(string)UYVY" ! rtpvrawdepay ! videoconvert ! appsink drop=true sync=true async=false

需要注意

断电重启

HOST和GL26上是两个系统,但GL26并不依赖于HOST供电。HOST的重启操作可能导致GL26并不能真正关闭,根据 Stop Script and Gentle Shutdown | NRU Series (gitbook.io) 文档中的描述,不当关机操作有万分之五概率损坏GL26。

如果想让GL26真正关机,有两种方法:

  1. 在ssh中 sudo shutdown now

  2. 物理断电(不推荐)


评论