3、开发环境搭建:交叉编译工具链安装、刷机与系统烧录、SSH远程连接与文件传输、Python与C++环境配置

好,咱们正式开始动手了。这一章,说白了就是给边缘设备“注入灵魂”的过程。很多新手拿到开发板,第一反应是“插电,亮灯,完事”。但真正做算法部署,你得先让电脑和板子能“对话”,让板子能跑你写的代码。

我个人习惯把这一步叫做“基建工程”。地基没打好,后面全是坑。我见过太多项目,卡在环境配置上好几天,最后发现是交叉编译链版本不对。嗯,咱们今天就把这些坑一个个填平。

3.1 交叉编译工具链:为什么不能直接在板子上编译?

你可能会问:“我直接在树莓派或者Jetson上写代码、编译不行吗?”

行,但效率极低。边缘设备的CPU性能有限,编译一个稍微大点的C++项目,可能得等半小时。而你的电脑,可能几分钟就搞定了。

交叉编译,就是在你的电脑(x86架构)上,生成目标设备(ARM架构)能运行的二进制文件。说白了,就是“借鸡生蛋”。

3.1.1 安装交叉编译工具链

以ARM架构的Linux设备为例(比如RK3588、树莓派、Jetson Nano),常用的工具链是 gcc-arm-linux-gnueabihfaarch64-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)、烧录工具(如 balenaEtcherWin32DiskImagerdd 命令)。

3.2.2 烧录步骤(以SD卡为例)

  1. 将SD卡插入读卡器,连接到电脑。
  2. 打开烧录工具,选择镜像文件,选择SD卡,点击“烧录”。
  3. 等待进度条走完。嗯,这个过程大概5-10分钟,可以去喝杯咖啡。
  4. 烧录完成后,将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密钥登录,省去每次输密码的麻烦。
ssh-keygen -t rsa -b 4096
ssh-copy-id username@192.168.1.100

3.3.2 文件传输

你需要把编译好的程序、模型文件、数据集传到板子上。常用的工具有 scprsync

# 从电脑传到板子
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环境配置

我建议使用 condaminiconda 来管理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
注意: 边缘设备通常是ARM架构,很多Python包的官方源可能没有预编译的ARM版本。这时候需要从源码编译,或者使用第三方源(如 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: 选项,最后才考虑源码编译。

好了,环境搭建这一步走完,你的开发板就已经“武装”好了。下一章,咱们开始真正接触视觉算法的部署流程。到时候你会发现,前面这些准备工作,都是值得的。