Jetson Xavier NX
资料
| ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
备注
如果您购买的是微雪提供的带核心板的套件,在出厂的时候,已经预烧了系统在配套的EMMC上,拿到手后可以直接上电启动完成开机配置即可。
预烧镜像没有装SDK,需要用户自行下载安装cuda等SDK插件。
简介
Jetson Xavier NX Developer Kit是一款功能强大的人工智能(AI)开发板,可为边缘系统提供强大的计算机性能。借助高达 21 TOPS 的加速计算能力,它可以并行运行现代神经网络并处理来自多个高分辨率传感器的数据,足以满足一个完整AI系统的需求。Jetson Xavier NX Developer Kit支持所有通用的AI框架。
Jetson Xavier NX 参数
GPU | NVIDIA Maxwell™ 架构,配有 384 个 NVIDIA CUDA® 核心 48 TFLOPS Cores |
---|---|
CPU | 6 核 NVIDIA Carmel ARM® v8.2 64 位 CPU 6 MB L2 + 4 MB L3 |
内存 | 8GB/16GB 128 位 LPDDR4x 59.7GB/s |
存储 | 16 GB eMMC 5.1 闪存/ M.2 M KEY NVME 固态接口 |
视频编码 | 2x 4K @ 60 4x 4K @ 30 (HEVC) |
视频解码 | 2x 8K @ 30 6x 4K @ 60 (HEVC) |
摄像头 | 最多 6 个摄像头(24 个通过虚拟通道) 14 个通道(3x4 或 6x2 或 3x4 + 1x2 或 5x2 + 1x4) |
联网 | Wi-Fi 需要外部芯片 10/100/1000 BASE-T 以太网 |
显示 | 2 多模 DP 1.4/eDP 1.4/HDMI 2.0 |
UPHY | 1 x1 (PCIe Gen3) + 1 x4 (PCIe Gen4)、1 个 USB 3.0、2 个 USB 2.0 |
IO | 3 个 UART、2 个 SPI、2 个 I2S、4 个 I2C、多个 GPIO |
JETSON Xavier NX DEV KIT 资源
- Jetson Xavier NX模组
- 40PIN GPIO扩展接口
- Micro USB接口
- 用于USB数据传输
- 千兆以太网端口
- 10/100/1000Base-T自适应以太网端口
- 4路USB 3.0接口
- HDMI高清接口
- DisplayPort接口
- DC电源接口
- 用于12~21V电源输入
- 2路MIPI CSI摄像头接口
- 风扇接口
烧录系统
注意JETSON Xavier NX DEV KIT 搭配的是官方16eMMC版本的Jetson Xavier NX 16GB/8GB 核心板,不带SD卡卡槽。因此烧录系统需要用到ubuntu 18.04主机,使用SDK Manager工具烧录。
主机环境配置
- 烧录环境: Ubuntu18.04 主机 (虚拟机也可以)
- 为了下载资源,烧录用的ubuntu18.04主机需要预留大约100G的内存空间
- SDK Manaeger下载链接
- 为了后续可以正常下载资源和烧录系统,请在NVIDAI DEVELOPER网站点击右上角的JOIN先注册一个账号
- 将deb文件下载到ubuntu电脑上,然后将deb文件复制到用户主目录下
- 打开终端运行以下程序安装sdk manager
sudo apt install ./sdkmanager_[version]-[build#]_amd64.deb
备注:注意将指令中的[version]-[build#] 改成实际下载的文件名
硬件配置(进入recovery 模式)
- 用跳帽或者杜邦线短接FC REC和GND引脚,位置如上图,位于核心板底下
- 连接DC电源到圆形供电口, 稍等片刻
- 用USB线(注意要是数据线)连接Jetson主板的Micro USB接口到Ubuntu主机
烧录系统
- 打开ubuntu电脑终端,运行sdkmanager打开软件
- 登录账号
- 如果Jetson 主板有被正常识别到。sdk manager会检测并提示选项
- 开发板类型选择Jetson Xavier NX 选项(如果你使用的是官方套件, 选择另一选项)
- 在JetPack选项中,选择支持的最新系统即可,不勾选其他的SDK, 然后点击Continue
- 选择Jetson OS, 并将Jetson SDK Components的选项去掉。勾选最下方的第一个协议
- 最后点击Continue 等待烧录完成即可。
- 从JetPack4.6.1版本开始,用SDK Manager烧系统的时候会弹出preconfig的窗口。
- 这里会默认选择开发板类型。 注意前面选择开发板类型的时候不要选择错误。
- 这里选择Manual Setup-Jetson ... (不同主板后缀提示不同)
- 这里可以选择runtime或者preconfig, 选择runtime的话,后续需要自己手动配置系统(用户名,密码,语言等), 选择preconfig,可以填入用户名和密码(可以自己定义),会在启动过程中自动配置主板
- 烧录完成之后,去掉底板的跳帽,接入显示器,重新上电,按照提示进行开机配置(如果是设置的pre-config, 上电后直接进入系统)。
设置系统从固态硬盘启动
- 将SSD接入Jetson Xavier NX,查看SSD的设备号,打开Jetson Xavier NX终端输入
ls /dev/nvme*
例如会看到有nvme0,nvme0n1。
- 格式化SSD
sudo mkfs.ext4 /dev/nvme0n1
- 修改启动路径
sudo vi /boot/extlinux/extlinux.conf
- 以上框住的内容复制一遍放在文件红框的下方并用#注释掉,防止修改错误
- 把未注释的复制内容里的第一行的LABEL primary 改成LABLE NX
- 找到语句APPEND ${cbootargs} quiet root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyS0,115200n8 console=tty0,将mmcblk0p1修改为nvme0n1保存
- 然后第一行的primary改成NX
- 挂载SSD
sudo mount /dev/nvme0n1 /mnt
- 复制系统到SSD(该过程没有信息打印请耐心等待)
sudo cp -ax / /mnt
- 复制完成后卸载SSD(不是拆掉SSD)
sudo umount /mnt/
- 重启系统
sudo reboot
- 输入
df -h
SDK安装
Jetpack主要包括系统镜像,库,APIs,开发者工具,示例和一些文档。在SDK Manager软件中,我们首先安装的是OS,也就是系统镜像,未安装的部分便是SDK,如下图:
SDK里包含TensorRT、cuDNN、CUDA、Multimedia API、Computer Vision、Developer Tools。
- TensorRT :用于图像分类、分割和对象检测神经网络的高性能深度学习推理运行,它加快了深度学习推理的速度,并减少了卷积和反卷积神经网络的运行时内存占用。
- cuDNN :CUDA深度神经网络库为深度学习框架提供高性能原语,它包括对卷积、激活函数和张量变换的支持。
- CUDA :CUDA工具包为构建 GPU 加速应用程序的 C 和C++开发人员提供了一个全面的开发环境。该工具包包括用于 NVIDIA GPU 的编译器、数学库以及用于调试和优化应用程序性能的工具。
- ultimedia API : Jetson Multimedia API为灵活的应用程序开发提供了低级 API。
- Computer Vision :VPI(视觉编程接口)是一个软件库,提供在PVA1(可编程视觉加速器)、GPU和CPU上实现的计算机视觉/图像处理算法,其中OpenCV是用于计算机视觉、图像处理和机器学习的领先开源库,现在具有用于实时操作的 GPU 加速功能,其中VisionWorks2是一个用于计算机视觉(CV)和图像处理的软件开发包。
- Developer Tools :Developer Tools CUDA工具包为构建GPU加速应用程序的C和C++开发人员提供了一个全面的开发环境。该工具包包括用于NVIDIA GPU的编译器、数学库以及用于调试和优化应用程序性能的工具。
以上是SDK的部分功能。 前面的系统安装的时候只是安装了基本的系统,其他的JetPack SDK组件,比如CUDA等都需要在系统正常启动后进一步安装,这里提供安装SDK的步骤说明。若要安装该部分,请保证是在以SSD硬盘为主系统的情况下,因为下载内容可能会导致EMMC磁盘容量告急。
使用SDK Manager安装
使用SDK Manager安装SDK的时候,不需要设置nano为recovery模式,也就是不需要进行短接引脚的操作。
- 正常上电启动Nano
- Jetson Nano进入系统正常启动后,用USB数据线连接Jetson Nano的Micro USB接口到Ubuntu主机
- Ubuntu主机电脑运行sdkmanager指令打开SDK Managaer(需要先安装SDK Manager)
- 类似于前面烧录系统的操作,不同的是,在步骤而中,不勾选 OS选项,而是勾选SDK' 选项, 然后continue到安装
- 在下载资源之后,会弹窗提示填写用户名和密码,填写nano系统的用户名和密码即可
- 等待SDK安装成功
使用指令安装
没有ubuntu或虚拟机的用户,可以选择在Jetson Nano上使用以下指令直接进行安装
sudo apt update sudo apt install nvidia-jetpack
Linux操作基础
常见指令介绍
文件系统
sudo
- sudo命令以系统管理者的身份执行指令。
- 要想使用root用户,可使用waveshare用户登录,执行下面命令
sudo su #切换为超级用户 su waveshare #切换普通用户
ls
- ls命令用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)。
- 常用的指令:
ls ls -a #显示所有文件及目录 (. 开头的隐藏文件也会列出) ls -l #除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出 ls -lh #文件大小以容易理解的格式列出,例如4K
- 想要学习了解指令更多参数,我们可以使用help指令来查看:
ls --help
chmod
- chmod命令是控制用户对文件的权限的命令。
- Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。
- 在下图中,显示了Linux根目录下的详细文件信息。在这些文件信息中, 最重要的就是第一列,它详细描述了文件和目录的权限,而第三与第四列则显示了这个文件和目录属于哪一个用户或组。
- Linux的文件属性可以分为三种:只读(r)、写(w)和可执行(x)。但是上面的文件属性却分为10小格,这是因为除了第一格显示目录外,另外三组每组三格分别表示文件所有者权限、同一组内的权限以及其他用户权限。
- 第一栏中如果显示d,则表示这是一个目录;如果是链接文件,则在这里显示l;如果是设备文件,则显示c。
- 第一个rwx栏位:-rwx------ 表示文件拥有者所拥有的权限。
- 第二个rwx栏位:---rwx--- 表示同一工作组内用户权限。
- 第三个rwx栏位:------rwx 表示其他用户权限。
- 例如:
- -rwx rwx rwx 表示无论哪个用户都可以对这个文件读写与执行。
- -rw- --- --- 表示只有文件拥有者有读写权限,但是没有执行权限。
- -rw -rw -rw 表示所有用户都有读写权。
- 符号模式
-
who(用户类型)
who 用户类型 说明 u user 文件所有者 g group 文件所有者所在组 o others 所有其他用户 a all 所用用户, 相当于 ugo
-
operator(符号模式表)
Operator 说明 + 为指定的用户类型增加权限 - 去除指定用户类型的权限 = 设置指定用户权限的设置,即将用户类型的所有权限重新设置
-
permission 的符号模式表
模式 名字 说明 r 读 设置为可读权限 w 写 设置为可写权限 x 执行权限 设置为可执行权限 X 特殊执行权限 只有当文件为目录文件,或者其他类型的用户有可执行权限时,才将文件权限设置可执行 s setuid/gid 当文件被执行时,根据who参数指定的用户类型设置文件的setuid或者setgid权限 t 粘贴位 设置粘贴位,只有超级用户可以设置该位,只有文件所有者u可以使用该位
-
符号模式实例
- 给file的所有用户增加读权限
chmod a+r file
- 删除file的所有用户的执行权限
chmod a-x file
- 给file的所有用户增加读写权限
chmod a+rw file
- 给file的所有用户增加读写执行权限
chmod +rwx file
- 对file的所有者设置读写权限,清空该用户组和其他用户对file的所有权限(空格代表无权限)
chmod u=rw,go= file
- 对目录waveshare和其子目录层次结构中的所有文件给用户增加读权限,而对用户组和其他用户删除读权限
chmod -R u+r,go-r waveshare
- 给file的所有用户增加读权限
-
who(用户类型)
- 八进制语法
-
chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者(User)的读、写、执行,用户组(Group)的读、写、执行以及其它用户(Other)的读、写、执行。
# 权限 rwx 二进制 7 读 + 写 + 执行 rwx 111 6 读 + 写 rw- 110 5 读 + 执行 rwx 101 4 只读 r-- 100 3 写 + 执行 -wx 011 2 只写 -w- 010 1 只执行 --x 001 0 无 --- 000
-
例如:765的解释如下:
- 所有者的权限用数字表达:属主的那三个权限位的数字加起来的总和。如 rwx ,也就是 4+2+1 ,应该是 7。
- 用户组的权限用数字表达:属组的那个权限位数字的相加的总和。如 rw- ,也就是 4+2+0 ,应该是 6。
- 其它用户的权限数字表达:其它用户权限位的数字相加的总和。如 r-x ,也就是 4+0+1 ,应该是 5。
-
常用的数字权限
- 400 -r-------- 拥有者能够读,其他任何人不能进行任何操作;
- 644 -rw-r–r-- 拥有者都能够读,但只有拥有者可以编辑;
- 660 -rw-rw---- 拥有者和组用户都可读和写,其他人不能进行任何操作;
- 664 -rw-rw-r-- 所有人都可读,但只有拥有者和组用户可编辑;
- 700 -rwx------ 拥有者能够读、写和执行,其他用户不能任何操作;
- 744 -rwxr–r-- 所有人都能读,但只有拥有者才能编辑和执行;
- 755 -rwxr-xr-x 所有人都能读和执行,但只有拥有者才能编辑;
- 777 -rwxrwxrwx 所有人都能读、写和执行(该设置不建议使用)。
-
实例
- 给file的所有用户增加读权限,拥有者和组用户可编辑权限
sudo chmod 664 file
- 给file的所有用户增加读权限,拥有者和组用户可编辑权限
-
chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者(User)的读、写、执行,用户组(Group)的读、写、执行以及其它用户(Other)的读、写、执行。
touch
- touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。
- 例如,在当前目录下,使用该指令创建一个空白文件"file.txt",输入如下命令:
touch file.txt
mkdir
- mkdir命令用于创建目录。
-
在工作目录下,建立一个名为waveshare的子目录 :
sudo mkdir waveshare
-
在工作目录下建立一个名为waveshare/test的目录。
sudo mkdir -p waveshare/test
- 若waveshare目录原本不存在,则建立一个。(注:本例若不加 -p 参数,且原本 waveshare 目录不存在,则产生错误。)
cd
- 切换当前工作目录。
cd .. #返回上一层目录 cd /home/waveshare #进入/home/waveshare 目录 cd #返回用户目录
cp
- cp命令主要用于复制文件或目录。
-
参数:
- -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
- -d:复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式。
- -f:覆盖已经存在的目标文件而不给出提示。
- -i:与 -f 选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答y时目标文件将被覆盖。
- -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
- -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
- -l:不复制文件,只是生成链接文件。
-
使用指令cp将当前目录test/下的所有文件复制到新目录 newtest 下,输入如下命令:
sudo cp –r test/ newtest
mv
- mv命令用来为文件或目录改名、或将文件或目录移入其它位置。
-
参数:
- -b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。
- -i: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入y表示直接覆盖,输入n表示取消该操作。
- -f: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件。
- -n: 不要覆盖任何已存在的文件或目录。
- -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。
-
使用指令mv将当前目录test/下的file1文件复制到新目录/home/waveshare下,输入如下命令:
sudo mv file1 /home/waveshare
rm
- rm命令用于删除一个文件或者目录。
-
参数:
- -i 删除前逐一询问确认。
- -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
- -r 将目录及以下之档案亦逐一删除。
-
- 删除文件可以直接使用rm命令,若删除目录则必须配合选项"-r",例如:
sudo rm test.txt
- rm:是否删除 一般文件 "test.txt"? y
sudo rm homework
- rm: 无法删除目录"homework": 是一个目录
sudo rm -r homework
- rm:是否删除 目录 "homework"? y
reboot
- reboot命令用于用来重新启动计算机,更改Tinker Board 2的配置经常需要重启。
-
参数:
- -n : 在重开机前不做将记忆体资料写回硬盘的动作
- -w : 并不会真的重开机,只是把记录写到 /var/log/wtmp 档案里
- -d : 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d)
- -f : 强迫重开机,不呼叫 shutdown 这个指令
- -i : 在重开机之前先把所有网络相关的装置先停止
-
重新启动
sudo reboot
shutdown
- Jetson Nano的关机是不能直接拔掉电源线的,因为Tinker Board 2会将内存作为暂存区,如果直接拔掉电源线会使一些在内存中的数据没有来得及写入SD卡中,从而造成数据的丢失或是损坏SD卡上的数据,造成系统无法启动。
-
参数
- -t seconds : 设定在几秒钟之后进行关机程序。
- -k : 并不会真的关机,只是将警告讯息传送给所有使用者。
- -r : 关机后重新开机。
- -h : 关机后停机。
- -n : 不采用正常程序来关机,用强迫的方式杀掉所有执行中的程序后自行关机。
- -c : 取消目前已经进行中的关机动作。
- -f : 关机时,不做 fsck 动作(检查 Linux 档系统)。
- -F : 关机时,强迫进行 fsck 动作。
- time : 设定关机的时间。
- message : 传送给所有使用者的警告讯息。
- 实例
- 立即关机
sudo shutdown -h now
- 指定 10 分钟后关机
sudo shutdown -h 10
- 重新启动计算机
sudo shutdown -r now
pwd
- 该pwd命令显示当前工作目录的名称:在Jetson nano上,输入pwd将输出类似/home/waveshare。
head
-
该head命令显示文件的开头。可用于-n指定要显示的行数(默认为 10 行),或与-c指定字节数。
head test.py -n 5
tail
- 该tail显示文件的结尾。-c字节或-n行数指定文件中的起始点
df
-
用于df显示已安装文件系统上可用和使用的磁盘空间。用于df -h以可读的格式查看输出,使用 M 表示 MB,而不是显示字节数。
df -h
tar
- tar命令是用来建立,还原备份文件的工具程序,它可以加入,解开备份文件内的文件。
-
压缩文件:
tar -cvzf waveshare.tar.gz *
-
解压文件:
tar -xvzf waveshare.tar.gz
apt
- apt(Advanced Packaging Tool)是一个在 Debian 和 Ubuntu 中的 Shell 前端软件包管理器。
- apt 命令提供了查找、安装、升级、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。
- apt 命令执行需要超级管理员权限(root)。
- apt 常用命令
- 列出所有可更新的软件清单命令:sudo apt update
- 升级软件包:sudo apt upgrade
- 列出可更新的软件包及版本信息:apt list --upgradeable
- 升级软件包,升级前先删除需要更新软件包:sudo apt full-upgrade
- 安装指定的软件命令:sudo apt install <package_name>
- 安装多个软件包:sudo apt install <package_1> <package_2> <package_3>
- 更新指定的软件命令:sudo apt update <package_name>
- 显示软件包具体信息,例如:版本号,安装大小,依赖关系等等:sudo apt show <package_name>
- 删除软件包命令:sudo apt remove <package_name>
- 清理不再使用的依赖和库文件: sudo apt autoremove
- 移除软件包及配置文件: sudo apt purge <package_name>
- 查找软件包命令: sudo apt search <keyword>
- 列出所有已安装的包:apt list --installed
- 列出所有已安装的包的版本信息:apt list --all-versions
- 例如我们安装nano编辑器
sudo apt install nano
网络
ifconfig
- 用于在不带任何参数(即)ifconfig运行时显示当前系统上接口的网络配置详细信息。
- 用SSH连接时可以通过ifconfig查找IP地址,终端输入
ifconfig
- 查看有线网络IP地址,终端输入
ifconfig eth0
- 查看无线网络IP地址,终端输入
ifconfig wlan0
hostname
- 该hostname命令显示系统的当前主机名。我们使用Jetson Nano的时候经常需要使用远程工具,而默认的网络配置IP地址采用动态分配,会造成IP地址不确定的问题
- 当我们的Jetson Nano的IP地址发生变化时,可以使用主机名登录。
-
登录Jetson Nano,修改hosts文件,命令如下:
sudo vim /etc/hosts
- 将jp46替换成要修改的名字,例如waveshare,按下键盘ZZ保存、退出:
-
修改hostname文件,将这里jp46也替换成要修改的名字,例如waveshare,按下键盘ZZ:
sudo vim /etc/hostname
- 修改完成重启Jetson Nano即可:
sudo reboot
- 我们也可以使用如下命令查看IP地址:
hostname -I
Vim编辑器使用
- Vim编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和常用命令。
- 基本上 vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。
- 命令模式:控制屏幕光标的移动,字符、字或行的删除,移动复制某区段。
- 输入模式:在此模式下输入字符,编辑文件。
- 底线模式:将文件保存或退出vim,也可以设置编辑环境,如寻找字符串、列出行号等。
- 我们可以将这三个模式想成底下的图标来表示:
- 首先删除默认Vi编辑器
sudo apt-get remove vim-common
- 然后重装Vim
sudo apt-get install vim
- 为方便使用还得在/etc/vim/vimrc文件后面添加下面三句
set nu #显示行号 syntax on #语法高亮 set tabstop=4 #tab退四格
常用命令
- 打开文件、保存、关闭文件(vi命令模式下使用)
vim filename //打开filename文件 :w //保存文件 :q //退出编辑器,如果文件已修改请使用下面的命令 :q! //退出编辑器,且不保存 :wq //退出编辑器,且保存文件 :wq! //强制退出编辑器,且保存文件 ZZ //退出编辑器,且保存文件 ZQ //退出编辑器,且不保存
- 插入文本或行(vi命令模式下使用,执行下面命令后将进入插入模式,按ESC键可退出插入模式)
a //在当前光标位置的右边添加文本 i //在当前光标位置的左边添加文本 A //在当前行的末尾位置添加文本 I //在当前行的开始处添加文本(非空字符的行首) O //在当前行的上面新建一行 o //在当前行的下面新建一行 R //替换(覆盖)当前光标位置及后面的若干文本 J //合并光标所在行及下一行为一行(依然在命令模式)
- 删除、恢复字符或行(vi命令模式下使用)
x //删除当前字符 nx //删除从光标开始的n个字符 dd //删除当前行 ndd //向下删除当前行在内的n行 u //撤销上一步操作 U //撤销对当前行的所有操作
-
复制、粘贴(vi命令模式下使用)
yy //将当前行复制到缓存区 nyy //将当前行向下n行复制到缓冲区 yw //复制从光标开始到词尾的字符 nyw //复制从光标开始的n个单词 y^ //复制从光标到行首的内容 y$ //复制从光标到行尾的内容 p //粘贴剪切板里的内容在光标后 P //粘贴剪切板里的内容在光标前
配置
文件传输
- 本教程以Windows系统远程连接到Linux服务器为例,有多种方式可以把本地的文件上传到服务器。
MobaXterm文件传输
- 使用MobaXterm工具传输文件是非常简单、方便的
NoMachine文件传输
- 当使用NoMachine远程连接成功后,Jetson Nano桌面右上角会出现NoMachine图标,我们点击图标,选择Transfer a file
SCP文件传输
- SCP命令可用于跨Linux系统安全地复制或加密传输文件和目录。
- 格式:
scp +参数 +用户名/登陆名+@+主机名/IP地址+ : + 目标文件路径+本地存放路径
- 首先进入要存放文件的目录按住键盘Shift且右键空白处,打开Windows PowerShell
-
将file文件从Jetson Nano复制到本地Windows,在终端输入
scp waveshare@192.168.15.100:file .
其中“.”表示当前路径
-
将file文件从本地Windows复制到Jetson Nano,在终端输入
scp file waveshare@192.168.15.100:
-
将file文件夹从Jetson Nano复制到本地Windows,由于file是一个目录,就需要加上参数r,在终端输入
scp -r waveshare@192.168.15.100:/home/pi/file .
-
将file文件夹从本地Windows复制到Jetson Nano,在终端输入
scp -r file waveshare@192.168.15.100:
注意:以上的waveshare需要改成你的系统的用户名,IP地址改成Jetson Nano实际IP地址。
文件共享(Samba)
使用Samba服务可实现文件共享。在windows的网上邻居即可访问Jetson Nano文件系统,非常方便。
-
首先安装Samba,在终端输入
sudo apt-get update sudo apt-get install samba -y
- 在/home/waveshare目录下创建共享文件夹sambashare
mkdir sambashare
-
安装完成后,修改配置文件/etc/samba/smb.conf:
sudo nano /etc/samba/smb.conf
拉到文件的最后,将下面的语句添加到文件尾部
[sambashare] comment = Samba on JetsonNano path = /home/waveshare/sambashare read only = no browsable = yes
注意:这里的waveshare需要改成你的系统的用户名。也就是说path是你要设置的共享文件夹路径。
-
重启Samba服务
sudo service smbd restart
-
设置共享文件夹密码
sudo smbpasswd -a waveshare
注意:这里的username需要改成你系统的用户名,如果不是用户名就会失败。
这里会要求设置Samba密码,建议是直接用你的系统的密码,比较方便记忆 -
设置完成之后,在你的电脑端,打开文件管理器
\\192.168.15.100\sambashare
-
输入登录名和前面第5步设置的密码
- 我们来验证下,在windows新建test文件夹,在Jetson Nano sambashare目录下就可以看到test文件夹
系统备份
- 在Windows电脑桌面上新建一个空白的.img后缀的文件。插入带有系统镜像的SD卡,选择对应的SD卡的盘符。
- 打开Win32DiskImager-烧录镜像软件,点击“Read”读取,即可将Jetson Nano的SD卡文件转为镜像。
摄像头
查看接入的第一个摄像头画面:
nvgstcapture-1.0
查看接入的第二个摄像头画面:
nvgstcapture-1.0 --sensor-id=1
AI入门
- 本教程基于JetPack4.6系统镜像,Python版本为Python3.6,TensorFlow版本为2.5.0,Pytorch版本为1.9.0为例。
- 注意:TensorFlow版本和Pytorch版本一定要和JetPack版本相互对应。
PIP安装
- Jetson Nano中默认安装了 Python3.6 版本,直接安装PIP
sudo apt update sudo apt-get install python3-pip python3-dev
- 安装完成后我们查看PIP版本
pip3 -V
- 默认安装的PIP是 9.01 版本,需要把它升级到最新版
python3 -m pip install --upgrade pip
- 升级成功后,查看pip版本信息,发现有些问题
pip3 -V
- 我们使用命令如下解决
python3 -m pip install --upgrade --force-reinstall pip sudo reboot
- 安装机器学习领域重要的安装包
安装机器学习领域重要的包 sudo apt-get install python3-numpy sudo apt-get install python3-scipy sudo apt-get install python3-pandas sudo apt-get install python3-matplotlib sudo apt-get install python3-sklearn
设置CUDA环境
- 查看CUDA版本,出现command not found,需要配置下环境
nvcc -V cat /usr/local/cuda/version.txt
注意:这里使用cat命令查看不到版本,进入/usr/local/目录查看下是否有CUDA目录,
如果没有参考后面未安装CUDA部分安装CUDA,安装完成后再配置环境。 - 设置环境变量
sudo vim .bashrc 在文件末尾加入: export PATH=/usr/local/cuda-10.2/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH export CUDA_HOME=$CUDA_HOME:/usr/local/cuda-10.2
- 更新环境变量
source .bashrc
- 再次查看CUDA版本
nvcc -V
Tensorflow GPU环境搭建
- 安装所需要的包
sudo apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev liblapack-dev libblas-dev gfortran sudo pip3 install -U pip testresources setuptools==49.6.0
-
安装 python 的依赖项
sudo pip3 install -U --no-deps numpy==1.19.4 future==0.18.2 mock==3.0.5 keras_preprocessing==1.1.2 keras_applications==1.0.8 gast==0.4.0 protobuf pybind11 cython pkgconfig packaging sudo env H5PY_SETUP_REQUIRES=0 pip3 install -U h5py==3.1.0
- 安装Tensorflow(在线安装经常失败,可以参考第4步离线安装)
sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v46 tensorflow
-
最后建议离线安装,先登录英伟达官网下载TensorFlow安装包(以jetpack4.6 TensorFlow2.5.0 nv21.08为例,建议使用火狐浏览器下载)
pip3 install tensorflow-2.5.0+nv21.8-cp36-cp36m-linux_aarch64.whl
- 安装完成后,检查是否安装成功,在终端输入
python3 import tensorflow as tf
- 查看版本信息
tf.__version__
Pytorch环境搭建
Pytorch安装
- 首先登录英伟达官网下载Pytorch安装包,我们以PyTorch v1.9.0为例
- 下载依赖库
sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev libopenblas-base libopenmpi-dev
- 安装Pytorch
sudo pip3 install torch-1.9.0-cp36-cp36m-linux_aarch64.whl
- 验证Pytorch是否安装成功
python3 import torch x = torch.rand(5, 3) print(x)
- 查看版本信息
import torch print(torch.__version__)
Torchvision安装
- Torchvision版本要与Pytorch版本相匹配,我们前面安装的Pytorch版本为1.9.0,Torchvision安装 v0.10.0版本
- 下载、安装torchvision
git clone --branch v0.10.0 https://github.com/pytorch/vision torchvision cd torchvision export BUILD_VERSION=0.10.0 sudo python3 setup.py install
- 验证Torchvision是否安装成功
python3 import torchvision
- 出现报错可能是Pillow版本太高,卸载重装
sudo pip3 uninstall pillow sudo pip3 install pillow
- 查看版本信息
import torchvision print(torchvision.__version__)
Yolo V4环境搭建
- 首先在github上下载darknet
git clone https://github.com/AlexeyAB/darknet.git
- 下载完成后,需要修改下Makefile文件
cd darknet sudo vim Makefile
将前四行0改成1
GPU=1 CUDNN=1 CUDNN_HALF=1 OPENCV=1
- cuda版本和路径也要改成我们的实际版本和路径,否则会编译失败
将NVCC=nvcc修改为 NVCC=/usr/local/cuda-10.2/bin/nvcc
- 修改完成后进行编译,在终端输入
sudo make
- 基本的推理方法有三种:图片、视频、摄影头 ( 实时影像 )
- 选择Yolo v4和Yolo v4-tiny(更轻量化的模型,适合在Jetson Nano上运行)进行测试。首先需要下载已训练好的模型权重文件
- 测试
./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights data/dog.jpg
- 如果要开启图片的话需使用 test模式,他会在执行之后要你输入图片的位置
./darknet detector test ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4.weights
- Yolov4-tiny 视频的检测(github下来的data里面并没有该视频文件,需要用户自行上传要检测的视频文件到 data 文件夹下)
./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights data/xxx.mp4
- 查看USB摄像头的设备号
ls /dev/video* ./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights /dev/video0 "nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, format=NV12, framerate=30/1 ! nvvidconv ! video/x-raw, width=1280, height=720, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! appsink" ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights /dev/video0 "nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, format=NV12, framerate=30/1 ! nvvidconv ! video/x-raw, width=1280, height=720, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! appsink"
- Hello AI World项目集成了NVIDIA非常强大的 TensroRT 加速引擎,将性能提升了数倍以上。
- 安装cmake
sudo apt-get update sudo apt-get install git cmake libpython3-dev python3-numpy
- 获取jetson-inference开源项目
git clone https://github.com/dusty-nv/jetson-inference cd jetson-inference git submodule update --init
-
新建文件夹,编译
注意:编译不报错才能正常运行下面的示例。sudo mkdir build cd build sudo cmake ../
由于内容是外网上的,可能导致下载不了box.com上的文件,所以下载模型和Pytorch界面我们选择跳过(Quit和Skip)。
-
下载模型,然后再放置到jetson-inference/data/networks目录下,然后解压,为了方便用户,这里我们提供部分模型参考下载指令:
cd ~/jetson-inference/data/networks/ #如果你需要下载更多的算法,请参考这里的方法,首先在github上获取model的下载地址,然后用wget 加指令下载。这里下载三个model以作参考 wget https://github.com/dusty-nv/jetson-inference/releases/download/model-mirror-190618/facenet-120.tar.gz wget https://github.com/dusty-nv/jetson-inference/releases/download/model-mirror-190618/GoogleNet.tar.gz wget https://github.com/dusty-nv/jetson-inference/releases/download/model-mirror-190618/SSD-Mobilenet-v2.tar.gz #下面的指令是解压前面下载的model的,只有解压出来才能用 tar -zxvf facenet-120.tar.gz tar -zxvf GoogleNet.tar.gz tar -zxvf SSD-Mobilenet-v2.tar.gz
-
也可以使用U盘或者文件传输方式将文件复制到Jetson Nano中
cd jetson-inference/build sudo make sudo make install
-
安装v4l摄像头驱动,终端输入
sudo apt-get install v4l-utils v4l2-ctl --list-formats-ext
- 使用摄像头对环境物体进行识别
cd ~/jetson-inference/build/aarch64/bin/ ./detectnet-camera
-
下面是可供下载的预训练对象检测网络表,以及用于加载预训练模型的相关--network参数:
./detectnet-camera --network=facenet #运行使用面部识别网络 ./detectnet-camera --network=multiped #运行使用多级行人/行李探测器 ./detectnet-camera --network=pednet #运行使用原始单级行人探测器 ./detectnet-camera --network=coco-bottle #在摄像头下检测 瓶/汽水罐 ./detectnet-camera --network=coco-dog #在摄像头下检测狗
-
让我们使用detectnet程序在静态图像中定位对象。除了输入/输出路径之外,还有一些额外的命令行选项:
- 更改正在使用的检测模型的可选--network标志(默认为 SSD-Mobilenet-v2)。
- --overlay标志,可以是逗号分隔的box, lines, labels, conf, 和none
- 默认--overlay=box,labels,conf显示框、标签和置信度值
- 该box选项绘制填充的边界框,而lines仅绘制未填充的轮廓
- --alpha值,设置覆盖期间使用的 alpha 混合值(默认值为120)。
- --threshold设置检测的最小阈值的可选值(默认为0.5)。
- --camera 标志设置要使用的摄像头设备
- 默认为使用 MIPI CSI 传感器 0(--camera=0)
- --width 和--height 标志设置相机分辨率(默认为 1280x720)
- 分辨率应设置为相机支持的格式,使用v4l2-ctl --list-formats-ext查询
./detectnet-camera --network=facenet #使用 FaceNet,默认 MIPI CSI 相机(1280×720) ./detectnet-camera --camera=/dev/video1 --network=facenet #使用 PedNet,V4L2 摄像机/dev/video1(1280x720) ./detectnet-camera --width=640 --height=480 --network=facenet #使用 PedNet,默认 MIPI CSI 摄像机(640x480)
- Jetson TX1、TX2、AGX Xavier 和 Nano 开发板包含一个 40 针 GPIO 接头,类似于 Raspberry Pi 中的 40 针接头。
- 可以使用 Jetson GPIO 库包中提供的 Python 库来控制这些 GPIO 的数字输入和输出。
- Jetson GPIO 库提供了 RPi.GPIO 库提供的所有公共 API。下面讨论每个 API 的使用:
- 要导入 Jetson.GPIO 模块,请使用:
import Jetson.GPIO as GPIO
- 管脚编号
- Jetson GPIO 库提供了四种对 I/O 引脚进行编号的方法。
- 前两个对应RPi.GPIO库提供的模式,即BOARD和BCM,分别指的是40针GPIO头的针号和Broadcom SoC GPIO号。
- 其余两种模式,CVM 和 TEGRA_SOC 使用字符串而不是数字,分别对应于 CVM/CVB 连接器和 Tegra SoC 上的信号名称。
- 要指定您使用的模式(强制),请使用以下函数调用:
GPIO.setmode(GPIO.BOARD) GPIO.setmode(GPIO.BCM) GPIO.setmode(GPIO.CVM) GPIO.setmode(GPIO.TEGRA_SOC)
- 要检查已设置的模式,您可以调用:
mode = GPIO.getmode()
模式必须是 GPIO.BOARD、GPIO.BCM、GPIO.CVM、GPIO.TEGRA_SOC 或 None 之一。
-
如果GRIO检测到一个引脚已经被设置成了非默认值,那么你将看到一个警告信息。
- 你可以通过下列代码禁用警告:
GPIO.setwarnings(False)
- 你可以通过下列代码禁用警告:
-
设置频道
- GPIO 通道必须在用作输入或输出之前进行设置。要将通道配置为输入,请调用:
# (where channel is based on the pin numbering mode discussed above) GPIO.setup(channel, GPIO.IN)
- 要将通道设置为输出,请调用:
GPIO.setup(channel, GPIO.OUT)
- 也可以为输出通道指定一个初始值:
GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)
- 将通道设置为输出时,也可以同时设置多个通道:
# add as many as channels as needed. You can also use tuples: (18,12,13) channels = [18, 12, 13] GPIO.setup(channels, GPIO.OUT)
- GPIO 通道必须在用作输入或输出之前进行设置。要将通道配置为输入,请调用:
-
输入
- 要读取通道的值,请使用:
GPIO.input(channel) 这将返回 GPIO.LOW 或 GPIO.HIGH。
- 要读取通道的值,请使用:
-
输出
- 要设置配置为输出的引脚的值,请使用:
GPIO.output(channel, state) 其中状态可以是 GPIO.LOW 或 GPIO.HIGH。
- 您还可以输出到通道列表或元组:
channels = [18, 12, 13] # or use tuples GPIO.output(channels, GPIO.HIGH) # or GPIO.LOW # set first channel to LOW and rest to HIGH GPIO.output(channel, (GPIO.LOW, GPIO.HIGH, GPIO.HIGH))
- 要设置配置为输出的引脚的值,请使用:
-
清理
- 在程序结束时,最好清理通道,以便将所有引脚设置为默认状态。要清理所有使用的通道,请调用:
GPIO.cleanup()
- 如果您不想清理所有频道,也可以清理单个频道或频道列表或元组:
GPIO.cleanup(chan1) # cleanup only chan1 GPIO.cleanup([chan1, chan2]) # cleanup only chan1 and chan2 GPIO.cleanup((chan1, chan2)) # does the same operation as previous statement
- 在程序结束时,最好清理通道,以便将所有引脚设置为默认状态。要清理所有使用的通道,请调用:
-
Jetson Board 信息和库版本
- 要获取有关 Jetson 模块的信息,请使用/阅读:
GPIO.JETSON_INFO
这提供了一个带有以下键的 Python 字典:P1_REVISION、RAM、REVISION、TYPE、MANUFACTURER 和 PROCESSOR。字典中的所有值都是字符串,但 P1_REVISION 是一个整数。
- 要获取有关库版本的信息,请使用/阅读:
GPIO.VERSION
这提供了一个具有 XYZ 版本格式的字符串。
- 要获取有关 Jetson 模块的信息,请使用/阅读:
-
中断
-
除了忙轮询之外,该库还提供了三种额外的方法来监视输入事件:
- wait_for_edge() 函数
- 此函数阻塞调用线程,直到检测到提供的边缘。该函数可以如下调用:
GPIO.wait_for_edge(channel, GPIO.RISING)
- 第二个参数指定要检测的边沿,可以是 GPIO.RISING、GPIO.FALLING 或 GPIO.BOTH。如果您只想将等待限制为指定的时间,可以选择设置超时:
# timeout is in milliseconds GPIO.wait_for_edge(channel, GPIO.RISING, timeout=500)
该函数返回检测到边缘的通道,如果发生超时,则返回 None。 - event_detected() 函数
- 此函数可用于定期检查自上次调用以来是否发生了事件。该函数可以按如下方式设置和调用:
# set rising edge detection on the channel GPIO.add_event_detect(channel, GPIO.RISING) run_other_code() if GPIO.event_detected(channel): do_something()
和以前一样,您可以检测 GPIO.RISING、GPIO.FALLING 或 GPIO.BOTH 的事件。 - 检测到边缘时运行的回调函数
- 此功能可用于为回调函数运行第二个线程。因此,回调函数可以与您的主程序并发运行以响应边缘。此功能可按如下方式使用:
# define callback function def callback_fn(channel): print("Callback called from channel %s" % channel) # add rising edge detection GPIO.add_event_detect(channel, GPIO.RISING, callback=callback_fn)
- 如果需要,也可以添加多个回调,如下所示:
def callback_one(channel): print("First Callback") def callback_two(channel): print("Second Callback") GPIO.add_event_detect(channel, GPIO.RISING) GPIO.add_event_callback(channel, callback_one) GPIO.add_event_callback(channel, callback_two)
在这种情况下,两个回调按顺序运行,而不是同时运行,因为只有线程运行所有回调函数。 - 为了通过将多个事件合并为一个事件来防止多次调用回调函数,可以选择设置去抖动时间:
# bouncetime set in milliseconds GPIO.add_event_detect(channel, GPIO.RISING, callback=callback_fn, bouncetime=200)
- 如果不再需要边缘检测,可以将其删除,如下所示:
GPIO.remove_event_detect(channel)
-
检查GPIO通道功能
-
此功能允许您检查提供的 GPIO 通道的功能:
GPIO.gpio_function(channel) 该函数返回 GPIO.IN 或 GPIO.OUT。
-
此功能允许您检查提供的 GPIO 通道的功能:
- 示例程序
import Jetson.GPIO as GPIO import time as time LED_Pin = 11 GPIO.setwarnings(False) GPIO.setmode(GPIO.BOARD) GPIO.setup(LED_Pin, GPIO.OUT) while (True): GPIO.output(LED_Pin, GPIO.HIGH) time.sleep(0.5) GPIO.output(LED_Pin, GPIO.LOW) time.sleep(0.5)
- 针对jetson.gpio库,官方也提供了一些简单的例程
- 首先下载jetson-gpio:
git clone https://github.com/NVIDIA/jetson-gpio
- 将下载的文件移动到/opt/nvidia下
sudo mv ~/jetson-gpio
- 进入jetson-gpio库文件夹,并安装库
cd /opt/nvidia/jetson-gpio sudo python3 setup.py install
- 使用前,还需要创建一个 gpio 组,把你的当前的账号加到这个组,并赋予使用权限
sudo groupadd -f -r gpio sudo usermod -a -G gpio user_name
注意:user_name是你使用的用户名,比如说waveshare
- 将99-gpio.rules文件复制到rules.d目录
sudo cp /opt/nvidia/jetson-gpio/lib/python/Jetson/GPIO/99-gpio.rules /etc/udev/rules.d/
- 为了使新规则生效,您需要通过运行以下命令重新引导或重新加载udev规则
sudo udevadm control --reload-rules && sudo udevadm trigger
- 配置完成后,我们就可以使用里面的例程了,例如simple_input.py可以读取引脚的状态
cd /opt/nvidia/jetson-gpio/samples/ sudo python3 simple_input.py
- 首先安装I2Ctool,终端输入:
sudo apt-get update sudo apt-get install -y i2c-tools sudo apt-get install -y python3-smbus
- 检查安装情况,终端输入:
apt-cache policy i2c-tools
输出如下即为安装成功
i2c-tools: 已安装:4.0-2 候选: 4.0-2 版本列表: *** 4.0-2 500 500 http://ports.ubuntu.com/ubuntu-ports bionic/universe arm64 Packages 100 /var/lib/dpkg/status
- 查询i2c设备:
sudo i2cdetect -y -r -a 0
- 参数: -y是无视交互问题直接执行,-r是SMBus read byte命令,-a是所有地址,0是指SMBus 0。
- 扫描寄存器数据:
sudo i2cdump -y 0 0x68
-
寄存器数据写入:
sudo i2cset -y 0 0x68 0x90 0x55
-
参数:
参数 含义 0 代表I2C设备号 0x68 代表I2C设备地址 0x90 代表寄存器地址 0x55 代表向寄存器写入的数据
-
参数:
-
寄存器数据读出:
sudo i2cget -y 0 0x68 0x90
-
参数:
参数 含义 0 代表I2C设备号 0x68 代表I2C设备地址 0x90 代表寄存器地址
-
参数:
- 入门教程
- Jetson Nano 论坛
- Nvidia Jetson Github
- NVIDIA官方免费AI教程(基于Jetson nano)
- Jetson Xavier NX 3D 图纸
- Jetson Xavier developer kit 3D图纸
- NVIDA深度学习学院(有相关深度学习的教程提供)
- NVIDIA Multimedia说明文档
使用YOLOv4进行推理
图片测试
视频测试
实时图像测试
Hello AI World
环境搭建
DetectNet运行实时摄像头检测
硬件控制
GPIO
点亮LED灯
例程使用
IIC
i2cdetect
NVIDIA官方资料
镜像
软件
FAQ