news 2026/9/3 1:14:03

PX4与Gazebo SITL仿真:从环境搭建到多机编队实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PX4与Gazebo SITL仿真:从环境搭建到多机编队实战指南

简介:本资源是一套面向无人机控制与多智能体协同研究者的PX4四旋翼软件在环(SITL)仿真完整实践方案,聚焦自动驾驶/无人机前沿技术领域,适用于高校科研、研究生课题及ROS机器人开发工程师。资源涵盖PX4飞控栈集成、Gazebo高保真物理仿真、ROS节点通信、PID姿态控制、单机航点导航及多机编队飞行(含领导-跟随、距离保持等策略)全流程实现。压缩包共790个文件,58.42MB,以97个C++/H源码(控制算法与驱动)、84个launch启动脚本(ROS-Gazebo-PX4协同配置)、69个Python工具脚本(数据采集与可视化)、24个YAML/CFG参数配置文件(含fk_PID.cfg等关键控制器调参)、21个world/Gazebo场景模型及32个SDF物理定义文件为核心,结构清晰、模块解耦,便于二次开发与算法替换。目前已有2158人学习下载,提供可直接运行的仿真环境、完整编队控制逻辑、传感器模拟配置(IMU/GPS/摄像头)及真机调参参考,显著降低实飞风险与硬件门槛。

1. 从零到一:PX4与Gazebo软件在环仿真的核心价值

如果你正在接触无人机,尤其是想深入四旋翼的控制算法开发、多机编队协同,那么“软件在环仿真”是你绕不开的第一个,也是最重要的一个环节。我见过太多新手,包括几年前的我自己,一上来就想着买硬件、焊飞控、调PID,结果不是炸机就是烧板子,钱和时间都打了水漂。PX4作为目前最主流的开源飞控软件栈,其强大之处不仅在于能稳定控制真机,更在于它提供了一套极其完善的仿真生态,让你能在电脑里,用Gazebo这个高保真物理引擎,安全、快速、低成本地验证你的所有想法。

简单来说,PX4 SITL(Software In The Loop)仿真,就是把飞控软件本身运行在你的电脑(Ubuntu系统)上,而不是真实的飞控硬件里。Gazebo则负责模拟出一个包含物理定律(重力、空气动力学、传感器噪声)的虚拟世界,以及在这个世界里飞行的无人机模型。PX4通过虚拟的串口与Gazebo通信,接收模拟的传感器数据(如IMU、GPS),并计算出控制指令(电机转速)发送回Gazebo,驱动模型运动。这就形成了一个完整的闭环。你写的任何控制代码、参数调整、甚至是多机通信逻辑,都可以在这个闭环里先跑通、测试、迭代无数次,而不用担心任何物理风险。

为什么这如此重要?因为无人机开发,尤其是编队飞行,是一个典型的“感知-决策-控制”复杂系统。单机的稳定性是基础,多机间的通信、避障、队形保持才是难点。在仿真里,你可以轻松地给无人机“开上帝视角”,注入各种故障(如GPS失灵、电机失效),测试极端情况下的算法鲁棒性。你也可以一键生成十架、百架无人机,来验证你的编队算法能否应对大规模集群。这些在现实世界中需要巨额成本和严密安保才能完成的测试,在仿真环境中几乎零成本实现。因此,掌握PX4+Gazebo的SITL仿真,是你从无人机爱好者迈向专业开发者的必经之路。

2. 环境搭建:在Ubuntu 22.04上构建稳固的仿真基石

几乎所有关于PX4的教程都会从环境搭建开始,但这也是劝退率最高的步骤。网上的教程版本混杂,依赖关系复杂,一步出错,满盘皆输。根据最新的社区实践和热搜趋势,Ubuntu 22.04 LTS是目前最稳定、兼容性最好的选择。下面,我将结合我多次重装系统的经验,为你梳理一条清晰、避坑的搭建路径。

2.1 系统准备与ROS 2 Humble安装

