Ubuntu 20.04 + Linux工程基础:无人机开发环境搭建实战指南
2026/9/6 10:28:51 网站建设 项目流程

很多朋友一进无人机开发这个领域,第一反应就是去背飞控代码、看论文、调参。结果折腾了大半个月,发现自己还卡在一堆乱七八糟的环境问题上:固件编不过、仿真起不来、地面站连不上飞控、串口权限报错。这个“Module 3:Ubuntu 20.04 + Linux 工程基础——无人机软件开发环境”要解决的,恰恰就是这些问题。它不是教你怎么写飞控,而是先把你的开发环境、工程习惯、工具链能力全部夯实,让后面的烧录、仿真、真机调试不至于寸步难行。这篇文章我会按自己带项目时实际用到的整套流程,把环境搭建、核心命令、工程化技能、无人机开发专属组件一次讲清楚。

1. 为什么无人机软件开发要从 Ubuntu 20.04 和 Linux 打底

不少新手会问,无人机飞控的代码不是有Windows版本的地面站工具吗,为什么非要折腾Linux?这个问题问得很好,也恰恰是理解这个模块价值的关键。

1.1 无人机软件栈到底长什么样

一套完整的无人机系统,软件部分大概可以分成六层。最底层是硬件,包括飞控板(STM32、Zynq这类MCU/SoC)、机载电脑(树莓派、NVIDIA Jetson)、传感器(IMU、GPS、相机)、执行机构(电调、电机)。硬件上面跑的是实时固件,比如PX4、ArduPilot,它们负责姿态解算、电机控制这类对实时性要求极高的任务。再往上是机载电脑上的操作系统,绝大多数情况就是Linux,通常还是Ubuntu。在操作系统之上,我们会装中间件和通信协议栈,主要就是ROS、MAVLink、MAVSDK这些。再往上是应用开发层,比如视觉避障、目标识别、航线规划、编队控制。最后还有一个地面站软件,像QGroundControl,用来做飞行监控、参数调整和日志分析。

你会发现,除了最底层的MCU固件,从机载电脑的操作系统到中间件,再到应用开发和地面站工具,整条技术栈都深度依赖Linux。所以把Ubuntu环境玩熟了,等于把无人机开发的下半身基础打牢了。这个模块在整条学习路线里的位置,就是承上启下——上接开发板、传感器,下接ROS、PX4、仿真这些后续学习内容。

1.2 为什么是 Ubuntu 20.04 而不是 22.04 或 24.04

很多人会疑惑,既然要装新系统,为什么不直接上最新版?我的回答很直接:无人机开发里的很多工具链,不是越新越好,而是“生态兼容”最好。

Ubuntu 20.04是LTS版本,官方支持到2030年,这意味着长期维护和稳定更新。更重要的是,ROS Noetic这个版本是官方绑定Ubuntu 20.04的,而ROS Noetic目前仍然是无人机、机器人教学和科研项目中使用频率最高的中间件版本。PX4官方文档里大量编译指令、仿真教程也是默认在Ubuntu 20.04上验证过的。一旦你换到22.04,Python默认版本变了,很多二进制依赖的编译选项也跟着变,你自己排查这些问题的时间成本会非常高。所以我给团队和学生的建议都是:先用20.04跑通全流程,以后如果项目有硬性要求再迁移。

1.3 虚拟机、双系统、WSL 到底选哪个

搭建Linux环境通常有三条路:双系统、虚拟机、WSL。我直接用一张表把它们的差别列出来。

方案系统性能USB/串口支持安装难度适用阶段
双系统性能最好原生支持较高,需要分区真机调试、整机开发
虚拟机性能有损耗需要额外USB映射配置较低日常学习、代码编译、仿真
WSL性能较好对串口/USB设备支持不完善纯命令学习、简单编译

如果你手头是一台配置普通的电脑,我的建议是初期先用虚拟机。原因很实际:虚拟机里玩坏了可以直接快照回滚,不用重装系统,这对新手极其友好。等到你准备接真机、刷飞控固件、用串口和USB设备时,再装双系统也不迟。WSL我一般只推荐给想快速学Linux命令的人,真做无人机开发不要指望它,串口设备映射和图形化仿真用起来太痛苦。

2. 搭建 Linux 工程环境的完整实操记录

