“Jetson TX2 NX”的版本间的差异

来自Waveshare Wiki
跳转至: 导航搜索
(Created page with "<div class="wiki-pages jet-green-color"> <div class="tabber"> <div class="tabbertab" title="资料"> {{外围模块|colorscheme=jet-green |name=Jetson TX2 NX |img=File:Jetso...")
 
 
(未显示4个用户的37个中间版本)
第1行: 第1行:
 +
{{DISPLAYTITLE: JETSON NANO TX2 NX}}
 
<div class="wiki-pages jet-green-color">
 
<div class="wiki-pages jet-green-color">
 +
<div class="tabberlive  newwsnav" id="wsnavbar">
 +
<ul class="tabbernav">
 +
<li class="nav-link">[[#myintro|说明]]</li>
 +
<li class="nav-link">[[#myresources|资料]]</li>
 +
<li class="nav-link">[[#myfaq|FAQ]]</li>
 +
<li class="nav-link">[[#mysupport|售后]]</li>
 +
</ul>
 +
</div>
 
<div class="tabber">
 
<div class="tabber">
<div class="tabbertab" title="资料">
+
<div class="tabbertab" title="资料" id="myresources">
 +
 
 +
<h1>资料</h1>
 +
<div class="tabber" >
 
{{外围模块|colorscheme=jet-green
 
{{外围模块|colorscheme=jet-green
 
|name=Jetson TX2 NX
 
|name=Jetson TX2 NX
|img=[[File:Jetson-TX2-NX-1.jpg|360px |link=https://{{SERVERNAME}}/shop/Jetson-TX2-NX.htm | Jetson TX2 NX]]  
+
|img=<div class="subnavber">
 +
<div class="subnavbertab" title="带驱动板">[[File:JETSON-TX2-NX-DEV-KIT-1.jpg|360px |link=https://{{SERVERNAME}}/shop/JETSON-TX2-NX-DEV-KIT.htm | JETSON-TX2-NX-DEV-KIT]]</div>
 +
<div class="subnavbertab" title="核心板">[[File:Jetson-TX2-NX-1.jpg|360px |link=https://{{SERVERNAME}}/shop/Jetson-TX2-NX.htm | Jetson TX2 NX]] </div></div>
 
|category1=Nvidia Jetson
 
|category1=Nvidia Jetson
 
|category2=AI
 
|category2=AI
第15行: 第29行:
 
|feature-name3=内存
 
|feature-name3=内存
 
|feature-value3=4 GB 128-bit LPDDR4 51.2 GB/s
 
|feature-value3=4 GB 128-bit LPDDR4 51.2 GB/s
}}
+
}}</div>
 
+
==备注==
 +
如果您购买的是微雪提供的带核心板的套件,在出厂的时候,已经预烧了系统在配套的EMMC上,拿到手后可以直接上电启动完成开机配置即可。<br />
 +
预烧镜像没有装SDK,需要用户自行下载安装cuda等SDK插件。
 
==简介==
 
==简介==
 
NVIDIA Jetson TX2 NX 为入门级嵌入式和边缘产品提供新一代 AI 性能。它体积小,功耗低,是您下一个从制造业、迁移学习、零售业到农业及生命科学 AI 解决方案的理想之选。预训练的 AI 模型、迁移学习工具包和 NVIDIA JetPack SDK 可帮助您将性能强大的产品快速推向市场。
 
NVIDIA Jetson TX2 NX 为入门级嵌入式和边缘产品提供新一代 AI 性能。它体积小,功耗低,是您下一个从制造业、迁移学习、零售业到农业及生命科学 AI 解决方案的理想之选。预训练的 AI 模型、迁移学习工具包和 NVIDIA JetPack SDK 可帮助您将性能强大的产品快速推向市场。
 +
<ol>
 +
 +
 +
 +
 +
 +
 +
</ol>
 +
==Jetson TX2 NX 参数==
 +
{|class="list" border="1"
 +
! GPU
 +
| NVIDIA Pascal 架构,配有 256 个 NVIDIA CUDA® 核心
 +
|-
 +
! CPU
 +
| 双核 NVIDIA Denver 2 64 位 CPU 与四核 Arm Cortex-A57 MPCore 处理器联合体
 +
|-
 +
!内存
 +
| 4 GB 128 位 LPDDR4 51.2 GB/秒
 +
|-
 +
! 存储
 +
| 16 GB eMMC 5.1 闪存/ M.2 M KEY NVME 固态接口
 +
|-
 +
!视频编码
 +
|1x 4K60 | 3x 4K30 | 4x 1080p60 | 8x 1080p30 (H.265)<br />
 +
1x 4K60 | 3x 4K30 | 7x 1080p60 | 14x 1080p30 (H.264)<br />
 +
|-
 +
!视频解码
 +
|2x 4K60 | 4x 4p30 | 7x 1080p60 | 14x 1080p30<br />
 +
(H.265 和 H.264)<br />
 +
|-
 +
! 摄像头
 +
|可支持 5 个摄像头 (通过虚拟通道可支持 12 个)<br />
 +
12 个通道 MIPI CSI-2 (3x4 或 5x2) <br />
 +
D-PHY 1.2 (高达 30 Gbps)<br />
 +
|-
 +
! 联网
 +
| Wi-Fi 需要外部芯片<br />
 +
10/100/1000 BASE-T 以太网
 +
|-
 +
! 显示
 +
| 2 个多模式 DP 1.2/eDP 1.4/HDMI 2.0 <br />
 +
1 个 2 DSI (1.5Gbps/通道) <br />
 +
|-
 +
! 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 TX2 NX DEV KIT 资源==
 +
:[[File:JETSON-IO-BASE-B-10.png|600px]]
 +
# Jetson TX2 NX模组
 +
# 40PIN GPIO扩展接口
 +
# Micro USB接口
 +
#:用于USB数据传输
 +
# 千兆以太网端口
 +
#:10/100/1000Base-T自适应以太网端口
 +
# 4路USB 3.0接口
 +
# HDMI高清接口
 +
# DisplayPort接口
 +
# DC电源接口
 +
#: 用于9~19V电源输入
 +
# 2路MIPI CSI摄像头接口
 +
#风扇接口
 +
 +
==尺寸图==
 +
[[file:JETSON-IO-BASE-B-size.jpg|500px]]
 +
==烧录系统==
 +
<font style="color:red;">注意JETSON TX2 NX DEV KIT搭配的是官方16eMMC版本的Jetson TX2 NX核心板,不带SD卡卡槽。因此烧录系统需要用到ubuntu 18.04主机,使用SDK Manager工具烧录。</font>
 +
===主机环境配置===
 +
*烧录环境: Ubuntu18.04 主机 (虚拟机也可以)
 +
*: 为了下载资源,烧录用的ubuntu18.04主机需要预留大约100G的内存空间
 +
*[https://developer.nvidia.com/nvidia-sdk-manager SDK Manaeger下载链接]
 +
*:'''为了后续可以正常下载资源和烧录系统,请在NVIDAI DEVELOPER网站点击右上角的JOIN先注册一个账号'''
 +
*将deb文件下载到ubuntu电脑上,然后将deb文件复制到用户主目录下
 +
*打开终端运行以下程序安装sdk manager
 +
<pre>
 +
sudo apt install ./sdkmanager_[version]-[build#]_amd64.deb
 +
</pre>
 +
备注:注意将指令中的[version]-[build#] 改成实际下载的文件名
 +
 +
===硬件配置(进入recovery 模式)===
 +
:[[File:jetson-nano-force_recovery.jpg|500px]]
 +
*用跳帽或者杜邦线短接FC REC和GND引脚,位置如上图,位于核心板底下
 +
*连接DC电源到圆形供电口, 稍等片刻
 +
*用USB线(注意要是数据线)连接Jetson主板的Micro USB接口到Ubuntu主机
 +
 +
 +
===烧录系统===
 +
*打开ubuntu电脑终端,运行sdkmanager打开软件
 +
*登录账号
 +
*如果Jetson 主板有被正常识别到。sdk manager会检测并提示选项
 +
:[[File:Jetson TX2 NX.png|400px]]
 +
*开发板类型选择JetsonTX2 NX 选项,在JetPack选项中,选择支持的最新系统即可,'''不勾选Host PC''', 然后点击Continue
 +
:[[File:configuration1.png|400px]]
 +
*选择Jetson OS, <font color="red">并将Jetson SDK Components的选项去掉</font>。勾选最下方的第一个协议
 +
:[[File:configuration2.png|400px]]
 +
*最后点击Continue 等待烧录完成即可。
 +
**从JetPack4.6.1版本开始,用SDK Manager烧系统的时候会弹出preconfig的窗口。
 +
*# 这里会默认选择开发板类型。 注意前面选择开发板类型的时候不要选择错误。
 +
*#这里选择Manual Setup-Jetson ... (不同主板后缀提示不同)
 +
*#这里可以选择runtime或者preconfig, 选择runtime的话,后续需要自己手动配置系统(用户名,密码,语言等), 选择preconfig,可以填入用户名和密码(可以自己定义),会在启动过程中自动配置主板
 +
[[File:configuration3.png|400px]]
 +
 +
*烧录完成之后,去掉底板的跳帽,接入显示器,重新上电,按照提示进行开机配置(如果是设置的pre-config, 上电后直接进入系统)。
 +
 +
</div>
 +
 +
<div class="tabbertab" title="使用"><br />
 +
 +
==设置系统从固态硬盘启动==
 +
<ol>
 +
<li>将SSD接入Jetson nano TX2 NX,查看SSD的设备号,打开Jetson nano TX2 NX终端输入
 +
<pre>ls /dev/nvme*</pre>例如会看到有nvme0,nvme0n1。<br>
 +
[[File:identification.png|400px]]
 +
</li>
 +
<li>格式化SSD
 +
<pre>sudo mkfs.ext4 /dev/nvme0n1</pre>
 +
格式化成功。<br>
 +
[[File:format.png|400px]]
 +
<li>修改启动路径
 +
<pre>sudo vi /boot/extlinux/extlinux.conf</pre></li>
 +
*以上内容复制一遍放在文件红框的下方并用#注释掉,防止修改错误
 +
*把未注释的复制内容里的LABEL primary 改成LABLE NX
 +
*找到语句APPEND ${cbootargs} quiet root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyS0,115200n8 console=tty0,将mmcblk0p1修改为nvme0n1保存
 +
*然后第二行的primary改成NX
 +
[[File:NX-configuration.png|400px]]
 +
<li>挂载SSD
 +
<pre>sudo mount /dev/nvme0n1 /mnt</pre></li>
 +
<li>复制系统到SSD(该过程没有信息打印请耐心等待)
 +
<pre>sudo cp -ax / /mnt</pre></li>
 +
<li>复制完成后卸载SSD(不是拆掉SSD)
 +
<pre>sudo umount /mnt/</pre></li>
 +
<li>重启系统
 +
<pre>sudo reboot</pre></li>
 +
<li>输入
 +
<pre>df -h</pre>
 +
显示从固态硬盘启动<br>[[File:enable.png|400px]]
 +
 +
</ol>
 +
 +
==SDK安装==
 +
Jetpack主要包括系统镜像,库,APIs,开发者工具,示例和一些文档。在SDK Manager软件中,我们首先安装的是OS,也就是系统镜像,未安装的部分便是SDK,如下图:<br>
 +
[[File:SDK.jpg|600px]]<br>
 +
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的时候,不需要设置Jetson TX2 NX为recovery模式,也就是不需要进行短接引脚的操作。
 +
*正常上电启动Jetson TX2 NX
 +
*Jetson TX2 NX进入系统正常启动后,用USB数据线连接Jetson TX2 NX的Micro USB接口到Ubuntu主机
 +
*Ubuntu主机电脑运行sdkmanager指令打开SDK Managaer(需要先安装SDK Manager)
 +
*类似于前面烧录系统的操作,不同的是,在步骤而中,'''不勾选 OS选项''',而是'''勾选SDK'''' 选项, 然后continue到安装
 +
*在下载资源之后,会弹窗提示填写用户名和密码,填写Jetson TX2 NX系统的用户名和密码即可
 +
*等待SDK安装成功
 +
 +
===使用指令安装===
 +
没有ubuntu或虚拟机的用户,可以选择在Jetson Nano上使用以下指令直接进行安装
 +
<pre>
 +
sudo apt update
 +
sudo apt install nvidia-jetpack
 +
</pre>
 +
==FAN==
 +
安装jtop<br>
 +
sudo apt install python3-pip
 +
sudo pip3 install jetson-stats
 +
sudo reboot
 +
开机后输入<br>
 +
jtop
 +
最大化窗口鼠标选择6CTRL,鼠标选择profiles里的mannual选项,然后点击speed旁的[+]号调节风扇风力.
 +
 +
==系统登录==
 +
===本地登录===
 +
Jetson TX2 NX上电,用数据线连接micro usb口和电脑,打开电脑的设别管理器查看是否有新的端口出现,有则查看端口号,可以使用putty用串口登录。
 +
===远程登录===
 +
====准备工作====
 +
*用一根网线一端连接Jetson TX2 NX,另一端连接路由器的LAN端口。
 +
*确保Jetson TX2 NX与你的电脑出于一个路由器下或同一网段。
 +
 +
====获取Jetson TX2 NX的IP地址====
 +
*方法一:登录路由器查找Jetson TX2 NX的IP地址。
 +
*方法二:你可以通过一些局域网IP扫描工具,这里以[https://www.advanced-ip-scanner.com/ Advanced IP Scanner]为例程
 +
*# 运行Advanced IP Scanner
 +
*# 点击Scan按钮,扫描当前局域网内的IP地址
 +
*# 找到'''所有'''Manufacturer中有NVIDIA字样的IP地址并记录<br>[[文件:NVIDIA-ip水印.png|600px]]
 +
*# 将设备上电,并确保设备连接上网络后
 +
*# 重新点击Scan按钮,扫描当前局域网内的IP地址
 +
*# 排除掉'''所有先前记录的'''Manufacturer中有NVIDIA字样的IP地址,剩下的就是你的NVIDIA的IP地址了
 +
*方法三:屏幕IP查询
 +
*#Jetson TX2 NX连接上网线或者装上无线网卡连接WIFI,在终端输入ifconfig ,查看Jetson TX2 NX的IP地址。
 +
*#[[文件:有线网络.png|600px]]
 +
 +
====使用MobaXterm登录====
 +
=====终端窗口=====
 +
#下载[https://www.waveshare.net/w/upload/c/c3/MobaXterm_Portable_v22.0.zip MobaXterm]远程登录软件,解压即可使用。
 +
#打开MobaXterm远程登录软件,选择Session,选择ssh。
 +
#在Remote host输入我们前面查询到的IP地址192.168.15.102(根据自己的实际IP来填写),填写完成后,点击ok。<br>[[File:登录水印.png|600px]]
 +
#点击Accept,输入登录用户名,回车输入登录密码(在输入密码时,屏幕没有变化属于正常现象,点击回车确认即可)<br>[[File:Aceept-1水印.png|600px]]
 +
 +
====NoMachine登录====
 +
*相比SSH和VNC大家对Nomachine可能了解不是很多,Nomachine是一款免费的远程桌面软件。
 +
*NoMachine基本覆盖了所有主流大操作系统,包括Windows,Mac,Linux,iOS,Android和Raspberry等等。
 +
=====Jetson TX2 NX上安装=====
 +
<ol>
 +
<li>下载、解压Jetson TX2 NX的[https://www.waveshare.net/w/upload/5/5f/Nomachine_7.10.1_1_arm64.zip NoMachine安装包]</li>
 +
<li>解压完成后,使用U盘或者[[#文件传输|文件传输]]方式将.deb文件复制到Jetson TX2 NX中</li>
 +
<li>使用指令来安装<pre>sudo dpkg -i nomachine_7.10.1_1_arm64.deb</pre></li>
 +
</ol>
 +
 +
=====Windows电脑上安装=====
 +
<ul>
 +
<li>
 +
下载[https://www.waveshare.net/w/upload/d/dd/Nomachine_7.10.1_1.zip NoMachine安装包],打开安装,等待进度条结束,点击Finish,最后还需要重启下电脑<br>[[文件:Nomachine-安装水印.gif]]
 +
</li>
 +
</ul>
 +
 +
=====连接Jetson Nano=====
 +
<ol>
 +
<li>
 +
打开NoMachine,在Search输入Jetson TX2 NX的IP地址。例如:192.168.15.100<br>[[文件:Nomachine-1水印.png|600px]]
 +
</li>
 +
<li>点击Connect to new host 192.168.15.100,输人Jetson TX2 NX登录名和登录密码,点击login<br>[[文件:Nomachine-login水印.png|600px]]
 +
</li>
 +
<li>加载完成后,会出现一些软件介绍界面,我们直接点击ok就可以了<br>[[文件:Nomachine-ok水印.png|600px]]
 +
</li>
 +
<li>此时我们就成功登录Jetson TX2 NX<br>[[文件:Nomachine-success水印.png|600px]]
 +
</li>
 +
</ol>
 +
 +
====VNC登录====
 +
*在没有显示屏的情况下,想要进入Jetson TX2 NX的桌面,此时就需要使用远程桌面登陆。(建议使用显示屏,VNC有一定延时)
 +
====配置VNC服务器====
 +
*Jetson Nano使用vino来作为默认的VNC服务器,但是默认的设置需要进行一些修改。
 +
<ol>
 +
<li>配置VNC Server<pre>
 +
gsettings set org.gnome.Vino require-encryption false
 +
gsettings set org.gnome.Vino prompt-enabled false
 +
gsettings set org.gnome.Vino authentication-methods "['vnc']"
 +
gsettings set org.gnome.Vino lock-screen-on-disconnect false
 +
gsettings set org.gnome.Vino vnc-password $(echo -n "mypassword"|base64)</pre>
 +
*需要注意的是,不要用sudo来运行上面的命令,mypassword就是连接VNC的密码。
 +
</li>
 +
<li>设置桌面开机自启,在.config路径下新建一个自启文件<pre> mkdir -p .config/autostart
 +
sudo vim ~/.config/autostart/vino-server.desktop</pre>
 +
添加以下内容:
 +
<pre>[Desktop Entry]
 +
Type=Application
 +
Name=Vino VNC server
 +
Exec=/usr/lib/vino/vino-server
 +
NoDisplay=true</pre></li>
 +
<li>查看当前用的是什么管理器<pre>cat /etc/X11/default-display-manager</pre></li>
 +
<li>编辑文件<pre>sudo vim /etc/gdm3/custom.conf</pre></li>
 +
<li>把下面三行的注释去掉,其中AutomaticLogin行修改成自己的用户名。
 +
<pre>WaylandEnable=false
 +
AutomaticLoginEnable = true
 +
AutomaticLogin = waveshare</pre></li>
 +
<li>重启Jetson Nano <pre>sudo reboot</pre></li>
 +
</ol>
 +
 +
=====下载安装VNC Viewer=====
 +
*在电脑上下载安装[https://www.waveshare.net/w/upload/4/4e/VNC-Viewer-6.21.1109-Windows.zip VNC-Viewer]。
 +
 +
=====使用VNC Viewer远程连接Jetson Nano=====
 +
#打开VNC Viewer,输入Jetson TX2 NX的IP地址回车确认。例如:<pre>192.168.15.102</pre>
 +
#输入前面设置的VNC登录密码,点击ok:
 +
#此时就成功登录Jetson TX2 NX了。<br>[[文件:VNC-DESKTOP水印.png|600px]]
 +
==Linux操作基础==
 +
===常见指令介绍===
 +
====文件系统====
 +
=====sudo=====
 +
<ul>
 +
<li>sudo命令以系统管理者的身份执行指令。</li>
 +
<li>要想使用root用户,可使用waveshare用户登录,执行下面命令</li>
 +
<pre>
 +
sudo su  #切换为超级用户
 +
su waveshare #切换普通用户
 +
</pre>
 +
</ul>
 +
 +
=====ls=====
 +
<ul>
 +
<li>ls命令用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)。</li>
 +
<li>常用的指令:<pre>ls
 +
ls -a  #显示所有文件及目录 (. 开头的隐藏文件也会列出)
 +
ls -l  #除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出
 +
ls -lh  #文件大小以容易理解的格式列出,例如4K
 +
</pre>
 +
 +
</li>
 +
<li><font color="#FF0000">想要学习了解指令更多参数,我们可以使用help指令来查看:</font><pre>ls --help</pre>
 +
 +
</li>
 +
</ul>
 +
 +
=====chmod=====
 +
<ul>
 +
<li>chmod命令是控制用户对文件的权限的命令。</li>
 +
<li>Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。</li>
 +
<li>在下图中,显示了Linux根目录下的详细文件信息。在这些文件信息中, 最重要的就是第一列,它详细描述了文件和目录的权限,而第三与第四列则显示了这个文件和目录属于哪一个用户或组。<br>[[文件:Jetson-chmod.png|600px]]
 +
</li>
 +
<li>Linux的文件属性可以分为三种:只读(r)、写(w)和可执行(x)。但是上面的文件属性却分为10小格,这是因为除了第一格显示目录外,另外三组每组三格分别表示文件所有者权限、同一组内的权限以及其他用户权限。
 +
*第一栏中如果显示d,则表示这是一个目录;如果是链接文件,则在这里显示l;如果是设备文件,则显示c。
 +
*第一个rwx栏位:-rwx------ 表示文件拥有者所拥有的权限。
 +
*第二个rwx栏位:---rwx---        表示同一工作组内用户权限。
 +
*第三个rwx栏位:------rwx      表示其他用户权限。
 +
*例如:
 +
*-rwx rwx rwx  表示无论哪个用户都可以对这个文件读写与执行。
 +
*-rw- --- ---  表示只有文件拥有者有读写权限,但是没有执行权限。
 +
*-rw -rw -rw  表示所有用户都有读写权。
 +
</li>
 +
<li>'''符号模式'''
 +
<ul><li>
 +
who(用户类型)
 +
  {|border=1; style="height:280px;width:700px;"
 +
  |-style="background:#363636; color:white;"
 +
  |who||用户类型||说明
 +
  |-style="background:#E8E8E8;"
 +
  |u||user||文件所有者
 +
  |-style="background:#CFCFCF;"
 +
  |g||group||文件所有者所在组
 +
  |-style="background:#E8E8E8;"
 +
  |o||others||所有其他用户
 +
  |-style="background:#CFCFCF;"
 +
  |a||all||所用用户, 相当于 ugo
 +
  |}
 +
</li></ul>
 +
<ul><li>
 +
operator(符号模式表)
 +
 +
{|border=1; style="height:200px;width:700px;"
 +
  |-style="background:#363636; color:white;"
 +
  |Operator||说明||
 +
  |-style="background:#E8E8E8;"
 +
  | + ||为指定的用户类型增加权限||
 +
  |-style="background:#CFCFCF;"
 +
  | - ||去除指定用户类型的权限||
 +
  |-style="background:#E8E8E8;"
 +
  |=||设置指定用户权限的设置,即将用户类型的所有权限重新设置||
 +
  |}
 +
</li></ul>
 +
<ul><li>
 +
permission 的符号模式表
 +
 +
  {|border=1; style="height:280px;width:700px;"
 +
  |-style="background:#363636; color:white;"
 +
  |模式||名字||说明
 +
  |-style="background:#E8E8E8;"
 +
  |r||读||设置为可读权限
 +
  |-style="background:#CFCFCF;"
 +
  |w||写||设置为可写权限
 +
  |-style="background:#E8E8E8;"
 +
  |x||执行权限||设置为可执行权限
 +
  |-style="background:#CFCFCF;"
 +
  |X||特殊执行权限||只有当文件为目录文件,或者其他类型的用户有可执行权限时,才将文件权限设置可执行
 +
  |-style="background:#E8E8E8;"
 +
  |s||setuid/gid||当文件被执行时,根据who参数指定的用户类型设置文件的setuid或者setgid权限
 +
  |-style="background:#CFCFCF;"
 +
  |t||粘贴位||设置粘贴位,只有超级用户可以设置该位,只有文件所有者u可以使用该位
 +
  |}
 +
</li></ul>
 +
<ul><li>
 +
符号模式实例
 +
#给file的所有用户增加读权限<pre>chmod a+r file</pre>
 +
#删除file的所有用户的执行权限<pre>chmod a-x file</pre> 
 +
#给file的所有用户增加读写权限<pre>chmod a+rw file</pre> 
 +
#给file的所有用户增加读写执行权限<pre>chmod +rwx file </pre>
 +
#对file的所有者设置读写权限,清空该用户组和其他用户对file的所有权限(空格代表无权限)<pre>chmod u=rw,go= file</pre> 
 +
#对目录waveshare和其子目录层次结构中的所有文件给用户增加读权限,而对用户组和其他用户删除读权限<pre>chmod -R u+r,go-r waveshare</pre>
 +
 +
</li></ul>
 +
</li>
 +
<li>'''八进制语法'''
 +
<ul><li>
 +
chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者(User)的读、写、执行,用户组(Group)的读、写、执行以及其它用户(Other)的读、写、执行。
 +
 +
  {|border=1; style="height:280px;width:700px;"
 +
  |-style="background:#363636; color:white;"
 +
  |#||权限||rwx||二进制
 +
  |-style="background:#E8E8E8;"
 +
  |7||读 + 写 + 执行||rwx||111
 +
  |-style="background:#CFCFCF;"
 +
  |6||读 + 写 ||rw-||110
 +
  |-style="background:#E8E8E8;"
 +
  |5||读  + 执行||rwx||101
 +
  |-style="background:#CFCFCF;"
 +
  |4||只读||r--||100
 +
  |-style="background:#E8E8E8;"
 +
  |3||写 + 执行||-wx||011
 +
  |-style="background:#CFCFCF;"
 +
  |2||只写||-w-||010
 +
  |-style="background:#E8E8E8;"
 +
  |1||只执行||--x||001
 +
  |-style="background:#CFCFCF;"
 +
  |0||无||---||000
 +
  |}
 +
</li></ul>
 +
<ul><li>
 +
例如:765的解释如下:
 +
*所有者的权限用数字表达:属主的那三个权限位的数字加起来的总和。如 rwx ,也就是 4+2+1 ,应该是 7。
 +
*用户组的权限用数字表达:属组的那个权限位数字的相加的总和。如 rw- ,也就是 4+2+0 ,应该是 6。
 +
*其它用户的权限数字表达:其它用户权限位的数字相加的总和。如 r-x ,也就是 4+0+1 ,应该是 5。
 +
</li></ul>
 +
<ul><li>
 +
常用的数字权限
 +
*400 -r-------- 拥有者能够读,其他任何人不能进行任何操作;
 +
*644 -rw-r–r-- 拥有者都能够读,但只有拥有者可以编辑;
 +
*660 -rw-rw---- 拥有者和组用户都可读和写,其他人不能进行任何操作;
 +
*664 -rw-rw-r-- 所有人都可读,但只有拥有者和组用户可编辑;
 +
*700 -rwx------ 拥有者能够读、写和执行,其他用户不能任何操作;
 +
*744 -rwxr–r-- 所有人都能读,但只有拥有者才能编辑和执行;
 +
*755 -rwxr-xr-x 所有人都能读和执行,但只有拥有者才能编辑;
 +
*777 -rwxrwxrwx 所有人都能读、写和执行(该设置不建议使用)。
 +
</li></ul>
 +
<ul><li>
 +
实例
 +
*给file的所有用户增加读权限,拥有者和组用户可编辑权限<pre>sudo chmod 664 file</pre>
 +
</li></ul>
 +
</li>
 +
</ul>
 +
 +
=====touch=====
 +
<ul><li>
 +
touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。</li>
 +
<li>例如,在当前目录下,使用该指令创建一个空白文件"file.txt",输入如下命令:<pre>touch file.txt</pre>
 +
</li></ul>
 +
 +
=====mkdir=====
 +
<ul><li>
 +
<li>mkdir命令用于创建目录。</li>
 +
<li>
 +
在工作目录下,建立一个名为waveshare的子目录 :
 +
<pre>sudo mkdir waveshare</pre>
 +
</li>
 +
<li>
 +
在工作目录下建立一个名为waveshare/test的目录。
 +
<pre>sudo mkdir -p waveshare/test</pre>
 +
</li>
 +
<li>若waveshare目录原本不存在,则建立一个。(注:本例若不加 -p 参数,且原本 waveshare 目录不存在,则产生错误。)</li>
 +
</li></ul>
 +
 +
=====cd=====
 +
<ul>
 +
<li>切换当前工作目录。
 +
<pre>
 +
cd ..            #返回上一层目录
 +
cd /home/waveshare #进入/home/waveshare 目录
 +
cd              #返回用户目录
 +
</pre>
 +
</li>
 +
</ul>
 +
 +
=====cp=====
 +
<ul>
 +
<li>cp命令主要用于复制文件或目录。</li>
 +
<li>
 +
参数:
 +
*-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
 +
*-d:复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式。
 +
*-f:覆盖已经存在的目标文件而不给出提示。
 +
*-i:与 -f 选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答y时目标文件将被覆盖。
 +
*-p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
 +
*-r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
 +
*-l:不复制文件,只是生成链接文件。
 +
</li>
 +
<li>
 +
使用指令cp将当前目录test/下的所有文件复制到新目录 newtest 下,输入如下命令:
 +
<pre>sudo cp –r test/ newtest </pre>
 +
</li>
 +
</ul>
 +
 +
=====mv=====
 +
<ul>
 +
<li>
 +
mv命令用来为文件或目录改名、或将文件或目录移入其它位置。
 +
</li>
 +
<li>
 +
参数:
 +
*-b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。
 +
*-i: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入y表示直接覆盖,输入n表示取消该操作。
 +
*-f: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件。
 +
*-n: 不要覆盖任何已存在的文件或目录。
 +
*-u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。
 +
</li>
 +
<li>
 +
使用指令mv将当前目录test/下的file1文件复制到新目录/home/waveshare下,输入如下命令:
 +
<pre>sudo mv file1 /home/waveshare</pre>
 +
</li>
 +
</ul>
 +
 +
=====rm=====
 +
<ul>
 +
<li>rm命令用于删除一个文件或者目录。</li>
 +
<li>
 +
参数:
 +
*-i 删除前逐一询问确认。
 +
*-f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
 +
*-r 将目录及以下之档案亦逐一删除。
 +
</li>
 +
<li>
 +
*删除文件可以直接使用rm命令,若删除目录则必须配合选项"-r",例如:
 +
<pre>sudo rm  test.txt </pre>
 +
*rm:是否删除 一般文件 "test.txt"? y
 +
<pre>sudo rm  homework  </pre>
 +
*rm: 无法删除目录"homework": 是一个目录 
 +
<pre>sudo rm  -r  homework  </pre>
 +
*rm:是否删除 目录 "homework"? y
 +
</li>
 +
</ul>
 +
 +
=====reboot=====
 +
<ul>
 +
<li>reboot命令用于用来重新启动计算机,更改Tinker Board 2的配置经常需要重启。</li>
 +
<li>
 +
参数:
 +
*-n : 在重开机前不做将记忆体资料写回硬盘的动作
 +
*-w : 并不会真的重开机,只是把记录写到 /var/log/wtmp 档案里
 +
*-d : 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d)
 +
*-f : 强迫重开机,不呼叫 shutdown 这个指令
 +
*-i : 在重开机之前先把所有网络相关的装置先停止
 +
</li>
 +
<li>
 +
重新启动
 +
<pre>sudo reboot</pre>
 +
</li>
 +
</ul>
 +
 +
=====shutdown=====
 +
</font>
 +
<ul>
 +
<li>
 +
Jetson Nano的关机是不能直接拔掉电源线的,因为Tinker Board 2会将内存作为暂存区,如果直接拔掉电源线会使一些在内存中的数据没有来得及写入SD卡中,从而造成数据的丢失或是损坏SD卡上的数据,造成系统无法启动。
 +
</li>
 +
<li>
 +
参数
 +
*-t seconds : 设定在几秒钟之后进行关机程序。
 +
*-k : 并不会真的关机,只是将警告讯息传送给所有使用者。
 +
*-r : 关机后重新开机。
 +
*-h : 关机后停机。
 +
*-n : 不采用正常程序来关机,用强迫的方式杀掉所有执行中的程序后自行关机。
 +
*-c : 取消目前已经进行中的关机动作。
 +
*-f : 关机时,不做 fsck 动作(检查 Linux 档系统)。
 +
*-F : 关机时,强迫进行 fsck 动作。
 +
*time : 设定关机的时间。
 +
*message : 传送给所有使用者的警告讯息。
 +
</li>
 +
<li>实例</li>
 +
*立即关机
 +
<pre>sudo shutdown -h now</pre>
 +
*指定 10 分钟后关机
 +
<pre>sudo shutdown -h 10</pre>
 +
*重新启动计算机
 +
<pre>sudo shutdown -r now</pre>
 +
<li>无论使用哪一个命令来关闭系统都需要root用户权限,如果用户使用linaro这样的普通用户,可以使用sudo命令暂时获得root权限。</li>
 +
</ul>
 +
 +
=====pwd=====
 +
<ul><li>该pwd命令显示当前工作目录的名称:在Jetson nano上,输入pwd将输出类似/home/waveshare。</li></ul>
 +
 +
=====head=====
 +
<ul><li>
 +
该head命令显示文件的开头。可用于-n指定要显示的行数(默认为 10 行),或与-c指定字节数。
 +
<pre>head test.py -n 5</pre>
 +
</li></ul>
 +
 +
=====tail=====
 +
<ul><li>该tail显示文件的结尾。-c字节或-n行数指定文件中的起始点</li></ul>
 +
 +
=====df=====
 +
<ul><li>
 +
用于df显示已安装文件系统上可用和使用的磁盘空间。用于df -h以可读的格式查看输出,使用 M 表示 MB,而不是显示字节数。
 +
<pre>df -h</pre>
 +
</li></ul>
 +
 +
=====tar=====
 +
<ul><li>
 +
tar命令是用来建立,还原备份文件的工具程序,它可以加入,解开备份文件内的文件。</li>
 +
<li>
 +
压缩文件:
 +
<pre>tar -cvzf waveshare.tar.gz *</pre>
 +
</li>
 +
<li>
 +
解压文件:
 +
<pre>tar -xvzf waveshare.tar.gz </pre>
 +
</li></ul>
  
 +
=====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编辑器<pre>sudo apt install nano</pre>
 +
 +
====网络====
 +
=====ifconfig=====
 +
<ul>
 +
<li>用于在不带任何参数(即)ifconfig运行时显示当前系统上接口的网络配置详细信息。</li>
 +
<li>用SSH连接时可以通过ifconfig查找IP地址,终端输入<pre>ifconfig</pre></li>
 +
<li>查看有线网络IP地址,终端输入<pre>ifconfig eth0</pre></li>
 +
<li>查看无线网络IP地址,终端输入<pre>ifconfig wlan0</pre></li>
 +
</ul>
 +
 +
=====hostname=====
 +
<ul>
 +
<li>该hostname命令显示系统的当前主机名。我们使用Jetson Nano的时候经常需要使用远程工具,而默认的网络配置IP地址采用动态分配,会造成IP地址不确定的问题</li>
 +
<li>当我们的Jetson Nano的IP地址发生变化时,可以使用主机名登录。</li>
 +
</ul>
 +
<ol>
 +
<li>
 +
登录Jetson Nano,修改hosts文件,命令如下:
 +
<pre>sudo vim /etc/hosts</pre>
 +
*将jp46替换成要修改的名字,例如waveshare,按下键盘ZZ保存、退出:
 +
[[文件:Jetson-hosts.png|600px]]
 +
</li>
 +
<li>
 +
修改hostname文件,将这里jp46也替换成要修改的名字,例如waveshare,按下键盘ZZ:<pre>sudo vim /etc/hostname</pre>
 +
[[文件:Jetson-hostname.png|600px]]
 +
</li>
 +
<li>修改完成重启Jetson Nano即可:<pre>sudo reboot</pre></li>
 +
<li>我们也可以使用如下命令查看IP地址:<pre>hostname -I</pre></li>
 +
</ol>
 +
 +
===Vim编辑器使用===
 +
*Vim编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和常用命令。
 +
*基本上 vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。
 +
**命令模式:控制屏幕光标的移动,字符、字或行的删除,移动复制某区段。
 +
**输入模式:在此模式下输入字符,编辑文件。
 +
**底线模式:将文件保存或退出vim,也可以设置编辑环境,如寻找字符串、列出行号等。
 +
**我们可以将这三个模式想成底下的图标来表示:
 +
[[文件:Vim模式水印-1.png|600px]]
 +
<ol>
 +
<li>首先删除默认Vi编辑器<pre>sudo apt-get remove vim-common</pre></li>
 +
<li>然后重装Vim<pre>sudo apt-get install vim</pre></li>
 +
<li>为方便使用还得在/etc/vim/vimrc文件后面添加下面三句
 +
<pre>set nu  #显示行号
 +
syntax on  #语法高亮
 +
set tabstop=4  #tab退四格</pre>
 +
</li>
 +
</ol>
 +
====常用命令====
 +
<ul>
 +
<li>打开文件、保存、关闭文件(vi命令模式下使用)
 +
<pre>  vim filename    //打开filename文件
 +
      :w                    //保存文件
 +
      :q                    //退出编辑器,如果文件已修改请使用下面的命令
 +
      :q!                  //退出编辑器,且不保存
 +
      :wq                  //退出编辑器,且保存文件
 +
      :wq!                //强制退出编辑器,且保存文件
 +
      ZZ                    //退出编辑器,且保存文件
 +
      ZQ                  //退出编辑器,且不保存</pre>
 +
</li>
 +
<li>插入文本或行(vi命令模式下使用,执行下面命令后将进入插入模式,按ESC键可退出插入模式)
 +
<pre> a      //在当前光标位置的右边添加文本
 +
i        //在当前光标位置的左边添加文本
 +
A      //在当前行的末尾位置添加文本
 +
I      //在当前行的开始处添加文本(非空字符的行首)
 +
O    //在当前行的上面新建一行
 +
o    //在当前行的下面新建一行
 +
R    //替换(覆盖)当前光标位置及后面的若干文本
 +
J    //合并光标所在行及下一行为一行(依然在命令模式)</pre>
 +
</li>
 +
 +
<li>删除、恢复字符或行(vi命令模式下使用)
 +
<pre> x          //删除当前字符
 +
nx        //删除从光标开始的n个字符
 +
dd      //删除当前行
 +
ndd    //向下删除当前行在内的n行
 +
u        //撤销上一步操作
 +
U        //撤销对当前行的所有操作</pre>
 +
</li>
 +
<li>
 +
复制、粘贴(vi命令模式下使用)
 +
<pre> yy      //将当前行复制到缓存区
 +
      nyy    //将当前行向下n行复制到缓冲区
 +
yw    //复制从光标开始到词尾的字符
 +
nyw  //复制从光标开始的n个单词
 +
y^    //复制从光标到行首的内容
 +
y$    //复制从光标到行尾的内容
 +
p      //粘贴剪切板里的内容在光标后
 +
P      //粘贴剪切板里的内容在光标前</pre>
 +
</li>
 +
</ul>
 +
==配置==
 +
===文件传输===
 +
*本教程以Windows系统远程连接到Linux服务器为例,有多种方式可以把本地的文件上传到服务器。
 +
====MobaXterm文件传输====
 +
*使用MobaXterm工具传输文件是非常简单、方便的
 +
**将文件从Windows传输到树莓派只需拖动文件到MobaXterm左边目录里即可
 +
**同理,将树莓派文件传输到Windows,只需拖动MobaXterm左边目录里文件到Windows即可。<br>[[文件:MobaXterm-文件传输.gif]]
 +
 +
====NoMachine文件传输====
 +
*当使用NoMachine远程连接成功后,Jetson Nano桌面右上角会出现NoMachine图标,我们点击图标,选择Transfer a file
 +
**Upload file from the client是将文件从Windows电脑传输到Jetson Nano上
 +
**Download file from the server是将文件从Jetson Nano传输到Windows电脑上<br>[[文件:Nomachine-filetransfer水印.png|600px]]
 +
 +
====SCP文件传输====
 +
<ul>
 +
<li>SCP命令可用于跨Linux系统安全地复制或加密传输文件和目录。</li>
 +
<li>格式:<pre>scp +参数 +用户名/登陆名+@+主机名/IP地址+ : + 目标文件路径+本地存放路径</pre></li>
 +
<li>首先进入要存放文件的目录按住键盘Shift且右键空白处,打开Windows PowerShell</li>
 +
<li>
 +
将file文件从Jetson Nano复制到本地Windows,在终端输入<pre>scp waveshare@192.168.15.100:file .</pre> 
 +
其中“.”表示当前路径
 +
</li>
 +
<li>
 +
将file文件从本地Windows复制到Jetson Nano,在终端输入<pre>scp file waveshare@192.168.15.100:</pre> 
 +
</li>
 +
<li>
 +
将file文件夹从Jetson Nano复制到本地Windows,由于file是一个目录,就需要加上参数r,在终端输入 <pre>scp -r waveshare@192.168.15.100:/home/pi/file .</pre>
 +
</li>
 +
<li>
 +
将file文件夹从本地Windows复制到Jetson Nano,在终端输入<pre> scp -r file waveshare@192.168.15.100:</pre>
 +
</li>
 +
<font color="#FF0000">'''注意:以上的waveshare需要改成你的系统的用户名,IP地址改成Jetson Nano实际IP地址。'''</font>
 +
</ul>
 +
 +
====文件共享(Samba)====
 +
<p>
 +
使用Samba服务可实现文件共享。在windows的网上邻居即可访问Jetson TX2 NX文件系统,非常方便。
 +
</p>
 +
<ol>
 +
<li>
 +
首先安装Samba,在终端输入<pre>sudo apt-get update
 +
sudo apt-get install samba -y</pre>
 +
</li>
 +
<li>在/home/waveshare目录下创建共享文件夹sambashare<pre>mkdir sambashare</pre></li>
 +
<li>
 +
安装完成后,修改配置文件/etc/samba/smb.conf:<pre>sudo nano /etc/samba/smb.conf</pre>
 +
拉到文件的最后,将下面的语句添加到文件尾部
 +
<pre>
 +
[sambashare]
 +
  comment = Samba on JetsonNano
 +
  path = /home/waveshare/sambashare
 +
  read only = no
 +
  browsable = yes</pre>
 +
<font color="#FF0000">'''注意:这里的waveshare需要改成你的系统的用户名。也就是说path是你要设置的共享文件夹路径。'''</font>
 +
</li>
 +
<li>
 +
重启Samba服务<pre>sudo service smbd restart</pre>
 +
</li>
 +
<li>
 +
设置共享文件夹密码<pre>sudo smbpasswd -a waveshare</pre>
 +
<font color="#FF0000">'''注意:这里的username需要改成你系统的用户名,如果不是用户名就会失败。'''</font><br><font color="#FF0000">'''这里会要求设置Samba密码,建议是直接用你的系统的密码,比较方便记忆'''</font>
 +
</li>
 +
<li>
 +
设置完成之后,在你的电脑端,打开文件管理器<pre>\\192.168.15.100\sambashare</pre>
 +
</li>
 +
<li>
 +
输入登录名和前面第5步设置的密码<br>[[文件:Jetson-samba水印.png|600px]]
 +
</li>
 +
<li>我们来验证下,在windows新建test文件夹,在Jetson TX2 NX sambashare目录下就可以看到test文件夹<br>[[文件:Jetson-nano-Samba1水印.png|600px]]<br>[[文件:Jetson-nano-Samba水印.png|600px]]
 +
</li>
 +
</ol>
 +
 +
 +
===摄像头===
 +
查看接入的第一个摄像头画面:
 +
nvgstcapture-1.0
 +
查看接入的第二个摄像头画面:
 +
nvgstcapture-1.0 --sensor-id=1
 +
<br>
 +
<!--
 +
默认摄像头型号是IMX219如果需要更改其他型号的摄像头执行<br>
 +
sudo /opt/nvidia/jetson-io/jetson-io.py
 +
选择Configure Jetson Nano CSI Connector -> Configure for compatible hardware <br>
 +
选择对应的摄像头型号<br>
 +
|                        Camera IMX219 Dual                        |<br>
 +
|                    Je  Camera IMX477 Dual or:                    |<br>
 +
|                    Camera IMX477-A and IMX219-B                    |<br>
 +
|                ConfigurCamera IMX219 Dualardware                  |<br>
 +
选择之后  Save pin changes  -> Save and reboot to reconfigure pins  <br>
 +
等待重启即可<br>
 +
-->
 +
==AI入门==
 +
*本教程基于JetPack4.6系统镜像,Python版本为Python3.6,TensorFlow版本为2.5.0,Pytorch版本为1.9.0为例。
 +
*注意:[https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform-release-notes/tf-jetson-rel.html#tf-jetson-rel TensorFlow版本]和[https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-pytorch Pytorch版本]一定要和JetPack版本相互对应。
 +
===PIP安装===
 +
<ol>
 +
<li>Jetson Nano中默认安装了 Python3.6 版本,直接安装PIP<pre>sudo apt update
 +
sudo apt-get install python3-pip python3-dev</pre></li>
 +
<li>安装完成后我们查看PIP版本<pre>pip3 -V</pre>
 +
[[文件:Pip3 9.0.1.png|600px]]
 +
</li>
 +
<li>默认安装的PIP是 9.01 版本,需要把它升级到最新版<pre>python3 -m pip install --upgrade pip</pre>
 +
[[文件:Pip-21.png|600px]]
 +
</li>
 +
<li>升级成功后,查看pip版本信息,发现有些问题<pre>pip3 -V</pre>
 +
[[文件:Pip-V.png|600px]]
 +
</li>
 +
<li>我们使用命令如下解决<pre>python3 -m pip install --upgrade --force-reinstall pip
 +
sudo reboot</pre>
 +
[[文件:Pip-V1.png|600px]]
 +
</li>
 +
<li>安装机器学习领域重要的安装包<pre>安装机器学习领域重要的包
 +
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</pre>
 +
</li>
 +
</ol>
 +
 +
===设置CUDA环境===
 +
<ol>
 +
<li>查看CUDA版本,出现command not found,需要配置下环境<pre>nvcc -V
 +
cat /usr/local/cuda/version.txt</pre>
 +
[[文件:Cat-cuda10.2.png|600px]]
 +
<br><font color="#FF0000">'''注意:这里使用cat命令查看不到版本,进入/usr/local/目录查看下是否有CUDA目录,<br>如果没有参考后面未安装CUDA部分安装CUDA,安装完成后再配置环境。'''</font>
 +
</li>
 +
<li>设置环境变量<pre>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</pre>
 +
[[文件:Bashrc-cuda.png|600px]]
 +
</li>
 +
<li>更新环境变量<pre>source .bashrc</pre></li>
 +
<li>再次查看CUDA版本<pre>nvcc -V</pre>
 +
[[文件:Nvcc-cuda-success.png|600px]]
 +
</li>
 +
</ol>
 +
===Tensorflow GPU环境搭建===
 +
<ol>
 +
<li>安装所需要的包<pre>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</pre>
 +
</li>
 +
<li>
 +
安装 python 的依赖项
 +
<pre>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</pre>
 +
</li>
 +
<li>安装Tensorflow(在线安装经常失败,可以参考第4步离线安装)
 +
<pre>sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v46 tensorflow</pre>
 +
</li>
 +
<li>
 +
最后建议离线安装,先登录英伟达官网下载[https://developer.nvidia.com/embedded/downloads TensorFlow安装包](以jetpack4.6 TensorFlow2.5.0 nv21.08为例,建议使用火狐浏览器下载)<br>
 +
[[文件:Jp46-TensorFlow.png|600px]]
 +
<pre>pip3 install tensorflow-2.5.0+nv21.8-cp36-cp36m-linux_aarch64.whl</pre>
 +
</li>
 +
<li>安装完成后,检查是否安装成功,在终端输入<pre>python3
 +
import tensorflow as tf</pre>
 +
[[File:Tensorflow-success.png|600px]]
 +
</li>
 +
<li>查看版本信息<pre>tf.__version__</pre>
 +
[[文件:Tensorflow-version.png|600px]]
 +
</li>
 +
</ol>
 +
 +
===Pytorch环境搭建===
 +
====Pytorch安装====
 +
<ol>
 +
<li>首先登录英伟达官网下载[https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-11-now-available/72048 Pytorch安装包],我们以PyTorch v1.9.0为例<br>[[文件:Torch-download.png|600px]]</li>
 +
<li>下载依赖库<pre>sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev libopenblas-base libopenmpi-dev
 +
</pre></li>
 +
<li>安装Pytorch<pre>sudo pip3 install torch-1.9.0-cp36-cp36m-linux_aarch64.whl </pre></li>
 +
<li>验证Pytorch是否安装成功<pre>python3
 +
import torch
 +
x = torch.rand(5, 3)
 +
print(x)</pre>
 +
[[文件:Torch-success.png|600px]]
 +
</li>
 +
<li>查看版本信息<pre>import torch
 +
print(torch.__version__)</pre>
 +
[[文件:Torch-verson.png|600px]]
 +
</li>
 +
</ol>
 +
 +
====Torchvision安装====
 +
<ol>
 +
<li>Torchvision版本要与Pytorch版本相匹配,我们前面安装的Pytorch版本为1.9.0,Torchvision安装 v0.10.0版本<br>[[文件:Pytorch-torchvision.png|600px]]</li>
 +
<li>下载、安装torchvision<pre>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</pre></li>
 +
<li>验证Torchvision是否安装成功<pre>python3
 +
import torchvision</pre>
 +
[[文件:Torchvision.png|600px]]
 +
<li>出现报错可能是Pillow版本太高,卸载重装<pre>sudo pip3 uninstall pillow
 +
sudo pip3 install pillow</pre>
 +
[[文件:Pillow9.1.1.png|600px]]
 +
</li>
 +
</li>
 +
<li>查看版本信息<pre>import torchvision
 +
print(torchvision.__version__)</pre>
 +
[[文件:Torchvision-version.png|600px]]
 +
</li>
 +
</ol>
 +
 +
===Yolo V4环境搭建===
 +
<ol>
 +
<li>首先在github上下载darknet<pre>git clone https://github.com/AlexeyAB/darknet.git</pre></li>
 +
<li>下载完成后,需要修改下Makefile文件<pre>cd darknet
 +
sudo vim Makefile</pre>
 +
将前四行0改成1
 +
<pre>GPU=1
 +
CUDNN=1
 +
CUDNN_HALF=1
 +
OPENCV=1</pre>
 +
</li>
 +
<li>cuda版本和路径也要改成我们的实际版本和路径,否则会编译失败<pre>将NVCC=nvcc修改为
 +
NVCC=/usr/local/cuda-10.2/bin/nvcc</pre>
 +
</li>
 +
<li>修改完成后进行编译,在终端输入<pre>sudo make</pre>
 +
</li>
 +
====使用YOLOv4进行推理====
 +
*基本的推理方法有三种:图片、视频、摄像头 ( 实时影像 )
 +
*选择Yolo v4和Yolo v4-tiny(更轻量化的模型,适合在Jetson Nano上运行)进行测试。首先需要下载已训练好的模型权重文件
 +
=====图片测试=====
 +
<ol>
 +
<li>测试<pre>./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights data/dog.jpg</pre>
 +
[[文件:yolov4-test水印1.png|600px]]
 +
</li>
 +
<li>如果要开启图片的话需使用 test模式,他会在执行之后要你输入图片的位置
 +
<pre>./darknet detector test ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4.weights</pre>
 +
</li>
 +
</ol>
 +
 +
=====视频测试=====
 +
<ol>
 +
<li>Yolov4-tiny 视频的检测(github下来的data里面并没有该视频文件,需要用户自行上传要检测的视频文件到 data 文件夹下)
 +
<pre>./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights data/xxx.mp4</pre>
 +
[[文件:yolo-MP4水印.png|600px]]
 +
<br>帧数大约是14帧
 +
</li>
 +
</ol>
 +
 +
=====实时图像测试=====
 +
<ol>
 +
<li>查看USB摄像头的设备号<pre>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"</pre>
 +
</li>
 +
</ol>
 +
 +
===Hello AI World===
 +
 +
*Hello AI World项目集成了NVIDIA非常强大的 TensroRT 加速引擎,将性能提升了数倍以上。
 +
====环境搭建====
 +
<ol>
 +
<li>安装cmake<pre>sudo apt-get update
 +
sudo apt-get install git cmake libpython3-dev python3-numpy</pre></li>
 +
<li>获取jetson-inference开源项目
 +
<pre>git clone https://github.com/dusty-nv/jetson-inference
 +
cd jetson-inference
 +
git submodule update --init</pre>
 +
 +
</li>
 +
<li>
 +
新建文件夹,编译<br>
 +
<font color="red">注意</font>:编译不报错才能正常运行下面的示例。
 +
<pre>sudo mkdir build
 +
cd build
 +
sudo cmake ../</pre>
 +
由于内容是外网上的,可能导致下载不了box.com上的文件,所以下载模型和Pytorch界面我们选择跳过(Quit和Skip)。<br>
 +
[[文件:Jetson-inference-model水印.png|600px]]
 +
[[文件:Jetson-inference-pytorch水印.png|600px]]
 +
</li>
 +
<li>
 +
下载[https://github.com/dusty-nv/jetson-inference/releases  模型],然后再放置到jetson-inference/data/networks目录下,然后解压,为了方便用户,这里我们提供部分模型参考下载指令:
 +
<pre>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
 +
</pre>
 +
</li>
 +
<li>
 +
也可以使用U盘或者[[#文件传输|文件传输]]方式将文件复制到Jetson Nano中
 +
<pre>cd jetson-inference/build
 +
sudo make
 +
sudo make install</pre>
 +
</li>
 +
<li>
 +
安装v4l摄像头驱动,终端输入<pre>
 +
sudo apt-get install v4l-utils
 +
v4l2-ctl --list-formats-ext</pre>
 +
</li>
 +
</ol>
 +
 +
====DetectNet运行实时摄像头检测====
 +
<ul>
 +
<li>使用摄像头对环境物体进行识别<pre>
 +
cd  ~/jetson-inference/build/aarch64/bin/
 +
./detectnet-camera</pre>
 +
[[文件:Helloai-camera水印.png|600px]]
 +
<br>使用TensorRT加速帧率达到24帧。
 +
</li>
 +
<li>
 +
下面是可供下载的预训练对象检测网络表,以及用于加载预训练模型的相关--network参数:<pre>./detectnet-camera --network=facenet #运行使用面部识别网络
 +
./detectnet-camera --network=multiped #运行使用多级行人/行李探测器
 +
./detectnet-camera --network=pednet #运行使用原始单级行人探测器
 +
./detectnet-camera --network=coco-bottle #在摄像头下检测 瓶/汽水罐
 +
./detectnet-camera --network=coco-dog #在摄像头下检测狗</pre>
 +
</li>
 +
<li>
 +
让我们使用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)
 +
**
 +
</li>
 +
<li>分辨率应设置为相机支持的格式,使用v4l2-ctl --list-formats-ext查询<pre>./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)</pre>
 +
</li>
 +
</ul>
 +
==硬件控制==
 +
*Jetson TX1、TX2、AGX Xavier 和 Nano 开发板包含一个 40 针 GPIO 接头,类似于 Raspberry Pi 中的 40 针接头。
 +
===GPIO===
 +
*可以使用 Jetson GPIO 库包中提供的 Python 库来控制这些 GPIO 的数字输入和输出。
 +
*Jetson GPIO 库提供了 RPi.GPIO 库提供的所有公共 API。下面讨论每个 API 的使用:
 +
<ol>
 +
<li>要导入 Jetson.GPIO 模块,请使用:<pre>import Jetson.GPIO as GPIO</pre></li>
 +
<li>管脚编号
 +
<ul>
 +
<li>Jetson GPIO 库提供了四种对 I/O 引脚进行编号的方法。</li>
 +
<li>前两个对应RPi.GPIO库提供的模式,即BOARD和BCM,分别指的是40针GPIO头的针号和Broadcom SoC GPIO号。</li>
 +
<li>其余两种模式,CVM 和 TEGRA_SOC 使用字符串而不是数字,分别对应于 CVM/CVB 连接器和 Tegra SoC 上的信号名称。</li>
 +
<li>要指定您使用的模式(强制),请使用以下函数调用:
 +
<pre>GPIO.setmode(GPIO.BOARD)
 +
GPIO.setmode(GPIO.BCM)
 +
GPIO.setmode(GPIO.CVM)
 +
GPIO.setmode(GPIO.TEGRA_SOC)</pre></li>
 +
<li>要检查已设置的模式,您可以调用:<pre>mode = GPIO.getmode()</pre>
 +
模式必须是 GPIO.BOARD、GPIO.BCM、GPIO.CVM、GPIO.TEGRA_SOC 或 None 之一。</li>
 +
</ul>
 +
</li>
 +
 +
<li>
 +
如果GRIO检测到一个引脚已经被设置成了非默认值,那么你将看到一个警告信息。
 +
<ul>
 +
<li>你可以通过下列代码禁用警告:<pre>GPIO.setwarnings(False)</pre></li>
 +
</ul>
 +
</li>
 +
 +
<li>
 +
设置频道
 +
<ul>
 +
<li>GPIO 通道必须在用作输入或输出之前进行设置。要将通道配置为输入,请调用:<pre># (where channel is based on the pin numbering mode discussed above)
 +
GPIO.setup(channel, GPIO.IN)</pre></li>
 +
<li>要将通道设置为输出,请调用:<pre>GPIO.setup(channel, GPIO.OUT)</pre></li>
 +
<li>也可以为输出通道指定一个初始值:<pre>GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)</pre></li>
 +
<li>将通道设置为输出时,也可以同时设置多个通道:<pre># add as many as channels as needed. You can also use tuples: (18,12,13)
 +
channels = [18, 12, 13]
 +
GPIO.setup(channels, GPIO.OUT)</pre></li>
 +
</ul>
 +
</li>
 +
 +
<li>
 +
输入
 +
<ul>
 +
<li>要读取通道的值,请使用:<pre>GPIO.input(channel)
 +
这将返回 GPIO.LOW 或 GPIO.HIGH。</pre>
 +
</li>
 +
</ul>
 +
</li>
 +
 +
<li>
 +
输出
 +
<ul>
 +
<li>要设置配置为输出的引脚的值,请使用:<pre>GPIO.output(channel, state)
 +
其中状态可以是 GPIO.LOW 或 GPIO.HIGH。</pre></li>
 +
<li>您还可以输出到通道列表或元组:<pre>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))</pre></li>
 +
</ul>
 +
</li>
 +
 +
<li>
 +
清理
 +
<ul>
 +
<li>在程序结束时,最好清理通道,以便将所有引脚设置为默认状态。要清理所有使用的通道,请调用:<pre>GPIO.cleanup()</pre></li>
 +
<li>如果您不想清理所有频道,也可以清理单个频道或频道列表或元组:<pre>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</pre></li>
 +
</ul>
 +
</li>
 +
 +
<li>
 +
Jetson Board 信息和库版本
 +
<ul>
 +
<li>要获取有关 Jetson 模块的信息,请使用/阅读:<pre>GPIO.JETSON_INFO</pre>
 +
这提供了一个带有以下键的 Python 字典:P1_REVISION、RAM、REVISION、TYPE、MANUFACTURER 和 PROCESSOR。字典中的所有值都是字符串,但 P1_REVISION 是一个整数。
 +
</li>
 +
<li>要获取有关库版本的信息,请使用/阅读:<pre>GPIO.VERSION</pre>
 +
这提供了一个具有 XYZ 版本格式的字符串。
 +
</li>
 +
</ul>
 +
</li>
 +
 +
<li>
 +
中断
 +
<ul>
 +
除了忙轮询之外,该库还提供了三种额外的方法来监视输入事件:
 +
<li>
 +
wait_for_edge() 函数</li>
 +
<li>此函数阻塞调用线程,直到检测到提供的边缘。该函数可以如下调用:<pre>GPIO.wait_for_edge(channel, GPIO.RISING)</pre></li>
 +
<li>第二个参数指定要检测的边沿,可以是 GPIO.RISING、GPIO.FALLING 或 GPIO.BOTH。如果您只想将等待限制为指定的时间,可以选择设置超时:<pre># timeout is in milliseconds
 +
GPIO.wait_for_edge(channel, GPIO.RISING, timeout=500)</pre>
 +
该函数返回检测到边缘的通道,如果发生超时,则返回 None。</li>
 +
 +
<li>event_detected() 函数</li>
 +
<li>此函数可用于定期检查自上次调用以来是否发生了事件。该函数可以按如下方式设置和调用:<pre># set rising edge detection on the channel
 +
GPIO.add_event_detect(channel, GPIO.RISING)
 +
run_other_code()
 +
if GPIO.event_detected(channel):
 +
    do_something()</pre>
 +
和以前一样,您可以检测 GPIO.RISING、GPIO.FALLING 或 GPIO.BOTH 的事件。</li>
 +
<li>检测到边缘时运行的回调函数</li>
 +
<li>此功能可用于为回调函数运行第二个线程。因此,回调函数可以与您的主程序并发运行以响应边缘。此功能可按如下方式使用:<pre># 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)</pre></li>
 +
<li>如果需要,也可以添加多个回调,如下所示:<pre>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)</pre>
 +
在这种情况下,两个回调按顺序运行,而不是同时运行,因为只有线程运行所有回调函数。</li>
 +
 +
<li>为了通过将多个事件合并为一个事件来防止多次调用回调函数,可以选择设置去抖动时间:<pre># bouncetime set in milliseconds
 +
GPIO.add_event_detect(channel, GPIO.RISING, callback=callback_fn,
 +
bouncetime=200)</pre>
 +
<li>如果不再需要边缘检测,可以将其删除,如下所示:<pre>GPIO.remove_event_detect(channel)</pre></li>
 +
</ul>
 +
</li>
 +
<li>
 +
检查GPIO通道功能
 +
<ul>
 +
<li>
 +
此功能允许您检查提供的 GPIO 通道的功能:<pre>GPIO.gpio_function(channel)
 +
该函数返回 GPIO.IN 或 GPIO.OUT。</pre></li>
 +
</ul>
 +
</li>
 +
</ol>
 +
====点亮LED灯====
 +
<ul>
 +
<li>示例程序<pre>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)
 +
</pre>
 +
</li>
 +
</ul>
 +
====例程使用====
 +
<ul>
 +
<li>针对jetson.gpio库,官方也提供了一些简单的例程</li>
 +
<li>首先下载jetson-gpio:
 +
<pre>git clone https://github.com/NVIDIA/jetson-gpio</pre></li>
 +
 +
<li>下载完成后,我们就可以使用里面的例程了,例如simple_input.py可以读取引脚的状态<pre>cd /opt/nvidia/jetson-gpio/samples/
 +
sudo python3 simple_input.py</pre>
 +
 +
</li>
 +
</ul>
 +
 +
===IIC===
 +
<ol>
 +
<li>首先安装I2Ctool,终端输入:<pre>sudo apt-get update
 +
sudo apt-get install -y i2c-tools
 +
sudo apt-get install -y python3-smbus</pre>
 +
</li>
 +
<li>检查安装情况,终端输入:<pre>apt-cache policy i2c-tools</pre>
 +
输出如下即为安装成功
 +
<pre>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</pre></li>
 +
 +
</ol>
 +
 +
====i2cdetect====
 +
<ul>
 +
<li>查询i2c设备:<pre> sudo i2cdetect -y -r -a 0</pre>
 +
[[文件:Jetson-i2c0.png|600px]]
 +
*参数: -y是无视交互问题直接执行,-r是SMBus read byte命令,-a是所有地址,0是指SMBus 0。
 +
</li>
 +
<li>扫描寄存器数据:<pre>sudo i2cdump -y 0 0x68</pre>
 +
 +
 +
</li>
 +
<li>
 +
寄存器数据写入:<pre>sudo i2cset -y 0 0x68 0x90 0x55</pre>
 +
 +
<ul><li>
 +
参数:
 +
{|border=1; style="height:200px;width:700px;"
 +
  |-style="background:#363636; color:white;"
 +
  |参数||含义||
 +
  |-style="background:#E8E8E8;"
 +
  |-y||代表取消用户交互过程,直接执行命令||
 +
  |-style="background:#CFCFCF;"
 +
  |0||代表I2C设备号||
 +
  |-style="background:#E8E8E8;"
 +
  |0x68||代表I2C设备地址||
 +
  |-style="background:#CFCFCF;"
 +
  |0x90||代表寄存器地址||
 +
  |-style="background:#E8E8E8;"
 +
  |0x55||代表向寄存器写入的数据||
 +
|}
 +
</li></ul>
 +
</li>
 +
<li>
 +
寄存器数据读出:<pre>sudo i2cget -y 0 0x68 0x90</pre>
 +
 +
<ul><li>
 +
参数:
 +
{|border=1; style="height:200px;width:700px;"
 +
  |-style="background:#363636; color:white;"
 +
  |参数||含义||
 +
  |-style="background:#E8E8E8;"
 +
  |-y||代表取消用户交互过程,直接执行命令||
 +
  |-style="background:#CFCFCF;"
 +
  |0||代表I2C设备号||
 +
  |-style="background:#E8E8E8;"
 +
  |0x68||代表I2C设备地址||
 +
  |-style="background:#CFCFCF;"
 +
  |0x90||代表寄存器地址||
 +
|}
 +
</li></ul>
 +
</li>
 +
</ul>
 
==NVIDIA官方资料==
 
==NVIDIA官方资料==
 
*[https://developer.nvidia.com/jetson-tx2-nx-system-module-data-sheet Jetson TX2 NX SOM 数据手册]
 
*[https://developer.nvidia.com/jetson-tx2-nx-system-module-data-sheet Jetson TX2 NX SOM 数据手册]
第26行: 第1,313行:
 
*[https://developer.nvidia.com/jetson-tx2-nx-3d-cad-step-model-envelopezip Jetson TX2 NX 3D 图纸]
 
*[https://developer.nvidia.com/jetson-tx2-nx-3d-cad-step-model-envelopezip Jetson TX2 NX 3D 图纸]
 
*[https://developer.nvidia.com/embedded/downloads#?search=TX2%20NX&tx=$product,jetson_tx2 Jetson TX2 NX 资料下载路径]
 
*[https://developer.nvidia.com/embedded/downloads#?search=TX2%20NX&tx=$product,jetson_tx2 Jetson TX2 NX 资料下载路径]
 +
 
==软件==
 
==软件==
 
{{RPI-LCD Software}}
 
{{RPI-LCD Software}}
  
 
</div>
 
</div>
<div class="tabbertab" title="FAQ"><br />
+
<div class="tabbertab" title="FAQ" id="myfaq">
 +
 
 +
<h1>FAQ</h1>
 +
{{FAQ|为什么我的Jetson TX2 NX DEV KIT安装SDK显示空间不足?
 +
|因为启动的是EMMC上的系统,空间不足以完全安装SDK,可按照教程把固态硬盘修改为系统启动。
 +
|||}}
 +
<br />
 
</div>
 
</div>
<div class="tabbertab" title="售后"><br />{{Service17}}</div>
+
<div class="tabbertab" title="售后" id="mysupport">
 +
 
 +
<h1>技术支持</h1>
 +
<br />{{Service26}}</div>
 
<br />
 
<br />
 
</div>
 
</div>
 
</div>
 
</div>

2024年2月4日 (日) 10:59的最新版本

资料

{{{name2}}}
{{{name3}}}
功能简介
特性 小型AI计算机
GPU NVIDIA Pascal™ architecture with 256 NVIDIA® CUDA® cores
CPU Dual-core NVIDIA Denver 2 64-bit CPU and quad-core Arm® Cortex®-A57 MPCore processor complex
内存 4 GB 128-bit LPDDR4 51.2 GB/s
' 无特性,不解释
接口

备注

如果您购买的是微雪提供的带核心板的套件,在出厂的时候,已经预烧了系统在配套的EMMC上,拿到手后可以直接上电启动完成开机配置即可。
预烧镜像没有装SDK,需要用户自行下载安装cuda等SDK插件。

简介

NVIDIA Jetson TX2 NX 为入门级嵌入式和边缘产品提供新一代 AI 性能。它体积小,功耗低,是您下一个从制造业、迁移学习、零售业到农业及生命科学 AI 解决方案的理想之选。预训练的 AI 模型、迁移学习工具包和 NVIDIA JetPack SDK 可帮助您将性能强大的产品快速推向市场。

Jetson TX2 NX 参数

GPU NVIDIA Pascal 架构,配有 256 个 NVIDIA CUDA® 核心
CPU 双核 NVIDIA Denver 2 64 位 CPU 与四核 Arm Cortex-A57 MPCore 处理器联合体
内存 4 GB 128 位 LPDDR4 51.2 GB/秒
存储 16 GB eMMC 5.1 闪存/ M.2 M KEY NVME 固态接口
视频编码 3x 4K30 | 4x 1080p60 | 8x 1080p30 (H.265)

1x 4K60 | 3x 4K30 | 7x 1080p60 | 14x 1080p30 (H.264)

视频解码 4x 4p30 | 7x 1080p60 | 14x 1080p30

(H.265 和 H.264)

摄像头 可支持 5 个摄像头 (通过虚拟通道可支持 12 个)

12 个通道 MIPI CSI-2 (3x4 或 5x2)
D-PHY 1.2 (高达 30 Gbps)

联网 Wi-Fi 需要外部芯片

10/100/1000 BASE-T 以太网

显示 2 个多模式 DP 1.2/eDP 1.4/HDMI 2.0

1 个 2 DSI (1.5Gbps/通道)

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 TX2 NX DEV KIT 资源

JETSON-IO-BASE-B-10.png
  1. Jetson TX2 NX模组
  2. 40PIN GPIO扩展接口
  3. Micro USB接口
    用于USB数据传输
  4. 千兆以太网端口
    10/100/1000Base-T自适应以太网端口
  5. 4路USB 3.0接口
  6. HDMI高清接口
  7. DisplayPort接口
  8. DC电源接口
    用于9~19V电源输入
  9. 2路MIPI CSI摄像头接口
  10. 风扇接口

尺寸图

JETSON-IO-BASE-B-size.jpg

烧录系统

注意JETSON TX2 NX DEV KIT搭配的是官方16eMMC版本的Jetson TX2 NX核心板,不带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 模式)

Jetson-nano-force recovery.jpg
  • 用跳帽或者杜邦线短接FC REC和GND引脚,位置如上图,位于核心板底下
  • 连接DC电源到圆形供电口, 稍等片刻
  • 用USB线(注意要是数据线)连接Jetson主板的Micro USB接口到Ubuntu主机


烧录系统

  • 打开ubuntu电脑终端,运行sdkmanager打开软件
  • 登录账号
  • 如果Jetson 主板有被正常识别到。sdk manager会检测并提示选项
Jetson TX2 NX.png
  • 开发板类型选择JetsonTX2 NX 选项,在JetPack选项中,选择支持的最新系统即可,不勾选Host PC, 然后点击Continue
Configuration1.png
  • 选择Jetson OS, 并将Jetson SDK Components的选项去掉。勾选最下方的第一个协议
Configuration2.png
  • 最后点击Continue 等待烧录完成即可。
    • 从JetPack4.6.1版本开始,用SDK Manager烧系统的时候会弹出preconfig的窗口。
    1. 这里会默认选择开发板类型。 注意前面选择开发板类型的时候不要选择错误。
    2. 这里选择Manual Setup-Jetson ... (不同主板后缀提示不同)
    3. 这里可以选择runtime或者preconfig, 选择runtime的话,后续需要自己手动配置系统(用户名,密码,语言等), 选择preconfig,可以填入用户名和密码(可以自己定义),会在启动过程中自动配置主板

Configuration3.png

  • 烧录完成之后,去掉底板的跳帽,接入显示器,重新上电,按照提示进行开机配置(如果是设置的pre-config, 上电后直接进入系统)。

设置系统从固态硬盘启动

  1. 将SSD接入Jetson nano TX2 NX,查看SSD的设备号,打开Jetson nano TX2 NX终端输入
    ls /dev/nvme*
    例如会看到有nvme0,nvme0n1。

    Identification.png

  2. 格式化SSD
    sudo mkfs.ext4 /dev/nvme0n1

    格式化成功。
    Format.png

  3. 修改启动路径
    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

    NX-configuration.png

  4. 挂载SSD
    sudo mount /dev/nvme0n1 /mnt
  5. 复制系统到SSD(该过程没有信息打印请耐心等待)
    sudo cp -ax / /mnt
  6. 复制完成后卸载SSD(不是拆掉SSD)
    sudo umount /mnt/
  7. 重启系统
    sudo reboot
  8. 输入
    df -h

    显示从固态硬盘启动
    Enable.png

SDK安装

Jetpack主要包括系统镜像,库,APIs,开发者工具,示例和一些文档。在SDK Manager软件中,我们首先安装的是OS,也就是系统镜像,未安装的部分便是SDK,如下图:
SDK.jpg
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的时候,不需要设置Jetson TX2 NX为recovery模式,也就是不需要进行短接引脚的操作。

  • 正常上电启动Jetson TX2 NX
  • Jetson TX2 NX进入系统正常启动后,用USB数据线连接Jetson TX2 NX的Micro USB接口到Ubuntu主机
  • Ubuntu主机电脑运行sdkmanager指令打开SDK Managaer(需要先安装SDK Manager)
  • 类似于前面烧录系统的操作,不同的是,在步骤而中,不勾选 OS选项,而是勾选SDK' 选项, 然后continue到安装
  • 在下载资源之后,会弹窗提示填写用户名和密码,填写Jetson TX2 NX系统的用户名和密码即可
  • 等待SDK安装成功

使用指令安装

没有ubuntu或虚拟机的用户,可以选择在Jetson Nano上使用以下指令直接进行安装

sudo apt update
sudo apt install nvidia-jetpack

FAN

安装jtop

sudo apt install python3-pip
sudo pip3 install jetson-stats
sudo reboot

开机后输入

jtop 

最大化窗口鼠标选择6CTRL,鼠标选择profiles里的mannual选项,然后点击speed旁的[+]号调节风扇风力.

系统登录

本地登录

Jetson TX2 NX上电,用数据线连接micro usb口和电脑,打开电脑的设别管理器查看是否有新的端口出现,有则查看端口号,可以使用putty用串口登录。

远程登录

准备工作

  • 用一根网线一端连接Jetson TX2 NX,另一端连接路由器的LAN端口。
  • 确保Jetson TX2 NX与你的电脑出于一个路由器下或同一网段。

获取Jetson TX2 NX的IP地址

  • 方法一:登录路由器查找Jetson TX2 NX的IP地址。
  • 方法二:你可以通过一些局域网IP扫描工具,这里以Advanced IP Scanner为例程
    1. 运行Advanced IP Scanner
    2. 点击Scan按钮,扫描当前局域网内的IP地址
    3. 找到所有Manufacturer中有NVIDIA字样的IP地址并记录
      NVIDIA-ip水印.png
    4. 将设备上电,并确保设备连接上网络后
    5. 重新点击Scan按钮,扫描当前局域网内的IP地址
    6. 排除掉所有先前记录的Manufacturer中有NVIDIA字样的IP地址,剩下的就是你的NVIDIA的IP地址了
  • 方法三:屏幕IP查询
    1. Jetson TX2 NX连接上网线或者装上无线网卡连接WIFI,在终端输入ifconfig ,查看Jetson TX2 NX的IP地址。
    2. 有线网络.png

使用MobaXterm登录

终端窗口
  1. 下载MobaXterm远程登录软件,解压即可使用。
  2. 打开MobaXterm远程登录软件,选择Session,选择ssh。
  3. 在Remote host输入我们前面查询到的IP地址192.168.15.102(根据自己的实际IP来填写),填写完成后,点击ok。
    登录水印.png
  4. 点击Accept,输入登录用户名,回车输入登录密码(在输入密码时,屏幕没有变化属于正常现象,点击回车确认即可)
    Aceept-1水印.png

NoMachine登录

  • 相比SSH和VNC大家对Nomachine可能了解不是很多,Nomachine是一款免费的远程桌面软件。
  • NoMachine基本覆盖了所有主流大操作系统,包括Windows,Mac,Linux,iOS,Android和Raspberry等等。
Jetson TX2 NX上安装
  1. 下载、解压Jetson TX2 NX的NoMachine安装包
  2. 解压完成后,使用U盘或者文件传输方式将.deb文件复制到Jetson TX2 NX中
  3. 使用指令来安装
    sudo dpkg -i nomachine_7.10.1_1_arm64.deb
Windows电脑上安装
  • 下载NoMachine安装包,打开安装,等待进度条结束,点击Finish,最后还需要重启下电脑
    Nomachine-安装水印.gif
连接Jetson Nano
  1. 打开NoMachine,在Search输入Jetson TX2 NX的IP地址。例如:192.168.15.100
    Nomachine-1水印.png
  2. 点击Connect to new host 192.168.15.100,输人Jetson TX2 NX登录名和登录密码,点击login
    Nomachine-login水印.png
  3. 加载完成后,会出现一些软件介绍界面,我们直接点击ok就可以了
    Nomachine-ok水印.png
  4. 此时我们就成功登录Jetson TX2 NX
    Nomachine-success水印.png

VNC登录

  • 在没有显示屏的情况下,想要进入Jetson TX2 NX的桌面,此时就需要使用远程桌面登陆。(建议使用显示屏,VNC有一定延时)

配置VNC服务器

  • Jetson Nano使用vino来作为默认的VNC服务器,但是默认的设置需要进行一些修改。
  1. 配置VNC Server
    gsettings set org.gnome.Vino require-encryption false
    gsettings set org.gnome.Vino prompt-enabled false
    gsettings set org.gnome.Vino authentication-methods "['vnc']"
    gsettings set org.gnome.Vino lock-screen-on-disconnect false
    gsettings set org.gnome.Vino vnc-password $(echo -n "mypassword"|base64)
    • 需要注意的是,不要用sudo来运行上面的命令,mypassword就是连接VNC的密码。
  2. 设置桌面开机自启,在.config路径下新建一个自启文件
     mkdir -p .config/autostart
    sudo vim ~/.config/autostart/vino-server.desktop

    添加以下内容:

    [Desktop Entry]
    Type=Application
    Name=Vino VNC server
    Exec=/usr/lib/vino/vino-server
    NoDisplay=true
  3. 查看当前用的是什么管理器
    cat /etc/X11/default-display-manager
  4. 编辑文件
    sudo vim /etc/gdm3/custom.conf
  5. 把下面三行的注释去掉,其中AutomaticLogin行修改成自己的用户名。
    WaylandEnable=false
    AutomaticLoginEnable = true
    AutomaticLogin = waveshare
  6. 重启Jetson Nano
    sudo reboot
下载安装VNC Viewer
使用VNC Viewer远程连接Jetson Nano
  1. 打开VNC Viewer,输入Jetson TX2 NX的IP地址回车确认。例如:
    192.168.15.102
  2. 输入前面设置的VNC登录密码,点击ok:
  3. 此时就成功登录Jetson TX2 NX了。
    VNC-DESKTOP水印.png

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根目录下的详细文件信息。在这些文件信息中, 最重要的就是第一列,它详细描述了文件和目录的权限,而第三与第四列则显示了这个文件和目录属于哪一个用户或组。
    Jetson-chmod.png
  • 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可以使用该位
    • 符号模式实例
      1. 给file的所有用户增加读权限
        chmod a+r file
      2. 删除file的所有用户的执行权限
        chmod a-x file
      3. 给file的所有用户增加读写权限
        chmod a+rw file
      4. 给file的所有用户增加读写执行权限
        chmod +rwx file 
      5. 对file的所有者设置读写权限,清空该用户组和其他用户对file的所有权限(空格代表无权限)
        chmod u=rw,go= file
      6. 对目录waveshare和其子目录层次结构中的所有文件给用户增加读权限,而对用户组和其他用户删除读权限
        chmod -R u+r,go-r waveshare
  • 八进制语法
    • 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
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
  • 无论使用哪一个命令来关闭系统都需要root用户权限,如果用户使用linaro这样的普通用户,可以使用sudo命令暂时获得root权限。
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地址发生变化时,可以使用主机名登录。
  1. 登录Jetson Nano,修改hosts文件,命令如下:
    sudo vim /etc/hosts
    • 将jp46替换成要修改的名字,例如waveshare,按下键盘ZZ保存、退出:

    Jetson-hosts.png

  2. 修改hostname文件,将这里jp46也替换成要修改的名字,例如waveshare,按下键盘ZZ:
    sudo vim /etc/hostname

    Jetson-hostname.png

  3. 修改完成重启Jetson Nano即可:
    sudo reboot
  4. 我们也可以使用如下命令查看IP地址:
    hostname -I

Vim编辑器使用

  • Vim编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和常用命令。
  • 基本上 vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。
    • 命令模式:控制屏幕光标的移动,字符、字或行的删除,移动复制某区段。
    • 输入模式:在此模式下输入字符,编辑文件。
    • 底线模式:将文件保存或退出vim,也可以设置编辑环境,如寻找字符串、列出行号等。
    • 我们可以将这三个模式想成底下的图标来表示:

Vim模式水印-1.png

  1. 首先删除默认Vi编辑器
    sudo apt-get remove vim-common
  2. 然后重装Vim
    sudo apt-get install vim
  3. 为方便使用还得在/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工具传输文件是非常简单、方便的
    • 将文件从Windows传输到树莓派只需拖动文件到MobaXterm左边目录里即可
    • 同理,将树莓派文件传输到Windows,只需拖动MobaXterm左边目录里文件到Windows即可。
      MobaXterm-文件传输.gif

NoMachine文件传输

  • 当使用NoMachine远程连接成功后,Jetson Nano桌面右上角会出现NoMachine图标,我们点击图标,选择Transfer a file
    • Upload file from the client是将文件从Windows电脑传输到Jetson Nano上
    • Download file from the server是将文件从Jetson Nano传输到Windows电脑上
      Nomachine-filetransfer水印.png

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 TX2 NX文件系统,非常方便。

  1. 首先安装Samba,在终端输入
    sudo apt-get update
    sudo apt-get install samba -y
  2. 在/home/waveshare目录下创建共享文件夹sambashare
    mkdir sambashare
  3. 安装完成后,修改配置文件/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是你要设置的共享文件夹路径。

  4. 重启Samba服务
    sudo service smbd restart
  5. 设置共享文件夹密码
    sudo smbpasswd -a waveshare

    注意:这里的username需要改成你系统的用户名,如果不是用户名就会失败。
    这里会要求设置Samba密码,建议是直接用你的系统的密码,比较方便记忆

  6. 设置完成之后,在你的电脑端,打开文件管理器
    \\192.168.15.100\sambashare
  7. 输入登录名和前面第5步设置的密码
    Jetson-samba水印.png
  8. 我们来验证下,在windows新建test文件夹,在Jetson TX2 NX sambashare目录下就可以看到test文件夹
    Jetson-nano-Samba1水印.png
    Jetson-nano-Samba水印.png


摄像头

查看接入的第一个摄像头画面:

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安装

  1. Jetson Nano中默认安装了 Python3.6 版本,直接安装PIP
    sudo apt update
    sudo apt-get install python3-pip python3-dev
  2. 安装完成后我们查看PIP版本
    pip3 -V

    Pip3 9.0.1.png

  3. 默认安装的PIP是 9.01 版本,需要把它升级到最新版
    python3 -m pip install --upgrade pip

    Pip-21.png

  4. 升级成功后,查看pip版本信息,发现有些问题
    pip3 -V

    Pip-V.png

  5. 我们使用命令如下解决
    python3 -m pip install --upgrade --force-reinstall pip
    sudo reboot

    Pip-V1.png

  6. 安装机器学习领域重要的安装包
    安装机器学习领域重要的包
    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环境

  1. 查看CUDA版本,出现command not found,需要配置下环境
    nvcc -V
    cat /usr/local/cuda/version.txt

    Cat-cuda10.2.png
    注意:这里使用cat命令查看不到版本,进入/usr/local/目录查看下是否有CUDA目录,
    如果没有参考后面未安装CUDA部分安装CUDA,安装完成后再配置环境。

  2. 设置环境变量
    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

    Bashrc-cuda.png

  3. 更新环境变量
    source .bashrc
  4. 再次查看CUDA版本
    nvcc -V

    Nvcc-cuda-success.png

Tensorflow GPU环境搭建

  1. 安装所需要的包
    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
  2. 安装 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
  3. 安装Tensorflow(在线安装经常失败,可以参考第4步离线安装)
    sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v46 tensorflow
  4. 最后建议离线安装,先登录英伟达官网下载TensorFlow安装包(以jetpack4.6 TensorFlow2.5.0 nv21.08为例,建议使用火狐浏览器下载)
    Jp46-TensorFlow.png
    pip3 install tensorflow-2.5.0+nv21.8-cp36-cp36m-linux_aarch64.whl
  5. 安装完成后,检查是否安装成功,在终端输入
    python3
    import tensorflow as tf

    Tensorflow-success.png

  6. 查看版本信息
    tf.__version__

    Tensorflow-version.png

Pytorch环境搭建

Pytorch安装

  1. 首先登录英伟达官网下载Pytorch安装包,我们以PyTorch v1.9.0为例
    Torch-download.png
  2. 下载依赖库
    sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev libopenblas-base libopenmpi-dev
    
  3. 安装Pytorch
    sudo pip3 install torch-1.9.0-cp36-cp36m-linux_aarch64.whl 
  4. 验证Pytorch是否安装成功
    python3
    import torch
    x = torch.rand(5, 3)
    print(x)

    Torch-success.png

  5. 查看版本信息
    import torch
    print(torch.__version__)

    Torch-verson.png

Torchvision安装

  1. Torchvision版本要与Pytorch版本相匹配,我们前面安装的Pytorch版本为1.9.0,Torchvision安装 v0.10.0版本
    Pytorch-torchvision.png
  2. 下载、安装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
  3. 验证Torchvision是否安装成功
    python3
    import torchvision

    Torchvision.png

  4. 出现报错可能是Pillow版本太高,卸载重装
    sudo pip3 uninstall pillow
    sudo pip3 install pillow

    Pillow9.1.1.png

  5. 查看版本信息
    import torchvision
    print(torchvision.__version__)

    Torchvision-version.png

Yolo V4环境搭建

  1. 首先在github上下载darknet
    git clone https://github.com/AlexeyAB/darknet.git
  2. 下载完成后,需要修改下Makefile文件
    cd darknet
    sudo vim Makefile

    将前四行0改成1

    GPU=1
    CUDNN=1
    CUDNN_HALF=1
    OPENCV=1
  3. cuda版本和路径也要改成我们的实际版本和路径,否则会编译失败
    将NVCC=nvcc修改为
    NVCC=/usr/local/cuda-10.2/bin/nvcc
  4. 修改完成后进行编译,在终端输入
    sudo make
  5. 使用YOLOv4进行推理

    • 基本的推理方法有三种:图片、视频、摄像头 ( 实时影像 )
    • 选择Yolo v4和Yolo v4-tiny(更轻量化的模型,适合在Jetson Nano上运行)进行测试。首先需要下载已训练好的模型权重文件
    图片测试
    1. 测试
      ./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights data/dog.jpg

      Yolov4-test水印1.png

    2. 如果要开启图片的话需使用 test模式,他会在执行之后要你输入图片的位置
      ./darknet detector test ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4.weights
    视频测试
    1. Yolov4-tiny 视频的检测(github下来的data里面并没有该视频文件,需要用户自行上传要检测的视频文件到 data 文件夹下)
      ./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights data/xxx.mp4

      Yolo-MP4水印.png
      帧数大约是14帧

    实时图像测试
    1. 查看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

    • Hello AI World项目集成了NVIDIA非常强大的 TensroRT 加速引擎,将性能提升了数倍以上。

    环境搭建

    1. 安装cmake
      sudo apt-get update
      sudo apt-get install git cmake libpython3-dev python3-numpy
    2. 获取jetson-inference开源项目
      git clone https://github.com/dusty-nv/jetson-inference
      cd jetson-inference
      git submodule update --init
    3. 新建文件夹,编译
      注意:编译不报错才能正常运行下面的示例。
      sudo mkdir build
      cd build
      sudo cmake ../

      由于内容是外网上的,可能导致下载不了box.com上的文件,所以下载模型和Pytorch界面我们选择跳过(Quit和Skip)。
      Jetson-inference-model水印.png Jetson-inference-pytorch水印.png

    4. 下载模型,然后再放置到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
      
    5. 也可以使用U盘或者文件传输方式将文件复制到Jetson Nano中
      cd jetson-inference/build
      sudo make
      sudo make install
    6. 安装v4l摄像头驱动,终端输入
      sudo apt-get install v4l-utils
      v4l2-ctl --list-formats-ext

    DetectNet运行实时摄像头检测

    • 使用摄像头对环境物体进行识别
      cd  ~/jetson-inference/build/aarch64/bin/
      ./detectnet-camera

      Helloai-camera水印.png
      使用TensorRT加速帧率达到24帧。

    • 下面是可供下载的预训练对象检测网络表,以及用于加载预训练模型的相关--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 针接头。

    GPIO

    • 可以使用 Jetson GPIO 库包中提供的 Python 库来控制这些 GPIO 的数字输入和输出。
    • Jetson GPIO 库提供了 RPi.GPIO 库提供的所有公共 API。下面讨论每个 API 的使用:
    1. 要导入 Jetson.GPIO 模块,请使用:
      import Jetson.GPIO as GPIO
    2. 管脚编号
      • 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 之一。
    3. 如果GRIO检测到一个引脚已经被设置成了非默认值,那么你将看到一个警告信息。
      • 你可以通过下列代码禁用警告:
        GPIO.setwarnings(False)
    4. 设置频道
      • 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)
    5. 输入
      • 要读取通道的值,请使用:
        GPIO.input(channel)
        这将返回 GPIO.LOW 或 GPIO.HIGH。
    6. 输出
      • 要设置配置为输出的引脚的值,请使用:
        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))
    7. 清理
      • 在程序结束时,最好清理通道,以便将所有引脚设置为默认状态。要清理所有使用的通道,请调用:
        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
    8. Jetson Board 信息和库版本
      • 要获取有关 Jetson 模块的信息,请使用/阅读:
        GPIO.JETSON_INFO

        这提供了一个带有以下键的 Python 字典:P1_REVISION、RAM、REVISION、TYPE、MANUFACTURER 和 PROCESSOR。字典中的所有值都是字符串,但 P1_REVISION 是一个整数。

      • 要获取有关库版本的信息,请使用/阅读:
        GPIO.VERSION

        这提供了一个具有 XYZ 版本格式的字符串。

    9. 中断
        除了忙轮询之外,该库还提供了三种额外的方法来监视输入事件:
      • 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)
    10. 检查GPIO通道功能
      • 此功能允许您检查提供的 GPIO 通道的功能:
        GPIO.gpio_function(channel)
        该函数返回 GPIO.IN 或 GPIO.OUT。

    点亮LED灯

    • 示例程序
      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
    • 下载完成后,我们就可以使用里面的例程了,例如simple_input.py可以读取引脚的状态
      cd /opt/nvidia/jetson-gpio/samples/
      sudo python3 simple_input.py

    IIC

    1. 首先安装I2Ctool,终端输入:
      sudo apt-get update
      sudo apt-get install -y i2c-tools
      sudo apt-get install -y python3-smbus
    2. 检查安装情况,终端输入:
      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

    i2cdetect

    • 查询i2c设备:
       sudo i2cdetect -y -r -a 0

      Jetson-i2c0.png

      • 参数: -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 代表寄存器地址

    NVIDIA官方资料

    软件

FAQ

因为启动的是EMMC上的系统,空间不足以完全安装SDK,可按照教程把固态硬盘修改为系统启动。



技术支持


联系人:张工
邮箱:3004637648@qq.com
QQ:3004637648
微信:扫下方二维码添加
QRCode SiminZhang.png

说明:进行售后服务前,请准备好客户信息(定货单位、定货人等),以供验证