VEYE CS Camera for Jetson TX2/zh

From wiki_veye
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

English

如何在英伟达Jetsno Nano,TX2,Xavier和Orin平台使用VEYE系列和CS系列摄像头模组

1 概述

本文讲述怎样将VEYE系列和CS系列模组接入到英伟达公司的Jetson Nano,Jetson Nano 2GB,Jetson TX2,TX2 NX和AGX Xavier开发板,Xavier NX Devkit以及我们兼容的其他主板上。采用的软件版本为

  • Jetpack4.2.2,L4T版本r32.2.1
  • Jetpack4.3,L4T版本r32.3.1
  • Jetpack4.4,L4T版本r32.4.3
  • Jetpack4.4.1,L4T版本r32.4.4
  • Jetpack4.5,L4T版本r32.5
  • Jetpack4.5.1,L4T版本r32.5.1
  • Jetpack4.6,L4T版本r32.6.1
  • Jetpack4.6.1,L4T版本r32.7.1
  • Jetpack4.6.3,L4T版本r32.7.3
  • Jetpack4.6.2,L4T版本r32.7.2
  • Jetpack4.6.4,L4T版本r32.7.4
  • Jetpack5.0.1DP,L4T版本r34.1.1
  • Jetpack5.0.2,L4T版本r35.1
  • Jetpack5.1,L4T版本r35.2.1
  • Jetpack5.1.1,L4T版本r35.3.1
  • Jetpack5.1.2,L4T版本r35.4.1

我们提供了编译好的固件和源代码两种方式来方便用户的使用。

VEYE系列和CS系列摄像头是内置ISP的摄像头模组,输出为MIPI-CSI2接口UYVY流模式。对于图像效果参数,我们并没有采用V4L2接口实现,而是采用了DRA(Directly Register Access)模式,我们提供了一组Shell脚本直接控制摄像头模组。

1.1 支持的模组:

模组型号支持表
系列 型号 状态
VEYE系列 VEYE-MIPI-IMX327S 完成
VEYE系列 VEYE-MIPI-IMX385 完成
VEYE系列 VEYE-MIPI-IMX462 完成
VEYE系列 VEYE-MIPI-IMX335 完成
CS系列 CS-MIPI-IMX307 完成
CS系列 CS-MIPI-SC132 完成
套装系列 CS-TX2-XAVIER-nCAM 完成

VEYE系列和CS系列MIPI摄像头模组是内置ISP的,输出为MIPI-CSI2接口。

1.2 怎样查看当前L4T版本

1.2.1 方法1

在jetson板子上,查看当前L4T版本,尽量使用同一版本进行替换。

cat /etc/nv_tegra_release

如显示:

# R32 (release), REVISION: 4.3......

则表示当前L4T版本为32.4.3。

1.2.2 方法2

参考这个链接,安装jetson-stats:

jtop

2 硬件准备及安装

我们设计了专用的转接板,支持6路摄像头,兼容TX2 Devkit,Xavier和Orin。

ADP-N1连接图 ADP-N1 V2.0连接图
 
6cam interposer board connected with 6 cameras
 
6cam interposer board connected with 6 cameras

特别的,VEYE-MIPI-IMX335由于功耗较高,必须使用12V DC端子提供辅助供电。参考ADP-N1的J11

2.1 英伟达TX2 Developer Kit

 
TX2 Devkit 6 cameras connection


注意,使用中请务必用螺丝将ADP转接板固定到底板上面,以保证转接板安装平正。

2.2 英伟达AGX Xavier(AGX Orin与此相同)

转接板是兼容TX2转接板的,连接方式如图:

 
Connect VEYE cameras to AGX Xavier


注意,使用中请务必用螺丝将ADP转接板固定到底板上面,以保证转接板安装平正。

2.3 英伟达Nano 、 Xavier NX Devkit和TX2 NX

Xavier NX 的接口是兼容树莓派和Jetson Nano的。 连接方式如图:

 
Xavier NX connection with VEYE-MIPI-327
 
Xavier NX connection with CS-MIPI-IMX307(3.3V供电)
 
Jetson Nano A02 与VEYE模组连接
 
VEYE camera  connection with Orin Nano and Orin NX


3 更新Jetson Nano,TX2,Xavier和Orin系统

3.1 概述

本章节描述怎样更新Jetson系统以支持我们的摄像头模组。

  • Jetpack4.x版本

要支持我们的摄像头模组,需要更新Jetson系统的L4T(Linux for Tegra)的两个部分,Image和dtb。

Image部分,我们增加了摄像头驱动,dtb部分则指明了使用的摄像头型号。一般情况下,只需使用我们已编译好的Image和dtb,非必要情况下,无需根据代码进行编译。

  • Jetpack5.0以后的版本

驱动不再编译进Image,而是以独立module的形式加载到系统中。dtb我们现在依然是采用整体编译到一起的方式以方便进行替换。

dtb也可以以overlay形式动态加载,详情参考nVidia官方的NVIDIA® Jetson™ Linux开发者指南。

  • MV系列模组

MV系列模组,为了支持扩展数据类型和外触发模式,我们在Image中增加了相关功能。因此无论Jetpack版本如何,都需要更新Image。是否需要更新modules,取决于Jetpack版本。

3.2 BSP包介绍:

3.2.1 路径

https://github.com/veyeimaging/nvidia_jetson_veye_bsp

3.2.2 bsp包包括以下主要内容:
  • 预编译好的不同平台下的dtb
  • driver源码
  • dts源码
  • i2c通信工具集

在项目release包中还包括:

  • 预编译好的linux kernel:Image
  • 预编译好的摄像机驱动

3.3 DTB文件名称与板卡对应关系

3.3.1 Nano A02

tegra210-p3448-0000-p3449-0000-a02.dtb

3.3.2 Nano B01 Devkit

tegra210-p3448-0000-p3449-0000-b00.dtb

3.3.3 Nano B01 4G emmc

tegra210-p3448-0002-p3449-0000-b00.dtb

3.3.4 Nano 2GB

tegra210-p3448-0003-p3542-0000.dtb

3.3.5 TX2 Devkit

tegra186-quill-p3310-1000-c03-00-base.dtb

3.3.6 TX2 NX(p3509-0000 carrier board)

use the same carrier board with XAVIER NX Devkit

tegra186-p3636-0001-p3509-0000-a01.dtb

3.3.7 AGX XAVIER

tegra194-p2888-0001-p2822-0000.dtb

3.3.8 XAVIER NX Devkit

tegra194-p3668-all-p3509-0000.dtb

特别的,对于Jetpack5.x:

  • Jetson Xavier NX (P3668-0000) For developer kit only:

tegra194-p3668-0000-p3509-0000.dtb

  • Jetson Xavier NX (P3668-0001) Commercial module:

tegra194-p3668-0001-p3509-0000.dtb

3.3.9 AGX Orin

tegra234-p3701-0000-p3737-0000.dtb

3.3.10 Orin NX
  • Jetson Orin NX 16G(P3767-0000):

tegra234-p3767-0000-p3768-0000-a0.dtb

  • Jetson Orin NX 8G (P3767-0001):

tegra234-p3767-0001-p3768-0000-a0.dtb

3.3.11 Orin Nano
  • Jetson Orin Nano 8G(P3767-0003) and Jetson Orin Nano Devkit(P3767-0005):

tegra234-p3767-0003-p3768-0000-a0.dtb

  • Jetson Orin Nano 4G (P3767-0004):

tegra234-p3767-0004-p3768-0000-a0.dtb

3.4 DTB文件名称与摄像头对应关系

每个主板的dtb目录下,存放了对应摄像头型号的目录,一般可以直接通过目录名称知道对应的摄像头型号。

特别的:

1、VEYE-MIPI-CAM2M 是新版本的VEYE系列dtb,支持所有VEYE 200W系列产品,包括VEYE-MIPI-327E、VEYE-MIPI-IMX327S、VEYE-MIPI-IMX462、VEYE-MIPI-IMX385。

2、以fpdlink为后缀的,对应fpdlink同轴型号模组。