PX4仿真环境的核心依赖是ROS 2和Gazebo。我们选择ROS 2 Humble Hawksbill,因为它与Ubuntu 22.04是官方匹配的长期支持版本。

首先,确保你的系统已更新:

sudo apt update && sudo apt upgrade -y

设置软件源并安装ROS 2。这里的关键是使用国内镜像源以加速下载,例如清华或中科大的源。修改sources.list后,执行官方安装脚本的核心命令如下:

# 设置locale sudo apt update && sudo apt install locales -y sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 export LANG=en_US.UTF-8 # 添加ROS 2仓库密钥和源 sudo apt install software-properties-common -y sudo add-apt-repository universe -y sudo apt update && sudo apt install curl -y sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null # 安装ROS 2桌面版(包含Gazebo等工具) sudo apt update sudo apt install ros-humble-desktop -y

安装完成后,务必在~/.bashrc文件中添加ROS 2的环境变量,这是很多后续命令找不到的根源:

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc source ~/.bashrc

注意:如果你使用zsh等其它shell,需要修改对应的配置文件(如~/.zshrc)。一个验证安装是否成功的方法是打开新终端,运行ros2 --version,应该能正确显示版本号。

2.2 PX4 Autopilot 源码下载与编译环境配置

接下来是PX4飞控代码本身。官方推荐使用px4-dev-ros-humble这个Docker镜像进行开发,但对于初学者或想深入了解编译过程的人来说,在宿主机上直接搭建更能理解其脉络。我们采用后者。

首先,安装一些基础工具和依赖:

sudo apt install git zip qtcreator cmake build-essential genromfs ninja-build exiftool -y # 安装Python3依赖 sudo apt install python3-pip python3-dev python3-wheel -y pip3 install --user kconfiglib jsonschema future empy toml pyros-genmsg packaging

然后,克隆PX4源码。注意,不要用sudo克隆,保持用户目录权限。国内用户可能会遇到GitHub克隆慢的问题,可以考虑使用Gitee的镜像源。

cd ~ git clone https://github.com/PX4/PX4-Autopilot.git --recursive cd PX4-Autopilot

这里有个巨坑:子模块(Submodules)。如果网络不好,--recursive可能会失败。如果克隆后进入PX4-Autopilot目录,发现Tools/sitl_gazebo等文件夹是空的,就需要手动初始化并更新子模块:

git submodule update --init --recursive

这个过程可能很漫长,需要耐心等待。

子模块完成后,开始编译第一个目标:px4_sitl_default。这个目标会构建用于Gazebo仿真的PX4可执行文件。

make px4_sitl_default

第一次编译会下载工具链(如arm-none-eabi-gcc)和Nuttx系统,耗时较长(可能30分钟以上),请保持网络通畅。如果卡在fetching xtensa compilers(这是为真实硬件编译用的工具链),你可以暂时跳过,因为SITL仿真不需要它。可以在make命令前加上PX4_NO_XTENSACOMPILE=1环境变量来跳过。

2.3 Gazebo模型与仿真世界配置

编译成功后,你已经有了PX4 SITL的核心。但要让无人机在Gazebo里飞起来,还需要对应的无人机模型和仿真世界。幸运的是,PX4源码的Tools/sitl_gazebo目录下已经包含了丰富的模型(如Iris, Typhoon H480)和世界文件(如空世界、城市、草原)。

然而,Gazebo在首次运行时,会从在线模型库下载模型,这在国内几乎是无法完成的任务,会导致Gazebo卡在启动界面。必须提前处理这个问题。

方法一:使用离线模型包。你可以寻找并下载gazebo_models.tar.gz这样的压缩包,解压后放到~/.gazebo/models/目录下。 方法二(推荐):修改Gazebo配置,阻止其在线下载。编辑或创建文件~/.ignition/fuel/config.yaml,添加:

servers: - url: https://api.ignitionrobotics.org local_cache: true cache_max_size: 1024 - url: https://fuel.ignitionrobotics.org local_cache: true cache_max_size: 1024

