simple_flight#
如果您不了解飞行控制器的工作原理,请参阅什么是飞行控制器?。
AirSim 内置了一个名为 simple_flight 的飞行控制器,默认使用。您无需进行任何操作即可使用或配置它。AirSim 还支持 PX4 作为高级用户的另一种飞行控制器。将来,我们还计划支持 ROSFlight 和 Hackflight。
优点#
使用 simple_flight 的优点是您无需进行任何额外的设置,它“开箱即用”。此外,simple_flight 使用可步进时钟,这意味着您可以暂停模拟,并且事情不受操作系统提供的高方差低精度时钟的影响。此外,simple_flight 简单、跨平台,由 100% 仅头文件、无依赖的 C++ 代码组成,这意味着您可以在同一个代码库中轻松切换模拟器和飞行控制器代码!
设计#
通常,飞行控制器设计用于在车辆的实际硬件上运行,并且它们在模拟器中运行的支持差异很大。对于非专业用户来说,它们通常很难配置,并且通常具有复杂的构建,通常缺乏跨平台支持。所有这些问题在 simple_flight 的设计中都发挥了重要作用。
simple_flight 从头开始设计,作为一个库,具有干净的接口,既可以在车辆上运行,也可以在模拟器中运行。核心原则是飞行控制器无法指定特殊的模拟模式,因此它无法知道自己是在模拟中运行还是作为真实车辆运行。因此,我们将飞行控制器简单地视为打包在库中的算法集合。另一个关键重点是将此代码开发为无依赖的纯标准 C++11 代码,仅包含头文件。这意味着编译 simple_flight 不需要特殊的构建。您只需将其源代码复制到您希望的任何项目,它即可正常工作。
控制#
simple_flight 可以通过接收所需的输入(如角度速率、角度水平、速度或位置)来控制车辆。每个控制轴都可以指定为这些模式之一。在内部,simple_flight 使用一系列 PID 控制器最终生成执行器信号。这意味着位置 PID 驱动速度 PID,速度 PID 又驱动角度水平 PID,角度水平 PID 最终驱动角度速率 PID。
状态估计#
在当前版本中,我们使用模拟器中的真实数据进行状态估计。我们计划在不久的将来添加一个基于互补滤波器(complementary filter)的状态估计器,用于使用 2 个传感器(陀螺仪、加速度计)进行角速度和方向估计。从长远来看,我们计划集成另一个库,使用 4 个传感器(陀螺仪、加速度计、磁力计和气压计)和扩展卡尔曼滤波器 (EKF) 执行速度和位置估计。如果您在此领域有经验,我们鼓励您与我们联系并做出贡献!
支持的开发板#
目前,我们已经为模拟板实现了 simple_flight 接口。我们计划为 Pixhawk V2 板和可能的 Naze32 板实现它。我们期望所有代码保持不变,实现主要涉及为各种传感器添加驱动程序、处理 ISR 以及管理其他板特定的细节。如果您在此领域有经验,我们鼓励您与我们联系并做出贡献!
配置#
要让 AirSim 使用 simple_flight,您可以在 settings.json 中指定,如下所示。请注意,这是默认设置,因此您不必显式执行此操作。
"Vehicles": {
"SimpleFlight": {
"VehicleType": "SimpleFlight",
}
}
默认情况下,使用 simple_flight 的车辆已经布防,这就是您会看到螺旋桨旋转的原因。但是,如果您不希望这样,则将 DefaultVehicleState
设置为 Inactive
,如下所示
"Vehicles": {
"SimpleFlight": {
"VehicleType": "SimpleFlight",
"DefaultVehicleState": "Inactive"
}
}
在这种情况下,您需要通过将遥控器摇杆置于向下向内位置或使用 API 手动布防。
出于安全原因,飞行控制器禁止 API 控制,除非操作员使用其遥控器上的开关同意使用。此外,当遥控器控制丢失时,出于安全原因,车辆应禁用 API 控制并进入悬停模式。为了简化一些事情,simple_flight 默认情况下无需人工同意即可通过遥控器启用 API 控制,即使未检测到遥控器也是如此。但是,您可以使用以下设置更改此设置
"Vehicles": {
"SimpleFlight": {
"VehicleType": "SimpleFlight",
"AllowAPIAlways": true,
"RC": {
"RemoteControlID": 0,
"AllowAPIWhenDisconnected": true
}
}
}
最后,simple_flight 默认使用可步进时钟,这意味着当模拟器告诉它前进时,时钟才会前进(不像挂钟那样严格按照时间流逝而前进)。这意味着时钟可以暂停,例如,如果代码遇到断点,并且时钟没有方差(操作系统提供的时钟 API 可能存在显著方差,除非它是“实时”操作系统)。如果您希望 simple_flight 改用挂钟,请使用以下设置
"ClockType": "ScalableClock"