这一部分我按自己给团队搭建环境的流程来讲,从VMware安装Ubuntu 20.04开始,到系统初始化和常用命令,全程按步骤执行。

2.1 用 VMware 安装 Ubuntu 20.04 的详细步骤

第一步,下载Ubuntu 20.04的ISO镜像。这里建议找官方源或国内镜像源下载,版本号带“Desktop”字样,用20.04.6这个后续维护版更稳。第二布,打开VMware,新建虚拟机,选择“典型”安装,然后选择“稍后安装操作系统”,客户机操作系统选“Linux”,版本选“Ubuntu 64位”。第三步,给虚拟机取名并设置安装位置,建议放到SSD盘符下,磁盘性能直接影响编译速度。第四步,分配硬件资源,我建议至少4核CPU、8GB内存、80GB磁盘。很多朋友一开始给20GB觉得自己够了,结果编译PX4时发现源码加编译缓存加仿真模型动辄三四十G,最后卡在磁盘满上,非常难受。

接下来编辑虚拟机设置,在CD/DVD那里挂载你下载的ISO镜像,同时确认网络适配器是NAT模式,然后启动虚拟机。系统安装界面里,语言选英文或中文都可以,关键是键盘布局选English (US)。分区那一步选择“Erase disk and install Ubuntu”就行,这个disk指的是虚拟机内部的虚拟磁盘,不会影响你Windows里的任何数据。设置用户名和密码后,等待安装完成重启,一个基础的Ubuntu 20.04就装好了。

有一点必须提醒:如果你电脑内存只有8G,虚拟机的内存分配别超过4G,否则宿主机卡到连鼠标都拖不动。如果你有16G内存,分配给虚拟机8G是合理值。另外,虚拟机磁盘建议选“将虚拟磁盘存储为单个文件”,性能和后续迁移都更省心。

2.2 装好系统后的第一轮初始化配置

装完系统先别急着装各种软件,按下面顺序来。先把软件源换成国内镜像源,因为默认源在国外,apt下载依赖会慢到怀疑人生。打开终端,执行以下命令备份并替换源:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list sudo sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list sudo apt update

换好源之后,安装VMware Tools。新版VMware推荐用open-vm-tools,它能解决虚拟机分辨率自适应、剪贴板共享、文件拖拽等功能。直接执行:

sudo apt update && sudo apt upgrade -y sudo apt install -y open-vm-tools open-vm-tools-desktop

装完后重启虚拟机,你会发现分辨率能自动适配窗口大小了。接下来安装开发和调试常用工具,命令如下:

sudo apt install -y build-essential git curl wget vim net-tools terminator htop

build-essential包含gcc、g++、make等编译必需组件,git做版本管理,vim是终端编辑器,terminator是一个支持多标签的终端工具,我用它同时开着编译窗口和日志窗口,效率高很多。如果你习惯图形界面输中文,建议装搜狗输入法Linux版或fcitx框架,注意安装后必须在系统设置里的“Region & Language”中把输入法框架切到fcitx,否则切不出来。

2.3 文件系统和终端高频命令速查

Linux文件系统结构很像一栋房子,你得先知道什么东西放在哪个房间。根目录/是整栋楼,/usr是公共仓库,大部分系统软件都装在这里;/etc是全屋的配电箱和配置中心,系统服务的配置都在这里;/home是每个用户自己的房间;/var是随时更新的信箱和日志房;/tmp是临时杂物间,重启会清空。理解这个结构后,你在终端里找东西就不会懵。

我按用途把无人机开发里最高频的命令整理一下。目录操作:ls查看文件、cd切换目录、pwd显示当前路径、mkdir创建目录、rm删除文件或目录、mv移动/重命名、cp复制。查找与查看:find按名字找文件、grep按内容过滤文本、cat看整个文件、less分页查看大文件、tail -f动态跟踪日志。权限与用户:chmod修改权限、chown修改属主、sudo临时提权。进程与系统:ps查进程、tophtop看系统实时状态、kill结束进程、df -h看磁盘空间、free -h看内存。网络相关:ifconfigip addr查IP、ping测试网络连通、ssh远程登录、scp跨机器传文件。