更彻底的方法是,在启动Gazebo时直接使用离线模式,并指定本地模型路径。但PX4的启动脚本通常会自动处理一部分。

一个关键的验证步骤是,尝试启动一个最简单的仿真:

cd ~/PX4-Autopilot make px4_sitl_default gazebo-classic

如果一切顺利,你会看到Gazebo界面启动,加载一个空旷的灰色世界,中间停着一架四旋翼无人机(默认是Iris模型),并且终端里PX4 SITL开始输出启动日志。如果Gazebo窗口黑屏或卡住,多半是模型下载问题。如果PX4启动报错,可能是环境变量未设置或依赖缺失。

3. 深入核心:PX4 SITL与Gazebo的通信与控制链路拆解

当你在终端输入make px4_sitl_default gazebo-classic并看到无人机稳稳停在Gazebo世界中时,背后已经完成了一系列复杂的握手和通信建立。理解这个链路,对于后续调试和开发至关重要。这个链路的核心是MAVLink协议和Gazebo插件

3.1 通信架构:MAVLink与Gazebo Bridge

PX4 SITL作为一个飞控程序,它认为自己连接着真实的传感器和执行器。在仿真中,这些硬件由Gazebo模拟。那么,传感器数据如何从Gazebo进入PX4?控制指令又如何从PX4传回Gazebo驱动电机?答案是MAVLink微服务隧道和Gazebo ROS插件

  1. PX4 SITL启动:当你运行make px4_sitl时,它首先会启动一个PX4实例。这个实例会创建几个关键的UDP端口:

    • 14540:用于接收来自地面站(如QGroundControl)的MAVLink指令。
    • 14580:用于发送MAVLink数据到地面站。
    • 一个随机的高端口:用于与Gazebo通信。
  2. Gazebo模型加载make命令随后会调用Gazebo,并加载指定的世界文件(如iris.world)。这个世界文件里不仅定义了地形、光照,更重要的是,它通过<include>标签引用了无人机模型文件(如iris.sdf)。在这个SDF模型文件中,定义了飞机的物理属性(质量、惯性)、外观、以及插件(Plugin)

  3. 核心插件:libgazebo_mavlink_interface.so:这是连接Gazebo与PX4的桥梁。该插件在模型中被实例化,并做了以下几件关键事:

    • 创建UDP客户端:连接到PX4 SITL启动时创建的那个随机高端口。
    • 模拟传感器:插件内部有代码模拟IMU(加速度计、陀螺仪)、磁力计、GPS等传感器。它根据Gazebo物理引擎计算出的模型位姿、速度,生成带有典型噪声和偏差的仿真数据。
    • 封装MAVLink消息:将这些仿真传感器数据,按照MAVLink协议(例如HIL_SENSOR,HIL_GPS消息)打包,通过UDP发送给PX4 SITL。
    • 接收执行器指令:监听来自PX4 SITL的UDP端口,接收MAVLinkHIL_ACTUATOR_CONTROLS消息,该消息包含了PX4计算出的各电机(通道)的控制量(通常为0~1之间的归一化值)。
    • 驱动模型:将接收到的控制量,通过Gazebo的API,转换为施加在模型关节(电机和螺旋桨)上的力或扭矩,从而使飞机在仿真中运动。
  4. 闭环形成:Gazebo根据受力更新模型状态(位姿、速度)→ 插件读取新状态并生成传感器数据 → 发送给PX4 → PX4的EKF(扩展卡尔曼滤波)融合传感器数据得到状态估计 → 控制器(位置环、速度环、姿态环)根据期望指令和状态估计计算出控制量 → 发送给Gazebo插件 → 插件施加力改变模型状态。如此循环,仿真就“活”了起来。

实操心得:当你发现仿真中无人机不受控制、疯狂抖动或者直接坠落时,排查这个通信链路是第一步。可以使用netstat -anp | grep px4查看PX4打开了哪些端口,用ss -ulnp查看UDP端口绑定情况。确保没有其它程序占用这些端口,特别是多次启动仿真未成功退出时,残留的进程会占用端口导致新的仿真无法连接。