3、MV-MIPI-MVCAM是所有MV系列和RAW系列摄像机通用的dtb(RAW-MIPI-AR0234M和RAW-MIPI-IMX462M除外)。

3.5 Jetson板上直接升级的方法

适用型号:Jetson Nano、Xavier和Orin。

注:AGX Xavier在Jetpack4.4以后的版本,建议可以使用此方法。以前版本我们未作验证,不建议使用。

3.5.1 查看当前L4T版本

首先查看当前L4T版本,尽量使用同一版本进行替换。

cat /etc/nv_tegra_release

如显示:

# R32 (release), REVISION: 4.3......

则表示当前L4T版本为32.4.3。

3.5.2 关于L4T 32.7.2的说明

L4T32.7.2版本的Image和dts与L4T32.7.1版本完全一致,所以直接使用L4T32.7.1相关目录下内容即可。

此外,升级需要更新cboot,请参考常见问题章节。

3.5.3 下载bsp包到Jetson板子

在Jetson 板子上面,执行:

wget https://github.com/veyeimaging/nvidia_jetson_veye_bsp/releases/latest/download/nvidia_jetson_veye_bsp.tar.gz

或者在浏览器地址栏中输入https://github.com/veyeimaging/nvidia_jetson_veye_bsp/releases/latest/

下载发布版本。

tar -xzvf nvidia_jetson_veye_bsp.tar.gz

3.5.4 升级Image(适用于Jetpack4.x以及MV系列摄像头的应用)

备份原来的Image

cp /boot/Image /boot/Image.backup

cp /boot/Image.sig /boot/Image.sig.backup

在bsp包目录下,找到对应版本的Image压缩包,解压,然后执行:

sudo cp <path to your Image dir>/Image /boot/Image -f

特别的,对于xavier需要使用签名后的文件(比如Image_l4t_r32.*.*_veyecam_signed_4_xavier目录下),把新的Image和Image.sig拷贝的XAVIER的/boot/目录下。

sudo cp <path to your Image dir>/Image* /boot/-f

重启后生效。

3.5.5 安装modules(适用于Jetpack5.x)

查看系统linux版本

uname -r

nvidia_jetson_veye_bsp/ko目录下找到对应的驱动版本目录,

