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 剩下全给,swap 8GB。
  • 软件源:装完系统第一件事换国内源。阿里云、清华、中科大都可以。不然你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 本章知识体系

下面这张图概括了本章的核心逻辑。你跟着这个流程走,环境搭建不会乱。

开发环境搭建知识体系 开发环境搭建知识体系 飞控开发环境搭建 Ubuntu系统 Git版本控制 交叉编译工具链 CMake/Makefile Ubuntu配置要点 • 双系统/虚拟机选择 • 磁盘分区建议 • 国内软件源配置 • 基础包安装 Git工作流 • 分支模型(main/develop/feature) • 常用命令速查 • 分支保护策略 • 协作规范 arm-none-eabi-gcc • 官方工具链下载 • 环境变量配置 • 版本验证 • 常见问题排查 构建系统 • CMakeLists.txt编写 • Makefile基础语法 • 编译流程 • 对比与选择 可复现的飞控开发环境

重要提醒:环境搭建完成后,建议你做一个完整的编译测试。随便找一个飞控源码(比如PX4的Firmware仓库),执行一次完整编译。如果顺利通过,说明环境没问题。如果报错,仔细看错误信息,90%的问题出在工具链路径或依赖缺失上。