3.2 仿真模型解析:从SDF文件理解无人机参数

我们以最常用的iris模型为例。它的模型文件位于~/PX4-Autopilot/Tools/sitl_gazebo/models/iris/iris.sdf。打开这个文件,你能直观地看到仿真无人机的所有秘密。

  • <link>标签:定义了模型的刚体部分。例如,base_link代表机身,rotor_0rotor_3代表四个电机/螺旋桨单元。每个<link>内部会定义<inertial>(质量、惯性矩)、<collision>(碰撞几何)和<visual>(外观网格)。
  • <joint>标签:连接各个<link>。对于旋翼,通常使用revolute(旋转)关节将螺旋桨连接到电机底座。关键属性是<axis>,它定义了旋转轴,这决定了螺旋桨是正桨还是反桨。
  • <plugin>标签:这是模型的灵魂。除了上述的MAVLink接口插件,你还会看到:
    • libgazebo_motor_model.so:电机模型插件。它接收来自mavlink_interface插件的控制量,并计算输出扭矩和推力。其参数如motorConstant(推力系数)、momentConstant(扭矩系数)直接决定了电机的力效,影响飞机的动力特性。
    • libgazebo_lidar_plugin.solibgazebo_optical_flow_plugin.so等:模拟各种额外传感器。如果你想测试激光雷达避障或光流定点,就需要在模型中加入并配置这些插件。
  • 参数调整的影响:在SITL中调试控制参数的一大优势,就是可以快速修改模型参数来模拟不同特性的飞机。例如,增加<inertial>中的<mass>值,飞机就会变得更“笨重”,原有的PID参数可能就无法稳定控制,这就逼着你重新整定控制器,以适应更大惯量的机型。这种能力在真机调试中是不可想象的。

4. 单机控制实战:在仿真中实现定点与航线飞行

环境搭好了,原理也懂了,现在让我们真正“飞”起来。我们将通过两个最基础也最重要的任务:手动控制、定点模式(Position)和任务模式(Mission),来掌握如何与仿真中的无人机交互。

4.1 启动仿真与QGroundControl连接

首先,启动一个带有光流和激光雷达传感器的Iris模型仿真,这为我们后续的室内定点飞行做准备:

cd ~/PX4-Autopilot export PX4_SITL_WORLD=warehouse.world # 使用仓库世界,有室内环境 make px4_sitl_default gazebo-classic_iris_opt_flow

这个命令会启动Gazebo,加载一个仓库内部的世界,并生成一架配备了向下光流传感器和激光雷达的Iris无人机。

接下来,我们需要一个地面站来发送指令和监控状态。QGroundControl (QGC)是PX4生态的官方地面站,功能强大。去官网下载AppImage版本,赋予执行权限后即可运行。

chmod +x ./QGroundControl.AppImage ./QGroundControl.AppImage

启动QGC后,它应该会自动通过UDP连接到本地14550端口(PX4 SITL默认配置)。在QGC的左上角,你会看到连接状态变为“已连接”,并显示心跳、电池、GPS等信息。如果没自动连接,可以在“应用程序设置” -> “通讯链接”中,手动添加一个UDP链接,端口为14550。

4.2 飞行模式切换与手动控制

在QGC的飞行视图中间,有一个飞行模式切换器。默认情况下,仿真无人机启动在“定高(Altitude)”模式。在这个模式下,摇杆的横滚(Roll)和俯仰(Pitch)控制飞机的倾斜角度,油门(Throttle)控制上升下降速度,偏航(Yaw)控制机头方向。飞机的高度由控制器自动维持。