很多人看命令列表会困,因为不知道什么时候用。我给你一个场景:PX4编译时终端刷屏,你想看实时日志输出时,就用tail -f跟踪日志文件;编译报错“No space left on device”时,先跑df -h看哪个分区满了;飞控通过USB连接虚拟机后找不到端口,用ls /dev/ttyUSB*ls /dev/serial/by-id/排查设备节点。命令不在多在精,先掌握上述二十个,基本够应付前几个月的开发日常。

3. 无人机开发者必须掌握的 Linux 工程化技能

环境装好后,接下来是从“会用Linux”到“用Linux做工程”的关键一步。这里包括用户权限管理、Shell脚本、Git和编译工具链,我一个个展开。

3.1 用户、文件权限与 sudo 的正确使用

Linux是多用户系统,权限模型简化理解就是三组权限:属主、属组、其他人。每个文件或目录都能设置读(r)、写(w)、执行(x)权限。用ls -l能看到类似-rwxr-xr-x的输出,第一个字符是文件类型,后面九个字符每三个一组。

权限对应的数字也很好记,r=4,w=2,x=1,把它们加和就是一种角色的权限。比如7就是rwx,5就是r-x,0就是无权限。所以chmod 755的意思是属主20070有全部权限,属组和其他人只能读和执行。这个规则在后续给脚本文件加执行权限时非常常用。

在无人机开发中,权限问题最典型的场景是访问串口设备。当你把飞控通过USB连到电脑,终端运行QGroundControl或PX4相关工具时报“Permission denied”,大概率是你当前用户不在dialout组中。解决办法是:

sudo usermod -aG dialout $USER

执行完后注销重新登录即可。这里必须提醒一点:不要图省事对设备节点直接chmod 777,也不要对home目录做全局777操作,这会引入严重的安全隐患。正确做法是把自己加入对应用户组。sudo虽然能让你临时拥有root权限,但也要谨慎使用,不要在root下跑日常编译和开发,出了问题排查起来非常麻烦。

3.2 Shell 脚本:一键完成编译和仿真

Shell脚本就是把你平时手动敲的命令按顺序写进文件,再加上条件判断和循环,让它自动执行。对于编译PX4这种命令巨长、参数巨多的场景,写一个脚本能省掉大量重复劳动。

我举个实际脚本的例子,这个是简化版的PX4 SITL仿真启动脚本:

#!/bin/bash # 一键清理并启动 PX4 + Gazebo 仿真环境 set -e cd ~/PX4-Autopilot make clean make px4_sitl gazebo

第一行#!/bin/bash是声明这个文件用bash解释器执行。set -e表示一旦中间任意命令出错,脚本立刻退出,避免带着错误往下跑。写完脚本后,必须给它执行权限:

chmod +x run_sim.sh ./run_sim.sh

为什么不直接用bash run_sim.sh?也可以,但养成加执行权限再运行的习惯,会让你更早理解Linux权限模型。如果你脚本里需要接收参数,比如每次编译前切换不同的机型配置,可以用$1$2这种方式引用位置参数。Shell脚本的细节很多,但第一周只需要掌握变量、if判断、for循环、函数,就足够应付日常自动化需求了。

3.3 Git 与编译工具链:从源码到二进制

Git在工程开发中的重要性不需要再多说,我重点说说实际工作流。一个标准的协作流程是:从远程仓库git clone代码到本地,基于主分支git checkout -b feature/xxx新建功能分支,改完代码后git add暂存、git commit提交、git push推送,然后在远程仓库发起合并请求。遇到冲突不要慌,用git status看冲突文件,手动编辑保留需要的部分,再重新add和commit就能解决。

编译工具链这一块,很多新手分不清gcc、gdb、cmake、make分别干嘛。简单理解:gcc是编译器,把C/C++源码变成二进制;make是构建调度器,根据Makefile里的规则决定先编译哪个文件再链接哪个库;cmake是Makefile的生成器,专门解决跨平台构建配置问题。PX4这类大型项目用CMake管理构建流程,所以你执行make px4_sitl gazebo时,它底层会先调用cmake生成构建规则,再按规则调用交叉编译器和链接器。

这里我强烈建议新手手动编译一次最简单的程序,把整个链路走通:

#include <stdio.h> int main(void) { printf("Drone dev env OK!\n"); return 0; }

保存成hello.c,然后:

gcc hello.c -o hello ./hello

你能看到输出“Drone dev env OK!”,说明编译器、链接器、动态库加载的整条链路都正常。这个过程中如果遇到gcc: command not found,回头装build-essential。以后编译任何复杂项目,底层原理和这个过程一模一样,区别只是编译目标和依赖库多得多。

4. 无人机专属软件栈:从固件交叉编译到仿真与地面站

把Linux基础打牢之后,就可以开始组装无人机开发的专业组件了。这一节我会讲交叉编译工具链、中间件与通信协议、仿真环境和地面站软件。

4.1 交叉编译:为什么飞控固件不能在 PC 上直接编译运行

交叉编译的概念,理解一句话就行:在一种架构的电脑上,编译出能在另一种架构电脑上运行的程序。你的开发机通常是x86_64架构,而飞控板的处理器大多是ARM架构,比如STM32F4、STM32H7,或者Zynq7000系列。x86编译出来的二进制文件不能直接扔到ARM上跑,指令集都不通。

所以在做无人机底层开发时,我们需要专门的目标架构编译器。比如PX4固件编译时用的工具链是arm-none-eabi-系列,编译Cortex-M系列单片机固件;如果开发Zynq7000这类嵌入式Linux平台,可能还需要配置PetaLinux工具链和对应的交叉编译工具。看起来复杂,但本质就是:主机上用一套专用编译器生成目标板能执行的固件镜像,然后用烧录器或U盘等方式把它烧进目标板。

在PX4项目中,你不需要手动一个个调编译器参数,构建系统已经帮你封装好了。但你必须理解为什么编译耗时很长,因为它在编译所有飞控模块的所有源码,还要经过链接、优化、生成二进制、打包固件等步骤。遇到编译失败时,先确认工具链版本和源码版本匹配,再排查具体的报错信息。

4.2 ROS、MAVLink 与 MAVSDK:三个容易混淆的组件

这三个东西在无人机开发里经常一起出现,但是职责完全不同。ROS(Robot Operating System)是一个机器人中间件,它提供进程间通信、模块化管理、硬件驱动封装这些能力。注意它不是一个真正的操作系统,而是一套运行在Linux之上的软件框架。MAVLink是一个轻量级的消息通信协议,专门用于无人机和地面站、机载电脑之间的数据传输,它的数据包非常紧凑,适合无线链路这种带宽受限的场景。MAVSDK则是一个开发者友好的SDK,把MAVLink的细节封装成简单易用的编程接口,你不用理解底层字节怎么组装,直接调函数就能读取飞控状态、发送任务指令。

ROS Noetic的安装命令比较固定,核心步骤如下:

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt install curl curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - sudo apt update sudo apt install ros-noetic-desktop-full

安装完成后,记得把环境变量写入shell配置:

echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc

这个过程在20.04上非常顺畅,到了22.04你会发现官方的apt源里已经没有Noetic,只能用Docker或者源码编译,这就是我一直强调20.04的原因。

4.3 Gazebo 与 PX4 SITL 仿真环境搭建

在拿真机试飞之前,仿真是一个必须经过的阶段。SITL意思是Software In The Loop,也就是飞控软件不跑在真实硬件上,而是跑在你的电脑上,配合Gazebo这样的物理仿真器,模拟出飞行器在三维世界中的姿态、位置和传感器数据。

启动PX4 SITL仿真的命令非常简单:

cd ~/PX4-Autopilot make px4_sitl gazebo

第一次执行这个命令会编译较长时间,因为要构建整个飞控系统和Gazebo插件。编译成功后会弹出Gazebo界面,同时终端中出现飞控Shell,你可以用commander takeoff指令让飞机起飞。这个环境对后续做视觉算法、编队算法验证极其重要,因为你在仿真里跑通的代码,大部分逻辑可以无缝移植到真机。

仿真不是玩具,我见过很多团队直接上真机试飞新算法,结果炸机炸到怀疑人生。正确的开发习惯是:先在SITL里验证算法逻辑,再通过硬件在环HITL测试传感器和驱动,最后才上真机。这三个阶段每往上走一步,成本都在成倍增加。

4.4 地面站 QGroundControl:日志分析与飞行任务监控