sudo cp nvidia_jetson_veye_bsp/ko/$(uname -r)/* /lib/modules/$(uname -r)/kernel/drivers/media/i2c/ -f

特别的,对于Jetpack5.1版本:

sudo cp nvidia_jetson_veye_bsp/ko/5.10.104-tegra-l4t35.2.1/* /lib/modules/$(uname -r)/kernel/drivers/media/i2c/ -f

特别的,对于Jetpack5.1.1版本:

sudo cp nvidia_jetson_veye_bsp/ko/5.10.104-tegra-l4t35.3.1/* /lib/modules/$(uname -r)/kernel/drivers/media/i2c/ -f

3.5.5.1 一般情况

执行如下命令,将modules注册到系统:

sudo depmod

3.5.5.2 特别的

如果使用fpdlink接口的摄像机模组。必须手动控制加载顺序,保证ds90ub954.ko的加载早于摄像头驱动的加载。

系统启动后,手动按照顺序插入驱动,如:

sudo insmod ds90ub954.ko

sudo insmod cs_imx307.ko

可将驱动加载的命令添加到启动脚本中。

3.5.6 升级dtb

在bsp包目录下,找到您对应的摄像头模组型号和L4T版本号的dtb文件。

将新的dtb拷贝的系统目录

sudo mkdir /boot/veyecam/

sudo cp <path to your dtb dir>/<DTB file name> /boot/veyecam -f

备份extlinux.conf文件。

cp /boot/extlinux/extlinux.conf /boot/extlinux/extlinux.conf.back

然后,编辑 /boot/extlinux/extlinux.conf文件,在最下面增加如下一行。

FDT /boot/veyecam/<DTB file name>

注意:<DTB file name>应当替换为主板对应的dtb名称,确保FDT一行所指明的文件确实正确存在。

重启后生效。

3.6 通过HOST PC烧写Jetson主板进行升级的方法

本节提供第二种升级系统的方法。这个方法与上一节的方法的目标相同,二选一即可。本方法比较复杂,对于Nano,Xavier,Orin不建议使用。

特别的,对于TX2系统,只能采取本节的方法升级。

3.6.1 烧写标准版本镜像

注意:如您的Jetson板子已经正确烧写了标准版本的镜像,此步骤可以跳过。

可以使用SDK Manager直接烧写标准镜像,也可以按照如下步骤手动烧写。

  • 配置环境变量

以下步骤假设SDK安装目录为<TOPDIR>。

export TOP_DIR=<absolute path to top dir accroding to your jetpack version and board name;for example /home/xumm/nvidia/nvidia_sdk/JetPack_4.5_Linux_JETSON_XAVIER_NX_DEVKIT/>

- 通用部分

export L4T_DIR=$TOP_DIR/Linux_for_Tegra

  • 生成默认版本烧写镜像,烧写默认镜像到板子,准备好L4T环境

cd $L4T_DIR

sudo ./apply_binaries.sh  

进入recovery mode并烧写标准版本镜像。

- Nano

sudo ./flash.sh jetson-nano-devkit mmcblk0p1

sudo ./flash.sh jetson-nano-2gb-devkit mmcblk0p1

- TX2

sudo ./flash.sh jetson-tx2 mmcblk0p1

- TX2 NX(p3509-0000 carrier board)

sudo ./flash.sh jetson-xavier-nx-devkit-tx2-nx mmcblk0p1

- AGX Xavier

sudo ./flash.sh jetson-xavier mmcblk0p1

- Xavier NX Devkit

sudo ./flash.sh jetson-xavier-nx-devkit mmcblk0p1

3.6.2 下载我们的bsp包

cd $L4T_DIR

wget https://github.com/veyeimaging/nvidia_jetson_veye_bsp/releases/latest/download/nvidia_jetson_veye_bsp.tar.gz

tar -xzvf nvidia_jetson_veye_bsp.tar.gz

export RELEASE_PACK_DIR=$L4T_DIR/nvidia_jetson_veye_bsp

3.6.3 升级Image和DTB

解压开下载到的nvidia_jetson_veye_bsp.tar.gz,找到对应版本的Image。

  • 升级Image文件

无论是使用预编译好的程序还是使用自行编译出的Image:

- Nano 和 TX2

把新的Image拷贝的Nano和TX2的/boot/目录下。

在Jetson TX2板子上执行

sudo cp <path to your Image dir>/Image /boot/Image -f

- Xavier 和Orin

需要使用签名后的文件(比如Image_l4t_r32.*.*_veyecam_signed_4_xavier目录下),把新的Image和Image.sig拷贝的XAVIER的/boot/目录下。

sudo cp <path to your Image dir>/Image /boot/Image -f

sudo cp <path to your Image dir>/Image.sig /boot/Image.sig -f

在Host PC执行

cd $L4T_DIR

sudo ./flash.sh -k kernel jetson-xavier mmcblk0p1

- Xavier NX

在Host PC执行

cd $L4T_DIR

sudo ./flash.sh -k kernel jetson-xavier-nx-devkit mmcblk0p1

  • 烧写DTS分区,进入烧写模式,在Host PC执行

cp <path to your dtb dir>/dtbfilename $L4T_DIR/kernel/dtb/ -f

cd $L4T_DIR

- Nano

sudo ./flash.sh -r -k DTB jetson-nano-qspi-sd mmcblk0p1

sudo ./flash.sh -r -k DTB jetson-nano-devkit mmcblk0p1

sudo ./flash.sh -r -k DTB jetson-nano-2gb-devkit mmcblk0p1

- TX2

sudo ./flash.sh -r -k kernel-dtb jetson-tx2 mmcblk0p1

- TX2 NX(p3509-0000 carrier board)

sudo ./flash.sh -r -k kernel-dtb jetson-xavier-nx-devkit-tx2-nx mmcblk0p1

- AGX Xavier

sudo ./flash.sh -r -k kernel-dtb jetson-xavier mmcblk0p1

- Xavier NX

sudo ./flash.sh -r -k kernel-dtb jetson-xavier-nx-devkit mmcblk0p1

烧写完成后,断电重启。

3.7 Image和DTB更新成功了吗?

完成Image和DTB的更新后,可以使用以下步骤检查操作是否成功。

3.7.1 对于DTB

DTB在不同的平台和不同的摄像头模组都会有所不同。

- Nano A02/ Nano 2G

ls /proc/device-tree/host1x/i2c@546c0000/

- Nano B01

ls /proc/device-tree/cam_i2cmux/i2c@*

- TX2 Devkit

ls /proc/device-tree/i2c@3180000/tca9548@70/i2c@*

or

ls /proc/device-tree/i2c@3180000/tca9548@77/i2c@*

- AGX Xavier和AGX Orin

ls /proc/device-tree/i2c@3180000/tca9548@70/i2c@*

or

ls /proc/device-tree/i2c@3180000/tca9548@77/i2c@*

- Xavier NX and TX2 NX(p3509-0000 carrier board)

ls /proc/device-tree/cam_i2cmux/i2c@*

应当可以发现摄像头型号。

3.7.2 对于Image或者ko

ls /sys/bus/i2c/drivers/

正确安装摄像头时,摄像头的相关目录应当存在,如 veyecam csx307 cssc132 mvcam等。

3.8 防止被升级所覆盖

确定Image和dtb成功更新之后,请执行以下命令,防止kernel和dtb被升级覆盖。

sudo apt-mark hold nvidia-l4t-kernel nvidia-l4t-kernel-dtbs

3.9 使用源码进行编译

请参考:英伟达Jetson平台上VEYE摄像头驱动源码编译指南

kernel和DTS编译完成后,可以按照上面的步骤升级Image和DTB。

4 应用和测试

4.1 系统状态检测

完成系统安装后,在Jetson板端执行以下命令来检测是否正确连接摄像头。

  • VEYE-MIPI-X型号(使用VEYE-MIPI-CAM2M dtb)

dmesg | grep veye  

应当有类似如下提示:

camera id is veyecam

sensor is IMX327/IMX462/IMX385

subdev veyecam [i2c_bus]-003b bound

此外,检查/dev/videoX设备节点,应当是存在的。

  • CS-MIPI-IMX307型号

dmesg | grep x307  

应当有类似如下提示:

Detected CS307 sensor

subdev csx307 [i2c_bus]-003b bound

此外,检查/dev/videoX设备节点,应当是存在的。

  • CS-MIPI-SC132型号

dmesg | grep cssc132  

应当有类似如下提示:

subdev cssc132 [i2c_bus]-003b bound

此外,检查/dev/videoX设备节点,应当是存在的。

  • VEYE-MIP-IMX335型号

dmesg | grep imx335  

应当有类似如下提示:

camera id is VEYE-MIPI-IMX335

subdev veye_imx335 [i2c_bus]-003b bound

此外,检查/dev/videoX设备节点,应当是存在的。

  • VEYE-MIPI-327型号(使用VEYE-MIPI-327 dtb)

dmesg | grep veye327  

应当有类似如下提示:

Detected VEYE327 sensor

subdev veye327 [i2c_bus]-003b bound

此外,检查/dev/videoX设备节点,应当是存在的。

驱动提示信息中的[i2c_bus]表示此摄像头对应的i2c总线。

4.2 视频流软件包和测试

摄像头模组在Jetson系统中映射为/dev/videoX设备节点。

操作系统启动过程中,按照i2c bus从小到大的顺序探测摄像头。X值是按照探测的逻辑顺序[0-5]递增的。

举例说,如果只接入一个摄像头,无论硬件连接到哪个位置,X都为0。如果接入5个,则按照i2c bus从小到大,X为[0-4]。

gstreamer中,v4l2src和nvv4l2camerasrc可以通过指明device=/dev/videoX来访问不同的摄像头。

4.2.1 Gstreamer Usage

export DISPLAY=:0

  • 视频预览1080p HD

gst-launch-1.0 nvv4l2camerasrc device=/dev/video0 ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1920, height=(int)1080" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false

gst-launch-1.0 nvv4l2camerasrc device=/dev/video0 ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1920, height=(int)1080" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)NV12" ! nv3dsink sync=false

  • 视频预览1080p HD(using xvimagesink sink if supported)

export DISPLAY=:0

gst-launch-1.0 -e v4l2src io-mode=4 device=/dev/video0 do-timestamp=true ! 'video/x-raw, width=1920, height=1080, framerate=30/1, format=UYVY' ! xvimagesink sync=false

  • 视频预览720p@60 HD(模组支持此分辨率时)

gst-launch-1.0 nvv4l2camerasrc ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)60/1" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false

  • 视频预览1280*1080@45fpsHD

gst-launch-1.0 nvv4l2camerasrc ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1280, height=(int)1080, framerate=(fraction)45/1" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false

  • 视频预览640*480@130fps(模组支持此分辨率时)

gst-launch-1.0 nvv4l2camerasrc ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)640, height=(int)480, framerate=(fraction)130/1" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false

  • 并列预览两路视频 1080p HD

WIDTH=960

HEIGHT=540

CAPS="video/x-raw(memory:NVMM),format=(string)UYVY, width=1920, height=1080"

gst-launch-1.0 nvcompositor name=comp sink_0::xpos=0 sink_0::ypos=0 sink_0::width=$WIDTH sink_0::height=$HEIGHT sink_1::xpos=$WIDTH sink_1::ypos=0 sink_1::width=$WIDTH sink_1::height=$HEIGHT ! nv3dsink nvv4l2camerasrc device=/dev/video0 ! $CAPS ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420"! comp. nvv4l2camerasrc device=/dev/video1 ! $CAPS ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420"! comp.

  • Gstreamer 嵌入到 OpenCV

I think maybe OpenCV do not support I420 data format input,so you should convert it to BGR format.

gst-launch-1.0 nvv4l2camerasrc ! video/x-raw(memory:NVMM), format=(string)UYVY, width=(int)1920, height=(int)1080 ! nvvidconv ! video/x-raw(memory:NVMM), format=(string)I420 ! nvvidconv ! video/x-raw, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink

  • 视频录像1080p HD

gst-launch-1.0 nvv4l2camerasrc num-buffers=300 ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1920, height=(int)1080" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)NV12" ! nvv4l2h264enc control-rate=1 bitrate=10000000 ! h264parse ! qtmux ! filesink location=filename.mp4 -e

  • 录像回放

gst-launch-1.0 filesrc location=filename.mp4 ! qtdemux ! queue ! h264parse ! nvv4l2decoder ! nv3dsink -e

  • 抓拍图片

gst-launch-1.0 v4l2src num-buffers=1 ! "video/x-raw,format=(string)UYVY, width=(int)1920, height=(int)1080" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nvjpegenc ! filesink location=jpgname.jpg

4.2.2 VEYE-MIPI-IMX335 的gstreamer例子

由于VEYE-MIPI-IMX335仅支持几种特定的分辨率模式,其驱动我们采用了use_sensor_mode_id模式。

VEYE-MIPI-IMX335 mode
./veye5_mipi_i2c.sh video mode v4l2-ctl sensor_mode video format
1 0 2592x1944@20fps
2 1 2592x1944@12.5fps
3 2 2560x1440@25fps
4 3 2560x1440@30fps
  • 准备工作

sudo apt-get install v4l-utils

参考下面一节,下载好veye5_mipi_i2c.sh工具。

  • 2592x1944@20fps模式预览,帧率统计

v4l2-ctl -d /dev/video0 --set-ctrl sensor_mode=0

./veye5_mipi_i2c.sh -w -f videomode -p1 1 -b [busnum]

v4l2-ctl -d /dev/video0 --set-ctrl preferred_stride=5376

预览

gst-launch-1.0 nvv4l2camerasrc device=/dev/video0 ! "video/x-raw(memory:NVMM), width=(int)2592, height=(int)1944" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false

帧率统计

gst-launch-1.0 nvv4l2camerasrc device=/dev/video0 ! "video/x-raw(memory:NVMM),format=(string)UYVY,width=(int)2592,height=(int)1944" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! fpsdisplaysink video-sink=fakesink -v

  • 2560x1440@30fps模式录像、抓拍

v4l2-ctl -d /dev/video0 --set-ctrl sensor_mode=3

./veye5_mipi_i2c.sh -w -f videomode -p1 4 -b [busnum]

v4l2-ctl -d /dev/video0 --set-ctrl preferred_stride=5120

录像

gst-launch-1.0 nvv4l2camerasrc num-buffers=300 ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)2560, height=(int)1440" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)NV12" ! nvv4l2h264enc control-rate=0 bitrate=10000000 ! h264parse ! qtmux ! filesink location=filename.mp4 -e

录像回放

gst-launch-1.0 filesrc location=filename.mp4 ! qtdemux ! queue ! h264parse ! nvv4l2decoder ! nvoverlaysink -e

抓图

gst-launch-1.0 v4l2src num-buffers=1 ! "video/x-raw,format=(string)UYVY, width=(int)2560, height=(int)1440" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nvjpegenc ! filesink location=jpgname.jpg

4.2.3 Jetson multimedia-api samples

Jetson平台上提供了Jetson Linux API 供开发者使用。具体jetson_multimedia_api包的安装请参考nVidia官方文档。

对于VEYE和CS系列相机,已经在相机内集成了ISP功能,因此不能使用libargus获取数据,而可以直接使用使用标准V4L2接口从/dev/videoX设备文件获取数据。

下面两个sample可以直接运行:

4.2.3.1 12_camera_v4l2_cuda

./camera_v4l2_cuda -d /dev/video0 -s 1920x1080 -f UYVY

4.2.3.2 v4l2cuda

./capture-cuda -d /dev/video0 -f UYVY -m -o out.ppm -s 1920x1080 -c 1

4.2.4 v4l2-ctl 应用范例
4.2.4.1 安装v4l2-utils

sudo apt-get install v4l-utils

4.2.4.2 使用v4l2-ctl配置参数
  • 列出相机支持的数据格式

v4l2-ctl --list-formats-ext

  • 帧率统计

v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=UYVY--stream-mmap --stream-count=-1 --stream-to=/dev/null

  • 保存图片到文件

v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=UYVY --stream-mmap --stream-count=1 --stream-to=uyvy-1920x1080.yuv

4.2.5 yavta
4.2.5.1 安装yavta

git clone https://github.com/veyeimaging/yavta.git

cd yavta;make

4.2.5.2 保存图片到文件

./yavta -c1 -FUYVY-1920x1080.yuv --skip 0 -f UYVY -s 1920x1080 /dev/video0

4.2.6 Opencv

为了将摄像头数据从v4l2设备导入到opencv,我们提供了几个sample。

We provide some samples here.

4.3 使用i2c脚本修改摄像机参数

  • VEYE-MIPI-CAM2M系列(VEYE-MIPI-327、VEYE-MIPI-IMX327S、VEYE-MIPI-IMX462、VEYE-MIPI-IMX385)

具体使用说明请见:VEYE-MIPI-327 I2C脚本使用说明

  • CS-MIPI-IMX307和CS-MIPI-SC132

具体使用说明请见:CS-MIPI-X I2C脚本使用说明

  • VEYE-MIPI-IMX335

具体使用说明请见:VEYE-MIPI-IMX335 I2C脚本使用说明

5 怎样移植驱动到第三方底板

源码编译步骤请参考:英伟达Jetson平台上VEYE和CS系列摄像头驱动源码编译指南

5.1 驱动移植

对于Image,我们是在官方标准Image基础上增加了功能,并没有做任何删减。一般情况下,可以直接使用我们编译好的Image。特殊情况请参考源码进行整合。

对于modules则更简单,直接使用即可。从源码编译和非常简单,此处不做赘述。

5.2 dts移植

我们只提供了Nano、TX2、Xavier、Orin的部分板子的dtb,对于没有提供的类型,需要:

1. 得到该板子的dts源码。

2. 我们camera相关的dts到整体中。

3. 重新编译得到对应板子的dtb。

操作步骤并不复杂,但是有一些第三方底板厂家并不开放dts源码。这就需要各方的配合才能做到了。

6 常见问题和bug列表

6.1 带SSD硬盘的系统的更新系统不生效的问题

如果系统安装了SSD硬盘,并将SSD硬盘挂载到/目录,有可能导致常规更新系统(Image,ko,dtb)操作完全无效。

这个原因是,板子自带有eMMC存储器件,启动阶段生效的是eMMC中的Image,ko和dtb。启动完成之后,SSD硬盘挂载到/目录,导致emmc上的文件无法看到。

此时的处理方法是将eMMC的mmcblk0p1分区手动挂载到某个目录,并基于此目录进行更新系统的所有操作。

6.2 VEYE cameras on Jetpack5.x

Jetpack5.x在xavier和orin平台对mipi信号的要求更加严格。VEYE-MIPI-xxx系列相机需要固件版本hdver>=7才可以完美支持。

6.3 CS-MIPI-IMX307配合Orin nano以及Orin NX绿屏

当CS-MIPI-IMX307使用FFC cable的3.3V供电模式时,现在(Jetpack5.1.1)Orin nano和Orin NX的MIPI接收状态机会进入错误状态。建议参考此文章,修改CS-MIPI-IMX307的供电模式,使用5V供电模式。

6.4 Jetpack5.0.1 DP

本版本有很多bug,如不支持nvv4l2camerasrc,不建议使用。

6.5 nv3dsink

Jetpack5.x不再支持nvoverlaysink,使用nv3dsink替代之。nv3ksink需要使用本地执行,不能ssh远程登陆执行。

6.6 L4T32.7.2在xavier系列上的bug

对于Xavier系列,L4T32.7.2的cboot存在一个bug,必须要先解决掉才可以升级。

[Cboot] Cboot in 32.7.2 fails to read extlinux.conf

我们编译了正确版本的cboot并放在这里

下载后,放到Linux_for_Tegra/bootloader目录下,进入recovery模式后,在PC端执行如下命令以烧写cboot。

  • AGX Xavier

sudo ./flash.sh -r -k cpu-bootloader jetson-xavier mmcblk0p1

  • Xavier NX

sudo ./flash.sh -r -k cpu-bootloader jetson-xavier-nx-devkit mmcblk0p1

7 文档历史

  • 20230427

支持Jetpack5.1.1。

  • 20230222

支持Jetpack5.1。

  • 20220831

完善Jetpack5.0.2下关于VEYE系列和 MV系列的说明。

  • 20220824

支持Jetpack5.0.2。

  • 20220720

增加Jetson multimedia-api和v4l2-ctl描述。

  • 20220714

增加对L4T32.7.2的说明。

  • 20220629

增加Jetpack5.0.1DP的支持,调通AGX-Orin。

  • 20220110

增加对新型号VEYE-MIPI-IMX335的相关说明。

  • 20220105

Use nvv4l2h264enc instead of omxh264enc in gstreamer command,because omxh264enc has been deprecated.

  • 20211025

gstreamer命令中,普遍采用nvv4l2camerasrc代替v4l2src,数据直接进入DMA内存。

8 参考资料

Jetson start up: https://developer.nvidia.com/embedded/learn/getting-started-jetson

Jetson Download Center: https://developer.nvidia.com/embedded/downloads

Xavier NX: https://developer.nvidia.com/embedded/learn/get-started-jetson-xavier-nx-devkit

TX2 development kit: https://developer.nvidia.com/embedded/jetson-tx2-developer-kit

SDK Manager: https://docs.nvidia.com/sdk-manager/index.html

L4T Doc: https://docs.nvidia.com/jetson/archives/l4t-archived/l4t-325/

https://docs.nvidia.com/jetson/archives/r35.3.1/DeveloperGuide/index.html

TX2 user guide: link