尧图精选

无人机软件开发环境搭建:Ubuntu 20.04与Linux工程基础实战

🕒 发布时间:2026/9/9 4:33:45 📁 来源:尧图网络
我们在搞无人机软件开发时最容易被忽略、也最影响后续效率的一件事就是基础环境。很多朋友一上来就急着写代码、调飞控结果编译PX4源码时装错依赖、交叉编译链版本不对、串口权限没配好一个下午就耗在莫名其妙的问题上。Module 3这块内容说白了就是把Ubuntu 20.04当成无人机软件开发的主战场把Linux工程基础打牢让后面的飞控固件编译、机载计算机通信、仿真测试都能顺顺利利跑起来。这篇文章我就从实际踩坑经验出发把整个环境搭建和Linux工程入门的关键环节拆开揉碎讲清楚。不管你是准备做PX4/ArduPilot二次开发还是打算搞ROS机器人操作系统与无人机对接或者只是想给飞控板搭个稳定的编译环境这篇内容都适合先过一遍。1. 内容整体设计与思路拆解1.1 为什么无人机软件开发绕不开Ubuntu 20.04先说结论在无人机软件开发这条路上Ubuntu 20.04是目前兼容性最好的“安全牌”。PX4官方文档长期把Ubuntu 20.04作为推荐编译环境ROS NoeticROS1的最后一个长期维护版本也基于它开发MAVSDK、QGroundControl这些地面站工具链同样在20.04上测试最充分。有的朋友可能会问Ubuntu 22.04、24.04都出了那么久内存更大、内核更新为什么不用更新的版本我一开始也这么想直到被现实教育了。Ubuntu 22.04虽然也能装PX4环境但Gazebo仿真版本、Python依赖、以及一些飞控厂商提供的SDK并没有完全跟上新系统的节奏。尤其是做硬件在环仿真HITL时USB转串口驱动、飞控固件烧录工具对老版本Ubuntu的兼容性明显更好。这里有个很实在的点无人机开发不在乎“尝鲜”而在乎“稳定可复现”。你写出来的代码是给飞控跑的不是给操作系统当小白鼠的。所以Ubuntu 20.04 LTS五年长期支持版本能保证你的开发环境和官方文档对得上别人遇到的坑你大概率不会遇到。1.2 这套环境的三大核心模块划分整个无人机软件开发环境我在实际教学和项目里习惯分成三个层次来搭建底层系统层Ubuntu 20.04安装、网络配置、软件源优化、基本驱动。这是地基地基本来就不稳上层全白搭。命令行与工程工具层Shell操作、文件权限、压缩解压、进程管理、Git版本控制、编译工具链。这一层是“手”和“脚”你所有操作都靠它们完成。无人机专用开发栈交叉编译工具、PX4/ArduPilot源码环境、MAVLink通信协议相关工具、串口与USB设备权限配置。这一层是“武器”直接对飞控硬件工作。很多人学Linux只学了一堆命令不知道这些命令在无人机开发里到底怎么用最后就是“学过但不会用”。我写这篇文章的思路就是把每一层知识都挂靠到具体的无人机开发场景里让你明白“学这个命令是为了解决什么问题”。2. 环境搭建第一步Ubuntu 20.04安装与初始化配置2.1 双系统还是虚拟机一个需要认真思考的选择关于Ubuntu 20.04的安装方式我先泼一盆冷水如果你打算长期做无人机开发建议直接装双系统不要用虚拟机做主力环境。虚拟机比如VMware)的好处是方便、可以快照回滚Windows里直接跑Linux切换不用重启。但无人机开发里有几个场景虚拟机动不了USB设备直通飞控通过USB连接电脑时虚拟机需要配置USB passthrough而且经常出现掉线、权限错乱的问题。我见过太多人在VMware里折腾飞控连接最后发现是USB控制器版本不兼容。实时性要求Gazebo仿真在高负载时虚拟机里的图形渲染和传感器计算会掉帧导致仿真数据不对你以为是代码的问题实际是虚拟化层拖了后腿。串口和网卡某些飞控开发板通过以太网连接比如树莓派作为机载计算机虚拟机的网络桥接模式偶尔会出现丢包查起来非常费劲。当然如果你只是先体验一下Linux、熟悉常用命令那虚拟机完全够了。我的建议是第一步用虚拟机学习基础知识一旦决定深入无人机开发立即转换到双系统。我自己就是这么过来的——先用VMware看了一个礼拜的Linux基础然后忍痛分区装了双系统。2.2 双系统安装实操细节与避坑安装Ubuntu 20.04的过程本身不复杂但有几个细节直接关系到后面的使用体验。启动盘制作推荐使用RufusWindows下或者balenaEtcher跨平台来制作启动U盘。这里有个坑制作时分区类型要选GPT目标系统类型选UEFI否则在一些较新的笔记本上会无法引导启动。老一点的电脑如果只支持Legacy BIOS才选MBR。磁盘分区新手最容易在这个环节栽跟头。我的建议是在Windows里先用“磁盘管理”压缩出一个空闲分区不要删分区、不要格式化。然后在Ubuntu安装界面选择“Something else”手动挂载/根分区分配50GB以上如果你要编译PX4、跑Gazebo仿真建议80GB起步swap交换分区分配电脑内存大小即可比如16GB内存就分16GB/home分区把剩余空间都给它以后源码、下载、项目文件都在这这里特别提醒/home分区不要和/分区合并到一起。因为一旦系统出问题需要重装只要/分区格式化/home里的数据都能保留。我做项目这么多年这招帮我保住了好几次没备份的源码。软件源替换装完系统第一件事就是换源否则下载软件包的速度会让你抓狂。Ubuntu 20.04的源配置文件在/etc/apt/sources.list用清华源或者阿里云源都行。我用的是清华源实测速度稳定。替换完记得执行sudo apt update sudo apt upgrade -y2.3 基础开发环境初始化脚本装完系统、换完源接下来就是安装无人机开发的基础工具包。下面这段是我每次给新机器初始化都在用的命令集合# 基础编译工具链 sudo apt install -y build-essential cmake git vim # Python 3开发环境 sudo apt install -y python3 python3-dev python3-pip # 串口和USB工具 sudo apt install -y putty minicom screen # 其他常用工具 sudo apt install -y net-tools curl wget htop # 图形界面辅助 sudo apt install -y terminator这些工具看着基础但每一个都有用build-essential是后续编译任何C/C项目的地基cmake是PX4这类大型项目的构建系统核心git是版本管理命脉minicom和screen用于串口调试飞控日志。装完这些建议把系统重启一遍让驱动和内核模块都正常加载再继续。3. Linux工程基础命令行与文件系统的无人机场景化运用3.1 文件权限模型无人机项目里最常踩的坑之一Linux的文件权限模型读r、写w、执行x几乎是每个新手遇到的第一堵墙。在Windows里你双击就能运行程序在Linux里不行——你要么给文件加执行权限要么就要报Permission denied错误。无人机项目里最典型的一个场景你下载了飞控固件的编译脚本install.sh然后执行./install.sh结果系统提示权限不够。原因就是该文件没有执行权限。解决办法chmod x install.sh ./install.sh还有串口设备权限问题。飞控通过USB连接到电脑在Linux里对应的设备名一般是/dev/ttyUSB0或/dev/ttyACM0默认只有root用户和dialout组的用户才能访问。损坏设备权限最常用的方法sudo usermod -a -G dialout $USER修改完后一定要注销重新登录用户组才会生效。这个步骤我在课堂上反复强调因为几乎每届都有学生在这一步卡住然后问我“为什么加了dialout组还是没权限”——答案就是你还没重新登录。3.2 命令行实操无人机开发中最高频的命令清单在无人机项目里有些命令出现的频率高到离谱我把它们分成了几类每一类都对应一个实际场景命令场景说明lsusb查看USB设备是否被系统识别。飞控插上没反应第一件事就是lsusb看设备列表dmesg | tail -20查看内核日志。USB设备插入时内核会打印识别信息是排查驱动问题的关键ls /dev/ttyUSB*查看串口设备节点是否生成chmod 777 /dev/ttyUSB0临时给串口设备权限不推荐长期用调试时方便df -h查磁盘空间。编译PX4经常要几十GB磁盘满了会报莫名其妙的神秘错误free -h查内存使用情况Gazebo仿真崩了先看内存够不够top/htop实时看CPU、内存占用排查机载程序性能瓶颈还有一个比较有意思的是rsync命令很多做无人机的人都用它把代码同步到机载计算机比如树莓派、NVIDIA Jetson上。局域网内的同步整个项目代码rsync -avz --progress ./project_dir/ user192.168.1.100:/home/user/project/我觉得命令行不要求全背但要达到“看一遍就理解遇到问题知道去哪查”的程度。真正常用的命令就那二三十个多敲几遍自然就熟了。3.3 压缩解压与文件传输的工程应用无人机项目里经常要从网上下载工具链、固件源码跟你打交道最多的压缩格式就是.tar.gz、.tar.bz2、.zip。这里有一个关键区别.zipWindows最常用Linux下用unzip file.zip解压.tar.gzLinux最常见一条命令搞定tar -zxvf file.tar.gz.tar.bz2压缩率更高但速度慢飞控源码包偶尔见到tar -jxvf file.tar.bz2最让我印象深刻的是PX4源码下载它默认通过Git仓库克隆第一次下载可能就要好几个GB。如果直接git clone速度很慢建议加上--recurse-submodules参数并提前配好代理镜像这是后面第6章会详细讲的内容。总之掌握基本的压缩解压命令能让你在处理源码包时不被劝退。4. 交叉编译与开发工具链无人机项目专属的“硬核”知识4.1 交叉编译到底是什么一个接地气的类比交叉编译这个概念我每次都要费很大劲才能让新手弄明白。其实用一个类比就能说清楚你在Mac上写了一个APP想装到华为手机上运行。Mac和手机的CPU指令集不一样你不能把Mac上编译出来的程序直接拷贝到手机上。你需要在Mac上安装一个“华为手机视角的编译器”让它生成手机能跑的程序这个过程就是交叉编译。对应到无人机开发你在PC的x86架构上编写代码但飞控板通常是ARM架构比如STM32PC直接编译出来的程序飞控跑不了。你需要用交叉编译工具链让PC生成ARM架构的机器码然后烧录到飞控上。无人机行业里最常见的交叉编译场景有PX4固件交叉编译PX4在PC上编译时会自动调用arm-none-eabi-开头的GCC工具链为STM32 F系列芯片生成固件。机载计算机程序如果你在树莓派或Jetson上跑视觉算法就需要在PC上安装对应的交叉编译器或者直接在ARM主板上本地编译。Linux内核/驱动模块如果给飞控定制内核模块同样需要交叉编译环境。4.2 从零安装PX4 Ubuntu 20.04开发环境PX4官方提供了一键安装脚本ubuntu.sh但它会把一大堆依赖都装到系统里耗时很长。我实际项目里更推荐按需安装核心依赖分三大块第一块基础编译工具sudo apt install -y \ git zip qtcreator cmake \ build-essential genromfs ninja-build exiftool \ astyle cmake-format第二块Python依赖与pip包sudo apt install -y python3-pip python3-setuptools python3-dev pip3 install --user \ pyserial empy pyros-genmsg packaging \ jinja2 numpy toml这里有个坑empy这个Python模板库PX4编译时必须用3.3.2版本如果装成新版会导致固件编译报错。指定安装pip3 install --user empy3.3.2第三块交叉编译器sudo apt install -y gcc-arm-none-eabi gdb-multiarch装完可以用这个命令验证交叉编译器是否正常看到“arm-none-eabi-gcc”版本信息就说明OKarm-none-eabi-gcc --version4.3 编译工具链中的关键参数与选择逻辑在PX4编译过程中有个重要概念叫“构建目标build target”它决定了你编译出来的固件要烧到哪块飞控板上。最常用的几个目标构建目标适用硬件说明px4_fmu-v5Pixhawk 4 / FMUv5最常见的Pixhawk系列板卡px4_fmu-v6xPixhawk 6系列新硬件性能更强sitl无硬件纯仿真在PC上跑软件在环仿真不需要真机px4_fmu-v2Pixhawk 1代老硬件已逐渐淘汰编译命令是这样make px4_fmu-v5如果你只想快速验证代码语法对不对不烧真机那就编译仿真版make sitl gazebo-classic这个命令会启动Gazebo仿真器同时编译PX4软件在环仿真固件。我强烈建议新手上路先跑仿真仿真里炸机不心疼真机上炸机修飞机钱包心疼。5. 开发环境必备工具Git、编辑器与调试工具的工程级配置5.1 写代码环境VS Code还是Vim无人机项目里写代码我用的是VS Code飞控代码用VS Code里的Remote-SSH插件直接编辑机载计算机上的文件非常方便。插件方面必备这几个C/C微软官方插件提供语法高亮、智能提示、调试支持CMake ToolsCMake工程构建一体的IDE化支持Python写地面站脚本、数据处理时要用GitLensGit历史可视化管理排查“谁改了我的代码”特别有用Remote-SSH远程开发机载计算机但我也认识一些老手坚持用Vim说“在无图形界面的服务器上工作只能靠Vim”。Vim的上手曲线有点陡峭我建议新手先把基础的打开文件、编辑、保存、退出记住就行vim filename.py # 打开文件 i # 进入插入模式可以输字符 Esc # 退出插入模式 :wq # 保存并退出 :q! # 不保存强制退出5.2 Git版本管理无人机项目里必须养成的肌肉记忆无人机软件项目动辄几百个源文件没有Git管理代码你很难知道改了什么、要不要回滚。真实项目中我最常规避的一个场景是在机载计算机上直接改代码改坏了想恢复却发现没有提交任何版本。到这一步只能手动翻历史记录痛苦无比。Git的最核心流程其实就几条命令git init # 仓库初始化 git add . # 把所有文件加入暂存区 git commit -m 提交信息 # 提交到本地仓库 git log --oneline # 查看提交历史 git checkout -- filename # 丢弃工作区某个文件的修改 git branch feature/test # 新建分支 git checkout feature/test # 切换到新分支对于PX4这种大型项目我强烈建议不要直接在主分支上乱改代码而是从官方版本拉出自己项目的分支这样以后官方更新时还能合并回来。git clone --recurse-submodules https://github.com/PX4/PX4-Autopilot.git cd PX4-Autopilot git checkout -b myproject v1.13.3这里为什么用--recurse-submodules参数因为PX4本身依赖了几十个子模块比如固件框架、驱动库不加上这个参数克隆下来的源码不完整编译必失败。5.3 串口调试与日志查看地面站之外的“单手工具”地面站功能很多但有时候你只需要快速看一眼飞控输出的日志或者跟传感器模块手动通信测试这时命令行工具反而更高效。minicom老牌串口终端我用的最多sudo minicom -D /dev/ttyUSB0 -b 115200-D指定串口设备-b指定波特率。飞控的调试串口通常是57600或115200具体参数要查你的飞控硬件手册。screen退出方式比minicom方便CtrlA然后按K临时看数据很方便screen /dev/ttyUSB0 115200QGroundControl图形化地面站除了调参还能刷固件、看实时日志。不属于命令行工具但它是无人机地面站的事实标准装机时顺便装了准没错。6. 环境问题排查那些能把人逼疯的典型场景6.1 下载慢、克隆失败的根源与解决无人机开发里你打交道最多的“外网资源”就是GitHubPX4源码、硬件驱动库都在这。国内裸连GitHub经常只有几十KB/s甚至直接超时。很多新手在这步浪费了大量时间。我的处理方案是给Git配置一个代理如果你本地有代理服务的话git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy http://127.0.0.1:7890如果不想用代理也可以用一些GitHub镜像加速方式GitHub Proxy、FastGit等。但最稳妥的还是在编译脚本层面解决问题提前把PX4源码包里的大子模块下载好或者用gitee上别人同步的镜像仓库拉取。等基础环境装好后如果你的开发任务不依赖频繁访问GitHub可以考虑把代理关掉省点流量git config --global --unset http.proxy git config --global --unset https.proxy6.2 串口无法识别飞控三步排查法飞控插上电脑后QGroundControl显示“No device connected”这种情况在Linux下非常常见。我归纳了一个三步排查法第一步检查设备有没有被系统发现lsusb如果看到类似“STMicroelectronics STM32”或“PX4 FMU”的条目说明USB层面识别到了。什么USB信息都没有换个线、换一个USB接口再试很多问题的根源只是USB线质量差。第二步检查串口设备节点有没有生成ls /dev/ttyUSB* /dev/ttyACM*PX4飞控一般生成ttyACM0ArduPilot也差不多。没有设备节点就是驱动问题Ubuntu 20.04对常见USB转串口芯片FTDI、CH340、CP2102都内置了驱动一般不需要额外装驱动。第三步检查当前用户有没有权限ls -l /dev/ttyACM0看第一列权限位和所属组如果组名是dialout而你还没加进去就执行我前面讲的usermod命令。6.3 编译报错的三大“坑王”与其解法在做PX4编译时有几个报错出现的频率极高我把它们总结成了一张避坑表报错特征根本原因解决办法empy: command not foundPython模板库没装或版本不对pip3 install empy3.3.2gcc-arm-none-eabi: No such file or directory交叉编译器缺失sudo apt install gcc-arm-none-eabiModuleNotFoundError: No module named emPython环境里缺少em模块pip3 install pyros-genmsg基本上90%的编译失败都不是代码问题而是依赖环境没配对。这也是我前期不厌其烦强调“一定要跟着官方推荐的Ubuntu版本走”的原因。6.4 系统崩溃后的快速恢复策略做嵌入式开发系统越用越乱的概率很高。为了防止系统崩溃后个人配置和源码全丢我给自己定了一个规则/home目录里的代码和配置全部用Git跟踪重要笔记同步到云盘系统出问题直接格盘重装恢复时间控制在两小时内。具体来说我会把自己习惯的dotfiles比如.bashrc、.vimrc、.gitconfig放在一个单独的Git仓库里新机器上直接克隆然后软链接到home目录。这样无论换电脑还是重装系统都能快速恢复熟悉的工作环境。7. 常用Linux工程命令速查手册无人机开发精简版7.1 文件与目录操作pwd # 当前路径 ls -lah # 列出当前目录所有文件及其权限和大小 cd /home/user/project # 切换目录 mkdir -p src/include # 递归创建多级目录 cp -r old_dir new_dir # 递归复制目录 mv old_name new_name # 重命名或移动 rm -rf temp_dir # 强制删除目录非常危险慎用7.2 系统与进程管理df -h # 磁盘空间 free -h # 内存占用 ps aux | grep px4 # 查找PX4相关进程 kill -9 PID # 强制终止进程 systemctl status ssh # 查看SSH服务状态 sudo systemctl enable ssh # 设置SSH开机自启7.3 网络调试命令ifconfig # 查看本机IP地址 ping 192.168.1.1 # 测试局域网连通性 ssh user192.168.1.100 # SSH远程登录机载计算机 scp file.zip user192.168.1.100:/tmp/ # 复制文件到远程主机 ss -tunap # 查看端口监听情况7.4 权限与用户管理sudo chown -R user:user /home/user/project # 递归修改文件属主 sudo chmod -R urwX,grX,orX /home/user/project # 设定标准权限 groups # 查看当前用户属于哪些组这些命令不需要背但最好在虚拟机里都敲一遍形成肌肉记忆。真到了做项目的时候这些是最基础的“地基工具”。8. 后续学习路线与个人经验谈如果你把前面这些环境全部搭建完成并且能用命令行做基本的文件操作、权限配置、软件安装、Git管理、交叉编译那就意味着你已经具备了无人机软件开发最核心的“生存技能”。接下来我建议的学习路线是这样的第一阶段1~2周每天花半小时刷Linux常用命令重点练文件操作、权限、压缩解压、进程管理。目标是看到一个需求就知道该用什么命令、去哪里查帮助。第二阶段2~4周把PX4官方源码克隆下来尝试编译sitl仿真目标体验完整的编译过程。遇到报错不要慌先看报错信息再根据信息搜索解决方案。第三阶段1~2个月在Gazebo仿真环境里跑一架多旋翼飞机学会用QGroundControl连接仿真飞机、查看日志、修改参数。从仿真到真机之前把USB权限、串口调试、固件烧录流程全部走通。第四阶段开始读PX4代码结构理解uORB通信机制这是PX4模块之间通信的核心、模块注册方式、参数系统。再往深走就是写自己的飞行控制模块这就正式踏入无人机软件开发的大门了。最后分享一点个人体会我在带新人时发现真正能快速上手的往往不是那些“什么都会一点”的人而是遇到问题知道怎么独立排查的人。无人机开发的环境问题千奇百怪今天可能是USB掉驱动明天可能是编译缓存冲突后天可能是Python依赖版本不对。你不能每次都指望别人帮你解决必须有“我自己能搞定”的信心。而这份信心就来自你把上面这些基础操作都亲手敲过一遍之后对环境越来越熟悉的那种掌控感。到了那个阶段无人机软件开发对你来说就不再是“处处是坑”而只是“按照流程一步步推进”的日常工作了。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →