Ubuntu 20.04无人机开发环境搭建:从交叉编译到ROS Noetic实战指南

Ubuntu 20.04无人机开发环境搭建:从交叉编译到ROS Noetic实战指南 我做了近十年的无人机飞控与嵌入式开发带过不少新人也帮很多团队搭过开发环境。几乎每个从 Windows 切过来的同事前两周都会在 Ubuntu 上栽跟头——不是装错依赖就是编译工具链版本对不上折腾一整天最后发现是 PATH 没配好。这篇文章就把 Module 3 里关于 Ubuntu 20.04 和 Linux 工程基础这部分彻底讲透从磁盘分区到交叉编译从 ROS 环境到串口权限全是我实际跑过的流程直接照着抄就行。这篇文章适合谁零基础但准备入行无人机软件开发的在校生刚入职被分配了“搭环境”任务的嵌入式新人以及想把手头的 Zynq、STM32、树莓派开发环境迁移到 Ubuntu 20.04 的工程师。核心就解决一件事让 Linux 不再是你的开发瓶颈而是你手里的趁手工具。1. 环境选型与整体设计思路1.1 为什么一定是 Ubuntu 20.04先说结论无人机相关的开源生态目前兼容性最稳的 LTS 版本就是 20.04。这个版本对应的 ROS 发行版是 Noetic而 Noetic 是 ROS 1 的最后一个长期支持版本官方支持到 2025 年。很多飞控团队尤其是基于 PX4 和 APM 的到现在还在用 18.04 或 20.04 作为标准开发环境不是因为懒而是因为大量的依赖库、编译脚本、仿真工具都是在这两个版本上验证过的。拿我之前带的一个项目举例我们在一台 Ubuntu 22.04 的机器上编译 PX4 固件gcc 版本和 Python 依赖链总是出小问题虽然最终也能绕过去但每次都要额外处理好几个 warning。而同样的代码在 20.04 上跑一套脚本下来干干净净。开发环境这件事稳定性比版本新更重要。如果你没有特殊需求非要上 22.04就老老实实 20.04。1.2 双系统还是虚拟机这个选择题几乎每个入门者都会遇到。我的答案是如果你要做飞控固件编译、交叉编译、串口连接真实飞控板直接装双系统如果只是在学习 Linux 命令、写写 Python 脚本、跑跑 Offboard 仿真虚拟机或者 WSL 也能凑合。为什么这么说虚拟机的问题在于 USB 设备透传和性能损耗。虽然 VMware 和 VirtualBox 都支持 USB 直通但偶尔会出现串口识别不稳定或者带宽不够的情况。而无人机开发中串口和 USB 转串口是你的生命线连接 Pixhawk、连接 GPS、连接数传模块任何一步中断都可能导致误判硬件问题。另外交叉编译大型工程时虚拟机的磁盘 I/O 瓶颈会非常明显编译时间可能拉长 30% 以上。当然双系统也有代价来回重启切换不方便。我个人的解决方案是一台高性能笔记本装双系统工作区放一个移动硬盘专门放代码仓库两个系统都挂载同一个仓库目录。这样 Windows 上开会议、写文档Ubuntu 里跑编译、刷固件互不干扰。2. 磁盘分区与系统初始化实操2.1 磁盘分区方案与交换分区大小计算装双系统最容易忽略的坑就是分区。很多人图省事装 Ubuntu 时选“清除整个磁盘”结果 Windows 也没了。正确做法是在 Windows 的磁盘管理里先压缩卷腾出空闲空间然后在 Ubuntu 安装时选择“手动分区”使用空闲空间创建分区。推荐的分区方案如下以 512GB SSD 为例分区大小文件系统挂载点说明EFI 分区512MBFAT32/boot/efi如果 Windows 已有 EFI 分区可复用根分区100GBext4/系统与软件安装家目录剩余空间ext4/home代码、配置、下载都在这交换分区16GBswap-休眠和内存溢出的保险交换分区大小有个简单经验公式内存小于 8GB 时swap 设为内存的 2 倍内存 16GB 及以上swap 16GB 就够了。我笔记本是 16GB 内存配 16GB swap编译大型项目时偶尔内存吃紧也能撑住。如果你打算跑 Gazebo 仿真加上编译同时进行建议 swap 再加大 8GB别省这个空间。2.2 系统安装后的基础配置清单系统装好后先别急着装 ROS按这个顺序把基础层处理干净。# 更新软件源并升级所有包 sudo apt update sudo apt upgrade -y # 安装常用开发工具 sudo apt install -y build-essential cmake git vim curl wget \ net-tools openssh-server htop terminator # 安装 Python 开发环境20.04 自带 Python 3.8 sudo apt install -y python3-pip python3-dev python3-venv # 配置 pip 使用国内镜像大幅提升安装速度 pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple/这里有个很多人忽略的细节默认的 bash 提示符太朴素建议安装terminator作为终端工具支持分屏操作。无人机开发时经常要同时打开四个终端——一个看串口日志、一个编代码、一个跑仿真、一个监控系统资源分屏终端能省掉一半的窗口切换时间。另外一定改掉默认的软件源。Ubuntu 20.04 默认的 archive.ubuntu.com 在国内下载速度非常慢装 ROS 和 PetaLinux 的时候动辄几个 GB 的依赖包速度慢真的会让人崩溃。换源的操作很简单直接把/etc/apt/sources.list里的archive.ubuntu.com替换成mirrors.aliyun.com或mirrors.tuna.tsinghua.edu.cn然后sudo apt update即可。2.3 显卡驱动与 CUDA 环境选配如果你要做目标检测、视觉 SLAM、或者用 GPU 跑仿真NVIDIA 驱动必须第一时间弄好。Ubuntu 20.04 安装 NVIDIA 驱动最简单的办法是图形界面里“软件和更新”-“附加驱动”里选择一个 recommended 版本然后重启。注意一个非常容易踩的坑不要从 NVIDIA 官网下载.run文件手动安装尤其是在已经装了开源驱动 nouveau 的情况下。手动安装驱动和系统里已有的库很容易冲突轻则分辨率异常重则开机黑屏进不了桌面。如果真的不小心进了黑屏状态重启时长按 Shift 进 recovery 模式选择 root shell执行# 卸载所有 nvidia 相关包 sudo apt purge nvidia-* sudo apt autoremove # 如果手动装过 .run 驱动需要先清理 sudo nvidia-uninstall然后再回到图形界面重新选择驱动。CUDA 的安装建议直接用sudo apt install nvidia-cuda-toolkitUbuntu 20.04 自带的版本虽然不算最新但稳定性足够满足大部分无人机视觉项目。3. 交叉编译工具链搭建3.1 为什么无人机开发绕不开交叉编译交叉编译这个概念对刚入门的人来说有点绕——不就是 Linux 上的 C/C 编译吗为什么还要单独搭一套工具链这里用一个实际场景解释你就明白了。我们常用的飞控板比如 Pixhawk 系列上面跑的是 ARM Cortex-M4 或者 Cortex-M7 处理器。你的开发机是 x86 架构的 Intel/AMD CPU两种 CPU 的机器指令完全不通用。你在电脑上编译出可执行文件直接传到飞控板上是跑不起来的。交叉编译工具链就是让 x86 的开发机能生成 ARM 指令集可执行文件的整套工具。换句话说交叉编译的本质是“在一种架构的机器上编译出另一种架构能运行的程序”。理解了这一点下面这些工具链的用途就很清晰了。3.2 为 Zynq-7000 搭建 PetaLinux 编译环境标题里特别提到了 PetaLinux这是 Xilinx现在的 AMD官方提供的嵌入式 Linux 开发套件专门用于 Zynq SoC 平台。无人机里用 Zynq-7000 的场景很典型一边用 ARM 核跑 Linux 做上层图像处理、通信协议一边用 FPGA 逻辑做实时性要求高的传感器接口和电机控制。PetaLinux 对宿主机的系统版本要求极其严格。我记得 2020.2 版本开始官方只支持 Ubuntu 18.04 和 20.04而且要求 bash 作为默认 shell要求/bin/sh指向 bash 而不是 dash。很多人在这一卡就是一天。设置默认 shell 为 bash 的命令# 设置 bash 为默认 shell sudo dpkg-reconfigure dash # 选择 No保持 /bin/sh 指向 bash安装 PetaLinux 之前还需要安装一堆依赖库。下面这个清单是我在干净系统上验证过的sudo apt install -y gcc git make net-tools libncurses5-dev \ libncursesw5-dev libssl-dev libelf-dev libtool autoconf \ automake diffstat chrpath socat xterm python3 python3-pip \ python3-setuptools python3-venv python3-wheel \ zlib1g-dev g g-multilib libgmp-dev libmpc-dev \ libusb-1.0-0 libtinfo5 libc6-dev-i386 \ gawk flex bison texinfo file unzip graphviz # 如果系统提示缺少 libtinfo520.04 默认只有 libtinfo6 # 需要从旧版本源手动安装 wget http://archive.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.3-2ubuntu1_amd64.deb sudo dpkg -i libtinfo5_6.3-2ubuntu1_amd64.deb安装完成后把 PetaLinux 安装包解压到/opt或者~/tools目录执行安装脚本。安装结束后一定要 source 一下环境变量# 假设安装到 ~/tools/PetaLinux source ~/tools/PetaLinux/settings.sh测试环境是否正常可以用petalinux-util --version查看版本号。接下来进入工程目录创建一个新的 PetaLinux 项目# 创建一个名为 drone_zynq 的工程 petalinux-create -t project --name drone_zynq cd drone_zynq # 导入硬件描述文件从 Vitis 导出的 XSA 文件 petalinux-config --get-hw-description/path/to/hardware.xsa # 构建完整镜像 petalinux-build构建完成后生成的 BOOT.BIN、image.ub 和 boot.scr 就在images/linux目录下这些就是要烧写到 SD 卡里的东西。PetaLinux 编译时最大概率出的问题就是网络。它的构建系统要从网上下载大量的源码包如果网络不稳定经常会在某一个包下载时报错。解决方法是提前把下载缓存目录配好或者用代理。但这里不展开后面问题排查里我会给出更具体的方案。3.3 面向 PX4 飞控的 ARM 交叉编译工具链除了 Zynq 这种高端平台绝大多数无人机项目用的还是 Pixhawk 这类通用飞控。PX4 固件的交叉编译通常不需要你手动装 ARM 工具链因为 PX4 的构建脚本会自己处理。但了解底层是什么能帮你排查各种诡异问题。PX4 在 Ubuntu 20.04 上用的工具链主要是gcc-arm-none-eabi这个可以从 ARM 官网或 PX4 官方脚本里安装。手动安装也很简单用 PX4 官方提供的一键脚本最快git clone https://github.com/PX4/PX4-Autopilot.git --recursive cd PX4-Autopilot ./Tools/setup/ubuntu.sh这个脚本会把你系统里折腾 ROS、Gazebo、交叉编译依赖一口气装好。但我要提醒一句这个脚本可能会改你系统里已有的 Python 包如果之前配过什么深度学习环境最好还是手动装。手动装的话核心就三步# 1. 安装 ARM 编译器 sudo apt install gcc-arm-none-eabi # 2. 安装 ninja 构建系统 sudo apt install ninja-build # 3. 安装 PX4 的 Python 依赖 pip3 install --user kconfiglib pyros-genmsg empy然后测试编译固件cd PX4-Autopilot make px4_fmu-v5_default第一次编译会下载很多子模块时间比较长耐心等。编译完成后在build/px4_fmu-v5_default目录下找到px4_fmu-v5_default.px4固件文件这个就是可以烧录到 Pixhawk 4 的固件。3.4 工具链验证与 PATH 配置的避坑细节交叉编译工具链装好之后不是能用就完事了一定要花两分钟验证一下环境。# 查看 ARM 编译器版本 arm-none-eabi-gcc --version # 查看交叉编译器的搜索路径 arm-none-eabi-gcc -print-search-dirs然后写一个最小的 C 程序测试一下能不能正确生成 ARM 指令的二进制// test.c int add(int a, int b) { return a b; }arm-none-eabi-gcc -c test.c -o test.o file test.o如果file命令输出里包含ARM字样说明交叉编译链已经正常工作。如果输出的是x86-64说明调用的不是交叉编译器而是本机的 gcc这时要检查 PATH 环境变量是不是被覆盖了。PATH 配置是新人最容易翻车的地方。比如你手动安装了 ARM 工具链到/opt/gcc-arm-none-eabi/bin但系统里的/usr/bin里有同名的arm-none-eabi-gcc那执行命令时系统会先找到/usr/bin下的版本。验证当前使用的是哪个加which arm-none-eabi-gcc。建议把交叉编译器的路径写进~/.bashrc并放在export PATH的最前面export PATH/opt/gcc-arm-none-eabi/bin:$PATH写完之后source ~/.bashrc再用which确认。这个细节决定了你编译出来的东西能不能在硬件上跑真的重要。4. 无人机软件开发的关键依赖与中间件4.1 MAVLink 协议栈与消息定义无人机软件开发的另一个核心基础是通信协议。地面站、机载电脑和飞控之间怎么对话靠的就是 MAVLink——一个专门为微型飞行器设计的轻量级通信协议。MAVLink 的消息格式非常紧凑每帧数据只有 8 到 12 字节开销非常适合在数传带宽有限的条件下传输。MAVLink 的代码是生成出来的不是手写的。它先定义了一套 XML 格式的消息标准存放在mavlink/message_definitions目录然后通过代码生成器生成对应语言C、C、Python 等的库。我们在 Ubuntu 20.04 上用 Python 开发机载程序时通常用pymavlinkpip3 install pymavlink一个最简单的读取飞控姿态信息的 Python 脚本from pymavlink import mavutil # 连接飞控串口注意改成你自己的串口设备 master mavutil.mavlink_connection(/dev/ttyUSB0, baud115200) # 等待第一个心跳信号 master.wait_heartbeat() print(收到心跳飞控连接正常) # 请求所有数据流 master.mav.request_data_stream_send( master.target_system, master.target_component, mavutil.mavlink.MAV_DATA_STREAM_ALL, 10, # 频率 10Hz 1 ) # 循环打印姿态信息 while True: msg master.recv_match(typeATTITUDE, blockingTrue) print(fRoll: {msg.roll:.2f}, Pitch: {msg.pitch:.2f}, Yaw: {msg.yaw:.2f})这里最常见的坑是串口权限问题。Ubuntu 下普通用户默认没有权限访问/dev/ttyUSB0运行上面的脚本会报Permission denied。解决办法是把当前用户加入dialout组sudo usermod -a -G dialout $USER然后一定要注销重新登录或者重启组权限才会生效。这个坑我见过太多次了提醒一次就不再多说。4.2 Ubuntu 20.04 下的串口与 USB 设备管理无人机开发会用到大量 USB 转串口设备比如 CP2102、CH340、FTDI 等。每个厂家的芯片对应的驱动内核模块不一样芯片型号内核驱动模块常见设备名CP2102cp210x/dev/ttyUSB0CH340ch341/dev/ttyUSB0FTDIftdi_sio/dev/ttyUSB0ST-Linkstlink/dev/ttyACM0当多个设备同时插入时系统分配的设备名是随机的。比如你今天插的是/dev/ttyUSB0明天可能变成/dev/ttyUSB1。这对自动化脚本来说是致命的。解决办法是用 udev 规则绑定固定的设备名。创建文件/etc/udev/rules.d/90-usb-serial.rules# CP2102 设备绑定为 /dev/ttyPixhawk SUBSYSTEMtty, ATTRS{idVendor}10c4, ATTRS{idProduct}ea60, SYMLINKttyPixhawk # CH340 设备绑定为 /dev/ttyCH340 SUBSYSTEMtty, ATTRS{idVendor}1a86, ATTRS{idProduct}7523, SYMLINKttyCH340查看设备的 idVendor 和 idProduct 用lsusb命令。配置完成后用sudo udevadm control --reload-rules重载规则重新插拔设备/dev/ttyPixhawk这个固定名称就能用了。4.3 ROS Noetic 安装与工作区初始化无人机上层应用十有八九绕不开 ROS。Ubuntu 20.04 对应的版本是 ROS Noetic这也是 ROS 1 的收官之作生态最成熟文档最完善。安装 ROS Noetic 官方给出的步骤我简化过但流程一致# 1. 添加 ROS 软件源 sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list # 2. 配置密钥 sudo apt install curl curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - # 3. 更新并安装完整桌面版 sudo apt update sudo apt install ros-noetic-desktop-full # 4. 初始化 rosdep sudo rosdep init rosdep update # 5. 配置环境变量 echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc安装过程中 rosdep 是最容易出问题的。rosdep init需要访问 GitHub 上的 raw 文件这一点在网络环境不好时要折腾很久。我的经验是先测一下网络连通性如果连不通可以手动下载ros.asc文件和 rosdep 源列表放到本地。验证 ROS 环境是否正常开两个终端一个跑roscore一个跑rosnode list。能正常输出节点信息说明 ROS 核心已就绪。接着初始化一个 Catkin 工作区mkdir -p ~/drone_ws/src cd ~/drone_ws catkin_make工作区建好后所有无人机相关的 ROS 包都放在src目录下编译产物体现在devel和build目录。这里有个新手常问的问题catkin_make和catkin build有什么区别catkin_make是老牌工具简单直接catkin build是后起之秀并行编译效率高但对包的依赖关系要求更严格。PX4 官方文档用的catkin build我建议从一开始就统一用catkin_make如果你不打算用 catkin_tools 的高级功能catkin_make更省心。5. 仿真环境验证与典型工作流5.1 Gazebo 与 PX4 Offboard 模式的结合环境搭建完成不等于万事大吉真正的验证要放到仿真里跑一遍。无人机开发里最常用的仿真组合是 PX4 Gazebo MAVROS。Gazebo 负责模拟物理世界重力、风、传感器噪声PX4 跑的是和真机完全一样的固件MAVROS 充当 ROS 和 PX4 之间的翻译官。启动仿真的完整流程# 终端 1启动 Gazebo PX4 SITL 仿真 cd ~/PX4-Autopilot make px4_sitl gazebo # 终端 2通过 MAVROS 桥接 ROS 和 PX4 roslaunch mavros px4.launch fcu_url:udp://:14540127.0.0.1:14557终端 2 看到FCU connection established的日志说明 MAVROS 和 PX4 通信成功。此时再开终端 3用rostopic echo /mavros/state能看到当前的飞行状态。一个最简单的 Offboard 模式起飞测试脚本Python#!/usr/bin/env python3 import rospy from geometry_msgs.msg import PoseStamped from mavros_msgs.msg import State from mavros_msgs.srv import CommandBool, SetMode rospy.init_node(offboard_node) # 等待 MAVROS 服务可用 rospy.wait_for_service(/mavros/cmd/arming) rospy.wait_for_service(/mavros/set_mode) arming rospy.ServiceProxy(/mavros/cmd/arming, CommandBool) set_mode rospy.ServiceProxy(/mavros/set_mode, SetMode) # 发布目标位置 pose_pub rospy.Publisher(/mavros/setpoint_position/local, PoseStamped, queue_size10) pose PoseStamped() pose.pose.position.x 0 pose.pose.position.y 0 pose.pose.position.z 2 # 起飞到 2 米高度 rate rospy.Rate(20) # 先发 10 秒 setpoint进入 Offboard 模式前的标准流程 for i in range(200): pose_pub.publish(pose) rate.sleep() # 切 Offboard 模式并解锁 set_mode(custom_modeOFFBOARD) arming(True) rospy.loginfo(Offboard 模式已启动无人机开始执行任务)这里有个原则必须记住先发布 setpoint再切 Offboard 模式。这是 PX4 的固有保护机制——如果没有持续收到有效的 setpoint飞控拒绝切入 Offboard 模式。新手第一次写 Offboard 代码经常栽在这里确认模式切不过去就怀疑飞控坏了其实只是发布顺序错了。5.2 地面站与机载电脑的通信链路验证仿真跑通了接下来要验证的是真机通信链路。地面站QGroundControl 或 Mission Planner通过数传模块和飞控通信机载电脑比如树莓派、NVIDIA Jetson通过 UART 或 USB 和飞控通信。在 Ubuntu 20.04 上验证链路的最简单方式是用mavproxy.py# 通过串口连接飞控 mavproxy.py --master/dev/ttyPixhawk --baudrate115200 # 在 MAVProxy 控制台里输入 status 查看连接状态 # 输入 arm throttle 测试解锁注意螺旋桨移除链路正常后你可以用mavlink-router或MAVSDK把数据同时转发给地面站和机载程序。比如用 MAVSDK-Python 写一个简单的航点飞行程序pip3 install mavsdkimport asyncio from mavsdk import System async def run(): drone System() await drone.connect(system_addressserial:///dev/ttyPixhawk:115200) async for state in drone.core.connection_state(): if state.is_connected: print(飞控已连接) break print(开始起飞) await drone.action.arm() await drone.action.takeoff() await asyncio.sleep(10) print(降落) await drone.action.land() asyncio.run(run())这里要特别注意串口的波特率。Pixhawk 的 TELEM2 口默认波特率通常是 57600 或 921600具体要看飞控参数设置。如果你在 QGroundControl 里能连上但串口脚本连不上八成是波特率对不上。5.3 终端分屏与效率工具配置建议最后推荐一套我日常用的终端效率配置。安装terminator后右键选择“水平分割”或“垂直分割”可以把一个窗口切成多个终端。我的习惯是左侧跑编译和代码编辑右侧分上下两格上方跑串口日志下方跑系统监控。系统监控用htop关注 CPU 和内存占用。编译大型工程时如果内存接近满载立即用free -h确认 swap 是否正常使用。另外强烈建议配置 ssh 无密码登录方便从 Windows 远程连到 Ubuntu 开发机# 在开发机上生成密钥 ssh-keygen -t rsa -b 4096 # 将公钥复制到需要远程登录的机器 ssh-copy-id 用户名目标主机IP6. 常见问题与排查技巧实录6.1 环境类问题速查表整个 Module 3 的实操过程中我整理了一份高频问题速查表基本可以覆盖 90% 的踩坑场景问题描述可能原因排查与解决方法bash 显示$而不是用户名主机名.bashrc 被改动或加载失败执行bash -l重新登录检查~/.bashrc语法串口设备Permission denied用户不在 dialout 组sudo usermod -a -G dialout $USER后注销重登arm-none-eabi-gcc: command not found工具链未加入 PATHexport PATH/opt/gcc-arm-none-eabi/bin:$PATH写入 .bashrcrosdep update报超时访问 GitHub 受限使用国内镜像源或手动下载 rosdep 订阅PetaLinux build 卡在下载源码包网络不稳定配置本地 sstate-cache 缓存目录Gazebo 启动后模型全白未下载模型文件首次启动时耐心等待模型下载完成或手动下载放到~/.gazebo/models编译时报No rule to make target子模块未更新git submodule update --init --recursiveUbuntu 开机后直接进 Windows引导顺序问题进 BIOS 设置 Ubuntu 为第一启动项或修复 GRUB6.2 PetaLinux 与交叉编译的专项坑PetaLinux 的坑值得单独写一节因为它足够折磨人。我遇到最经典的一个问题执行petalinux-build时提示/bin/sh: 1: dash: not found或者大量奇怪的语法错误。这个问题的根源在于 Ubuntu 的/bin/sh默认指向dash而 PetaLinux 的构建脚本要求/bin/sh是bash。解决方法前面已经提过但这里再强调一次sudo dpkg-reconfigure dash # 选择 No如果这个问题已经导致 PetaLinux 安装半途失败不要原地重试直接把安装目录删掉重新解压一遍否则残留文件会让你疯掉。还有一个和磁盘空间相关的坑。PetaLinux 构建过程中会产生大量的临时文件一个默认配置的工程构建一次大约需要 10-20GB 空间。如果根分区只有 50GB很容易在构建到一半的时候报No space left on device。建议确保根分区至少预留 30GB 剩余空间并且不要和/home放在同一个分区导致碎片化问题。6.3 串口工具选择与日志分析技巧排查通信问题时串口工具的选择能帮你省下大量时间。minicom是老牌工具稳定但配置稍麻烦screen轻量但功能有限我更推荐picocom配置简单退出快捷键好记CtrlA CtrlX。# 安装 picocom sudo apt install picocom # 连接串口查看飞控日志 picocom -b 115200 /dev/ttyPixhawk连接上去后你会看到飞控持续输出 NuttShell 或者 MAVLink 调试信息。这里有个细节飞控在正常运行时不一定会主动输出日志需要按回车或发送特定命令。PX4 启动时通常会有 NuttShell 的提示符nsh这时候输入top可以查看系统资源占用输入listener可以查看指定 uORB 主题的实时数据。6.4 网络与下载问题的通用解法Ubuntu 20.04 环境下很多工具链安装都要从 GitHub 拉取源码网络问题几乎是每个人都要面对的。我总结了几种可用的应对手段使用ghproxy这类 GitHub 加速代理把git clone地址的github.com前缀替换成代理地址前缀。配置git使用浅克隆减少下载量git clone --depth1。对于大文件比如 PetaLinux 安装包用带断点续传的下载工具更稳。pip 包一律配镜像源前面已提到再强调一遍。另外提醒一句不要轻易尝试在虚拟机里跑 PetaLinux。PetaLinux 构建对 CPU 虚拟化支持有要求虚拟机里经常出现莫名其妙的编译中断排查成本极高。物理机上跑一次构建可能 30 分钟虚拟机里可能折腾一下午也不一定成功。7. 从环境搭建到工程思维环境搭建这部分内容本质上是在帮你建立一套工程方法论。我在带团队的时候发现一个规律环境搭得快的工程师后面写代码和排查问题的效率通常也不会差。原因很简单搭环境的过程就是和系统底层相处和熟悉的过程你搞清楚了串口、权限、编译器、构建系统之间的关系写代码时脑海里自然会有清晰的层次感。以我自己的经验第一次把 PX4 固件编译成功、烧进飞控板点亮的瞬间是无人机开发路上最让人有成就感的一刻。而那一刻往往就来源于一个干净、稳定的 Ubuntu 20.04 环境。希望这篇文章能让你少走一些弯路把宝贵的精力留给真正的飞行控制算法和机器人应用开发。