3、开发环境搭建:交叉编译工具链安装、刷机与系统烧录、SSH远程连接与文件传输、Python与C++环境配置
好,咱们正式开始动手了。这一章,说白了就是给边缘设备“注入灵魂”的过程。很多新手拿到开发板,第一反应是“插电,亮灯,完事”。但真正做算法部署,你得先让电脑和板子能“对话”,让板子能跑你写的代码。
我个人习惯把这一步叫做“基建工程”。地基没打好,后面全是坑。我见过太多项目,卡在环境配置上好几天,最后发现是交叉编译链版本不对。嗯,咱们今天就把这些坑一个个填平。
3.1 交叉编译工具链:为什么不能直接在板子上编译?
你可能会问:“我直接在树莓派或者Jetson上写代码、编译不行吗?”
行,但效率极低。边缘设备的CPU性能有限,编译一个稍微大点的C++项目,可能得等半小时。而你的电脑,可能几分钟就搞定了。
交叉编译,就是在你的电脑(x86架构)上,生成目标设备(ARM架构)能运行的二进制文件。说白了,就是“借鸡生蛋”。
3.1.1 安装交叉编译工具链
以ARM架构的Linux设备为例(比如RK3588、树莓派、Jetson Nano),常用的工具链是 gcc-arm-linux-gnueabihf 或 aarch64-linux-gnu-gcc。
安装命令很简单:
# 32位ARM
sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
# 64位ARM(aarch64)
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
aarch64-linux-gnu-gcc --version 看一眼,确保是较新的版本。
3.1.2 验证工具链是否可用
写一个最简单的Hello World,交叉编译试试:
// hello.cpp
#include <iostream>
int main() {
std::cout << "Hello from Edge Device!" << std::endl;
return 0;
}
# 编译
aarch64-linux-gnu-g++ hello.cpp -o hello_arm
# 查看文件信息
file hello_arm
# 输出应该包含:ELF 64-bit LSB executable, ARM aarch64
看到 ARM aarch64 字样,说明你成功了。把这个文件传到板子上,就能直接运行。
./hello_arm,会报错“无法执行二进制文件”。因为架构不同,电脑不认识ARM的指令。
3.2 刷机与系统烧录:给板子装上操作系统
拿到一块全新的开发板,第一件事就是烧录系统。这就像给电脑装Windows一样,但步骤更“原始”一些。
3.2.1 准备工作
- 硬件: 开发板、MicroSD卡(或eMMC模块)、读卡器、电源线。
- 软件: 系统镜像文件(.img)、烧录工具(如
balenaEtcher、Win32DiskImager或dd命令)。
3.2.2 烧录步骤(以SD卡为例)
- 将SD卡插入读卡器,连接到电脑。
- 打开烧录工具,选择镜像文件,选择SD卡,点击“烧录”。
- 等待进度条走完。嗯,这个过程大概5-10分钟,可以去喝杯咖啡。
- 烧录完成后,将SD卡插入开发板,上电启动。
我常用的烧录方式: 在Linux下直接用 dd 命令,速度最快,也最稳定。
sudo dd if=ubuntu-22.04-preinstalled-server-arm64.img of=/dev/sdb bs=4M status=progress
注意:/dev/sdb 是你的SD卡设备名,千万别搞错,否则会清空你的硬盘数据!
3.2.3 第一次启动与配置
板子启动后,通常需要设置用户名、密码、网络等。我个人习惯第一时间做两件事:
- 更新软件源:
sudo apt update && sudo apt upgrade -y - 开启SSH服务:
sudo systemctl enable ssh && sudo systemctl start ssh
这样,你就能远程连接了,不用每次都插显示器和键盘。
3.3 SSH远程连接与文件传输:告别显示器和键盘
做算法部署,你不可能一直把显示器和键盘插在板子上。SSH就是你的远程“遥控器”。
3.3.1 连接板子
确保电脑和板子在同一个局域网内。找到板子的IP地址(可以在路由器后台看,或者在板子上执行 ifconfig)。
ssh username@192.168.1.100
输入密码,你就进入了板子的终端。从现在开始,所有操作都可以在电脑上完成。
ssh-keygen -t rsa -b 4096
ssh-copy-id username@192.168.1.100
3.3.2 文件传输
你需要把编译好的程序、模型文件、数据集传到板子上。常用的工具有 scp 和 rsync。
# 从电脑传到板子
scp ./hello_arm username@192.168.1.100:/home/username/
# 从板子传到电脑
scp username@192.168.1.100:/home/username/output.txt ./
# 用rsync同步整个目录(推荐,支持断点续传)
rsync -avz ./my_project/ username@192.168.1.100:/home/username/my_project/
我个人更偏爱 rsync,尤其是传输大文件或大量小文件时,速度比 scp 快不少,而且不怕中断。
3.4 Python与C++环境配置:算法部署的“双引擎”
边缘设备上的算法部署,通常有两种路径:
- Python: 快速原型验证,调用现成的推理框架(如ONNX Runtime、TensorRT、OpenCV)。
- C++: 追求极致性能,部署到生产环境。
3.4.1 Python环境配置
我建议使用 conda 或 miniconda 来管理Python环境,避免包冲突。
# 在板子上安装miniconda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh
bash Miniconda3-latest-Linux-aarch64.sh
# 创建虚拟环境
conda create -n deploy python=3.8
conda activate deploy
# 安装常用库
pip install numpy opencv-python onnxruntime
https://github.com/Qengineering 提供的预编译包)。我曾经在Jetson上装 opencv-python,直接 pip install 失败,最后不得不从源码编译,花了整整一下午。
3.4.2 C++环境配置
C++环境相对简单,主要是安装编译器和依赖库。
# 安装基础工具
sudo apt install build-essential cmake git
# 安装常用库
sudo apt install libopencv-dev libeigen3-dev libboost-all-dev
然后,你就可以用交叉编译工具链来编译C++代码了。写一个简单的CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(DeployDemo)
set(CMAKE_CXX_STANDARD 11)
find_package(OpenCV REQUIRED)
add_executable(main main.cpp)
target_link_libraries(main ${OpenCV_LIBS})
编译时,指定工具链文件:
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake ..
make
其中 toolchain.cmake 文件内容大致如下:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
我的经验: 在C++项目中,尽量使用静态链接(-static)或者将动态库一起打包。否则,板子上可能缺少某些库文件,导致程序运行时报错“cannot open shared object file”。我曾经在部署一个模型推理程序时,就是因为忘了打包 libnvinfer.so,在客户现场折腾了俩小时。
3.5 避坑指南:我踩过的那些坑
- 工具链版本不匹配: 板子上的系统是Ubuntu 20.04,你电脑上的工具链却是针对Ubuntu 18.04编译的,可能会导致
glibc版本冲突。解决办法:在板子上用ldd --version查看glibc版本,然后选择对应的工具链。 - SSH连接超时: 板子IP变了,或者防火墙没关。我建议在路由器上给板子设置静态IP,一劳永逸。
- Python包安装失败: 优先使用
conda,其次尝试pip的--only-binary :all:选项,最后才考虑源码编译。
好了,环境搭建这一步走完,你的开发板就已经“武装”好了。下一章,咱们开始真正接触视觉算法的部署流程。到时候你会发现,前面这些准备工作,都是值得的。