跳到正文
Hacker News· vishwagw98·· 9 天前AI 评分38

开源无人机模拟器 SkySim:C++20 气动仿真,支持 ArduPilot/PX4/Betaflight 固件在环

Open Source Drone Simulator

AI 导读

SkySim 是一款跨平台开源无人机模拟器,用 C++20 计算真实气动,可将飞行器交给 ArduPilot(JSON SITL)、PX4(MAVLink HIL)和 Betaflight(MSP)实际飞控固件控制。

正文 · AI 翻译

一个跨平台无人机模拟器,使用 C++20 计算真实空气动力学,并能够将飞行器交给实际的飞控固件——ArduPilot(JSON SITL)、PX4(MAVLink HIL)和 Betaflight(MSP)。

物理通过 _integrate_forces 在 Godot 4 GDExtension 中运行——热路径中零 GDScript。可在 Windows、Linux 和 macOS(Intel + Apple Silicon)上运行。

状态

SkySim 现在覆盖了从可自行飞行的模拟器到浏览器层级和基准测试套件的完整技术栈。已经端到端测试的内容包括:Python 智能体接口、感知、数据管道、基准测试和确定性测试框架;Godot 智能体服务器、感知和域随机化(已针对 Godot 4.3 验证);以及 Web 物理核心(与 Godot 解耦,已原生验证)。

仍需要编译后的 C++ 扩展 + 硬件支持的部分:真实飞行空气动力学、RGB 渲染、跨机器确定性数据,以及——没有任何代码能产生的东西——仿真到现实的迁移结果(见 docs/sim_to_real.md)。

坦诚地说,这个愿景是:每一个能让你测试无人机算法的模拟器都需要 Linux、ROS 或游戏引擎和 GPU。SkySim 的目标是让它变成一个 URL。分阶段进展见 ROADMAP.md。


让它跑起来——选择你的级别

0. 在浏览器中飞行——无需安装(第 4 阶段,预览)

物理核心编译为 WebAssembly 并完全在客户端运行。打开托管页面,用键盘飞行,或放入一个 JavaScript 控制函数。构建和托管方法见 web/(web/build_wasm.sh,然后服务 web/)。重型机器学习和固件 SITL 使用原生智能体服务器;浏览器层级用于交互式飞行和经典/轻量控制。

1. 只想试试?下载并运行。无需安装。

从 Releases 页面获取独立构建版本:

你的操作系统 下载 运行方法
Windows SkySim-windows.zip 解压,双击 SkySim.exe
Linux SkySim-linux.zip 解压,chmod +x SkySim.x86_64,运行它
macOS SkySim-macos.zip 解压,右键点击应用 → 打开(未签名)

无需 Godot、无需编译器、无依赖。一切均已打包。

2. 想在 Godot 编辑器中打开它(以修改场景/脚本)?

  1. 安装 Godot 4.3+——一次便携下载,无需管理员权限,无需安装程序。
  2. 从 Releases 下载 SkySim-godot-project.zip 并解压。适用于所有操作系统的预构建扩展二进制文件已包含在内——你无需编译任何东西。
  3. 打开 Godot → 导入 → 选择解压后的文件夹 → 运行。

3. 开发者 / 模组制作者——从源码构建 C++ 扩展

只有在你修改 C++ 物理时才需要这样做。只需一条命令,并且 godot-cpp 会自动获取——无需 git 子模块。

# Linux / macOS
./scripts/build.sh

# Windows
scripts\build.bat

更喜欢直接用 CMake?

cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --parallel
# Output: gdextension/bin/(lib)drone_sim.<platform>.release.<arch>.(dll|so|dylib)

要求:CMake ≥ 3.22、C++20 编译器(MSVC 2022 / GCC 12+ / Clang 15+)、Python 3.8+。用 -DGODOTCPP_GIT_TAG=godot-4.3-stable 将 godot-cpp 与你的编辑器匹配。

可移植性说明:二进制文件故意在构建时未启用 -march=native,因此它们可以在同一架构的任何 CPU 上运行。仅在私有的单机构建中开启 -DDRONE_SIM_NATIVE=ON——它会固化你 CPU 的指令集,在其他机器上会崩溃。

跨平台二进制文件是如何制作的:你不需要制作它们。推送一个 v* 标签会触发 GitHub Actions(.github/workflows/),它会在 Windows、Linux 和 macOS(x86_64 + arm64)上编译扩展,导出独立应用,并自动将所有内容附加到 Release。


架构