让你的第一飞

  1. 在QGC中,确保模式为“定高(Altitude)”。
  2. 在Gazebo窗口中,点击视图,确保焦点在3D窗口内。
  3. 使用你的遥控器(如果已连接)或者键盘进行控制。PX4 SITL默认支持键盘控制:
    • 箭头键:控制俯仰(前后)和横滚(左右)。
    • W/A/S/D:控制油门(W上升,S下降)和偏航(A左转,D右转)。
    • T:解锁电机(Arm)。解锁前,确保飞机水平放置(在Gazebo中可以用鼠标拖动调整初始位置)。
    • L:上锁电机(Disarm)。
  4. 按下T,听到解锁提示音(在终端或QGC中有日志),然后轻推油门(按W),飞机应缓缓离地。尝试用方向键控制它前后左右移动。

切换到定点模式(Position):在QGC中将模式切换到“定点(Position)”。这个模式需要有效的水平位置信息源。在户外,通常是GPS。在我们的仓库仿真中,GPS信号很弱(室内),但光流传感器提供了水平速度估计,激光雷达或超声波提供了高度信息,EKF融合这些数据后,也能实现室内定点。

切换到定点模式后,你会发现摇杆/键盘的控制逻辑变了:现在摇杆控制的是北东地坐标系下的水平速度垂直速度。你向前推杆,飞机会以一个恒定的速度向前飞,而不是倾斜机身。松开摇杆,飞机就会刹车并悬停在当前位置。这是实现自动飞行的基础。

4.3 任务规划与自动飞行

QGC最强大的功能之一是任务规划。你可以在地图上(或Gazebo的3D视图中)点击一系列航点,为每个航点设置高度、速度、停留时间、动作(如拍照),然后上传给无人机执行。

  1. 规划任务:在QGC的“计划”视图,点击地图(或视图)添加航点。例如,设置一个矩形航线。
  2. 上传与执行:点击右上角的上传按钮,将任务发送给无人机。然后将飞行模式切换到“任务(Mission)”。无人机会自动起飞(如果第一个航点高度大于0),依次飞向各个航点,并在最后一个航点完成后自动返航或降落。
  3. 监控与干预:在任务执行过程中,你可以在“飞行视图”实时监控飞机状态、剩余航点、电池等。任何时候你都可以切换回“定高”或“定点”模式,接管控制权。

踩坑实录:在仿真中执行任务时,经常遇到无人机在航点附近“画圈”无法精确到达的情况。这通常是由于导航参数设置不当引起的。关键参数是NAV_ACC_RAD(航点接受半径)和NAV_LOITER_RAD(盘旋半径)。如果NAV_ACC_RAD设置过小(比如默认2米),而无人机的位置估计存在波动(仿真中也有噪声),它可能永远无法满足“进入半径”的条件,就会一直在航点周围徘徊。我的经验是,在仿真测试时,可以先将NAV_ACC_RAD设为5-10米,让任务流程先跑通,再逐步收紧参数测试控制精度。这些参数可以在QGC的“参数”界面中搜索并修改。

5. 迈向协同:多无人机编队仿真的实现思路

单机控制是基础,编队飞行才是体现智能和协同能力的舞台。在Gazebo中实现多机仿真,核心思想是:为每一架无人机启动一个独立的PX4 SITL实例和一个Gazebo模型,并让它们使用不同的网络端口,同时通过某种方式(如ROS 2话题)进行机间通信。

5.1 基于启动脚本的多机仿真部署

PX4提供了一套名为ros2 launch的启动方式,可以方便地启动多机。但理解其底层脚本更有助于排查问题。本质上,多机启动脚本(如multi_uav_mavros_sitl.launch)做了以下几件事:

  1. 分配唯一标识:为每架飞机分配一个唯一的ID(如1,2,3)和模型名称(如uav1, uav2)。
  2. 设置独立端口:为每个PX4实例分配独立的UDP端口,避免冲突。例如,第一架飞机的MAVLink系统ID为1,使用UDP端口14540(地面站)、14580(机外API)和18570(Gazebo通信);第二架飞机系统ID为2,端口号相应偏移,如14541,14581,18571
  3. 生成独立工作空间:每个PX4实例需要运行在一个独立的终端或后台进程中,其工作目录(PX4-Autopilot)是相同的,但通过环境变量(如PX4_INSTANCE,PX4_SIM_MODEL)来区分彼此。
  4. 在Gazebo中生成模型:通过Gazebo的ROS服务或修改世界文件,在指定初始位置(x, y, z)生成多个无人机模型。每个模型的Gazebo插件配置会连接到对应的PX4实例端口。