最后说说地面站。QGroundControl是目前PX4生态中最常用的开源地面站,它负责和飞控建立通信、显示实时姿态和轨迹、配置参数、规划航线、分析飞行日志。安装方式很多,最通用的是下载官方提供的AppImage,然后在终端里运行:

chmod +x QGroundControl.AppImage ./QGroundControl.AppImage

地面站和飞控之间走MAVLink协议,在仿真环境下,QGC默认通过UDP连接本机的14550端口,飞控启动SITL后会自动建立这条链路,你打开QGC就能看到模拟飞机的姿态数据。这个阶段你可以把QGC的地图、仪表盘、日志分析都提前熟悉一遍,真机飞行时才能快速定位问题。

我个人特别看重日志分析能力。每次试飞结束,从QGC里导出.ulog日志文件,然后可以在电脑上打开分析姿态、电机输出、传感器数据曲线。姿态异常、震动偏大、定位跳变,这些现象都能在日志里找到直接证据。

5. 新手常见问题与排查技巧实录

带过几届学员之后,我发现很多报错其实高度重复。我把这些高频问题整理成一张速查表,每一条都是实打实踩过的坑。

5.1 高频问题速查表

现象常见原因解决办法
虚拟机内部没有网络网络适配器没选NAT或桥接VM设置里将网络连接改为NAT模式
apt安装软件时提示锁被占用后台有其他apt进程sudo kill结束残留进程,或重启虚拟机
访问串口设备提示Permission denied用户未加入dialout组执行sudo usermod -aG dialout $USER后重新登录
编译PX4到一半磁盘满虚拟磁盘初始分配过小扩容虚拟磁盘,并推荐初始设置80GB以上
git push每次都要求输密码未配置SSH密钥生成SSH密钥并添加到GitHub账户
输入法切不出来fcitx框架未配置在输入法设置中添加拼音,并重启系统
编译报错找不到gcc没装build-essential执行sudo apt install -y build-essential
虚拟机窗口分辨率固定无法变大缺少open-vm-tools安装open-vm-tools-desktop并重启
共享文件夹里的代码编译特别慢跨文件系统IO性能差把工程放在Linux原生目录下编译

5.2 三个我实际踩过的“深坑”

第一个坑是虚拟磁盘分区太小。我第一次给虚拟机分40GB,觉得绰绰有余。结果PX4源码、Gazebo模型、ROS依赖包装完,df -h一看,/home已经用了九成。后面每次编译大项目都胆战心惊,最后只能扩容。扩容这事虽然能做,但要做分区的调整,费时费力。所以一开始就分80GB,后面省事非常多。

第二个坑是VMware Tools没装好,导致虚拟机和宿主机之间无法复制粘贴。当时我在虚拟机里看到了网上的命令想复制下来,结果手打了十几行命令才意识到这个功能没生效。其实解决极其简单,装open-vm-tools-desktop后重启就能解决。如果你用的VMware Workstation,也可以在虚拟机菜单里直接点击“安装VMware Tools”,一路下一步就好。

第三个坑是换软件源时手抖改错了地址。当时我执行了换源命令后立刻apt update,结果报“暂时不能解析域名”的错误。排查了半天,最后发现是源文件里某个镜像地址多了一个空格。从那以后,我都习惯先备份源文件再修改,出任何问题都能秒回滚。给你一个排查命令:cat /etc/apt/sources.list | grep -v "^#",干干净净列出当前可用的源地址。

5.3 一个不算坑但很关键的提醒

最后再说一个我几乎每次都要强调的点:不要把项目代码放在虚拟机的共享文件夹里编译。Windows和Linux之间的文件系统差异、权限映射、IO性能损耗,都会让编译速度明显变慢,还可能产生文件锁和权限错乱。正确的做法是,共享文件夹只用来做“单向交付”,比如从Windows拖一个压缩包进Linux,解压后把工程放到/home目录下再编译。Linux这边完成构建的产物要拿到Windows上使用,再通过共享文件夹传出去。这个习惯能帮你避开很多莫名其妙的问题。

无人机软件开发没有捷径,但可以少走弯路。这个模块如果能把环境、工具链和工程习惯打扎实,后面接PX4、接ROS、跑真机都会顺利很多。希望这篇文章能帮你把Ubuntu 20.04上的无人机开发环境一次性搭好。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询