DroneBody (RigidBody3D subclass)
├── RotorArray → BladeElementSolver × N   ← BET thrust/torque per rotor
├── Atmosphere        ← ISA density/pressure + Dryden turbulence (MIL-HDBK-1797)
├── AeroEffectsBundle ← Cheeseman-Bennett ground effect + Leishman VRS
├── FlightController  ← PX4-style cascade PID (attitude + rate)
├── MixerMatrix       ← wrench → per-rotor throttle allocation
├── SensorSuite       ← IMU / barometer / GPS with noise + bias
└── SITLManager       ← ArduPilot / PX4 / Betaflight bridges

每个物理 tick 的控制优先级:SITL 固件(新鲜执行器帧 < 0.5 秒)→ set_rotor_throttles() → 内部 PID → 电机关闭。

空气动力学

  • 叶素理论 — 每个旋翼 24 个径向环;诱导速度通过 3 次 Rankine-Froude 动量理论的牛顿迭代求解;一阶 ESC 滞后 (esc_tau = 15 ms) 和陀螺进动。
  • 地面效应 — Cheeseman-Bennett T_IGE/T_OGE = 1/(1 − (R/4h)²), 在 h/R = 3 以上逐渐淡出。
  • 涡环状态 — Leishman 起始包络带迟滞(0.5 秒 建立,1.2 秒恢复),最多 30% 推力损失,伴随约 2.3 Hz 抖振。
  • ISA 大气 — 标准对流层,Sutherland 定律粘度。
  • Dryden 湍流 — 每轴一阶成形滤波器,运行时可调。

在你自己的 Godot 项目中使用 SkySim

  1. 将 gdextension/ 文件夹复制到你的项目根目录(Godot 4 会自动检测 它 — 无需启用插件)。
  2. 添加一个 DroneBody 节点(出现在 RigidBody3D 下),带一个 CollisionShape3D 和一个视觉 MeshInstance3D 子节点。
  3. 对于固件在环,添加一个 SITLManager 作为 DroneBody 的子节点。
  4. 设置 项目设置 → 物理 → 每秒物理滴答数 = 250–400 (ArduCopter 用 400)。此项目已以 400 发布。

使用真实飞控固件(SITL)飞行

固件 传输 端口 谁连接
ArduPilot UDP(sim = 服务器) 9002 AP 向我们发送舵机数据包
PX4 TCP(sim = 服务器) 4560 PX4 SITL 连接到我们
Betaflight TCP(sim = 客户端) 5760 我们连接到 Betaflight
# ArduPilot
cd ardupilot && sim_vehicle.py -v ArduCopter -f JSON:127.0.0.1 --console --map

# PX4
cd PX4-Autopilot && make px4_sitl none_iris

# Betaflight
cd betaflight && make TARGET=SITL && ./obj/main/betaflight_SITL.elf

先运行 SkySim 场景,然后启动固件。解锁、模式和 任务来自你的 GCS(Mission Planner / QGroundControl)。坐标系为 航空航天标准(NED 世界 / FRD 机体,见 include/core/frames.hpp);旋翼 顺序遵循 ArduPilot/PX4 quad-X 约定。

tools/ap_json_probe.py 和 tools/px4_probe.py 让你无需完整固件检出即可测试 这些桥接。


遥测

drone.get_telemetry() 每个物理滴答返回:altitude、ground_speed、 vertical_speed、roll/pitch/yaw_deg、roll/pitch/yaw_rate、total_thrust、 power_draw、vrs_active、vrs_severity、ground_effect_factor、 air_density、wind、sitl_active、sitl_source。实时 PID 调参:

drone.set_rate_roll_pid(0.15, 0.05, 0.003)
drone.set_rate_pitch_pid(0.15, 0.05, 0.003)
drone.set_rate_yaw_pid(0.20, 0.10, 0.0)

基准测试与可复现性

一个小而稳定的种子任务套件(hover、waypoint、gps_denied_nav) 让算法可以被比较和引用:

python examples/run_benchmark.py --port 5557 --out scorecard.json
python examples/check_determinism.py --port 5557

对于参考级可复现数字,使用 -DDRONE_SIM_DETERMINISTIC=ON(严格浮点)构建扩展。详情及如何提交 结果:docs/benchmarks.md。

贡献

欢迎问题和 PR。CI 在所有三个平台上构建每个 PR,因此如果它 在工作流中编译通过,对所有人都有效。物理保持在 C++ (src/、include/);场景逻辑和动态世界辅助保持在 GDScript (demo/)。

许可证

MIT — 见 LICENSE。

来源:Hacker News · github.com