一个简化的手动启动两架飞机的思路如下(实际使用官方脚本更可靠):

# 终端1:启动第一架飞机 cd ~/PX4-Autopilot export PX4_SYS_AUTOSTART=4001 # Iris模型 export PX4_INSTANCE=1 export PX4_GZ_MODEL=iris1 make px4_sitl_default gazebo-classic # 终端2:启动第二架飞机(需要新开终端) cd ~/PX4-Autopilot export PX4_SYS_AUTOSTART=4001 export PX4_INSTANCE=2 export PX4_GZ_MODEL=iris2 make px4_sitl_default gazebo-classic

同时,你需要一个对应的Gazebo世界文件,里面定义了两个iris模型,并且它们的插件配置中的UDP端口要与上面实例的端口匹配。这非常繁琐,因此强烈建议使用PX4官方或社区维护的多机启动launch文件。

5.2 基于ROS 2的编队通信与控制

当多架飞机在同一个Gazebo世界中运行起来后,它们还只是独立的个体。要实现编队,就需要让它们彼此“对话”。ROS 2是理想的中间件。每架飞机的PX4 SITL实例,都可以通过一个MAVROS 2或PX4-ROS 2 Bridge节点,将其内部状态(位置、速度、姿态)和指令接口,转换为ROS 2的话题和服务。

典型的编队控制架构

  1. 状态获取:每架飞机运行一个mavros节点(或micro_ros_agent配合PX4的uxrce_dds_client),将飞机的/mavros/global_position/global(GPS坐标)、/mavros/local_position/pose(局部坐标)等话题发布到ROS 2网络中。
  2. 编队控制器:编写一个集中的编队控制节点(或分布式的节点)。这个节点订阅所有飞机的位姿信息。根据预设的队形(如三角形、菱形)、队形中心点的期望轨迹,结合避障算法,为每架飞机计算出一个期望的设定点(Setpoint),可以是位置、速度或加速度。
  3. 指令下发:编队控制器将计算出的设定点,通过ROS 2话题(如/uav1/mavros/setpoint_position/local)发送给每架飞机对应的mavros节点。mavros节点再通过MAVLink协议,将设定点指令发送给PX4飞控。
  4. PX4执行:每架飞机的PX4飞控,运行着位置控制器,它接收来自编队控制器的设定点,与自身估计的状态进行比较,通过PID等控制算法,计算出电机控制量,最终驱动Gazebo中的模型运动,从而形成编队。

一个简单的圆形编队示例思路

# 伪代码,基于rclpy (ROS 2 Python客户端库) class FormationController(Node): def __init__(self): super().__init__('formation_controller') # 订阅所有飞机的位置 self.sub1 = self.create_subscription(PoseStamped, '/uav1/mavros/local_position/pose', self.pose_callback1, 10) self.sub2 = self.create_subscription(PoseStamped, '/uav2/mavros/local_position/pose', self.pose_callback2, 10) # 发布给每架飞机的设定点 self.pub1 = self.create_publisher(PoseStamped, '/uav1/mavros/setpoint_position/local', 10) self.pub2 = self.create_publisher(PoseStamped, '/uav2/mavros/setpoint_position/local', 10) # 定时器,计算并发布设定点 self.timer = self.create_timer(0.1, self.timer_callback) # 10Hz self.center = [0, 0, 3] # 编队中心点 self.radius = 5.0 # 圆半径 self.angle_offset = {1: 0, 2: math.pi} # 两架飞机相差180度 def timer_callback(self): current_time = self.get_clock().now().seconds_nanoseconds()[0] # 计算每架飞机在圆上的目标位置 for uav_id in [1, 2]: angle = 2 * math.pi * current_time / 30.0 + self.angle_offset[uav_id] # 30秒一圈 target_x = self.center[0] + self.radius * math.cos(angle) target_y = self.center[1] + self.radius * math.sin(angle) target_z = self.center[2] # 构建并发布PoseStamped消息 pose_msg = PoseStamped() pose_msg.header.stamp = self.get_clock().now().to_msg() pose_msg.pose.position.x = target_x pose_msg.pose.position.y = target_y pose_msg.pose.position.z = target_z pose_msg.pose.orientation.w = 1.0 # 机头朝向圆心外,简化处理 if uav_id == 1: self.pub1.publish(pose_msg) else: self.pub2.publish(pose_msg)

这个简单的控制器会让两架飞机围绕(0,0,3)点,做一个半径为5米的圆周运动,且始终保持相对位置(相差180度)。在实际应用中,你需要加入更复杂的逻辑,如队形变换、避碰、通信拓扑管理等。

核心注意事项:多机仿真的资源消耗是巨大的。每增加一架飞机,就几乎要增加一整套PX4 SITL和Gazebo模型的计算开销。对于复杂的编队算法测试,建议先在简单的“空世界”中进行,并关闭Gazebo的图形界面(使用HEADLESS=1 make px4_sitl_default gazebo)以节省资源。同时,确保你的机器有足够的内存(建议16GB以上)和强大的CPU。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 1:13:35

JavaWeb实战:企业员工信息管理系统从设计到部署全流程详解

简介&#xff1a;本资源是一套完整的JavaWeb企业级员工信息管理系统毕业设计实战资料&#xff0c;面向计算机专业本科生、Java初学者及Web开发入门者&#xff0c;解决中小企业员工信息化管理痛点&#xff0c;覆盖部门管理、员工档案、考勤、薪资、请假审批等核心业务场景。压缩…

作者头像 李华
网站建设 2026/9/3 1:13:01

STM32F103移植NES模拟器:在64KB内存中重现红白机经典

简介&#xff1a;本资源是将经典NES&#xff08;Nintendo Entertainment System&#xff09;游戏模拟器成功移植至STM32F103ZET6嵌入式平台的完整工程实现&#xff0c;面向嵌入式开发初学者与进阶者&#xff0c;解决在资源受限MCU上运行复杂实时仿真系统的技术难点&#xff0c;…

作者头像 李华
网站建设 2026/9/3 1:04:46

Python实战:构建B站用户行为分析系统,从数据采集到可视化洞察

简介&#xff1a;本资源是一套完整的本科毕业设计项目——基于Python的B站用户行为分析系统&#xff0c;面向计算机、数据科学及相关专业高年级本科生与毕设指导教师&#xff0c;解决视频平台用户行为数据采集、可视化分析与系统集成的实际问题。压缩包共582个文件&#xff0c;…

作者头像 李华
网站建设 2026/9/3 1:04:26

java - redis 缓存穿透

一、缓存穿透 定义 查询一个数据库里面根本不存在的数据Redis 查不到 → 去查 MySQL&#xff1b;MySQL也查不到。 缓存永远不会生效&#xff0c;每一次请求都会直接打到数据库。举例子&#xff1a; 商铺 id 数据库最大只有 10&#xff0c;但是有人疯狂请求 id-1、id99999。 Red…

作者头像 李华
网站建设 2026/9/3 1:02:17

AI Agent开发必懂:Skill、MCP、子Agent的区别与组合

最近很多人在群里聊 AI Agent 开发时&#xff0c;都会遇到一个共同的困惑&#xff1a;今天看文档说要给 Claude 写一个 Skill&#xff0c;明天看到某个项目在提 MCP Server 的配置&#xff0c;后天又听人说复杂任务要拆成子 Agent 去跑。这三个词听起来都跟“让模型更聪明”有关…

作者头像 李华