资讯动态

Ubuntu 20.04无人机开发环境搭建:从裸机到ROS与飞控

发布时间:2026/9/10 3:21:26 来源:尧图企业网站定制
先给一个直接结论无人机软件开发这件事绕不开 Linux而现阶段最省心的发行版就是 Ubuntu 20.04。这不是情怀是生态绑定——ROS 1 的最后一个版本 Noetic、PX4 和 ArduPilot 的官方工具链、NVIDIA Jetson 的 JetPack 镜像全部默认聚焦在 20.04 上。这篇内容对应 “Module 3Ubuntu 20.04 Linux 工程基础——无人机软件开发环境”但不是给你讲抽象的系统原理而是从裸机开始把一套能编译飞控、能跑 ROS、能连地面站的开发环境一步步搭出来同时把无人机开发中真正高频使用的 Linux 工程技能串起来。无论你是准备在 x86 工作站上用 Gazebo 仿真还是打算在机载电脑上跑视觉、接飞控这篇文章都值得照着过一遍。1. 为什么无人机开发偏偏绕不开 Ubuntu 20.04很多人开局就问“Windows 能不能做无人机开发”答案是可以但你会非常难受。飞控固件在 Windows 上用 WSL 也能编译ROS 塞进虚拟机也能跑可等你需要插着 Pixhawk 调参、用 MAVROS 跟机载电脑通信、在 Gazebo 里跑仿真的时候你会发现几乎所有官方文档、工具链和社区帖子的默认宿主系统都是同一个Ubuntu 20.04。理解这一点比急着敲命令重要得多。1.1 ROS Noetic 与 20.04 的“婚姻绑定”ROS 1 的最后一个发行版是 Noetic官方支持周期到 2025 年它只支持 Ubuntu 20.04。这个捆绑关系直接决定了很多无人机开源项目的技术选型。MAVROS、PX4-ROS 接口、Cartographer、VINS、ORB-SLAM 的 ROS wrapper这些在无人机圈子里高频出现的包大量还是 ROS 1 格式。你可以说 ROS 2 很先进、通信机制更好但摆在你面前的问题是你要参考的 80% 教程和开源代码都是基于 Noetic 写的。如果你现在开始搭环境我建议不要贪新。Ubuntu 22.04 对应的是 ROS 2 Humble20.04 对应的是 ROS 1 Noetic两者在命令行习惯、工作空间结构、节点通信方式上都有差异。你未来可以往 ROS 2 迁但现阶段调试飞控、复现论文、跑开源算法Noetic 的兼容性是最稳的。1.2 PX4/ArduPilot 工具链的适配现状PX4 官方开发者文档里的 Toolchain InstallationUbuntu 20.04 是最顺滑的路径。虽然 22.04 也能装但经常遇到 Python 版本不一致、GCC 版本过新导致的 ABI 兼容问题。我自己用 Ubuntu 22.04 编译过一些老版本的 PX4 固件报错信息经常指向编译器版本太新最后只能切回 20.04 或者用 Docker 容器解决。ArduPilot 那边更保守。它支持很多飞控板和老外设很多驱动库在 20.04 上的行为最正常。你如果做的是特定飞控硬件适配20.04 的 GCC 9 工具链比新版 GCC 更少踩坑。飞控固件编译这件事稳定性远大于版本新鲜度。1.3 Jetson 与工控机的默认选择机载电脑这块NVIDIA Jetson Nano、Xavier NX、Orin Nano 在很长一段时间内的 JetPack 5.x 都基于 Ubuntu 20.04JetPack 6 才切到 22.04。如果你现在从 x86 工作站开始学后面想把环境平移到 Jetson 上跑选 20.04 就能做到从桌面端到 ARM 端几乎无缝迁移。很多做物流无人机、测绘无人机的工控机厂商出厂镜像也还是 20.04。这就是“跟主流生态走”的好处你遇到的大多数问题别人早就遇到过并留下了解决方案。2. 装完系统别急着装软件先把这三件事办妥拿到一台新装好的 Ubuntu 20.04 桌面版第一步不是装 ROS也不是装地面站而是把系统本身收拾利索。我见过太多人上来就下载各种软件结果 apt 卡成老牛拉车、SSH 连不上、中文输入法没有开发进度全耗在环境问题上。先把下面三件事办了后面会舒服很多。2.1 更换软件源避免 apt 卡成老牛拉车Ubuntu 默认的软件源在国外国内网络环境下 apt update 经常超时装个小工具都要等半天。这一步务必先做。备份原始源文件是一个好习惯sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后用 sed 一键替换成国内镜像源比如阿里云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 sudo apt upgrade -y20.04 的代号是 focal如果你手动改动 sources.list注意确认每一行都指向 focal 而不是 jammy 或 bionic。区分版本号是关键我之前见过有人把 20.04 的源写成 22.04 的结果 apt update 直接报错。2.2 开启 SSH让“躺着开发”成为可能无人机开发往往要长时间连接机载电脑总不能每次都在机载电脑上插显示器键盘。开启 SSH 是标配操作sudo apt install openssh-server sudo systemctl enable --now ssh sudo systemctl status ssh查看 IP 地址ip addr show之后你在本地电脑上就能用 VS Code 的 Remote SSH 插件直接连进去编辑代码远程终端、远程调试全部搞定。这个习惯建议从第一天就建立后面切到 Jetson 会非常顺手。2.3 输入法与基础工具解决“水土不服”中文输入法直接用 fcitx5 就好sudo apt install fcitx5 fcitx5-chinese-addons然后在/etc/environment里写入GTK_IM_MODULEfcitx QT_IM_MODULEfcitx XMODIFIERSimfcitx重启后生效。搜狗输入法在 Linux 上的维护状态一般不太建议浪费时间折腾。基础开发工具一次性装齐sudo apt install git curl wget vim htop net-tools cmake build-essential sshfs这些不像 ROS 那么显眼但几乎天天用。git 管理代码curl 下载文件vim 救急改配置htop 看系统状态net-tools 提供 ifconfig 老命令build-essential 提供编译链cmake 是后面很多源码工程的基础。装完这些系统才算能干活。3. 无人机开发真正用得上的 Linux 工程基础这一章不打算把 Linux 命令大全搬过来只挑无人机开发场景里最高频的一批知识和命令讲。掌握了这些你至少能独立处理 80% 的日常问题。3.1 权限思维不搞懂会一直卡住Linux 的权限模型是新手最容易懵的地方。一个文件有三组权限位属主owner、属组group、其他用户other每组有读r、写w、执行x三种权限。用ls -l查看比如-rw-r--r--表示属主可读写组和其他用户只可读。你下载了一个地面站 AppImage双击没反应大概率就是权限问题——文件没有执行权限。解决办法chmod x ./QGroundControl.AppImage这里要特别提醒一个常见坑不要用 sudo 去编译飞控固件或者 ROS 工作空间。用 sudo 编译出来的构建文件属主是 root之后普通用户再编译会报权限错误你又得回头 chown。正确做法是普通用户直接编译只有在安装系统级依赖时才用 sudo。还有个高频命令是 chown比如sudo chown -R $USER:$USER ~/catkin_wsROS 工作空间有时候会被 root 污染这条命令把工作空间所有权还给当前用户能解决很多莫名其妙的权限报错。3.2 串口设备与硬件调试的核心命令无人机开发离不开串口设备。飞控通过 USB 连接电脑时会生成/dev/ttyACM0或/dev/ttyUSB0这样的设备节点。很多新手不知道设备去哪了其实三条命令就能定位lsusb dmesg | tail -n 30 ls -l /dev/ttyUSB* /dev/ttyACM* 2/dev/nulllsusb看 USB 总线上有没有识别出设备dmesg看内核日志里设备被识别成了什么节点ls确认设备节点是否存在。把设备节点想象成门牌号dmesg 就是物业登记表设备插上去之后物业会告诉你它被安排在了哪个门牌。读串口数据常用 tio 或 screensudo apt install tio sudo tio /dev/ttyACM0串口调试在无人机开发里非常常见比如查看飞控的 NMEA 输出、调试数传模块、和底层传感器通信。不要害怕命令行读串口比图形化工具更直接而且很少出兼容性问题。3.3 进程、服务与日志出问题时怎么定位无人机系统出问题时最忌讳瞎猜。有一套固定的排查链路。查看服务状态systemctl status 服务名实时看日志journalctl -f -u 服务名查看某个进程是否在跑ps aux | grep px4强制杀掉卡死的进程pkill -9 px4举个实际场景你在跑仿真时地面站突然断开第一步看 dmesg 有没有硬件报错第二步看 MAVROS 进程是否还活着第三步用 journalctl 看飞控端口的数据流。这套链路走下来基本能定位到底是硬件、驱动还是上层软件的问题而不是反复重启碰运气。4. NVIDIA 驱动安装这里的水比你想的深如果你准备在本地跑视觉 SLAM、目标检测、YOLO 推理或者单纯想让 Gazebo 仿真流畅一点NVIDIA 驱动是绕不开的一步。Ubuntu 桌面版默认的 nouveau 开源驱动性能差很多 CUDA 程序会直接报错说不支持当前驱动版本。4.1 为什么必须装驱动NVIDIA 显卡的完整能力需要闭源驱动来释放否则 3D 加速、CUDA 计算、视频编解码都受影响。Gazebo 里面的传感器仿真虽然不算重度图形但加载复杂场景时驱动不对会明显卡顿。视觉类任务就更不用说了没有 NVIDIA 驱动PyTorch 的 CUDA 版本根本起不来。先查看系统推荐的驱动版本ubuntu-drivers devices这条命令会列出当前显卡和建议安装的驱动版本号。以前面常见的驱动版本为例比如 535、545、550选 recommended 标识的那个就好。4.2 三种安装方式选哪种这里我把常见的三种方式整理成表格方便你按自己的情况选安装方式命令稳定性适用场景apt 源安装sudo apt install nvidia-driver-535高和系统更新联动新手首选卸载方便ubuntu-drivers 自动安装sudo ubuntu-drivers autoinstall高懒得查版本号时用官网 .run 手动安装官网下载后 sh 执行中需手动处理依赖特殊版本需求个人建议优先走 apt 源。原因很简单卸载干净、内核模块由系统包管理后续升级内核不会出现驱动加载不上。官网 .run 文件适合某些极其特殊的版本需求但一旦和系统自带驱动冲突处理起来非常麻烦。验证驱动装没装成功重启后执行nvidia-smi能看到显卡型号和驱动版本就说明没问题。4.3 装完黑屏、secure boot 拦路排查链路NVIDIA 驱动安装最大的坑有两个。第一个是Secure Boot。UEFI 模式下 Secure Boot 开启时系统只加载有签名认证的内核模块NVIDIA 闭源驱动的第三方模块会被拦下来典型现象是装完驱动重启卡在 logo 界面或者黑屏。解决办法是在 BIOS 里关闭 Secure Boot或者在驱动安装过程中按提示注册 MOK 密钥。第二个是装错驱动版本导致桌面起不来。如果重启后黑屏按CtrlAltF3切到 tty 命令行登录然后卸载驱动重装sudo apt purge nvidia-driver-* sudo apt autoremove再把正确的驱动装回去。这个操作我经历过不止一次尤其在移动工作站上。记住一件事桌面崩了不代表系统崩了tty 命令行是你的救援通道。5. 部署 ROS Noetic、QGroundControl 与仿真环境基础系统搞定、驱动没问题之后就开始装无人机开发的真正主角了。这一步会花不少时间但只要按顺序来基本一次能过。5.1 ROS Noetic 安装与 rosdep 网络问题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桌面完整版会包含 Gazebo、RViz、可视化工具等对无人机开发来说很合适。如果你磁盘空间紧张可以改成ros-noetic-desktop但缺了仿真工具后面还是得补。安装完成后初始化 rosdepsudo rosdep init rosdep update这里的rosdep update是新手翻车重灾区因为它要从 GitHub 上的 rosdistro 仓库拉取依赖描述文件国内网络环境下经常失败。如果卡在这里不要硬刚。社区里已经有不少替代方案核心思路是使用国内镜像源或者现成的配置工具。我自己用过的 rosdepc 就是一个社区工具它会自动把源替换成国内镜像执行逻辑和 rosdep 一样sudo pip install rosdepc sudo rosdepc init rosdepc update如果不想装额外工具也可以手动调整 rosdistro 的源地址指向镜像仓库但步骤比较绕我这里更推荐直接用现成工具省时省心。最后把 ROS 环境加进 bashrcecho source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc5.2 QGroundControl 地面站安装QGroundControl 是 Pixhawk/PX4 最常用的地面站。官方提供 AppImage 单文件版本下载之后给它执行权限sudo usermod -a -G dialout $USER sudo apt install libfuse2 chmod x ./QGroundControl.AppImage ./QGroundControl.AppImage加入 dialout 组是为了获得串口访问权限这样地面站才能连上飞控。如果你的 Ubuntu 是 20.04libfuse2 在多数情况下已经有了但保险起见还是装一下AppImage 的运行依赖它。装完之后建议重启一次让用户组变更生效。连接飞控时如果出现Permission denied: /dev/ttyACM0基本就是权限问题。重新登录或者重启后通常会好如果还不行检查当前用户是否真的在 dialout 组里groups $USER5.3 仿真环境与 MAVROS 的准备Gazebo 第一次启动时会尝试从网上下载模型库这个过程在国内经常慢到怀疑人生。我的做法是提前把模型库下载到本地然后设置环境变量export GAZEBO_MODEL_PATH~/.gazebo/models也可以从国内镜像把 gazebo_models 仓库 clone 下来放到~/.gazebo/models。模型文件其实并不大但 GitHub 下载不稳定所以提前准备好能让后续仿真顺畅很多。MAVROS 是 ROS 和飞控通信的桥梁sudo apt install ros-noetic-mavros装完之后MAVROS 还带了一个 GeographicLib 数据集安装脚本用于地理坐标系转换/opt/ros/noetic/lib/mavros/install_geographiclib_datasets.sh这个脚本会去国外源站下载数据失败率也不低。如果一直失败可以先跳过不影响基础通信等真正需要 GPS 相关功能时再回来补数据。6. 串口权限、静态 IP 与 USB 规则三个最容易卡死新手的点环境装上之后真正的无人机开发会遇到三个“新手杀手”串口没权限、设备名乱跳、网络配置不对。这三个问题单看都不难但叠加在一起能卡你一下午。6.1 串口权限为什么明明插上了还是打不开飞控比如 Pixhawk通过 USB 连接电脑时设备节点通常是/dev/ttyACM0。普通用户默认没有读写权限所以地面站或 MAVROS 会报 permission denied。把当前用户加进 dialout 组sudo usermod -aG dialout $USER重新登录后验证id $USER你会看到dialout出现在用户组列表里。这之后打开地面站就能正常识别飞控了。很多教程只让你执行 usermod 不说要重启/重新登录导致新手以为命令没用这里特别提醒一下。6.2 网络配置机载电脑与地面站通信的底层保障无人机开发里存在多种通信拓扑地面站电脑通过 WiFi 连机载电脑、机载电脑通过串口或网线连飞控、两台 x86 电脑之间互传数据。搞清楚网络配置很重要。最常见的是给机载电脑设固定 IP方便地面站每次都通过同一个地址访问。用 nmcli 操作nmcli con mod Wired connection 1 ipv4.method manual ipv4.addresses 192.168.1.101/24 ipv4.gateway 192.168.1.1 nmcli con up Wired connection 1WiFi 连接nmcli dev wifi connect SSID password 密码这里有个坑很多 USB 转以太网设备插入后网络连接名不叫 “Wired connection 1”可能需要先nmcli device status看清楚设备名再操作。静态 IP 设置好之后地面站和机载电脑之间 SSH、MAVLink over TCP、ROS Master 通信都会稳定很多。6.3 自定义 udev 规则让设备名不再乱跳如果你经常插拔多个 USB 转串口设备、USB 摄像头会发现系统按插入顺序分配 ttyUSB0、ttyUSB1、ttyACM0重启之后可能全对不上。解决方案是用 udev 规则固定设备名。先查设备的 vendor ID 和 product IDlsusb比如某个 USB 转串口模块显示1a86:7523那么就创建规则文件sudo vim /etc/udev/rules.d/99-serial.rules写入SUBSYSTEMtty, ATTRS{idVendor}1a86, ATTRS{idProduct}7523, SYMLINKttyFC重载规则sudo udevadm control --reload-rules sudo udevadm trigger之后插入这个设备/dev/ttyFC就会稳定存在你可以放心在启动脚本里写死路径不用担心插拔顺序变化导致程序连错设备。这个操作一次配置长期受益。7. 开发机的备份与日常维护无人机开发的日常节奏是“搭环境、编译、测试、改代码、再编译”环境一旦被搞坏恢复成本极高。我吃过大亏之后开始重视备份和可复现性。7.1 Timeshift装环境前先按一下“后悔药”Timeshift 是 Linux 下的系统快照工具用法类似 Windows 的还原点。安装sudo apt install timeshift创建第一个快照推荐 RSYNC 模式它会备份整个系统文件而不产生镜像文件恢复时也灵活。我的习惯是每次装大软件之前打一个快照比如“before-nvidia-driver”“before-ros-install”。万一装坏了直接恢复到快照点十分钟回到之前状态不用重装系统。有次我在工控机上装一个依赖库不小心把 glibc 搞挂了命令都敲不了。如果没有快照只能重装系统机载电脑上所有代码和配置全部泡汤。用 Timeshift 从 U 盘启动恢复后系统完整复现那次之后我再也不敢忽略快照。7.2 性能与磁盘监控别等卡死了再处理开发机上最容易被忽略的是磁盘空间。Gazebo 模型、ROS 日志、编译缓存会悄悄把磁盘塞满磁盘满了之后编译报错、数据库异常、程序崩溃全都来了。日常监控命令df -h htop清理 ROS 日志journalctl --vacuum-time3d sudo apt autoremove --purge编译工作空间时记得定期清理旧的 devel/build 目录它们体积很大而且不用保留。7.3 让环境可复现把流程写成脚本环境搭好之后强烈建议把安装流程整理成一个脚本。不需要太复杂就是把本章提到的安装命令、组授权、udev 规则一次性记下来。我自己每台新开发机都会跑一遍这个脚本二十分钟恢复完整环境。脚本内容大概长这样#!/bin/bash # setup_env.sh - 无人机开发环境一键部署 sudo apt update sudo apt upgrade -y sudo apt install -y git curl wget vim htop net-tools cmake build-essential sudo apt install -y openssh-server sudo apt install -y fcitx5 fcitx5-chinese-addons sudo usermod -aG dialout $USER # ROS Noetic 安装... # MAVROS 安装...把它丢进 git 仓库换机器、换系统、帮同事配环境时直接复用。这比每次都在网上搜教程靠谱得多。我个人的习惯是每台开发机都留一个这样的环境脚本不是为了炫技而是提醒自己这套系统不是黑盒改过什么、装过什么都有记录。无人机开发本来就是个不断重复“搭环境-验证-改-再验证”的过程能把重复部分自动化后面省下的时间非常可观。建议你也从今天开始把每次手敲的命令沉淀成脚本半个月后回头看你会感谢自己。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价