1. 项目缘起:为什么从Jetson Nano开始
如果你和我一样,对边缘计算、机器人或者嵌入式AI开发感兴趣,那么Jetson Nano这个名字你一定不陌生。作为英伟达推出的入门级AI边缘计算平台,它凭借相对亲民的价格和强大的CUDA生态,成为了无数开发者、学生和创客踏入这个领域的第一块“敲门砖”。我最初选择它,也是看中了其官方宣传的“开箱即用”和丰富的社区资源,心想,有英伟达背书,跑个YOLO、部署个TensorRT模型,应该不会太难吧?
然而,现实很快就给我上了一课。从拿到那块小巧的开发板,到成功点亮第一个AI推理Demo,中间经历的曲折远超我的预期。这绝不是一个简单的“插电即用”过程,而是一场充满了版本冲突、驱动缺失、环境配置和性能调优的“硬核”探险。网上能找到的教程很多,但要么是过时的,要么是语焉不详的“一键脚本”,真正能帮你从零开始、理清脉络、避开所有坑的完整记录却很少。因此,我决定把这段“踩坑”历程系统地记录下来,这不仅仅是我的个人笔记,更希望能成为后来者的一张“避坑地图”。本系列的第一集,我们将聚焦在最基础,也最让人头疼的环节:系统烧录、基础环境搭建与第一次开机配置。别小看这些步骤,它们直接决定了你后续所有开发工作的稳定性和效率。
2. 开箱与硬件准备:别急着上电
拿到Jetson Nano开发板(这里以4GB版本为例)后,先别急着接通电源。硬件上的几个小细节,如果忽略,可能会导致无法开机或者性能严重受限。
2.1 核心供电选择:Micro USB还是DC Barrel Jack?
Jetson Nano有两个电源接口:一个是常见的Micro USB(J48),另一个是圆口的DC Barrel Jack(J25)。官方文档和许多教程会告诉你,Micro USB(5V/2A)供电只能用于“低功耗模式”,而DC Barrel Jack(5V/4A)才能解锁“10W模式”,获得完整的CPU和GPU性能。
注意:这里的“模式”切换不是一个软件开关,而是由物理跳线帽(J48旁边的“J48 Power Select”跳线)决定的。如果你使用Micro USB供电,跳线帽必须连接在“USB”一侧的引脚上;如果使用DC Barrel Jack供电,跳线帽必须连接在“J48”一侧的引脚上。很多新手开机没反应或者系统极卡,第一步就应该检查这个跳线帽的位置是否正确。我个人强烈建议,永远使用DC Barrel Jack配合5V/4A以上的电源适配器,并将跳线帽设置在“J48”位置。Micro USB供电仅适用于绝对轻量级的测试,任何涉及摄像头、GPU运算的任务都可能因供电不足导致系统重启。
2.2 散热与外壳:必要的投资
Jetson Nano在满载运行时发热量不小,尤其是GPU部分。裸板运行几分钟后,手摸上去就会感到烫手。长期高温会触发降频,导致性能下降,甚至影响硬件寿命。因此,一个带有主动散热风扇的外壳是必需品,而不是装饰品。市面上有很多第三方散热方案,选择时注意风扇的供电接口(通常是板上的“FAN”引脚)和噪音控制即可。
2.3 存储介质:SD卡的速度至关重要
Jetson Nano没有内置eMMC,系统完全运行在SD卡上。这意味着SD卡的读写速度直接决定了系统启动、软件安装、模型加载等一切I/O操作的性能。绝对不要使用手边闲置的、低速的Class 4或Class 10 SD卡。请至少选择UHS-I U3 / V30及以上规格的Micro SD卡,容量建议32GB或64GB。A1/A2级别的应用性能等级也对随机读写有帮助。一张高速卡和一张低速卡,在实际使用中的体验差异是天壤之别。
3. 系统烧录:从镜像下载到第一次启动
这是踩坑的“重灾区”,每一步都可能遇到问题。
3.1 官方镜像的选择与下载
前往英伟达官方网站的Jetson Nano下载页面,你会发现有多个版本的SDK Manager和系统镜像。对于新手,我建议绕开复杂的SDK Manager(它更适合批量烧录和多板卡管理),直接使用预烧录的系统镜像。找到“Jetson Nano Developer Kit SD Card Image”的下载链接,通常会对应特定的JetPack版本(如JetPack 4.6, 4.6.1等)。
关键决策点:JetPack版本。JetPack是英伟达为Jetson系列打包的软件开发套件,包含了操作系统(Ubuntu)、CUDA、cuDNN、TensorRT、OpenCV等所有核心组件。版本并非越新越好。你需要考虑你的项目所依赖的深度学习框架(如PyTorch, TensorFlow)是否有针对特定JetPack版本的预编译轮子(wheel)。例如,早期一些框架对JetPack 4.4/4.5支持较好,而新框架可能需要JetPack 4.6+。在开始前,最好先调研一下你目标工具的版本兼容性矩阵。我本次记录基于JetPack 4.6.1,这是一个相对稳定且生态支持较广的版本。
3.2 烧录工具与操作
下载到的通常是一个压缩包(如jetson-nano-sd-card-image.zip),解压后得到一个.img文件。在Windows下,推荐使用BalenaEtcher,它界面简洁,自动校验,不易出错。在macOS或Linux下,除了Etcher,也可以使用dd命令,但需要格外小心设备名(如/dev/sdb)不要选错,否则会清空你的硬盘。
烧录过程大约需要10-30分钟,取决于你的SD卡和读卡器速度。烧录完成后,不要急着弹出SD卡。在Windows下,系统可能会提示你格式化SD卡,因为Etcher烧录后,SD卡会被分成多个Windows无法识别的分区(如Linux的ext4分区)。务必点击“取消”,千万不要格式化!
3.3 首次启动与基础配置
将烧录好的SD卡插入Jetson Nano,连接显示器(通过HDMI或DP)、键盘鼠标,最后接通电源。第一次启动会进行系统初始化,这个过程比较慢,请耐心等待。
首先进入的是系统配置界面(OOBE)。这里有几个关键步骤:
- 语言和时区:按需选择。
- 用户名、密码、计算机名:建议设置一个简单易记的密码,后续通过SSH操作会频繁用到。
- 磁盘分区:选择“使用整个磁盘”即可。
- 组件安装:这一步会安装CUDA, cuDNN, TensorRT, OpenCV等核心组件。务必确保网络连接稳定!整个过程可能需要半小时到一小时,如果中途断网,会导致组件安装不全,后患无穷。
安装完成后,系统会自动重启,进入Ubuntu桌面环境。恭喜,你已经成功跨过了第一道门槛。
4. 初始系统优化与必做设置
进入桌面后,先别急着写代码。进行以下几项优化,能极大提升后续的开发体验。
4.1 更换软件源
默认的Ubuntu软件源服务器在国外,更新和安装软件速度极慢。我们需要将其替换为国内镜像源,如阿里云、清华源等。
# 备份原文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak # 编辑源文件,将http://ports.ubuntu.com替换为镜像地址 sudo nano /etc/apt/sources.list将文件内所有http://ports.ubuntu.com/ubuntu-ports/替换为https://mirrors.aliyun.com/ubuntu-ports/或https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/。
然后更新软件列表:
sudo apt update4.2 扩展交换空间(Swap)
Jetson Nano 4GB版本的内存对于AI应用来说相当紧张。当物理内存不足时,系统会使用硬盘上的交换空间。默认的交换空间(2GB)可能不够,我们可以将其扩大。
# 关闭当前交换文件 sudo swapoff /swapfile # 调整交换文件大小,这里设置为4GB (4096MB) sudo fallocate -l 4G /swapfile # 设置正确的权限 sudo chmod 600 /swapfile # 将其格式化为交换分区 sudo mkswap /swapfile # 启用新的交换文件 sudo swapon /swapfile为了让修改永久生效,还需要编辑/etc/fstab文件,确保其中关于swap的行指向正确的文件(通常是/swapfile)。
4.3 设置高性能模式
如前所述,确保你的电源跳线帽设置在“J48”(使用DC电源),然后在系统中开启最大性能模式。
# 安装管理工具(如果尚未安装) sudo apt install -y jetson-io # 设置最大性能模式(10W) sudo nvpmodel -m 0 # 查看当前模式 sudo nvpmodel -q模式0是最大性能模式(10W),模式1是低功耗模式(5W)。同时,可以设置风扇为持续转动,确保散热:
sudo sh -c 'echo 255 > /sys/devices/pwm-fan/target_pwm'4.4 安装基础开发工具
安装一些后续开发必备的工具包:
sudo apt update sudo apt install -y \ python3-pip \ python3-dev \ python3-venv \ git \ curl \ wget \ htop \ vim对于Python包管理,强烈建议使用虚拟环境,避免污染系统Python环境。可以使用venv:
python3 -m venv ~/myenv source ~/myenv/bin/activate # 之后安装的python包都会在这个独立环境中5. 核心组件验证:CUDA, cuDNN, TensorRT
系统装好了,优化也做了,现在需要验证英伟达的核心组件是否安装正确。这是后续所有AI应用的基础。
5.1 验证CUDA
CUDA是英伟达GPU计算的基石。在终端输入:
nvcc -V如果安装正确,你会看到CUDA的版本信息(如10.2)。同时,也可以使用:
nvidia-smi这个命令会显示一个监控界面,列出GPU型号(Jetson Nano)、驱动版本、CUDA版本以及当前的GPU使用情况。看到这个界面,基本说明GPU驱动和CUDA运行时是正常的。
5.2 验证cuDNN
cuDNN是深度神经网络加速库。验证它需要查看头文件和库文件。通常,JetPack会将其安装在/usr/include和/usr/lib/aarch64-linux-gnu下。
# 查找cuDNN头文件 find /usr/include -name "cudnn*.h" # 查找cuDNN库文件 find /usr/lib/aarch64-linux-gnu -name "libcudnn*"更直接的验证方法是使用Python(如果你安装了nvidia-pyindex中的cudnn包),或者在C++程序中包含头文件进行编译测试。对于大多数Python开发者,只要后续能成功导入tensorrt或运行依赖cuDNN的框架(如PyTorch),就说明其工作正常。
5.3 验证TensorRT
TensorRT是英伟达的高性能深度学习推理SDK,是Jetson的灵魂。验证TensorRT最直接的方式是检查其Python包。
python3 -c "import tensorrt; print(tensorrt.__version__)"如果成功输出版本号(如7.1.3),恭喜你,TensorRT安装成功。你也可以运行一个官方的示例来验证:
cd /usr/src/tensorrt/samples/sampleMNIST sudo make cd ../../bin/ ./sample_mnist如果能看到成功运行并输出推理结果,说明TensorRT的编译器和运行时环境都是完好的。
6. 第一个AI应用:跑通Jetson Inference示例
理论学习再多,不如实际跑一个Demo。英伟达官方维护的jetson-inference项目是一个极佳的起点,它封装了图像识别、目标检测、语义分割等常见任务的推理流程,并且自带预训练模型。
6.1 克隆与编译项目
# 安装编译依赖 sudo apt install -y \ cmake \ libpython3-dev \ python3-numpy # 克隆项目(建议在home目录下操作) cd ~ git clone --recursive https://github.com/dusty-nv/jetson-inference cd jetson-inference # 创建并进入构建目录 mkdir build cd build # 配置CMake。这里使用默认设置,会下载一些预训练模型(需要网络) cmake ../ # 开始编译,这个过程比较耗时(约30-60分钟) make -j$(nproc) # 安装(将库文件和Python包安装到系统) sudo make install sudo ldconfig编译过程中,CMake会提示你下载模型。如果网络不畅,可能会导致下载失败。你可以选择跳过(按Enter),后续再手动下载,或者耐心重试。
6.2 运行图像识别Demo
编译安装完成后,最简单的方式是使用项目提供的Python脚本。
# 激活你的Python虚拟环境(如果你使用了的话) source ~/myenv/bin/activate # 运行一个对图片进行ImageNet分类的例子 cd ~/jetson-inference/python/examples python3 imagenet.py --model=resnet18 /path/to/your/image.jpg /path/to/output.jpg例如,你可以用系统自带的图片:
python3 imagenet.py --model=resnet18 /usr/share/backgrounds/gnome/adwaita-day.jpg output.jpg程序会加载ResNet-18模型,对图片进行推理,并在终端输出识别出的类别及其置信度,同时生成一张带有标签的输出图片。如果这一步成功了,说明你的整个AI软件栈(从驱动、CUDA、cuDNN到TensorRT和Python绑定)已经全部打通。
6.3 尝试实时摄像头检测
Jetson Nano的强大之处在于实时处理。连接一个USB摄像头或CSI摄像头,运行目标检测Demo:
# 使用SSD-Mobilenet-v2模型进行实时检测 python3 detectnet.py --model=ssd-mobilenet-v2 csi://0 # 使用CSI摄像头 # 或者 python3 detectnet.py --model=ssd-mobilenet-v2 /dev/video0 # 使用USB摄像头如果摄像头连接正确,你应该会看到一个实时窗口,画面中的物体(如人、汽车、狗等)会被框出并标注。第一次运行会加载模型,稍慢一些,后续帧率会稳定下来。这是你与Jetson Nano AI能力的第一次“实时对话”。
7. 常见问题排查与解决思路
即便按照步骤操作,你也可能会遇到一些问题。这里汇总一些典型“坑点”及其解决思路。
7.1 开机无显示或卡在Logo界面
- 检查供电:确认使用5V/4A以上电源,跳线帽位置正确(DC供电对应“J48”)。
- 检查SD卡:重新烧录镜像,确保使用Etcher等可靠工具,SD卡质量过关。
- 检查显示器:尝试不同的HDMI线或显示器接口。有些显示器可能需要特定的分辨率/刷新率支持。
7.2sudo apt update或安装软件失败
- 网络问题:确保网络连接正常,特别是如果使用了代理,需要在
/etc/apt/apt.conf.d/中配置代理。 - 软件源问题:检查
/etc/apt/sources.list文件中的镜像源地址是否正确,可以尝试换一个源(如从阿里云换到清华源)。 - 空间不足:使用
df -h命令查看根目录空间,确保有足够空间(至少2-3GB空闲)进行系统更新。
7.3 运行AI Demo时报错“CUDA error”或“TensorRT error”
- 组件版本不匹配:这是最棘手的问题。确保你使用的深度学习框架(PyTorch/TensorFlow)版本与JetPack中的CUDA、cuDNN版本兼容。对于JetPack 4.6.1(CUDA 10.2),需要寻找对应版本的框架轮子。
- 模型格式问题:
jetson-inference项目使用的模型是特定的TensorRT序列化引擎(.engine文件)或ONNX格式。确保你使用的模型路径和格式正确。首次运行时会自动转换,需要网络下载相关文件。 - 内存不足:运行
htop命令查看内存和交换空间使用情况。如果物理内存和交换空间都接近耗尽,程序会崩溃。尝试增大交换空间(见4.2节),或者使用更轻量级的模型。
7.4 摄像头无法识别
- CSI摄像头:确认摄像头排线插入方向正确(蓝色一面通常朝向板子外侧),并插紧。使用命令
ls /dev/video*查看设备节点。 - USB摄像头:同样使用
ls /dev/video*查看。尝试不同的USB接口。有些USB3.0摄像头在USB2.0接口上可能工作不正常。 - GStreamer管道问题:
jetson-inference使用GStreamer处理视频流。CSI摄像头通常使用csi://0,USB摄像头使用/dev/video0。如果报GStreamer相关错误,尝试安装或重新安装GStreamer插件:sudo apt install gstreamer1.0-tools gstreamer1.0-plugins-good。
7.5 系统运行缓慢,风扇狂转
- 检查运行模式:使用
sudo nvpmodel -q确认当前运行在模式0(MAX-N)。 - 监控资源:使用
htop和nvidia-smi监控CPU、内存和GPU使用率,找出占用资源的进程。 - 散热问题:触摸散热片是否过热。确保风扇正常工作,并且外壳通风良好。可以考虑在
/etc/rc.local中添加开机启动风扇全速的命令。
走到这里,你的Jetson Nano应该已经是一个可以稳定运行基础AI应用的开发平台了。这个过程看似繁琐,但每一步的“坑”都有其背后的原因——电源管理、存储性能、系统依赖、组件兼容性。把这些基础打牢,后续在部署自定义模型、进行多传感器融合、优化推理性能时,才能避免更多复合型的问题。第一集的踩坑记录就到这里,下一篇我们将深入另一个“深水区”:在Jetson Nano上为特定版本的PyTorch或TensorFlow编译安装依赖,以及将自定义的ONNX模型转换为TensorRT引擎并部署。那将是真正将Jetson Nano用于自己项目的开始,坑只会更多,但也更有趣。