ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ubuntu 20.04 + Linux工程基础:无人机开发环境搭建实战指南

Ubuntu 20.04 + Linux工程基础:无人机开发环境搭建实战指南 很多朋友一进无人机开发这个领域第一反应就是去背飞控代码、看论文、调参。结果折腾了大半个月发现自己还卡在一堆乱七八糟的环境问题上固件编不过、仿真起不来、地面站连不上飞控、串口权限报错。这个“Module 3Ubuntu 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.04Python默认版本变了很多二进制依赖的编译选项也跟着变你自己排查这些问题的时间成本会非常高。所以我给团队和学生的建议都是先用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 htopbuild-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查进程、top或htop看系统实时状态、kill结束进程、df -h看磁盘空间、free -h看内存。网络相关ifconfig或ip 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的输出第一个字符是文件类型后面九个字符每三个一组。权限对应的数字也很好记r4w2x1把它们加和就是一种角色的权限。比如7就是rwx5就是r-x0就是无权限。所以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三个容易混淆的组件这三个东西在无人机开发里经常一起出现但是职责完全不同。ROSRobot 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上的无人机开发环境一次性搭好。
返回列表