一、 引言:托管代码在无人机(UAV)底层控制中的演进与挑战
在无人机(UAV)及多旋翼飞行器工程的传统发展历程中,飞行控制系统(Flight Control System, FCS)的固件开发几乎完全被 C、C++ 和汇编语言等底层非托管语言所垄断。这是因为飞行控制系统本质上是一个硬实时(Hard Real-Time)系统,要求微控制器能够以微秒级的精度处理传感器中断、执行复杂的姿态解算矩阵运算,并以严格的周期(通常为 100 Hz 至 400 Hz,即每 2.5 到 10 毫秒一次)向电子调速器(ESC)输出脉冲宽度调制(PWM)信号。任何计算周期的延迟或抖动(Jitter)都可能导致飞行器失去空气动力学稳定性并坠毁。
然而,随着嵌入式微控制器(MCU)和单板计算机(SBC)算力的指数级增长,以及物联网(IoT)生态系统的繁荣,航空航天与机器人开发社区开始积极探索使用 C# 及.NET 生态系统来开发机载飞控算法的可行性。C# 作为一种现代、面向对象的高级托管语言,为无人机开发带来了深远的架构优势:它不仅支持快速原型设计、具有极高的内存安全性(避免了 C/C++ 中常见的指针悬挂和内存泄漏问题),还拥有极其丰富的第三方库、强大的异步编程模型(async/await)以及如 Visual Studio 和 JetBrains Rider 等世界顶级的集成开发环境(IDE)支持。
尽管优势显著,但在无人机上直接运行 C# 飞控算法面临着一个核心的架构悖论:托管语言的非确定性(Non-determinism)。C# 依赖通用语言运行时(CLR)的垃圾回收器(Garbage Collector, GC)来管理内存。当系统进行垃圾回收时,通常会触发“世界暂停”(Stop-The-World)机制,挂起所有执行线程以清理堆内存。在硬实时飞控闭环中,几毫秒的 GC 暂停是灾难性的。因此,能否在无人机上成功应用 C# 飞控算法,完全取决于开发者如何通过严苛的零分配(Zero-Allocation)代码规范、定制化的微型框架(如.NET nanoFramework)或混合协处理硬件架构来规避这种非确定性延迟。
本文将全面深入地剖析 C# 在无人机机载飞控算法中的实际应用案例,系统梳理 GitHub 上的核心开源项目,详细解析 PID 控制、传感器融合及电机混控等算法在 C# 中的具体代码实现逻辑,并探讨基于.NET 生态的无人机技术未来发展趋势。
二、 C# 飞控架构的底层技术突破:从垃圾回收应对到实时性保障
要使 C# 代码能够胜任高频的闭环飞行控制,系统架构设计必须跨越操作系统调度和托管内存管理的双重障碍。目前,开源社区通过以下几种高级技术策略成功实现了 C# 的机载控制。
1. 零分配(Zero-Allocation)与内存池编程范式
在标准的 C# 开发中,频繁使用 new 关键字在托管堆(Managed Heap)上实例化对象是常规操作。但在飞控算法的每秒数百次循环中,这种做法会迅速填满第 0 代(Gen 0)内存,从而高频触发垃圾回收。为了解决这一问题,C# 飞控项目广泛采用“零分配”策略:
- 值类型(Value Types)的极致应用: 在姿态解算和 PID 控制器中,三维向量(Vector3)、四元数(Quaternion)和欧拉角(Euler Angles)等核心数据结构被严格定义为 struct 而非 class。结构体直接分配在线程栈(Stack)上,其生命周期随方法调用的结束而立即终结,完全不增加 GC 负担。
- 内存池(Object Pooling): 对于必须使用引用类型的情况(例如网络数据包缓冲区、复杂传感器状态对象),系统在无人机起飞前的初始化阶段(Pre-flight Init)预先实例化所有所需对象,并存入内存池中。在飞行过程中,算法仅从池中借用(Borrow)对象并在用完后归还(Return),确保飞行期间的内存分配率为零。
- 现代 C# 内存扩展: 利用 Span 和 Memory 等现代 C# 特性,开发者可以在不复制数组和不产生额外堆分配的情况下,高效切片并解析来自串口或 I2C 总线的原始传感器字节流。
2. NoGCRegion API 的任务级控制
在某些运行完整.NET Core 的单板计算机上,开发者可以使用 GC.TryStartNoGCRegion 方法。该 API 允许应用程序向运行时请求分配一块巨大的预留内存,并明确指示系统在当前关键任务(如自主降落或穿越狭窄障碍物)完成前,无论如何都不要触发垃圾回收。一旦关键飞行阶段结束,系统再调用 GC.EndNoGCRegion 恢复正常的内存管理。
3. 基于微型运行时(Micro-Runtimes)的硬件抽象
为了从根本上解决操作系统调度带来的延迟,开源社区开发了专门针对嵌入式微控制器的微型.NET 运行时,最著名的是 .NET nanoFramework 和 Wilderness Labs 的 Meadow.OS。这些框架将 C# 解释器直接运行在如 FreeRTOS 或 NuttX 等实时操作系统(RTOS)之上。
在这些环境中,最底层的硬件中断(Interrupts)、PWM 脉冲生成和 I2C 时钟同步由底层的 C/C++ 实时层接管,而高层的 C# 逻辑只需负责计算并更新寄存器目标值 6。这种设计巧妙地将“严格时序”与“复杂逻辑”解耦,使得 C# 能够在保障飞行安全的前提下控制无人机硬件。
三、 GitHub 核心开源项目深度解析:C# 机载飞控的具体实现
通过对 GitHub 开源生态的深度挖掘,目前存在多种直接在无人机上运行 C# 代码的架构方案。以下是该领域内最具代表性和技术深度的几个核心开源项目案例。
开源项目 / 架构核心硬件平台C# 运行环境飞控算法实现方式GitHub / 参考来源UAV-NETPandaboard (Linux)Mono FrameworkC# 100Hz 主循环,外置 Pololu 控制器输出 PWMsiegelpeter/UAV-NETPilotgadgetryRaspberry Pi (Win IoT)UWP /.NET CoreC# 卡尔曼滤波,通过 I2C 驱动 PCA9685 芯片tswanepoel/pilotgadgetryM5Stamp FlyM5Stack Stamp-S3.NET nanoFramework纯 C# 读取 I2C 传感器,内置底层 PWM 驱动官方示例与文档Meadow.FoundationSTM32F7 / Meadow F7Meadow.OS (基于 NuttX)官方提供 C# PID 库与传感器驱动封装WildernessLabs1. 混合 SBC 架构案例:siegelpeter/UAV-NET
siegelpeter/UAV-NET 是一个极具启发性的开源机器人框架,旨在证明使用现代 CPU 和高级操作系统(如 Ubuntu Server Linux)以及托管语言(C# / Mono)开发无人机控制器的可行性 1。传统上,树莓派或 Pandaboard 级别的单板计算机(SBC)不适合直接做飞控,因为 Linux 内核的非实时性会导致软件 PWM 输出产生严重的抖动。
架构突破: 为了克服 Linux 和 C# GC 的延迟,UAV-NET 采用了“主从混合”设计。C# 框架承担了高阶的 PID 控制、导航任务规划、GPS NMEA 解析以及所有的事件驱动通信。系统的核心是一个严格运行在 100 Hz 频率下的 C# 循环,该频率与 Sparkfun Razor 惯性测量单元(IMU)的输出频率完全同步 1。
为了解决 PWM 抖动,UAV-NET 巧妙地将底层脉冲生成任务卸载(Offload)给了一块名为 Mini Maestro 的独立硬件板。C# 算法计算出四个电机的推力值后,通过 USB 串口将指令极速发送给 Mini Maestro,后者再以低于 1 毫秒的延迟生成高精度的硬件 PWM 信号控制电调(ESC)。此外,该项目重写了工业级的 C# PID 控制库,专门针对飞控参数进行优化,并在代码层面进行了深度改造以实现极低的垃圾回收开销(Low GC Overhead) 。该框架甚至支持在飞行过程中通过事件驱动机制实时动态调整 PID 增益参数(In-flight PID Tuning),这在调试大型 C# 系统时展现出了巨大的便利性。
2. Windows 10 IoT Core 架构案例:tswanepoel/pilotgadgetry
由开发者 Theunis Swanepoel 创建的 tswanepoel/pilotgadgetry 项目是另一个致力于在高级操作系统上使用 C# 实现四旋翼飞控的杰出探索。该项目专门针对运行 Windows 10 IoT Core 的设备(如 Raspberry Pi 2/3)开发,采用了通用 Windows 平台(UWP)技术栈。
算法与硬件集成深度: 与 UAV-NET 类似,Pilotgadgetry 认识到 Raspberry Pi 自身的 GPIO 无法提供飞控所需的实时 PWM。因此,它引入了 PCA9685 PWM 控制器芯片。C# 核心代码通过硬件 I2C 总线向 PCA9685 发送占空比指令,由芯片生成精确的 50Hz-400Hz 电机控制信号。
该仓库在飞行控制算法的 C# 实现上非常硬核。它没有依赖现成的飞控固件,而是从零开始在 C# 中实现了以下关键组件:
- 定制传感器驱动: 包含针对 L3GD20H 陀螺仪、LSM303D 加速度计/磁力计、LPS25H 气压计以及 SRF02 超声波测距仪的独立 C# 库。
- C# 姿态和航向参考系统(AHRS): 项目在托管代码中实现了一套完整的传感器融合(Sensor Fusion)算法,核心包含一个用 C# 编写的卡尔曼滤波器(Kalman Filter),用于处理原始 IMU 数据并消除欧几里得空间中的线性加速度误差,从而计算出精确的飞行器倾角。
- 独立 PID 闭环: 为角位置控制量身定制的 PID 算法控制器,负责计算并输出到 PCA9685 的各个通道。 该项目深刻展示了面向对象语言在组织复杂数学模型(如卡尔曼矩阵运算)时的代码可读性优势。
3. 微控制器微框架案例:.NET nanoFramework 与 M5Stamp Fly
如果说上述两个项目是混合架构的代表,那么 .NET nanoFramework 则是将 C# 直接推向裸机(Bare-metal)执行的先锋。该框架专为受限嵌入式设备设计,支持 ESP32 等主流微控制器。
开源无人机平台 M5Stamp Fly: M5Stack 公司推出的一款名为 Stamp Fly 的微型四旋翼无人机,是 nanoFramework 飞控应用的最佳物理载体之一。该无人机的主控芯片为 ESP32-S3,这正是 nanoFramework 官方重点支持的芯片架构之一。
M5Stamp Fly 在极其紧凑的 PCB 板上集成了 BMI270(6 轴陀螺仪)、BMM150(3 轴磁力计)、BMP280(气压计)和双 VL53L3(飞行时间距离传感器)。在 nanoFramework 的生态中,开发者可以通过 GitHub 上的 nanoFramework.IoT.Device 仓库直接获取这些传感器的 C# 驱动绑定(Bindings)。由于底层 CLR 解释器已经由 C 语言处理了硬件寄存器的映射,开发者可以使用纯 C# 代码构建整个控制闭环:
- 在 C# 的 while(true) 主循环中,通过 I2C 读取 BMI270 的原始加速度和角速度。
- 利用 C# 的 Math 类进行数据滤波和姿态解算。
- 通过 nanoFramework 提供的 System.Device.Pwm 命名空间,直接向控制四个空心杯电机的引脚输出 PWM 占空比。
由于 ESP32 是一颗双核 240MHz 的处理器,它的算力足以让轻量级的 nanoFramework CLR 在保障毫秒级 PWM 硬件输出的同时,运行复杂的 PID 控制循环。
4. 企业级微控制器方案:Wilderness Labs Meadow
另一个支持 C# 开发的强大物联网平台是 Wilderness Labs 推出的 Meadow,它被设计为唯一允许在微控制器上运行完整.NET 应用程序的全栈物联网平台。Meadow F7 核心计算模块基于强大的 STM32F7 微控制器构建。
硬件抽象与算法集成: Meadow 将底层的实时操作系统(NuttX)与上层的 Mono/.NET 运行时完美融合。特别值得注意的是,NuttX 本身也是世界上最著名的开源飞控系统 PX4 Autopilot 的底层核心操作系统。
通过 GitHub 上的 WildernessLabs/Meadow.Foundation 仓库,平台提供了一个极其庞大的即插即用硬件外设库。更为关键的是,Meadow.Foundation 直接内置了标准的 PID 控制器类。开发者可以通过继承这些基础类,快速组装出无人机的高度保持(Altitude Hold)和姿态稳定(Attitude Stabilization)逻辑。因为中断服务例程(ISR)由底层的 NuttX 内核实时处理,C# 应用程序可以专注于更高维度的逻辑处理和网络通信,而不会干扰飞行硬件的控制时序。
四、 核心飞控算法在 C# 中的代码级设计与实现原理
为了深刻理解 C# 在无人机上的运作机制,必须将控制理论与 C# 语言特性相结合。无人机(以四旋翼为例)是一个典型的欠驱动系统(Underactuated System):它具备六个自由度(三个平移轴 x, y, z 和三个旋转轴 Roll, Pitch, Yaw),但只有四个控制输入(四个电机的转速)。这要求飞控算法通过调整姿态来实现平移运动。
1. PID 控制器的面向对象建模
比例-积分-微分(PID)控制器是飞行稳定性的核心。在诸如 pilotgadgetry 或 UAV-NET 这样的 C# 项目中,PID 逻辑不再是零散的函数集合,而是被设计成具有丰富领域模型的对象(Rich Domain Model)。通常会定义一个 PIDController 类或结构体来封装 P、I、D 状态变量。
PID 的数学方程如下:
在 C# 的代码实现中,这种连续时间方程被转换为离散时间算法,并在飞行主循环中每次迭代执行:
- 比例(Proportional, ): 关注当前误差(期望角度 - 当前角度)。在 C# 代码中,直接将 Error * Kp。这是将无人机推回平衡状态的主力。
- 积分(Integral, ): 关注历史误差的累积。代码实现为 IntegralAccumulator += Error * dt(其中 dt 是两次循环的时间差)。这用于消除系统稳态误差,例如无人机重心偏移导致的持续漂移。为防止积分饱和(Windup),C# 逻辑中通常会添加对累加器的钳位(Clamp)限制。
- 微分(Derivative, ): 预测未来误差趋势。代码实现为 (Error - PreviousError) / dt * Kd。这起到了阻尼器的作用,防止无人机在回到水平位置时发生过度补偿(Overshoot)和震荡。
一个稳健的 C# 飞控通常采用串级 PID(Cascaded PID)架构 :外环控制位置(Position)或高度(Altitude),其输出作为内环速度(Velocity)或姿态角(Attitude)的输入设定点 29。最内层的角速度(Rate)环必须以最快的频率运行,直接响应由于风等外界干扰引起的瞬时旋转变化。
2. 传感器融合:卡尔曼滤波与互补滤波
PID 控制器的计算前提是系统必须准确知道自身的当前姿态。IMU 中的加速度计(Accelerometer)能够提供绝对的重力参考,但在无人机震动环境下充满高频噪声;陀螺仪(Gyroscope)能精确测量瞬间角速度,但在积分计算角度时会产生不可逆的漂移(Drift) 。
在 C# 飞控开发中,实现传感器融合算法是关键挑战。
- 互补滤波(Complementary Filter): 一种计算量极小的算法,非常适合算力较弱的单板或 MCU。其 C# 实现逻辑仅为:Angle = 0.98 * (Angle + GyroData * dt) + 0.02 * AccelData。它利用高通滤波器处理陀螺仪数据,低通滤波器处理加速度计数据。
- 卡尔曼滤波(Kalman Filter): 在 pilotgadgetry 项目中被采用 16。它通过矩阵运算预测无人机状态并利用传感器测量值更新该预测 。在 C# 中,这通常需要引入轻量级的矩阵运算库(如 System.Numerics)来处理协方差矩阵和状态转移矩阵的乘法。尽管开销较大,但现代处理器完全有能力在几毫秒内完成 C# 的矩阵计算。
3. 电机混控算法(Motor Mixing Algorithm)
当姿态 PID 计算出所需的滚转扭矩(Roll)、俯仰扭矩(Pitch)、偏航扭矩(Yaw)以及高度 PID 计算出所需的总推力(Thrust)后,电机混控算法(MMA)负责将这些抽象力转化为四个电机的具体 PWM 脉宽值。
在经典的“X型”四旋翼布局中,C# 混控逻辑通过简单的代数加减实现力矩分配:
- MotorFrontLeft = Thrust + Pitch + Roll - Yaw
- MotorFrontRight = Thrust + Pitch - Roll + Yaw
- MotorRearLeft = Thrust - Pitch + Roll + Yaw
- MotorRearRight = Thrust - Pitch - Roll - Yaw
C# 代码随后会对这些计算结果进行阈值限制(例如确保输出在 1000us 到 2000us 的标准 PWM 范围内),以防止溢出,并最终通过硬件接口发送至电调。
五、 软件在环(SITL)、飞行仿真与 C# 的先天优势
在将任何未经充分测试的飞控算法部署到真实物理硬件之前,进行飞行仿真和软件在环测试(SITL)是现代航空工程的标准操作。在这一领域,C# 凭借其在游戏引擎和 3D 图形技术中的统治地位,展现出了无可比拟的先天优势。
1. 基于 Unity 引擎的飞控仿真
Unity3D 作为全球最流行的游戏引擎,其底层脚本语言正是 C#。这使得研究人员能够在一个环境中同时编写物理仿真框架和飞控算法逻辑。在 GitHub 项目 alvgaona/unity-drone-controller 及 thedylone/unity-drone-simulator 中,开发者构建了具备真实空气动力学阻力、重力和刚体物理(Rigidbody Physics)环境的虚拟空间 。
在这些仿真中,无人机的“植物模型(Plant Model)”与现实世界无异。开发者可以直接在 Unity 的 FixedUpdate(一个固定的物理时间步长函数)中运行他们编写的 C# PID 控制器脚本。算法读取虚拟无人机的当前空间朝向(即虚拟传感器的反馈),计算所需推力,并通过 Unity API 对模型的四个虚拟旋翼施加扭矩和升力(AddTorque / AddForce) 。这种无缝对接极大地降低了飞控算法前期的试错成本和调试难度。
2. Microsoft AirSim 与跨平台验证
Microsoft 的 AirSim 是一款建立在 Unreal Engine(现也提供 Unity 实验版支持)之上的重量级开源无人机及自动驾驶汽车模拟器,被 NASA 及各大科研机构广泛使用。虽然其底层由 C++ 构建,但 AirSim 设计的初衷是为了 AI 算法的研究,因此它暴露了基于跨平台远程过程调用(RPC)的强大 API,完美支持 C# 等多种高级语言。
利用这套 C# API,开发者可以在完全独立于模拟器的外部.NET 应用程序中编写复杂的飞行路径规划逻辑、高级自主避障算法,甚至是基于强化学习(RL)的神经网络控制策略,随后通过代码远程控制模拟器中无人机的舵面或电机。
此外,在 predict-drone/flight-control 开源项目中,展示了基于 C# 构建桥接工具(如 X-Interface)的能力。这个用 C# 编写的工具通过 UDP 协议从 X-Plane 11 飞行模拟器接收状态数据,通过串口(Serial)转发给外部连接的嵌入式飞控硬件,然后接收硬件输出的 PWM 信号再回传给模拟器 。这种硬件在环(HITL)/ 软件在环(SITL)的测试架构充分发挥了 C# 在网络通信和串口读写方面极高的开发效率。
六、 拓展维度:C# 在地面控制站(GCS)与 MAVLink 集群协议中的主导应用
尽管本文的核心在于探讨 C# 运行于无人机“机载”硬件上的飞控算法,但如果要全面评估 C# 在无人机领域的技术版图,就必须提及它在离线(Offboard)控制、地面控制站(Ground Control Station, GCS)以及无人机集群(Swarm)管理系统中的绝对主导地位。
在工业级无人机应用中,最常见的设计模式是:底层飞行姿态稳定由运行在 Pixhawk 硬件上的 PX4 或 ArduPilot C/C++ 固件负责;而高层的航点导航、载荷控制、多机协同以及实时遥测数据分析则交由运行在地面站或伴随计算机(Companion Computer)上的 C# 应用程序来执行。
1. 现代化开源地面站:asv-soft/asv-drones
GitHub 上的 asv-soft/asv-drones 项目是目前最现代化的基于 C# 和.NET 9.0 开发的开源地面站平台之一 。该项目利用 Avalonia UI 框架实现了全平台覆盖(Windows, macOS, Linux),并能够与任何支持 MAVLink 协议的飞控(如 PX4 和 ArduPilot)无缝对接。
MAVLink 协议的高效 C# 解析: MAVLink 是无人机与地面站之间通信的轻量级二进制消息协议。asv-drones 生态中包含了 Asv.Mavlink 这个至关重要的 C# 库。在处理高频遥测数据包时,该库采用了极致的性能优化策略,内置代码生成器生成数据包的反序列化逻辑,极大地减少了字节流到 C# 对象的转换过程中的堆内存分配,确保即使在同时监控多架无人机产生海量网络吞吐时,应用程序界面依然保持极高的刷新率而不发生卡顿。
该系统还包含一个名为 Asv.Drones.Gbs 的地面基站服务模块。此 C# 服务充当 MAVLink 路由器,具备实时动态(RTK)差分 GNSS 修正能力。它能够接收基站的高精度 GPS 数据,将其封装为 MAVLink 消息,并通过 TCP/UDP 或串口透传给无人机,从而使无人机在空中实现厘米级的定位精度,这对农业喷洒或三维测绘等应用至关重要。
2. 消费级无人机控制与集群应用
对于大疆 Tello 等开放了 SDK 的消费级无人机,C# 同样是极佳的控制语言。GitHub 上的开源项目如 rphuang/TelloCSharp 和 elbruno/sk-v1-droneAssistant,利用 C# 发送 UDP 字符串指令即可轻松控制无人机的起飞、降落和翻滚动作。在此类场景下,C# 甚至与前沿的人工智能大语言模型(LLM)相结合,项目 sk-v1-droneAssistant 就展示了如何通过解析自然语言指令,实时生成 C# 飞行代码并动态执行,实现基于自然语言的智能飞行交互。
在多智能体系统(Multi-Agent System)或无人机集群(Swarm)控制的学术研究中,项目如 dronsEETAC/DroneEngineeringEcosystemDEE 演示了如何利用 C# 构建前端指挥中心。系统通过连接到外部消息代理(Broker),可以将编队航点、防碰撞的人工势场算法计算结果同时广播分发给空中成群的无人机节点,充分展示了 C# 在处理高并发网络拓扑和多线程数据流路由时的先天优势。
七、 结论:C# 在无人机控制领域的战略定位与未来展望
综上所述,利用 C# 开发无人机上运行的飞行控制算法,不仅在理论上完全可行,并且在开源社区中已经存在大量被验证的实践架构和硬件级实现案例。
对 GitHub 庞大开源库的深入剖析表明,C# 在无人机开发中的应用策略必须因地制宜:
- 对于要求微秒级硬实时的底层闭环控制(如 PWM 输出和 IMU 中断读取): 不能依赖运行于非实时操作系统(如标准 Linux 或 Windows IoT)之上的标准.NET 运行时,这必然受挫于垃圾回收(GC)延迟机制带来的物理崩溃。
- 微框架架构: 借助.NET nanoFramework(如 M5Stamp Fly)或 Wilderness Labs Meadow 等专为嵌入式环境和 RTOS 设计的微型运行时,开发者已经可以直接利用 C# 读取 I2C 传感器数据、执行 PID 控制算法,并安全稳定地输出硬件级 PWM 信号。
- 混合协同架构: 在诸如 UAV-NET 和 Pilotgadgetry 等架构中,C# 被配置为主力大脑,负责处理诸如卡尔曼滤波、航向参考等复杂数学运算,而将最底层的脉冲生成任务外包给专门的 I2C/USB 控制器芯片(如 PCA9685 或 Mini Maestro)。这种设计在保持 C# 面向对象开发优势的同时,完美绕过了实时性的致命弱点。
- 生态系统的核心引擎: C# 最大的应用版图依然在于全平台的地面控制站(如 Asv.Drones)、高并发的 MAVLink 数据流解析、物理高保真飞行模拟器(基于 Unity 或 AirSim),以及复杂的机载伴随计算机高级导航和视觉算法的实现。
随着最新版本.NET 框架原生预先编译(AOT,Ahead-Of-Time)技术的日益成熟,其内存足迹和执行效率已得到质的飞跃。可以预见,在未来的无人机系统工程中,高阶人工智能算法与底层硬件控制的边界将进一步融合。C# 以其兼具高效执行能力、强大的面向对象抽象设计和庞大开源库生态的特质,必将在下一代无人机技术栈(特别是飞行边缘计算与智能集群控制领域)中占据愈发核心且不可替代的战略地位。
引用的链接
<ol>siegelpeter/UAV-NET - GitHub https://github.com/siegelpeter/UAV-NET
ThomasJon196/quadcopter: quadcopter build with arduino flight controller - GitHub https://github.com/ThomasJon196/quadcopter
Quadrotor Control System Design - Position, Attitude, and Motor Control - Wil Selby https://wilselby.com/research/arducopter/controller-design/
.NET nanoFramework · GitHub https://github.com/nanoframework
nanoframework/Home:
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |