JETSON ORIN NX系列说明 Jetson Orin NX 资料集 JETSON ORIN NX系列入门教程 本章节主要介绍Jetson Orin NX的基本配置、系统烧录和基础外设使用。 一、产品介绍 1. 简介 Jetson Orin NX 是 Jetson Orin 系列的中端产品,提供 8GB 和 16GB 两种内存组合,AI算力高达 70 TOPS/100 TOPS,在super模式下至高 117 TOPS/157 TOPS ,同时其拥有丰富的接口资源,并且兼容 NVIDIA 的软件生态,是AI机器人,AI大模型和计算机视觉开发的得力工具。 Orin NX 8GB Orin NX 16GB AI算力 (INT8) 117 TOPS  157 TOPS  GPU 1024 核 CUDA核心 32 个 Tensor Core   GPU@1020MHz 1796 核 CUDA核心 32 个 Tensor Core   GPU@1020MHz CPU 8x A78 @ 2GHz 8x A78 @ 2GHz 内存 LPDDR5 8GB LPDDR5 16GB 功率 10W | 15W | 25W | 40W  10W | 15W | 25W | 40W 2. 外观 3. 接口 接口类型 规格详情 CSI 摄像头接口 •2x MIPI CSI-2 22 针摄像头连接器 PCIe 接口 •M.2 Key M 插槽,支持 x4 PCIe 3.0 •M.2 Key M 插槽,支持 x2 PCIe 3.0 •M.2 Key E 插槽(已预装网卡) USB 接口 • 4 x USB 3.2 Gen 2 (10Gbps) 接口 • USB Type-C UFP 网络接口 • 1 个千兆以太网 (GbE) 接口 显示输出 •1x DisplayPort 1.2 (+MST) 连接器 存储接口 • 支持外部 NVMe 存储 • 支持SD卡 扩展接口 • 40 针扩展接头: - 3x UART - 2x SPI - 2x I2S(音频) - 4x I2C - 1x CAN(控制器局域网) - DMIC(数字麦克风) - DSPK(数字扬声器) - PWM(脉冲宽度调制) - GPIO(通用输入输出) • 12 针调试接口 • 4 针风扇接头 • DC电源接口 无线连接 • 支持WLAN 802.11ac • 支持蓝牙5.0 12Pin调试接口定义如下 4. 注意事项 开发板允许电源为 9~19V 5A MAX,请使用官方原装电源接入开发板,以免损坏载板和核心卡。 请确认核心卡的散热器工作状态,以免模组过热导致性能下降。确保散热器安装稳固且无杂物阻碍,如有需要可定期清理灰尘以保障散热效果。 在上电开机前请确保开发板已经接入 USB/固态硬盘/eMMC/内存卡等存储介质。 二、刷机教程 1. 安装ubuntu虚拟机 1.1 下载VMware Workstation 通过百度网盘下载此文件:VMware-workstation-full-16.2.5-20904516.exe 链接: https://pan.baidu.com/s/1xopblFgG29dYZXoNfwa5ZA 提取码: frjy 1.2 安装VMware Workstation 打开VMware-workstation-full-16.2.5-20904516.exe 选项保持默认即可,点下一步 输入激活码,请自行百度搜索:vmware16密钥 1.3安装ubuntu系统 推荐使用20.04和22.04版本,这里以20.04为例。 下载 ubuntu20.04_desktop_amd64.iso 镜像,若下载速度较慢,推荐使用 清华源 或 中科大源 。 打开VMware Workstation Pro,新建虚拟机 选择典型配置 选择刚才下载的ISO镜像 输入用户名与密码 输入虚拟机名字与选择存放虚拟机文件的路径 虚拟机可用的存储空间,建议最少给300G 点击完成 等待安装完成 出现以下画面表示安装完成 2.安装NVIDIA SDK Manager 2.1 下载安装包 进入虚拟机打开浏览器,进入  Jetson SDK ,下载 .deb ubuntu 安装包。 2.2 安装SDK Manager 打开 文件管理器 进入  Downloads 文件夹,确认 sdkmanager_xxxxx_amd64.deb 存在,在当前目录下打开命令行窗口执行以下命令安装。 sudo apt update sudo dpkg -i sdkmanager_2.3.0-12617_amd64.deb # 需要根据实际版本修改包名 sudo apt install --fix-broken 3.使用NVIDIA SDK Manager进行刷机  3.1 设置VMware的USB模式 将USB连接模式设置为 将设备连接到前台虚拟机 ,避免刷机中途开发板重启导致失败。 3.2 进入恢复模式 ​​使用跳线帽短接开发板上的 FC REC 和 GND 针脚。​​ ​​使用 USB to Tpye-C  数据线将开发板连接到电脑。​​ ​​接通开发板的 DC 电源。​​ ​​成功进入恢复模式后, SDK Manager 会自动检测到核心卡类型,并提示选择套件类型,​同时散热器风扇不会工作。 进入恢复模式后一段时间内不操作会重启进入系统,请注意操作时机。 3.3 配置SDK 取消Host Machine,并点击CONTINUE 只勾选Jetson Linux 3.4 等待下载完成 3.5 配置刷机参数 Pre-Config,预设账号密码 Runtime,开机后自行配置账号密码 Storage Device,系统刷入的介质,根据不同设备自行选择 (内存卡/固态硬盘/U盘)。 选择 developer kit version 。 耐心等待刷机完成,大约10~20分钟。 刷入过程中开发板可能会多次与主机重新连接,请勿途中拔开数据线或切断开发板电源,可以在识别到开发板类型以后就拔掉跳线帽。 刷入完成后,拔掉跳线帽,上电正常进入系统桌面或初始化设置页面即刷机成功。 4.使用命令行刷入super固件 此操作需依赖官方固件环境,请先通过SDK Manager完成至少一次完整的烧录以创建固件缓存。 4.1 进入恢复模式 使用跳线帽短接 FC REC 和 GND 针脚,使用 Tpye-C 型数据线连接至电脑并接通开发板电源,使开发板进入恢复模式。 4.2 使用官方固件进行命令行刷机 操作前请关闭正在运行的SDK Manager软件,刷入过程约为10~20分钟 JetPack6.2版本刷入指令: cd /home/ubuntu/nvidia/nvidia_sdk/JetPack_6.2.1_Linux_JETSON_ORIN_NANO_TARGETS/Linux_for_Tegra #仅供参考,需要根据实际版本和路径进行修改 sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1 \ -c tools/kernel_flash/flash_l4t_t234_nvme.xml -p "-c bootloader/generic/cfg/flash_t234_qspi.xml" \ --showlogs --network usb0 jetson-orin-nano-devkit-super internal JetPack5.1.5版本刷入指令: cd /home/ubuntu/nvidia/nvidia_sdk/JetPack_5.1.5_Linux_JETSON_ORIN_NANO_TARGETS/Linux_for_Tegra #仅供参考,需要根据实际版本和路径进行修改 sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1\ -c tools/kernel_flash/flash_l4t_external.xml -p "-c bootloader/t186ref/cfg/flash_t234_qspi.xml"\ --showlogs --network usb0 jetson-orin-nano-devkit-super internal 4.3 验证是否处于super模式 开发板上电开机完成用户配置后在桌面右上角可以选择电源模式, 25W & MAXN SUPER 为super模式独有,普通模式只有 7W 和 1 5W 两档。 三、摄像头 接入摄像头后,您可以使用以下指令查看现有摄像头的编号。 jetson@jetson-desktop:~$ ls /dev/video* /dev/video0 /dev/video1 1. CSI摄像头 尽量避免带电操作,接入CSI摄像头时注意FPC排线金属触点一面朝下 1.1 使用gst-launch打开摄像头 确认CSI摄像头正确连接后,分别在两个命令行窗口运行以下命令打开摄像头。 gst-launch-1.0 nvarguscamerasrc sensor-id=0 ! "video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080,format=(string)NV12, framerate=(fraction)30/1" ! nvvidconv ! xvimagesink sync=false gst-launch-1.0 nvarguscamerasrc sensor-id=1 ! "video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080,format=(string)NV12, framerate=(fraction)30/1" ! nvvidconv ! xvimagesink sync=false #打开另一个命令行窗口运行 sensor-id :指定摄像头物理接口 ID,双摄使用 sensor-id=0 和 sensor-id=1 。 memory :使用 NVIDIA GPU 内存(NVMM),减少延迟。 width, height :设置分辨率,需硬件支持,例如 1080p。 format :像素格式为 NV12 (NVIDIA 编码器原生支持)。 framerate :设置帧率,例如 30/1 (30 FPS)。 sync : false 禁用音视频同步,减少延迟。 2. USB摄像头 Cheese是一款简单易用的摄像头应用,它允许用户在Ubuntu系统中轻松地进行拍照、录像以及连拍等操作。运行以下命令以安装Cheese软件。 sudo apt install cheese 将USB摄像头连接至开发板USB接口,并打开cheese软件 Guvcview是一款开源的图形用户界面软件,它为用户提供了简单直观的方式来捕捉视频。运行以下命令以安装guvcview软件。 sudo apt install guvcview 您也仍然可以使用nvgstcapture来打开USB摄像头 # V4L2 USB camera (where is the /dev/videoN node) sudo nvgstcapture --cap-dev-node 2 #0,1默认为CSI摄像头 更详细的说明可参考 NVIDIA Developer 四、GPIO控制 GPIO(General-purpose input/output )是一种通用型输入输出接口,其脚位可由使用者编程控制。根据实际需要,这些脚位可以被设置为通用输入(GPI)、通用输出(GPO),或兼具输入输出功能(GPIO)。 Jetson Orin Nano系列的40PIN GPIO引脚定义如下: 1 在JetPack 5系统中使用GPIO 1.1 使用命令行控制GPIO 获取GPIO口的引脚名称与编号 以31号引脚为例,454为GPIO口编号,PQ.06为引脚名称 提升至root权限,启用GPIO口 sudo bash echo 454 > /sys/class/gpio/export 设置GPIO为输入模式 echo in > /sys/class/gpio/PQ.06/direction 获取GPIO当前状态,返回值1为高电平,0为低电平 cat /sys/class/gpio/PQ.06/value 设置GPIO为输出模式 echo out > /sys/class/gpio/PQ.06/direction 设置GPIO输出,1为高电平,0为低电平 echo 1 > /sys/class/gpio/PQ.06/value 您也可以使用以下脚本进行测试 #!/bin/bash trap 'echo PQ.06 > /sys/class/gpio/unexport; echo "GPIO PQ.06 is released"' EXIT echo "setting GPIO PQ.06" echo PQ.06 > /sys/class/gpio/export 2>/dev/null # set Pin output mode echo out > /sys/class/gpio/PQ.06/direction # blink while true do echo 0 > /sys/class/gpio/PQ.06/value sleep 0.5 cat /sys/class/gpio/PQ.06/value sleep 0.5 echo 1 > /sys/class/gpio/PQ.06/value sleep 0.5 cat /sys/class/gpio/PQ.06/value sleep 0.5 done 1.2 使用python控制GPIO 1.2.1 安装JETSON.GPIO包 如果您不确定您的环境是否正常,或者您尝试使用 conda 环境运行脚本请执行以下指令安装Jetson官方的GPIO库 pip install JETSON.GPIO Jetson GPIO库提供了四种给I / O引脚编号的方法。 ​ ​BOARD​ ​:物理引脚编号(40针接口顺序)。 ​ ​BCM​ ​:Broadcom SoC 的 GPIO 编号(​ ​常用​ ​)。 ​ ​CVM​ ​:CVM/CVB 连接器的信号名称。 ​ ​TEGRA_SOC​ ​:Tegra SoC 信号名称。 import time import RPi.GPIO as GPIO # define pin number output_pin = 31 # set pin as BOARD mode GPIO.setmode(GPIO.BOARD) # set pin mode GPIO.setup(output_pin, GPIO.OUT) print("Press CTRL+C to exit") curr_value = GPIO.HIGH try: while True: time.sleep(1) print("pin {} now is {}".format(output_pin, curr_value)) GPIO.output(output_pin, curr_value) # blink curr_value ^= GPIO.HIGH finally: GPIO.cleanup() 其他具体用法和例程可参考 项目官网 1.3使用C/C++控制GPIO 安装libgpio-dev sudo apt install libgpio-dev 参考例程: /** * License - MIT. */ #include #include #include #include #define GPIO_CHIP "/dev/gpiochip0" #define GPIO_LED 3 int main() { int ret = 0; struct gpiod_chip *gpiochip; struct gpiod_line *gpioline; // Open driver. gpiochip = gpiod_chip_open(GPIO_CHIP); if (NULL == gpiochip) { printf("Error in gpiod_chip_open.\n"); ret = -1; goto out1; } // Get gpio. gpioline = gpiod_chip_get_line(gpiochip, GPIO_LED); if (NULL == gpioline) { printf("Error in gpiod_chip_get_line.\n"); ret = -1; goto out2; } // Set gpio direction. ret = gpiod_line_request_output(gpioline, "gpio", 0); if (ret != 0) { printf("Error in gpiod_line_request_output.\n"); ret = -1; goto out2; } // Blink. for (int i = 0; i < 10; i++) { printf("%d times.\n", i); gpiod_line_set_value(gpioline, 1); sleep(1); gpiod_line_set_value(gpioline, 0); sleep(1); } // Release. gpiod_line_release(gpioline); out2: gpiod_chip_close(gpiochip); out1: return ret; } 编译源文件 g++ test_gpio.cc -o test_gpio -lgpiod 执行测试程序 ./test_gpio 2 在JetPack 6系统中使用GPIO 2.1使用libgpiod控制GPIO 在 JetPack 6.2/r36.4.3 中,NVIDIA已经移除了传统的 sysfs GPIO 接口(/sys/class/gpio)不建议再使用 sysfs 来控制 GPIO。推荐使用Linux统一的 libgpiod 管理 GPIO 安装前置软件包 sudo apt-get install busybox automake autoconf libtool 验证安装是否成功 jetson@jetson-desktop:~$ gpioinfo gpiochip0 - 164 lines: line 0: "PA.00" "regulator-vdd-3v3-sd" output active-high [used] line 1: "PA.01" unused input active-high line 2: "PA.02" unused input active-high line 3: "PA.03" unused input active-high line 4: "PA.04" unused input active-high line 5: "PA.05" unused input active-high line 6: "PA.06" unused input active-high line 7: "PA.07" unused input active-high line 8: "PB.00" unused input active-high line 9: "PC.00" unused input active-high ........... 读取 GPIO 状态 gpioget $(gpiofind "PQ.06") 将 GPIO 设置为输出模式 sudo busybox devmem 0x2430070 w 0x004 各个引脚对应的寄存器地址从 官方文档 中可以查询到 保持高电平: gpioset --mode=wait `gpiofind "PQ.06"`=1 保持低电平: gpioset --mode=wait `gpiofind "PQ.06"`=0 2.2 使用python控制GPIO 在JetPack6 系统中仍需要修改寄存器内容来更改引脚GPIO模式以使用高级语言控制GPIO 将 PQ.06 引脚设置为输出模式 sudo busybox devmem 0x2430070 w 0x004 如果您尝试使用 conda 环境运行脚本请执行以下指令安装 Jetson 官方的 GPIO 库 pip install JETSON.GPIO 建议执行以下指令,重新安装系统自带的 JETSON.GPIO 库 sudo rm -rf /usr/lib/python3*/dist-packages/Jetson sudo rm -rf /usr/local/lib/python3*/dist-packages/Jetson git clone https://github.com/NVIDIA/jetson-gpio.git cd jetson-gpio sudo pip3 install . Jetson GPIO 库提供了四种给I / O引脚编号的方法。 ​ ​BOARD​ ​:物理引脚编号(40针接口顺序)。 ​ ​BCM​ ​:Broadcom SoC 的 GPIO 编号(​ ​常用​ ​)。 ​ ​CVM​ ​:CVM/CVB 连接器的信号名称。 ​ ​TEGRA_SOC​ ​:Tegra SoC 信号名称。 import time import RPi.GPIO as GPIO # define pin number PQ.06 output_pin = 31 # set pin as BOARD mode GPIO.setmode(GPIO.BOARD) # set pin mode GPIO.setup(output_pin, GPIO.OUT) print("Press CTRL+C to exit") curr_value = GPIO.HIGH try: while True: time.sleep(1) print("pin {} now is {}".format(output_pin, curr_value)) GPIO.output(output_pin, curr_value) # blink curr_value ^= GPIO.HIGH finally: GPIO.cleanup() 其他具体用法和例程可参考 项目官网 2.3使用C/C++控制GPIO 在JetPack6 系统中仍需要修改寄存器内容来更改引脚GPIO模式以使用高级语言控制GPIO 将 PQ.06 引脚设置为输出模式 sudo busybox devmem 0x2430070 w 0x004 安装libgpio-dev sudo apt install libgpiod-dev 参考例程: /** * License - MIT. */ #include #include #include #include #define GPIO_CHIP "/dev/gpiochip0" #define GPIO_LED 106 int main() { int ret = 0; struct gpiod_chip *gpiochip; struct gpiod_line *gpioline; // Open driver. gpiochip = gpiod_chip_open(GPIO_CHIP); if (NULL == gpiochip) { printf("Error in gpiod_chip_open.\n"); ret = -1; goto out1; } // Get gpio. gpioline = gpiod_chip_get_line(gpiochip, GPIO_LED); if (NULL == gpioline) { printf("Error in gpiod_chip_get_line.\n"); ret = -1; goto out2; } // Set gpio direction. ret = gpiod_line_request_output(gpioline, "gpio", 0); if (ret != 0) { printf("Error in gpiod_line_request_output.\n"); ret = -1; goto out2; } // Blink PQ.06 for (int i = 0; i < 30; i++) { printf("%d times.\n", i); gpiod_line_set_value(gpioline, 1); sleep(1); gpiod_line_set_value(gpioline, 0); sleep(1); } // Release. gpiod_line_release(gpioline); out2: gpiod_chip_close(gpiochip); out1: return ret; } 编译源文件 g++ test_gpio.cc -o test_gpio -lgpiod 执行测试程序 ./test_gpio PADCTL基地址与GPIO口偏移量 我们从官方文档中查找摘取了以下信息供您参考,您也可以自行查阅官方Pinmux和TRM文档。 PADCTL_A0(PADCTL_G3) 0x02430000 PADCTL_A4(PADCTL_G4) 0x02434000 PADCTL_A16(PADCTL_EDP) 0x02440000 PADCTL_A24(PADCTL_G7) 0x02448000 7号 GPIO09 PADCTL_G7_SOC_GPIO59_0 0x30 gpio-492 PAC.06 0x02448030 15号 GPIO12 PADCTL_EDP_SOC_GPIO39_0 0x20 gpio-433 PN.01 0x02440020 29号 GPIO01 PADCTL_G3_SOC_GPIO32_0 0x68 gpio-453 PQ.05 0x02430068 31号 GPIO11 PADCTL_G3_SOC_GPIO33_0 0x70 gpio-454 PQ.06 0x02430070 32号 GPIO07 PADCTL_G4_SOC_GPIO19_0 0x80 gpio-389 PG.06 0x02434080 33号 GPIO13 PADCTL_G4_SOC_GPIO21_0 0x40 gpio-391 PH.00 0x02434040 五、其他外设 1. UART接口 1.1使用 cutecom 操作UART cutecom 是一个 跨平台的串口终端程序 ,它提供了一个简洁直观的图形用户界面,允许用户通过串口接口发送和接收数据。运行以下命令以安装 cutecom sudo apt install cutecom  官方默认开启的UART接口为 ttyTHS1 即 40pin GPIO中的 pin8 (TX) 和 pin10( RX) 引脚。 使用一根条线短接8和10引脚 更改串口权限(临时授权) sudo chmod 777 /dev/ttyTHS1 运行如下语句将当前用户加入到用户组。(可选,永久授权) sudo usermod -aG dialout $USER 打开 cutecom ,选择 ttyTHS1 并打开。 输入文本并回车,可以看到下方接收区显示有内容。 1.2 使用 python 操作 UART  更改串口权限 sudo chmod 777 /dev/ttyTHS1 安装pyserial库 pip install pyserial 运行以下脚本进行测试 import serial import time PORT = "/dev/ttyTHS1" BAUDRATE = 115200 ENCODING = "UTF-8" MESSAGE = "hello,jetson\r\n" try: with serial.Serial(PORT, BAUDRATE, timeout=2) as se: print(f"Serial port {PORT} opened: {se.is_open}") while True: se.write(MESSAGE.encode(ENCODING)) print(f"Sent: {MESSAGE.strip()}") try: line = se.readline().decode(ENCODING).strip() if line: print(f"Received: {line}") except Exception as e: print(f"Read error: {e}") time.sleep(1) except serial.SerialException as e: print(f"Serial error: {e}") except KeyboardInterrupt: print("\nExit by user.") 2. SPI接口 查看开发板spi资源 jetson@ubuntu:~/Downloads$ lsmod | grep -i spi spidev                 28672  0 spi_tegra114           32768  0 2.1使用C/C++进行SPI通讯 以SPI0为例,使用条线短接19(),20号针脚 下载SPI例程 git clone https://github.com/rm-hull/spidev-test 编译源文件 cd spidev-test gcc spidev_test.c -o spidev_test 运行例程 sudo modprobe spidev #启动官方spi驱动 ./spidev_test -D /dev/spidev0.0 -s 100000 -p "\x11\x22\x33" -v 正确测试结果如下: jetson@ubuntu:~/spidev-test$ ./spidev_test -D /dev/spidev0.0 -s 100000 -p "\x11\x22\x33" -v spi mode: 0x0 bits per word: 8 max speed: 100000 Hz (100 KHz) TX | 11 22 33 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | ."3 RX | 11 22 33 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | ."3 2.1使用python进行SPI通讯 安装spidev库 pip install spidev 运行测试脚本 import spidev import time spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = 1_000_000 spi.mode = 0 TEST_DATA = [   [11], [22], [33] ] for data in TEST_DATA:   resp = spi.xfer2(data)   print(f"recived:{resp}")   time.sleep(0.1) spi.close() 正确测试结果如下: (test) jetson@ubuntu:~/Downloads$ python test_spi.py recived:[11] recived:[22] recived:[33] 3. I 2 C接口 安装i2c工具 sudo apt install  i2c-tools 查看开发板可用的i2c的总线: jetson@jetson-desktop:~$ i2cdetect -l i2c-0    i2c           3160000.i2c                         I2C adapter i2c-1    i2c           c240000.i2c                         I2C adapter i2c-2    i2c           3180000.i2c                         I2C adapter i2c-4    i2c           Tegra BPMP I2C adapter              I2C adapter i2c-5    i2c           31b0000.i2c                         I2C adapter i2c-7    i2c           c250000.i2c                         I2C adapter i2c-9    i2c           NVIDIA SOC i2c adapter 0            I2C adapter 查看连接到对应总线的i2c设备: jetson@jetson-desktop:~$ i2cdetect -y -r -a 7    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f 00: 00 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  正确接入i2c设备后: i2cdetect -y -r -a 7    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  4. RTC接口 实时时钟 (Real-Time Clock, RTC )是一种独立计时设备,可在系统断电或主电源关闭时持续提供精确的时间和日期信息。当开发板在​ ​离线环境​ ​下运行,并且​ ​断电后仍需保持时间同步​ ​时,就需要使用到RTC。 官方套件不支持RTC功能 检查系统时间是否正确 timedatectl status 同步网络时间 sudo apt install ntpdate sudo ntpdate cn.pool.ntp.org 设置时区 sudo timedatectl set-timezone Asia/Shanghai 同步系统时间到RTC硬件 sudo hwclock --systohc --utc --rtc /dev/rtc0 --noadjfile 检查RTC硬件时间 sudo hwclock --show --utc --rtc /dev/rtc0 --noadjfile 设置开机自动同步RTC时间      1. 打开文件 sudo vi /lib/systemd/system/hwrtc.service      2.写入以下内容 [Unit] Description=Synchronise System clock to hardware RTC DefaultDependencies=no After=systemd-modules-load.service Before=systemd-journald.service systemd-fsck-root.service time-sync.target sysinit.target shutdown.target Conflicts=shutdown.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/sbin/hwclock --hctosys --utc --rtc /dev/rtc0 --noadjfile RestrictRealtime=yes [Install] WantedBy=sysinit.target      3.设置开机自启动服务 sudo systemctl enable hwrtc.service 手动RTC硬件同步到系统时间 sudo hwclock --hctosys --utc --rtc /dev/rtc0 --noadjfile 关闭网络同步时间 sudo timedatectl set-ntp false Orin Nano/NX USB配置说明 一、Jetson Orin Nano配置方法 1. JetPack 5.1.5配置方法 1. 1刷入 JetPack 5.1.5 系统。      参考 官方固件刷机流程 1.2 将设备树文件下载到开发板      设备正常开机后,打开终端命令行,将 修改后的设备树文件 下载到开发板。 git clone https://gitee.com/kongyuantech/document.git cd document/AN002\ Orin\ Nano\ NX\ USB配置/5.1.4/ 1.3 使用命令行替换设备树。 选择执行以下命令替换 DTB设备树 文件并重启设备。 Jetson Orin Nano 4G  请使用以下代码 sudo cp /boot/dtb/kernel_tegra234-p3767-0004-p3768-0000-a0.dtb /boot/dtb/kernel_tegra234-p3767-0004-p3768-0000-a0.dtb.backup # 备份原设备树文件 sudo cp kernel_tegra234-p3767-0004-p3768-0000-a0.dtb /boot/dtb sudo chown 0:0 /boot/dtb/kernel_tegra234-p3767-0004-p3768-0000-a0.dtb sudo chmod 644 /boot/dtb/kernel_tegra234-p3767-0004-p3768-0000-a0.dtb sudo reboot Jetson Orin Nano 8G  请使用以下代码 sudo cp /boot/dtb/kernel_tegra234-p3767-0003-p3768-0000-a0.dtb /boot/dtb/kernel_tegra234-p3767-0003-p3768-0000-a0.dtb.backup # 备份原设备树文件 sudo cp kernel_tegra234-p3767-0003-p3768-0000-a0.dtb /boot/dtb sudo chown 0:0 /boot/dtb/kernel_tegra234-p3767-0003-p3768-0000-a0.dtb sudo chmod 644 /boot/dtb/kernel_tegra234-p3767-0003-p3768-0000-a0.dtb sudo reboot 2. JetPack 6.2.1配置方法 2.1 刷入 JetPack 6.2.1 系统。      参考 官方固件刷机流程 2.2 将设备树文件下载到开发板 设备正常开机后,打开终端命令行,将 修改后的设备树文件 下载到开发板。 git clone https://gitee.com/kongyuantech/document.git cd document/AN002\ Orin\ Nano\ NX\ USB配置/6.2/ 1.3 使用命令行替换设备树。 选择执行以下命令 增加DTB设备树 文件并重启设备。 Jetson Orin Nano 4G  请执行以下代码 sudo cp orin_nano_4g.dtb /boot/dtb sudo sed -i 's#console=tty0#console=tty0\n FDT /boot/dtb/orin_nano_4g.dtb#g' /boot/extlinux/extlinux.conf sudo reboot Jetson Orin Nano 8G  请执行以下代码 sudo cp orin_nano_8g.dtb /boot/dtb sudo sed -i 's#console=tty0#console=tty0\n FDT /boot/dtb/orin_nano_8g.dtb#g' /boot/extlinux/extlinux.conf sudo reboot 二、Jetson Orin NX配置方法 1. JetPack 5.1.5配置方法 1. 1刷入 JetPack 5.1.5 系统。      参考 官方固件刷机流程 1.2 将设备树文件下载到开发板 设备正常开机后,打开终端命令行,将 修改后的设备树文件 下载到开发板。 git clone https://gitee.com/kongyuantech/document.git cd document/AN002\ Orin\ Nano\ NX\ USB配置/5.1.4/ 1.3 使用命令行替换设备树。 选择执行以下命令替换 DTB设备树 文件并重启设备。 Jetson Orin NX 8G  请执行以下代码 sudo cp /boot/dtb/kernel_tegra234-p3767-0001-p3768-0000-a0.dtb /boot/dtb/kernel_tegra234-p3767-0001-p3768-0000-a0.dtb.backup # 备份原设备树文件 sudo cp kernel_tegra234-p3767-0001-p3768-0000-a0.dtb /boot/dtb sudo chown 0:0 /boot/dtb/kernel_tegra234-p3767-0001-p3768-0000-a0.dtb sudo chmod 644 /boot/dtb/kernel_tegra234-p3767-0001-p3768-0000-a0.dtb sudo reboot Jetson Orin NX 16G  请执行以下代码 sudo cp /boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb /boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb.backup # 备份原设备树文件 sudo cp kernel_tegra234-p3767-0000-p3768-0000-a0.dtb /boot/dtb sudo chown 0:0 /boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb sudo chmod 644 /boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb sudo reboot 2. JetPack 6.2.1配置方法 2.1 刷入 JetPack 6.2.1 系统。      参考 官方固件刷机流程 2.2 将设备树文件下载到开发板 设备正常开机后,打开终端命令行,将 修改后的设备树文件 下载到开发板。 git clone https://gitee.com/kongyuantech/document.git cd document/AN002\ Orin\ Nano\ NX\ USB配置/6.2/ 2.3 使用命令行替换设备树。 选择执行以下命令 增加DTB设备树 文件并重启设备。 Jetson Orin NX 8G  请使用以下代码 sudo cp orin_nx_8g.dtb /boot/dtb sudo sed -i 's#console=tty0#console=tty0\n FDT /boot/dtb/orin_nx_8g.dtb#g' /boot/extlinux/extlinux.conf sudo reboot Jetson Orin NX 16G  请使用以下代码 sudo cp orin_nx_16g.dtb /boot/dtb sudo sed -i 's#console=tty0#console=tty0\n FDT /boot/dtb/orin_nx_16g.dtb#g' /boot/extlinux/extlinux.conf sudo reboot 检测配置结果 替换设备树后,4个USB3.0端口(C1901为3个)可正常工作,Type-C端口系统默认处于关闭状态 可使用以下命令查看USB端口工作情况。 lsusb -t 未替换设备树前: 替换设备树成功后: 您也可以自行使用DISK工具或dd指令测试读写速率是否达到USB3.0的标准。 三、配置Tpye-C端口模式 配置 Type-C端口 为 Device 模式 注意:此命令为临时启用,重启会失效。 sudo bash -c 'echo device > /sys/class/usb_role/usb2-0-role-switch/role' 设置后,使用Type-C端口连接到PC主机时,具有以下功能 COM口,设备的终端命令行 虚拟网卡,设备ip地址默认为:192.168.55.1 NCM (Network Control Model),设备可通过PC主机联网,仅支持Linux、Mac  开机默认配置 Type-C端口 为 Device 模式(永久有效) sudo sed -i 's#exit 0#echo device > /sys/class/usb_role/usb2-0-role-switch/role\nexit 0#g' /opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-start.sh 连接到Jetson系统 Jetson拥有一个HDMI/DP视频输出接口、RJ45网口、Type-C接口和UART调试接口,下面我们将使用上面这四种方法连接到Jetson开发板系统。 1. 连接显示器 使用功能正常的 DP/HDMI 线材连接到功能正常的显示器,接通开发板电源就能正常进入桌面。接入鼠标键盘后即可如普通桌面PC一样操作。 2. 远程登陆 此方法需要提前使用SDK Maneger写入用户名和密码 2.1将开发板连接到路由器,并接通电源开机 2.2-1通过路由器后台获取到开发板ip地址 不同品牌的路由器存在较大差异,请按照设备制造商的指引进行查询 2.2-2使用 advanced ip scanner 软件扫描同网段下的设备 在刷入官方固件时,制造商信息为 NVIDIA Corporation 的设备即为开发板。 2.3 下载安装 putty 或 MobaXterm 等连接工具(下面以 MobaXterm 为例) 2.4 点击 session 创建一个会话 2.5 点击 SSH 2.6 输入刚刚查询到的 IP 地址和刷入系统时或者自定义的用户名,完成后点击OK保存 2.7 输入密码(命令行不显示),完成后回车即可登录到系统。 3. 通过type-c连接到SSH   3.1 在开发板正常上电开机 在默认模式下连接到主机后,Jetson默认作为主机,其IP地址为 192.168.55.1 3.2 使用 putty 或 MobaXterm 等连接工具,连接到开发板 参考 2.3 节进行操作 4. 远程连接到Jetson桌面环境 在无显示器模式下建议使用HDMI/DP诱骗器确保桌面环境正常 4.1 使用 NoMachine NoMachine 是一款功能强大、跨平台的远程桌面软件,专注于提供高速、高画质的远程访问体验。其核心基于 ​ ​NX 协议​ ​,通过高效压缩和加密技术实现低延迟传输,特别适合图形密集型任务(如视频编辑、3D 渲染)和多场景协作。 主机下载安装NoMachine Jetson端下载安装NoMachine  (下载页面参考: NoMachine–arm_version ) 通过scp等方式上传到开发板(也可尝试复制下载链接通过命令行使用 wget 命令下载) 命令行安装deb软件包 sudo dpkg -i nomachine_9.1.24_6_arm64.deb #随软件的更新包名可能发生变化 主机和开发板都安装成功后将其连接到同一局域网下,在主机打开NoMachine便可自动搜索到Jetson服务端 输入用户名和密码,点击OK 成功连接到桌面 点击软件显示区域右上角可以进入设置调节画质、显示画幅和编码模式等选项 4.2 使用 VNC VNC (​​虚拟网络计算机​​)是一种基于图形界面的远程控制技术,允许用户通过网络(互联网或局域网)实时访问并操作另一台计算机的桌面环境。其核心协议为 ​ ​RFB( Remote Framebuffer Protocol )​ ​,通过传输屏幕帧缓冲区的像素数据实现跨平台远程控制 下载安装主机端 在Jetson上进行如下设置 设置VNC服务为开机自启 cd /usr/lib/systemd/user/graphical-session.target.wants sudo ln -s ../vino-server.service ./. 配置VNC服务 gsettings set org.gnome.Vino prompt-enabled false gsettings set org.gnome.Vino require-encryption false 设置VNC登录密码 # 将 <密码> 替换为你要设置的密码 gsettings set org.gnome.Vino authentication-methods "['vnc']" gsettings set org.gnome.Vino vnc-password $(echo -n '密码'|base64) 重启系统生效 sudo reboot 在主机的 VNC 软件中新建连接并输入 Jetson 的局域网 IP 并按回车确认 输入密码并确认 可参考英伟达官方说明 Setting Up VNC | NVIDIA Developer JETSON ORIN NANO 进阶教程 本章主要Jetson特色的AI功能使用 新页面 安装jtop jtop 是英伟达专为 ​ ​Jetson 系列边缘计算设备​ ​开发的​ ​交互式系统监控工具。 1 安装jtop 安装jtop需要的依赖库 sudo apt update sudo apt install python3 sudo apt install python3-pip 安装jtop sudo pip3 install -U pip -i https://pypi.tuna.tsinghua.edu.cn/simple sudo pip3 install jetson-stats -i https://pypi.tuna.tsinghua.edu.cn/simple sudo systemctl restart jtop.service 2 jtop的使用 安装完成后在控制台中输入 jtop 打开主界面 2.1 监视各个模块的工作信息 2.2 控制风扇 2.3 查看内置软件信息 安装CUDA Jetson CUDA 是NVIDIA为边缘AI设计的并行计算平台,基于ARM的Jetson系列硬件,支持 GPU加速 深度学习与 实时推理 ,低 功耗高性能 。 安装CUDA JETSON SDK sudo apt update sudo apt install nvidia-jetpack 对开发板进行压力测试 以下测试仅在 JetPack 6.1 (rev1) 和 JetPack 5.1.5 版本中通过验证 调整功耗上限: sudo nvpmodel -m 2 #nano 模式2为super sudo jetson_clocks --fan cpu压力测试: sudo apt install stress stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --hdd 1 --hdd-bytes 1024M gpu压力测试: git clone https://github.com/anseeto/jetson-gpu-burn/ cd jetson-gpu-burn make ./gpu_burn 100000 状态查询: sudo jtop Orin Nano 整机最大功率为 30W. Orin NX  整机最大功率为 40W . 编译安装opencv with cuda JetPack预装的opencv没有启用cuda,需要自行编译安装。 1. 脚本一键安装 #!/bin/bash # opencv_install.sh # Modified from https://github.com/AastaNV/JEP/blob/master/script/install_opencv4.10.0_Jetpack6.1.sh version="4.10.0" folder="workspace" remove_old="" set -e # Parse command-line arguments for arg in "$@"; do case $arg in --version=*) version="${arg#*=}" ;; --folder=*) folder="${arg#*=}" ;; --remove-old=*) remove_old="${arg#*=}" ;; --help|-h) echo "Usage: $0 [--version=4.x.x] [--folder=dir] [--remove-old=yes/no]" exit 0 ;; *) echo "Unknown parameter: $arg" echo "Usage: $0 [--version=4.x.x] [--folder=dir] [--remove-old=yes/no]" exit 1 ;; esac done # Create installation directory if it doesn't exist if [ ! -d "$folder" ]; then echo "Creating directory: $folder" mkdir -p "$folder" fi cd "$folder" || exit # Old OpenCV removal logic if [ -z "$remove_old" ]; then read -rp "Do you want to remove system-installed OpenCV? (yes/no): " remove_old fi case "$remove_old" in [yY] | [yY][eE][sS]) echo "** Removing system OpenCV packages" sudo apt -y purge *libopencv* sudo apt -y autoremove ;; *) echo "** Skipping system OpenCV removal" ;; esac echo "------------------------------------" echo "** Installing dependencies (1/4)" echo "------------------------------------" sudo apt-get update sudo apt-get install -y build-essential cmake git libgtk2.0-dev pkg-config \ libavcodec-dev libavformat-dev libswscale-dev libgstreamer1.0-dev \ libgstreamer-plugins-base1.0-dev python3-dev python3-numpy libtbb2 \ libtbb-dev libjpeg-dev libpng-dev libtiff-dev libv4l-dev v4l-utils qv4l2 curl # Verify essential dependencies installed for dep in g++ cmake git pkg-config; do if ! command -v "$dep" > /dev/null; then echo "Error: $dep installation failed" exit 1 fi done echo "------------------------------------" echo "** Downloading OpenCV ${version} (2/4)" echo "------------------------------------" # Check if source files already exist download_opencv=false download_contrib=false if [ ! -f "opencv-${version}.zip" ]; then echo "Downloading opencv-${version}.zip" wget -O opencv-${version}.zip https://github.com/opencv/opencv/archive/${version}.zip || { echo "Download failed! Check your internet connection or verify the version exists" exit 1 } download_opencv=true else echo "opencv-${version}.zip exists, skipping download" fi if [ ! -f "opencv_contrib-${version}.zip" ]; then echo "Downloading opencv_contrib-${version}.zip" wget -O opencv_contrib-${version}.zip https://github.com/opencv/opencv_contrib/archive/${version}.zip || { echo "Download failed! Check your internet connection or verify the version exists" exit 1 } download_contrib=true else echo "opencv_contrib-${version}.zip exists, skipping download" fi # Unpack source files if [ ! -d "opencv-${version}" ] || $download_opencv; then if [ -d "opencv-${version}" ]; then echo "Removing existing opencv-${version} directory" rm -rf "opencv-${version}" fi echo "Unpacking opencv-${version}.zip" unzip -q opencv-${version}.zip || { echo "Extraction failed! File may be corrupt" exit 1 } fi if [ ! -d "opencv_contrib-${version}" ] || $download_contrib; then if [ -d "opencv_contrib-${version}" ]; then echo "Removing existing opencv_contrib-${version} directory" rm -rf "opencv_contrib-${version}" fi echo "Unpacking opencv_contrib-${version}.zip" unzip -q opencv_contrib-${version}.zip || { echo "Extraction failed! File may be corrupt" exit 1 } fi # Clean up zip files after successful extraction if [ $? -eq 0 ]; then rm -f opencv-${version}.zip opencv_contrib-${version}.zip fi cd opencv-${version} || exit echo "------------------------------------" echo "** Building OpenCV ${version} (3/4)" echo "------------------------------------" mkdir -p release cd release # Auto-detect CUDA architecture cuda_arch="" if command -v nvidia-smi &> /dev/null; then gpu_name=$(nvidia-smi --query-gpu=name --format=csv,noheader | head -n1) if [[ $gpu_name == *"Orin"* ]] || [[ $gpu_name == *"Jetson"* ]]; then cuda_arch="8.7" elif [[ $gpu_name == *"A100"* ]]; then cuda_arch="8.0" fi fi cmake_cmd="cmake -D WITH_CUDA=ON -D WITH_CUDNN=ON -D OPENCV_GENERATE_PKGCONFIG=ON " cmake_cmd+="-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-${version}/modules " cmake_cmd+="-D WITH_GSTREAMER=ON -D WITH_LIBV4L=ON -D BUILD_opencv_python3=ON " cmake_cmd+="-D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF " cmake_cmd+="-D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local " # Add CUDA architecture if detected if [ -n "$cuda_arch" ]; then echo "Detected NVIDIA GPU: ${gpu_name}, using CUDA_ARCH_BIN=${cuda_arch}" cmake_cmd+="-D CUDA_ARCH_BIN=${cuda_arch} -D CUDA_ARCH_PTX=\"\" " else echo "No supported GPU detected, skipping CUDA architecture flags" fi # Execute CMake configuration echo "CMake command: $cmake_cmd .." $cmake_cmd .. || { echo "CMake configuration failed" exit 1 } # Parallel build (leave one core for system stability) cpu_cores=$(($(nproc) - 1)) [ $cpu_cores -lt 1 ] && cpu_cores=1 echo "Building with ${cpu_cores} CPU cores" make -j${cpu_cores} || { echo "Compilation failed" exit 1 } echo "------------------------------------" echo "** Installing OpenCV ${version} (4/4)" echo "------------------------------------" sudo make install || { echo "Installation failed" exit 1 } # Add environment variables to .bashrc (only if not already present) bashrc=~/.bashrc env_lines=( "export LD_LIBRARY_PATH=/usr/local/lib:\$LD_LIBRARY_PATH" "export PYTHONPATH=/usr/local/lib/python3.10/site-packages/:\$PYTHONPATH" ) for line in "${env_lines[@]}"; do if ! grep -Fxq "$line" "$bashrc"; then echo "Adding to .bashrc: $line" echo "$line" >> "$bashrc" else echo "Environment variable already exists: $line" fi done source ~/.bashrc echo "** OpenCV ${version} installation completed" echo "Verification commands:" echo " pkg-config --modversion opencv4" echo " python3 -c 'import cv2; print(cv2.__version__)'" echo "** Installation successful!" 2. 手动安装 2.1 卸载自带opencv sudo apt-get purge libopencv* sudo apt autoremove sudo apt-get update 2.2 安装前置软件包 sudo apt-get update sudo apt-get install -y build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev python3.10-dev python3-numpy sudo apt-get install -y libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libv4l-dev v4l-utils qv4l2 sudo apt-get install -y curl 2.3 获取opencv源码(以4.10.0版本为例) version=4.10.0 wget -O "opencv-${version}.zip" "https://github.com/opencv/opencv/archive/${version}.zip" wget -O "opencv_contrib-${version}.zip" "https://github.com/opencv/opencv_contrib/archive/${version}.zip" unzip "opencv-${version}.zip" unzip "opencv_contrib-${version}.zip" rm "opencv-${version}.zip" "opencv_contrib-${version}.zip" cd "opencv-${version}/" 2.4 编译源码 此步骤至少需要半小时以上。 中途可能会下载第三方软件包,建议提前确认网络环境。 mkdir build cd build/ cmake -D WITH_CUDA=ON -D WITH_CUDNN=ON -D CUDA_ARCH_BIN="8.7" -D CUDA_ARCH_PTX="" -D OPENCV_GENERATE_PKGCONFIG=ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-${version}/modules -D WITH_GSTREAMER=ON -D WITH_LIBV4L=ON -D BUILD_opencv_python3=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local .. make -j$(nproc) 2.5 安装 sudo make install echo 'export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH' >> ~/.bashrc echo 'export PYTHONPATH=/usr/local/lib/python3.10/site-packages/:$PYTHONPATH' >> ~/.bashrc source ~/.bashrc 三、验证测试 #--test_cuda.cpp #include #include #include #include #include // CPU 矩阵乘法 void cpu_matrix_mult(cv::Mat& a, cv::Mat& b, cv::Mat& result) {   for (int i = 0; i < 50; i++) {       result = a * b;   } } // GPU 矩阵乘法 void gpu_matrix_mult(cv::cuda::GpuMat& d_a, cv::cuda::GpuMat& d_b, cv::cuda::GpuMat& d_result) {   cv::cuda::Stream stream;   for (int i = 0; i < 50; i++) {       cv::cuda::gemm(d_a, d_b, 1.0, cv::cuda::GpuMat(), 0, d_result, 0, stream);       stream.waitForCompletion();   } } int main() {   try {       std::cout << "--- OpenCV CUDA Matrix Multiplication Test ---\n";           // 创建两个 1000x1000 的随机矩阵       cv::Mat mat_a(1000, 1000, CV_32FC1);       cv::Mat mat_b(1000, 1000, CV_32FC1);       cv::randu(mat_a, 0.0f, 1.0f);       cv::randu(mat_b, 0.0f, 1.0f);           cv::Mat cpu_result;           // CPU 测试       auto start_cpu = std::chrono::high_resolution_clock::now();       cpu_matrix_mult(mat_a, mat_b, cpu_result);       auto end_cpu = std::chrono::high_resolution_clock::now();       double cpu_time = std::chrono::duration_cast(end_cpu - start_cpu).count();           // GPU 测试       cv::cuda::GpuMat d_mat_a, d_mat_b, d_result;       d_mat_a.upload(mat_a);       d_mat_b.upload(mat_b);           auto start_gpu = std::chrono::high_resolution_clock::now();       gpu_matrix_mult(d_mat_a, d_mat_b, d_result);       auto end_gpu = std::chrono::high_resolution_clock::now();       double gpu_time = std::chrono::duration_cast(end_gpu - start_gpu).count();           // 下载结果进行验证       cv::Mat gpu_result;       d_result.download(gpu_result);           // 计算误差(一般为空)       double diff = cv::norm(cpu_result, gpu_result, cv::NORM_L2);       std::cout << "Result difference: " << diff << "\n";           std::cout << "Performance Results:\n"                 << " - CPU time: " << cpu_time << " ms\n"                 << " - GPU time: " << gpu_time << " ms\n"                 << " - Speedup: " << cpu_time / gpu_time << "x\n";           std::cout << "\n✅ CUDA matrix multiplication test completed\n";       return 0;       } catch (const cv::Exception& e) {       std::cerr << "OpenCV Error (" << e.err << "): " << e.what() << "\n";       return -1;   } catch (const std::exception& e) {       std::cerr << "Standard Error: " << e.what() << "\n";       return -2;   } } 编译运行 jetson@jetson-desktop:~/work$ g++ test_cuda.cpp -o test_cuda `pkg-config --cflags --libs opencv4` jetson@jetson-desktop:~/work$ ./test_cuda --- OpenCV CUDA Performance Test --- Performance Results: - CPU time: 2451 ms - GPU time: 918 ms - Speedup: 2.66993x ✅ CUDA performance test completed 安装使用pytorch和torchvision ​​ PyTorch 是 Python 中最流行、最易用的深度学习框架之一。它让开发者能够像操作普通 Python 代码一样,直观、灵活地设计和训练复杂的神经网络模型。其简洁的 API 设计和强大的 GPU 加速支持,使得从研究想法到实际部署的开发过程都极其高效便捷,广受开发者青睐。​ NVIDIA 为 Jetson 系列设备专门适配了对应的软件包,其版本依赖关系如下: PyTorch Version NVIDIA Framework  Container NVIDIA Framework  Wheel JetPack Version 2.8.0a0+5228986c39 25.06 - 6.2 2.8.0a0+5228986c39 25.05 - 6.2 2.7.0a0+79aa17489c 25.04 - 6.2 2.7.0a0+7c8ec84dab 25.03 - 6.2 2.7.0a0+6c54963f75 25.02 - 6.2 2.6.0a0+ecf3bae40a 25.01 - 6.1 2.6.0a0+df5bbc09d1 24.12 - 6.1 2.6.0a0+df5bbc0 24.11 - 6.1 2.5.0a0+e000cf0ad9 24.10 - 6.1 2.5.0a0+b465a5843b 24.09 24.09 6.1 2.5.0a0+872d972e41 24.08 - 6.0 2.4.0a0+3bcc3cddb5 24.07 24.07 6.0 2.4.0a0+f70bd71a48 24.06 24.06 6.0 2.4.0a0+07cecf4168 24.05 24.05 6.0 2.3.0a0+6ddf5cf85e 24.04 24.04 6.0 Developer Preview 2.3.0a0+40ec155e58 24.03 24.03 2.3.0a0+ebedce2 24.02 24.02 2.2.0a0+81ea7a4 23.12, 24.01 23.12, 24.01 2.2.0a0+6a974bec 23.11 23.11 2.1.0a   23.06 5.1.x 2.0.0   23.05 2.0.0a0+fe05266f   23.04 2.0.0a0+8aa34602   23.03 1.14.0a0+44dac51c   23.02, 23.01 1.13.0a0+936e930   22.11 5.0.2 1.13.0a0+d0d6b1f   22.09, 22,10 1.13.0a0+08820cb 22.07 22.07 1.13.0a0+340c412 22.06 22.06 5.0.1 1.12.0a0+8a1a93a9 22.05 22.05 5.0 1.12.0a0+bd13bc66   22.04 1.12.0a0+2c916ef   22.03 1.11.0a0+bfe5ad28   22.01 4.6.1 下面教程以 JetPack6.2.1 cuda12.6 版本为例 1.安装torch工具包 1.1下载并安装torch , torchvison wget https://pypi.jetson-ai-lab.io/jp6/cu126/+f/62a/1beee9f2f1470/torch-2.8.0-cp310-cp310-linux_aarch64.whl wget https://pypi.jetson-ai-lab.io/jp6/cu126/+f/907/c4c1933789645/torchvision-0.23.0-cp310-cp310-linux_aarch64.whl pip install torch-2.8.0-cp310-cp310-linux_aarch64.whl torchvision-0.23.0-cp310-cp310-linux_aarch64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple 1.2 检测是否正确安装 使用python执行下面三个语句 jetson@jetson-desktop:~$ python Python 3.10.16 (main, Dec 11 2024, 16:18:56) [GCC 11.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import torch >>> print(torch.__version__) 2.8.0 >>> print(torch.cuda.is_available()) True 2. 运行YOLO11 YOLO 是一种实时目标检测算法,它将目标检测视为单阶段回归问题,通过将图像划分为网格并直接预测边界框与类别概率,实现高速且高精度的检测。YOLO系列因开源易用、部署灵活,广泛应用于自动驾驶、安防监控、工业质检等领域。 2.1 安装miniconda curl -L https://repo.anaconda.com/miniconda/Miniconda3-py310_25.3.1-1-Linux-aarch64.sh | bash source ~/.bashrc conda --version   2.2 conda换源 conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/ conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/msys2/ conda config --set show_channel_urls yes 2.3创建conda环境 conda create -n jetson-ai python=3.10 2.4 进入conda环境 conda activate jetson-ai 2.5 安装torch和torchvison wget https://pypi.jetson-ai-lab.io/jp6/cu126/+f/62a/1beee9f2f1470/torch-2.8.0-cp310-cp310-linux_aarch64.whl wget https://pypi.jetson-ai-lab.io/jp6/cu126/+f/907/c4c1933789645/torchvision-0.23.0-cp310-cp310-linux_aarch64.whl pip install torch-2.8.0-cp310-cp310-linux_aarch64.whl torchvision-0.23.0-cp310-cp310-linux_aarch64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple 2.6 安装ultralytics pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple 2.7 运行摄像头视频推理例程 接入摄像头,并在上面创建的环境中运行如下程序。 import cv2 import time from ultralytics import YOLO from ultralytics import YOLOWorld # Load the YOLO model model = YOLO("yolo11s.pt") # Open the video file video_path = 0 cap = cv2.VideoCapture(video_path) # Loop through the video frames while cap.isOpened(): # Read a frame from the video success, frame = cap.read() start = time.time() if success: # Run YOLO inference on the frame results = model(frame) inf_time = time.time() - start # Visualize the results on the frame annotated_frame = results[0].plot() fps = 1.0 / inf_time if inf_time > 0 else 0 # show FPS cv2.putText(annotated_frame, f"FPS: {fps:.2f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2) cv2.imshow("YOLO Inference", annotated_frame) # Break the loop if 'q' is pressed if cv2.waitKey(1) & 0xFF == ord("q"): break else: # Break the loop if the end of the video is reached break # Release the video capture object and close the display window cap.release() cv2.destroyAllWindows() 更多信息可参考 Ultralytics YOLO11 -Ultralytics YOLO 文档 安装使用ollama 1. 运行以下指令安装ollama curl -fsSL https://ollama.com/install.sh | sh 2. 检查是否正确安装 jetson@jetson-desktop:~$ ollama -v ollama version is 0.9.6 3. 下载并运行deepseek-r1 1.5b模型 ollama run deepseek-r1:1.5b 安装使用Jetson-container 开始本节内容前请确定您的网络环境能正常拉取docker镜像 Jetson-container是NVIDIA为Jetson设备打造的轻量Docker环境,预装CUDA、cuDNN、TensorRT,快速部署AI边缘应用。 本节以 Jetson Orin NX 16GB , JetPack6.2.1 运行 Comfy-UI 为例进行展示。您也可以参考 官方示例 Comfy-UI 是一款专业的节点式Stable Diffusion图形界面,拖拽连接即可构建文生图工作流,支持LoRA、ControlNet、视频扩散,低代码、易扩展等应用及特性。 1. 下载编译 jetson-container 环境 git clone https://github.com/dusty-nv/jetson-containers.git cd jetson-containersbash jetson-containers/install.sh 2. 拉取docker镜像并运行 jetson-containers run dustynv/comfyui:r36.4.3 3. 成功运行后命令行窗口输出如下 4. 打开对应服务的GUI网页 若在Jetson设备上打开则访问 http://0.0.0.0:8188 若在局域网内的其他设备则输入 http://:8188 5. 设定映射路径,将开发板里下载好的模型映射到容器内部目录 jetson-containers run ~/models/:/opt/ComfyUI/models/checkpoints dustynv/comfyui:r36.4.3 6. 按照需求搭建工作流并调整参数生成图像 关于ComfyUI的使用教程请参考其官网 ComfyUI | 用AI生成视频、图像、音频 使用TensorRT加速 c++ python绑定 网卡驱动 4G模块使用说明 移远通信LTE Standard EM05系列是一款专为IoT/M2M应用而设计的LTE Cat 4模块。采用节省空间的M.2(NGFF)封装类型,超薄、紧凑的设计使其更易于嵌入到小尺寸产品中。 EM05系列支持最大下行速率150 Mbps,最大上行速率50 Mbps,包含三个型号:EM05-CN、EM05-E和EM05-G。支持LTE-FDD、LTE-TDD、DC-HSDPA、HSPA+、HSDPA、HSUPA、WCDMA和CDMA等多种网络制式。 要在Jetson系列上使用EM-05模块需要重新编译系统内核并刷入新编译的系统。 方法一:替换新内核 1.1 拉取编译好的资料 1.2 修改设备树配置文件 1.3 移动内核和驱动到指定位置 1.4 应用更改并重启验证 方法二:编译刷入完整系统 2.1 获取源码和工具链 安装编译依赖工具 sudo apt install build-essential bc sudo apt-get install git bison flex libssl-dev zip libncurses-dev make git sudo apt-get install build-essential bc 创建工具链放置目录 mkdir $HOME/l4t-gcc-toolchain cd $HOME/l4t-gcc-toolchain 下载并解压交叉编译工具链 wget https://developer.nvidia.com/downloads/embedded/l4t/r36_release_v3.0/toolchain/aarch64--glibc--stable-2022.08-1.tar.bz2 tar xf aarch64--glibc--stable-2022.08-1.tar.bz2 进入到缓存好的刷机固件目录 cd $HOME/nvidia/nvidia_sdk/JetPack_6.2.1_Linux_JETSON_ORIN_NANO_TARGETS/Linux_for_Tegra/source  #根据实际目录进行修改 根据 release tag 拉取源码。 Jetson Linux Archive | NVIDIA Developer  ./source_sync.sh -k -t #替换为你自己的发行版本如 jetson_36.4.3 2.2 修改内核源码 本部分内容可参考 移远Linux&Andriod驱动技术手册 Jetson Orin Nano配置文件路径:arch/arm64/configs/defconfig 配置USB转串口驱动添加如下内容 CONFIG_USB_SERIAL=y CONFIG_USB_SERIAL_WWAN=y CONFIG_USB_SERIAL_OPTION=y CONFIG_USB_NET_DRIVERS=y CONFIG_USB_USBNET=y CONFIG_USB_NET_QMI_WWAN=y CONFIG_USB_WDM=y 修改 drivers/usb/serial/option.c,向USB转串口驱动添加VID和PID static const struct usb_device_id option_ids[] = { #if 1 // 2025-04-24 Added by Quectel   { USB_DEVICE(0x2C7C, 0x0125) }, #endif   ... ... } 使用USBNet驱动,文件路径:drivers/usb/serial/option.c static int option_probe(struct usb_serial *serial,           const struct usb_device_id *id) {   ... ... #if 1  // 2025-04-24 Added by Quectel if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) {       __u16 idProduct = le16_to_cpu(serial->dev->descriptor.idProduct);       struct usb_interface_descriptor *intf = &serial->interface->cur_altsetting->desc;       if (intf->bInterfaceClass != 0xFF || intf->bInterfaceSubClass == 0x42) {               //ECM, RNDIS, NCM, MBIM, ACM, UAC, ADB               return -ENODEV;       }       if ((idProduct&0xF000) == 0x0000) {               //MDM interface 4 is QMI               if (intf->bInterfaceNumber == 4 && intf->bNumEndpoints == 3                       && intf->bInterfaceSubClass == 0xFF && intf->bInterfaceProtocol == 0xFF)                       return -ENODEV;       } } #endif   /* Store the device flags so we can use them during attach. */   usb_set_serial_data(serial, (void *)device_flags);   return 0; } 添加零包机制,文件路径:drivers/usb/serial/usb_wwan.c static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port,                     int endpoint,                     int dir, void *ctx, char *buf, int len,                     void (*callback) (struct urb *)) { ... ...   usb_fill_bulk_urb(urb, serial->dev,             usb_sndbulkpipe(serial->dev, endpoint) | dir,             buf, len, callback, ctx);   #if 1   //2025-04-24 Added by Quectel for zero packet   if (dir == USB_DIR_OUT) {       struct usb_device_descriptor *desc = &serial->dev->descriptor;       if (desc->idVendor == cpu_to_le16(0x2C7C))       urb->transfer_flags |= URB_ZERO_PACKET;   } #endif   return urb; } 添加Reset-resume机制(休眠唤醒)文件路径:drivers/usb/serial/option.c static struct usb_serial_driver option_1port_device = {   ... ... #ifdef CONFIG_PM   .suspend           = usb_wwan_suspend,   .resume            = usb_wwan_resume, #if 1  //2025-04-24 Added by Quectel   .reset_resume   = usb_wwan_resume, #endif #endif }; 添加QMI_WWAN驱动         移远提供了QMI_WWAN驱动源文件qmi_wwan_q.c,将其复制到 drivers/net/usb/ 目录下。同时修改drivers/net/usb/Makefile,使其能编译 qmi_wwan_q.c #Makefile # must insert qmi_wwan_q.o before qmi_wwan.o obj-${CONFIG_USB_NET_QMI_WWAN} += qmi_wwan_q.o obj-${CONFIG_USB_NET_QMI_WWAN} += qmi_wwan.o  2.3 编译内核 此步骤可能需要进行半个小时以上 创建输出目录 cd ../../                  mkdir kernel_out  编译安装内核 export CROSS_COMPILE=$HOME/l4t-gcc-toolchain/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-        #设置交叉编译工具 make -C kernel                     #构建 Jetson Linux 内核镜像 sudo -E make install -C kernel     #安装内核模块和树内模块 将内核镜像复制到刷机目录下 cp kernel/kernel-jammy-src/arch/arm64/boot/Image ../Linux_for_Tegra/kernel/Image 构建NVIDIA树外模块(驱动程序)  export CROSS_COMPILE=$HOME/l4t-gcc-toolchain/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu- export KERNEL_HEADERS=$PWD/kernel/kernel-jammy-src make modules 安装到刷机目录下 export INSTALL_MOD_PATH=$HOME/nvidia/nvidia_sdk/JetPack_6.2.1_Linux_JETSON_ORIN_NANO_TARGETS/Linux_for_Tegra/rootfs/ #根据实际目录进行修改 sudo -E make modules_install 开始构建DTB export CROSS_COMPILE=$HOME/l4t-gcc-toolchain/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu- export KERNEL_HEADERS=$PWD/kernel/kernel-jammy-src make dtbs 将生成的dtb文件拷贝到刷机目录 cp kernel-devicetree/generic-dts/dtbs/* /Linux_for_Tegra/kernel/dtb/ 2.4 刷入系统 进入刷机固件缓存目录 cd $HOME/nvidia/nvidia_sdk/JetPack_6.2.1_Linux_JETSON_ORIN_NANO_TARGETS/Linux_for_Tegra/source  #根据实际目录进行修改 使用命令行刷机: super模式 sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1 -c tools/kernel_flash/flash_l4t_t234_nvme.xml -p "-c bootloader/generic/cfg/flash_t234_qspi.xml" --showlogs --network usb0 jetson-orin-nano-devkit-super internal 普通模式 sudo ./flash.sh jetson-orin-nano-devkit-nvme internal 2.5 开机验证 将Quectel_Qconnectmanager上传到开发板 解压并编译 unizp Quectel_QConnectManager_Linux_V1.6.5.zip cd Quectel_QConnectManager_Linux_V1.6.5 make 成功运行便可4G拨号上网 jetson@jetson-desktop:~/Downloads/Quectel_QConnectManager_Linux_V1.6.5$ sudo ./quectel-CM [08-08_11:39:04:415] QConnectManager_Linux_V1.6.5 [08-08_11:39:04:416] Find /sys/bus/usb/devices/1-2.2 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x007 [08-08_11:39:04:416] Auto find qmichannel = /dev/cdc-wdm0 [08-08_11:39:04:417] Auto find usbnet_adapter = wwan0 [08-08_11:39:04:417] netcard driver = qmi_wwan_q, driver version = V1.2.6 [08-08_11:39:04:417] Modem works in QMI mode [08-08_11:39:04:447] cdc_wdm_fd = 7 [08-08_11:39:04:523] Get clientWDS = 5 [08-08_11:39:04:557] Get clientDMS = 1 [08-08_11:39:04:589] Get clientNAS = 2 [08-08_11:39:04:620] Get clientUIM = 1 [08-08_11:39:04:653] Get clientWDA = 1 [08-08_11:39:04:684] requestBaseBandVersion EM05CNFDR08A03M1G_ND [08-08_11:39:04:812] requestGetSIMStatus SIMStatus: SIM_READY [08-08_11:39:04:876] requestGetProfile[pdp:1 index:1] ctnet///0/IPV4V6 [08-08_11:39:04:908] requestRegistrationState2 MCC: 460, MNC: 11, PS: Attached, DataCap: LTE [08-08_11:39:04:940] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED [08-08_11:39:04:941] ip addr flush dev wwan0 [08-08_11:39:04:947] ip link set dev wwan0 down [08-08_11:39:05:003] requestSetupDataCall WdsConnectionIPv4Handle: 0x8723e530 [08-08_11:39:05:132] ip link set dev wwan0 up [08-08_11:39:05:141] No default.script found, it should be in '/usr/share/udhcpc/' or '/etc//udhcpc' depend on your udhcpc version! [08-08_11:39:05:142] busybox udhcpc -f -n -q -t 5 -i wwan0 udhcpc: started, v1.30.1 udhcpc: sending discover udhcpc: sending select for 10.21.181.66 udhcpc: lease of 10.21.181.66 obtained, lease time 7200 [08-08_11:39:05:282] ip -4 address flush dev wwan0 [08-08_11:39:05:286] ip -4 address add 10.21.181.66/30 dev wwan0 [08-08_11:39:05:292] ip -4 route add default via 10.21.181.65 dev wwan0 查看网卡信息 jetson@jetson-desktop:~$ ifconfig wwan0 wwan0: flags=193 mtu 1500 inet 10.21.181.66 netmask 255.255.255.252 inet6 fe80::5804:41ff:feda:ce83 prefixlen 64 scopeid 0x20 ether 5a:04:41:da:ce:83 txqueuelen 1000 (Ethernet) RX packets 9 bytes 2304 (2.3 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 22 bytes 1854 (1.8 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 连通性测试