2. 开发环境搭建:Ubuntu系统安装与配置、Git版本控制、交叉编译工具链安装、CMake与Makefile基础
说实话,飞控开发的第一步往往最劝退。我见过太多人卡在环境搭建上,代码写好了,编译不过,最后发现是工具链版本不对。这一章,咱们就把这些基础打牢。
本章核心目标:搭建一套可复现的飞控开发环境。你跟着我走一遍,以后换电脑也能半小时内恢复战斗力。
2.1 Ubuntu系统安装与配置
为什么选Ubuntu?因为PX4、ArduPilot这些主流飞控的官方构建环境都是基于Ubuntu的。你用Windows也能搞,但坑多。我个人习惯用Ubuntu 20.04 LTS,稳定,社区支持好。
2.1.1 系统安装要点
- 双系统 vs 虚拟机:如果你电脑性能还行,我建议直接双系统。虚拟机在USB转串口、实时性上会有小毛病。我曾经在虚拟机上调试飞控,串口数据总丢包,折腾了两天才发现是虚拟机USB passthrough的问题。
- 磁盘分区:至少给Ubuntu留80GB。飞控源码、编译中间文件、SDK加起来不小。我一般分三个区:
/30GB,/home剩下全给,swap8GB。 - 软件源:装完系统第一件事换国内源。阿里云、清华、中科大都可以。不然你apt install一个包,等半小时。
2.1.2 基础软件包安装
打开终端,执行以下命令。我习惯把这些基础包一次性装好,省得后面编译时缺这个缺那个。
sudo apt update
sudo apt upgrade -y
sudo apt install -y \
build-essential \
cmake \
git \
vim \
curl \
wget \
python3 \
python3-pip \
python3-venv \
ninja-build \
ccache
小技巧:ccache能缓存编译结果。你改了一行代码,重新编译时只编译改动的部分,链接时间能省一半。我项目里必开。
2.2 Git版本控制
飞控开发不是一个人能搞定的。Git是协作的基础。你想想看,没有版本控制,你怎么回滚?怎么对比两个版本的差异?
2.2.1 基础配置
装完Git,第一件事配用户名和邮箱。不然你commit的时候会报错。
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
git config --global core.editor vim
git config --global color.ui auto
2.2.2 工作流建议
我个人习惯用这个分支模型:
| 分支 | 用途 | 说明 |
|---|---|---|
main |
稳定发布版 | 只有经过测试的代码才能合并到这里 |
develop |
日常开发 | 所有功能分支从这里拉出 |
feature/xxx |
新功能 | 命名清晰,比如feature/imu-calib |
fix/xxx |
Bug修复 | 紧急修复直接从main拉hotfix分支 |
注意:不要在main分支上直接改代码。我曾经手快,在main上改了个参数,结果同事拉下来编译不过,整个团队等我回滚。嗯,从那以后我养成了分支保护的习惯。
2.2.3 常用命令速查
# 克隆仓库
git clone https://github.com/your-repo/firmware.git
# 创建并切换到新分支
git checkout -b feature/ekf-tuning
# 查看状态
git status
# 提交
git add .
git commit -m "feat: add EKF tuning parameters"
# 推送到远程
git push origin feature/ekf-tuning
# 合并develop到当前分支
git merge develop
2.3 交叉编译工具链安装
飞控的MCU通常是ARM Cortex-M系列。你在电脑上编译,生成的是ARM指令集的二进制文件,这叫交叉编译。说白了,就是在一个架构上生成另一个架构的代码。
2.3.1 安装arm-none-eabi-gcc
我推荐用ARM官方的GCC工具链。别用apt源里的老版本,坑多。
# 下载最新版(以2024年为例)
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
# 解压到/opt
sudo tar xjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 -C /opt/
# 添加环境变量
echo 'export PATH=$PATH:/opt/gcc-arm-none-eabi-10.3-2021.10/bin' >> ~/.bashrc
source ~/.bashrc
# 验证安装
arm-none-eabi-gcc --version
验证输出示例:
arm-none-eabi-gcc (GNU Arm Embedded Toolchain 10.3-2021.10) 10.3.1 20210824 (release)
Copyright (C) 2020 Free Software Foundation, Inc.
2.3.2 常见问题
- 权限问题:解压到
/opt需要sudo。你也可以解压到~/tools,省去权限麻烦。 - 版本冲突:系统可能自带
gcc-arm-none-eabi,但版本太老。我建议用绝对路径调用,或者在~/.bashrc里把自定义路径放在前面。 - 32位库缺失:如果你用的是64位系统,可能需要安装32位兼容库:
sudo apt install lib32z1 lib32ncurses5。
2.4 CMake与Makefile基础
飞控项目动辄几百个源文件,手动编译不现实。CMake负责生成构建系统,Makefile负责执行编译。你想想看,没有它们,你怎么管理依赖关系?
2.4.1 CMake入门
一个最简单的CMakeLists.txt长这样:
cmake_minimum_required(VERSION 3.10)
project(Firmware VERSION 1.0.0 LANGUAGES C CXX)
# 设置C标准
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
# 添加可执行文件
add_executable(firmware.elf
src/main.c
src/imu.c
src/control.c
)
# 添加头文件路径
target_include_directories(firmware.elf PRIVATE
include
third_party/FreeRTOS/include
)
# 链接库
target_link_libraries(firmware.elf PRIVATE
m
cmsis_core
)
编译步骤:
mkdir build
cd build
cmake ..
make -j4
个人经验:我习惯在CMakeLists.txt里加一个option(ENABLE_DEBUG "Enable debug output" OFF),这样调试时开,发布时关,不用改代码。
2.4.2 Makefile基础
虽然CMake是主流,但有些老项目还在用纯Makefile。你得看得懂。
# 编译器
CC = arm-none-eabi-gcc
CFLAGS = -mcpu=cortex-m4 -mthumb -O2 -Wall
# 源文件
SRCS = main.c imu.c control.c
OBJS = $(SRCS:.c=.o)
# 目标
TARGET = firmware.elf
# 链接脚本
LINKER_SCRIPT = stm32f4.ld
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -T $(LINKER_SCRIPT) -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
clean:
rm -f $(OBJS) $(TARGET)
.PHONY: all clean
2.4.3 CMake vs Makefile 对比
| 特性 | CMake | Makefile |
|---|---|---|
| 跨平台 | 原生支持 | 需要手动适配 |
| 依赖管理 | 自动 | 手动 |
| 学习曲线 | 中等 | 简单 |
| 大型项目 | 推荐 | 不推荐 |
| 调试支持 | 内置 | 需额外配置 |
2.5 本章知识体系
下面这张图概括了本章的核心逻辑。你跟着这个流程走,环境搭建不会乱。
重要提醒:环境搭建完成后,建议你做一个完整的编译测试。随便找一个飞控源码(比如PX4的Firmware仓库),执行一次完整编译。如果顺利通过,说明环境没问题。如果报错,仔细看错误信息,90%的问题出在工具链路径或依赖缺失上。