1. 为什么无人机软件开发绕不开 Ubuntu 20.041.1 无人机软件栈的真实生态干无人机软件这行有一个绕不开的事实从飞控固件到地面站从仿真平台到机载计算机整个生态基本都建构在 Linux 之上。你去看 PX4、ArduPilot 的官方文档第一行永远是Ubuntu 20.04 LTS 是唯一官方支持的桌面系统ROS 的长期支持版本 Noetic 也是精准对应 Ubuntu 20.04。这不是巧合而是整个无人机开发技术栈在这些年的演进中形成的默契。我做无人机开发这几年见过太多新手一上来就在 Windows 上折腾双系统或者在虚拟机里装个 Ubuntu 就开始编译 PX4。倒不是说完全跑不通但你会遇到太多无谓的坑串口驱动不识别、编译权限报错、USB 设备找不到、CMake 版本不兼容……随便一个都能让你卡上一整天。等你把这些坑全踩完人家用原生 Linux 的同学已经把仿真跑起来开始调参数了。所以 Module 3 这个标题其实说得很清楚这套内容不是教你随便用个能跑代码的系统就完事而是要建立一个标准、可靠、可复现的开发环境。Ubuntu 20.04 之所以成为行业事实标准有几个很实际的原因它编译工具链版本稳定gcc 9.4、CMake 3.16、Python 3.8 这些版本正好和 PX4、ROS Noetic 的官方支持矩阵完全匹配它的硬件驱动支持非常全对 Intel/NVIDIA 显卡、RealSense 相机、各种 USB 转串口芯片的兼容性都很好另外它作为 LTS 版本有五年官方更新支持不用担心用着用着源就没了。这篇内容适合谁准备进入无人机、机器人和自动驾驶领域的开发者刚拿到 PX4/RM 比赛/课题任务但还不太熟悉 Linux 的在校学生以及想系统性补上 Linux 工程基础的在职工程师。我不会讲太多花哨的东西只讲整个环境搭建过程中你真正会遇到的、绕不开的点。1.2 双系统、虚拟机、还是 WSL我的选择建议在开始装系统之前先解决一个选择难题。很多人会问我能不能用虚拟机能不能用 WSL如果你的数据线只连飞行控制器虚拟机确实够用但一旦涉及机载电脑与飞控的 PX4 串口通信、USB 3D 摄像头画面读取、RTK 或者数传模块的驱动虚拟机的 USB 透传会频繁出问题延时和稳定性都不如原生系统。WSL2 对 ROS 的支持在逐步完善跑个仿真勉强可以但 GUI 显示、串口权限、多机通信这一块仍然比较折腾。所以我个人建议是如果这台电脑你打算长期投入无人机开发直接装双系统习惯 Linux 作为主力开发环境如果你只是短期过渡、跑跑仿真验证一些算法VMware 里装一个 Ubuntu 20.04 也够用遇到 USB 设备问题再想办法。需要特别提醒的是双系统安装时分区要有规划。我给自己的电脑分区时预留了根目录 50GB、/home目录 100GB后来发现 50GB 根目录加上编译缓存很容易爆最终重装时直接把根目录扩到了 80GB/home也单独划了出来。这个安排在后面折腾 PX4 编译、Gazebo 模型下载时显得非常值因为你的工程代码和编译缓存不会把系统盘塞满。2. Linux 工程基础先啃下这三块硬骨头2.1 目录结构别再问文件去哪了很多从 Windows 转过来的新手最大的不适应是 Linux 没有 C 盘 D 盘所有的设备、文件都在一个根目录/下面按照固定的约定摆放。这个约定本身就是一个工程规范你必须先接受它才能理解后面系统和软件的各种默认行为。目录结构里我按实际使用频率排个优先级。/home/用户名/是你的个人工作目录相当于 Windows 的我的文档你在终端打开时默认就在这个位置。/etc/存放系统配置文件比如网络配置、环境变量全局设置、软件源列表都在这里。/opt/是很多第三方软件安装的地方比如你可能会把 NVIDIA 驱动、QGroundControl、MATLAB 装在这里。/usr/是系统软件安装的目录相当于 Windows 的C:\Program Files通过apt install装的软件基本都散布在/usr/bin、/usr/lib、/usr/share下。/var/log/存放日志文件程序崩溃或者系统异常时来这里翻日志是排查问题的第一步。我见过不少同学把 PX4 源码直接 clone 到桌面路径然后用终端编译时报一堆路径包含空格和中文的错误。Linux 下的习惯是路径尽量不包含空格和中文所以我会把工程源码统一放在~/workspace/或~/code/下这个习惯早点养成后面编译、配置、写脚本会顺利很多。另外要理解一个关键概念Linux 中一切皆文件。串口设备对应/dev/ttyUSB0、/dev/ttyACM0USB 摄像头对应/dev/video0这些设备文件在系统启动或设备插入时被自动创建你操作这些文件就是在操作硬件。这也是为什么后面我们配置飞控连接时要专门给这些设备文件加权限——没有权限程序就打不开这个文件。2.2 文件权限与用户管理sudo 能解决九成问题剩下那一成会坑你文件权限是 Linux 新手最容易忽略、但却是无人机开发中一定会遇到的硬知识点。每次用ls -l看文件详情时你会看到类似-rwxr-xr-x的十个字符这就是文件权限的编码。第一个字符表示文件类型-代表普通文件d代表目录l代表符号链接。后面九个字符分成三组分别代表文件属主user、属组group、其他用户other的读r4、写w2、执行x1权限。举一个无人机开发中真实的场景。你从网上下载了飞控地面站的 AppImage 安装包双击运行提示Permission denied这就是因为它没有执行权限。你只需要在终端执行chmod x 文件名.AppImage就能解决。后来你写了一个启动脚本start_sim.sh打算一键启动 Gazebo 和 QGC用./start_sim.sh执行却提示权限不够同样用chmod x start_sim.sh加上执行权限即可。至于sudo它在 Linux 里是以超级用户身份执行的意思。安装软件时需要sudo apt install修改系统配置时需要sudo vim /etc/hosts给串口设备加当前用户权限时需要sudo usermod -aG dialout $USER。但我给你的忠告是能用普通用户权限做的工作就别加sudo。比如编译 PX4 时如果你习惯用sudo make px4_sitl_default生成的整个 build 目录都会变成 root 所有后续你想删除、修改都得再带 sudo而且会导致文件权限紊乱。正确做法是先sudo chown -R $USER:$USER 目录路径把目录属主改回当前用户然后用普通权限编译。2.3 高频命令清单先背熟这 40 个Linux 命令浩如烟海你不需要全部背下来你需要的是建立一套条件反射式的命令肌肉记忆。我把无人机开发中最高频的命令分成五类每一类都有它对应的应用场景。第一类是文件与目录操作包括ls查看目录内容、cd切换目录、cp复制文件、mv移动文件、rm删除文件、mkdir创建目录。这是最基础的命令但这些命令在工程实践中有一些细节要注意。比如ls -l可以查看文件权限ls -a可以显示隐藏文件你编译后如果找不到某个配置文件先看看它在不在隐藏目录里。再比如rm -rf这个命令-r表示递归删除目录-f表示强制删除组合起来威力巨大但也极其危险我见过有人手滑在错误的目录下执行了这个命令整个项目一夜回到解放前。我的经验是执行删除操作之前先用pwd确认自己所在的路径多花两秒钟省下的是几个小时的后悔。第二类是系统信息与状态查看包括df -h查看磁盘空间、free -h查看内存使用、top或htop查看 CPU 和进程、uname -a查看内核信息、dmesg查看内核日志。这些命令在环境出现问题时是最直接的排查工具。比如飞控 USB 插上后没反应第一件事就是dmesg | tail -20看内核有没有识别到设备、驱动有没有报错。第三类是网络工具包括ping、ifconfig、ip addr、ssh、scp。无人机机载电脑的远程开发、局域网内的 ROS 节点通信、下载依赖包都离不开这些命令。ifconfig查看网卡 IP 地址scp把本地文件复制到远程主机。第四类是查找与文本处理重点掌握find、grep、cat、vim、nano。find /path -name *.txt按文件名查找grep -r error .在当前目录及子目录的所有文件中查找包含 error 的行。日志排查、代码搜错都靠这两个命令。第五类是权限与包管理包括chmod、chown、sudo、apt。apt update更新软件源apt search搜索软件包apt install安装apt remove卸载apt list --installed查看已安装。我给你一个实操建议打开终端建立一个自己的cheatsheet.txt文件把你常用的命令和注释写进去忘了就查。这不丢人很多资深 Linux 用户也有自己的速查表。3. 从零搭一套可用的无人机开发环境3.1 系统安装后的第一轮配置系统装好进入桌面后别急着装软件先把系统更新和软件源配置好。Ubuntu 20.04 默认的软件源服务器在国外国内访问速度会非常慢所以第一件事就是换源。打开终端编辑/etc/apt/sources.list这个文件将http://archive.ubuntu.com和http://security.ubuntu.com替换成国内镜像源地址。我实测过多个镜像源阿里云和清华源都相当稳定。换完源后执行sudo apt update更新索引然后执行sudo apt upgrade -y升级所有已安装的软件包。接下来做四项基础配置。第一项是设置软件仓库的额外组件包括 restricted受限软件、universe社区维护的开源软件、multiverse非自由软件如果你的sources.list里默认没有这些组件需要手动加上。第二项是安装基础开发工具包用一条命令完成sudo apt install -y build-essential cmake git vim curl wget net-tools ssh。其中 build-essential 包含了 gcc、g、make 等编译核心工具是你后面编译 C/C 项目的基础。第三项是配置 Git 的用户信息这些信息会记录在你每次提交代码时git config --global user.name 你的名字和git config --global user.email 你的邮箱。第四项是安装输入法英文系统默认不带中文输入法你可以用sudo apt install fcitx5 fcitx5-chinese-addons安装然后重启后切换输入法框架。很多同学在这一步会忽略一个细节系统自带的 Python 3.8 不要动。Ubuntu 20.04 系统的很多底层工具都依赖这个 Python 版本如果你自作主张把它换成了 Python 3.10可能会引发一系列系统工具崩溃。需要更高版本 Python 时用apt install python3.10额外装一个并存版本或者直接用虚拟环境工具。3.2 核心工具链编译器、Python、Git严格来说无人机开发环境的软件栈分为好几层。底层是编译工具链负责把 C/C 源码编译成可执行文件中间是构建工具CMake、Make负责管理编译流程上层是各种依赖库和框架比如 Eigen线性代数库、OpenCV图像处理库、BoostC 通用库、ROS机器人操作系统、MAVLink无人机通信协议库。先说 CMake。现代 C 工程几乎都用 CMake 来组织构建流程PX4、ROS、MAVSDK 这些项目全部基于 CMake。Ubuntu 20.04 自带的 CMake 是 3.16 版本对 PX4 和 ROS Noetic 来说正好够用但如果你要编译更新的项目可能需要升级到 3.22 以上。升级方式不要用apt因为源里的版本比较旧推荐用pip install cmake --upgrade或从 CMake 官网下载预编译包把解压后的bin目录加入PATH。然后是编译链版本的问题。PX4 官方推荐的 GCC 版本是 9.x这与 Ubuntu 20.04 默认安装的版本一致。ROS Noetic 同样以 GCC 9 为基准进行测试。所以如果你用 Ubuntu 20.04在编译器版本层面基本不会遇到兼容性问题。但如果你在 Ubuntu 22.04默认 GCC 11上装 ROS Noetic 或编译旧版 PX4就会踩到一堆警告变错误的坑。这也是我反复强调要用 Ubuntu 20.04的最直接原因之一。Python 在无人机开发中主要承担三块任务地面站脚本、数据处理、深度学习相关的内容。我建议用虚拟环境隔离每个项目的依赖。python3 -m venv venv创建虚拟环境然后source venv/bin/activate激活。你需要安装的常规包有numpy、opencv-python、matplotlib、pandas、pymavlink、dronekitpytest写测试用。安装 can 时注意用国内 pip 源加速pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple这一步能省你很多时间。Git 的用法值得单独说。无人机项目大多是多人协作分支管理是基本功。你至少要熟练掌握这几个场景git clone拉取远程仓库git checkout -b feature/xxx创建并切换到新分支git add和git commit提交本地修改git push origin 分支名推送到远程git pull拉取远程更新git merge合并分支。遇到冲突不是世界末日git status看冲突文件编辑解决冲突后git add再重新 commit 即可。3.3 PX4、ROS、Gazebo仿真环境的完整搭建仿真环境是无人机软件开发的重要环节在真机上测试前先在仿真环境里验证算法和逻辑几乎是行业标准流程。整个仿真环境可以拆成三块飞控软件PX4-Autopilot、机器人中间件ROS Noetic、仿真渲染器Gazebo。先装 ROS Noetic。打开官方 wiki按照步骤依次配置软件源、添加 ROS 的 GPG 密钥、更新索引、安装完整版 ROS Noetic Desktop Full然后初始化 rosdep。sudo rosdep init这一步经常因为网络问题失败如果你遇到网络错误可以配置 HG 代理或者手动下载 rosdep 所需的 yaml 文件放到指定位置。装完 ROS 后需要确认环境变量是否配置好echo source /opt/ros/noetic/setup.bash ~/.bashrc然后重新加载~/.bashrc。然后是 PX4 的编译。从 GitHub 克隆 PX4-Autopilot 代码到~/workspace/目录下然后运行bash ./Tools/setup/ubuntu.sh这个脚本会自动安装 PX4 编译所需的全部依赖。脚本执行完毕后用make px4_sitl gazebo编译并启动仿真。第一次编译会比较慢在性能不错的电脑上大约 20 分钟到 1 小时不等原因是它要编译整个飞控固件以及配套的 Gazebo 模型、插件。编译完成后你会看到 Gazebo 窗口弹出一架多旋翼无人机出现在仿真场景中同时终端里会显示飞控的 shell 提示符。make px4_sitl gazebo这个命令的完整含义是针对 SITLSoftware In The Loop软件在环仿真目标使用 Gazebo 作为仿真环境进行编译并启动。PX4 还支持其他机型比如make px4_sitl gazebo-classic-plane编译固定翼模型make px4_sitl gazebo_iris_opt_flow编译带光流传感器的 Iris 无人机。机组调试时如果更换了机型重新编译的时间会短很多因为它有缓存。到这里你的开发环境已经具备跑仿真、写代码、调参数的能力。4. 实操过程中最常见的五个坑4.1 USB 设备权限飞控连不上先看这里接上 Pixhawk 或者其他飞控板在 QGroundControl 里却看不到串口设备或者终端提示Permission denied: /dev/ttyACM0这是无人机开发中频率最高的报错之一。原因不复杂Linux 对设备文件的访问权限有严格限制当前用户默认不在dialout组里所以没有权限访问串口设备。解决方法有两条。临时方法是用sudo chmod 666 /dev/ttyACM0直接给设备文件加读写权限但这样只对当前插入的设备有效拔了重插又变回去。一劳永逸的方法是把自己加入dialout组sudo usermod -aG dialout $USER然后注销重新登录。之后所有串口设备都对你开放了。我额外提示一下如果飞控通过 USB 连接后dmesg显示设备是/dev/ttyACM0但飞行控制器始终没出现先试一下换一根数据线。很多 USB 线只能充电不能传数据这个坑让无数人怀疑过自己的代码最后发现是线的问题。4.2 编译中途内存不足编译 PX4 时进程被 kill 掉终端出现virtual memory exhausted或g: internal compiler error: Killed (program cc1plus)通常是因为系统内存或交换空间不足。PX4 的 C 编译对内存要求很高多线程编译时每个编译进程都会吃掉大量内存。如果编译时用make -j88 个 g 进程同时跑内存很容易被吃满。解决办法有两个。第一降低并行编译数make px4_sitl gazebo -j4牺牲一点编译速度换来稳定。第二增加交换空间sudo fallocate -l 8G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile这样即使物理内存不足系统也能通过交换分区扛过去。把这条命令放进你的笔记几乎每个新装系统的同学都会遇到一次。4.3 虚拟机里共享文件夹看不到如果你用的是虚拟机方案装了 VMware Tools 但/mnt/hgfs/下还是看不到共享文件夹这是 VMware 老问题。解决方案是手动挂载sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid1000如果提示找不到vmhgfs-fuse先执行sudo apt install open-vm-tools-desktop安装增强工具。不过我还是建议有条件的话直接用原生 Linux。虚拟机带来的硬件隔离会让你在做传感器接入、串口通信、USB 设备调试时花费很多额外时间。工程效率是最宝贵的资源不值得浪费在这些环境摩擦上。4.4 Shell 脚本执行时报错在 Windows 下用记事本或 IDE 写了.sh脚本拿到 Linux 里一跑就报$\r: command not found这是文件换行符不兼容的问题。Windows 用\r\n换行Linux 只认\n脚本的多余\r会被当成命令的一部分。解决办法是执行sed -i s/\r$// 脚本名.sh把回车符去掉或者以后写脚本直接用vim、VS Code在 Linux 里写。4.5 网络源慢导致依赖安装失败国内网络下载 GitHub 源码、ROS 包时经常超时。除了换用国内镜像源以外还可以给 Git 配置代理或者使用带有国内镜像的下载工具。git clone时如果遇到超时可以用git clone https://ghproxy.com/https://github.com/PX4/PX4-Autopilot.git这类加速地址替代原地址但注意加速服务商不保证长期稳定建议下载完成后把 remote 地址改回官方源干净一些。另外一个非常实际的建议把~/.bashrc文件里加上 Git 相关的命令别名例如alias gsgit status、alias glgit log --oneline --graph这些别名会让你的日常操作效率明显提升。5. 关于这个环境的个人体会操作到这一步你手上已经有一套完整可用的无人机软件开发环境了。但环境搭建只是起点真正决定开发效率的是你对 Linux 这套工具的熟练程度以及遇到未知问题时愿意去翻日志、查文档的耐心。我自己带过不少新同学总结出一个经验在环境配置阶段遇到报错时不要急着问别人先自己用dmesg、journalctl -xe、cat /var/log/syslog | tail -50这组命令看系统日志大部分问题的线索都藏在里面。然后把你执行过的命令和报错信息完整地记录下来很多看似随机的问题反复出现时你会发现规律。排查问题的过程其实也是你理解底层的绝佳机会。最后再分享一个小技巧。我习惯把本机的环境配置过程写成一个setup_env.sh脚本放在工程目录里内容包括换源、装依赖、配权限、建工作目录。这样不管以后是换了台新电脑还是帮同学复现环境跑一遍脚本就能搞定不用每次踩一遍相同的坑。这套思路比我当初自己一遍遍手动敲命令省下的时间多得多强烈建议你也试试。
