AirSim安全系统详解:地理围栏与障碍物地图配置完整指南
【免费下载链接】AirSimOpen source simulator for autonomous vehicles built on Unreal Engine / Unity, from Microsoft AI & Research项目地址: https://gitcode.com/gh_mirrors/ai/AirSim
AirSim是由微软研究院开发的开源自动驾驶模拟器,构建于 Unreal Engine / Unity 之上。它的内置安全系统是保护无人机"不乱飞、不撞墙"的核心防线,由两大支柱组成:地理围栏(GeoFence)和障碍物地图(ObstacleMap)。本文带你从零看懂这套安全机制的工作原理与配置方法,无需任何 C++ 基础也能上手。
一、AirSim 安全系统:一次飞行要过哪些安全关?
在 AirSim 中,多旋翼飞行控制器的每个控制周期都会调用安全评估器 SafetyEval.hpp 对"下一个位置是否安全"进行裁决。安全违规类型被定义为三类(见 SafetyEval.hpp 中的SafetyViolationType):
| 违规类型 | 含义 | 触发效果 |
|---|---|---|
GeoFence | 目标位置超出地理围栏 | 拒绝该运动指令 |
Obstacle | 目标方向存在障碍物风险 | 拒绝或改道 |
VelocityLimit | 速度超限 | 限制执行 |
三者可用按位运算自由组合,例如只启用"围栏 + 避障"检查。所有输入输出都采用 NEU 世界坐标系(北-东-上,单位米),这与真实无人机行业惯例一致。
二、地理围栏配置指南:方形与圆形两种模式
地理围栏的抽象基类是 IGeoFence.hpp,它定义了统一接口checkFence(当前位置, 目标位置, 是否在围栏内, 是否允许)。AirSim 提供了两种开箱即用的实现:
1. 方形围栏(CubeGeoFence)
源码见 CubeGeoFence.hpp。你用最小角点 + 最大角点两个坐标即可框出一个长方体禁飞边界,适合模拟矩形测试场地、城市街区等规则区域。
2. 圆形围栏(SphereGeoFence)
源码见 SphereGeoFence.hpp。只需指定圆心、半径、最低/最高飞行高度,更适合模拟机场净空区、圆形测试穹顶等场景。
💡巧妙之处:两种围栏判断时并不"一刀切"。当目标点越界时,系统会比较"目标点离围栏中心/角点的距离"与"当前位置的距离"——只有当移动会让飞行器更远离围栏中心时才真正拦截(允许一定误差
distance_accuracy,默认 0.1 米)。这意味着"越界后飞回围栏内"依然是被允许的,行为更符合直觉。
三、障碍物地图(ObstacleMap):O(1) 速度的秘密
障碍物地图实现于 ObstacleMap.hpp。它没有采用常见的"网格格子"方案,而是把飞行器周围的水平面切成一个圆盘并划分成若干刻度(ticks),每个刻度记录该方向的障碍物距离与置信度:
- 快速查询:插入/删除/查询均为 O(1) 小常数,能跟上激光雷达这类高频传感器;
- 线程安全:一个线程持续更新、另一个线程随时查询,互不阻塞;
- 支持盲区:传感器覆盖不到的方向标记为 blindspot,自动取相邻刻度值兜底;
- 方向对齐:刻度 0 永远位于飞行器正前方,"前方锥形区"永远是 segment 0,方便避障逻辑直接读取。
四、SafetyEval 安全评估:风险距离如何计算?
核心逻辑在 SafetyEval.cpp,整个评估可概括为三步:
- 算目标点:对速度指令,先用制动距离模型(
vel_to_breaking_dist)推算"急停后最终会到的位置",再做检查——这保证了评估的是实际落点而非指令本身; - 算风险距离:
风险距离 = 到目标点距离 + 障碍物净空距离(obs_clearance) − 障碍物实际距离。结果 ≥ 0 说明"目标点比障碍物还近或撞进净空区",判定为潜在碰撞; - 给建议:若判定不安全,还会扫描四周刻度,找到无遮挡方向输出
suggested_vec建议速度向量,供上层避障使用。
避障策略(ObsAvoidanceStrategy)
检测到障碍物风险时,控制器按策略响应(见 SafetyEval.hpp):
| 策略 | 行为 |
|---|---|
RaiseException | 抛出异常,建议速度置零(默认,最保守) |
ClosestMove | 沿原目标方向寻找最近的无障碍落点 |
OppositeMove | 朝障碍物反方向寻找最近的无障碍落点 |
五、关键配置参数速查表
安全相关的车辆参数集中定义在 MultirotorCommon.hpp 的MultirotorApiParams中,调参时重点看这几个:
| 参数 | 默认值 | 说明 |
|---|---|---|
obs_clearance | 2 m | 与障碍物保持的最小净空距离,越大越保守 |
obs_window | 0 | 检查目标方向 ± 多少个刻度,提高鲁棒性 |
distance_accuracy | 0.1 m | 位置估计的微分精度,影响"是否更远离围栏"的判定 |
vel_to_breaking_dist | 0.5 | 速度→制动距离的换算系数 |
min_breaking_dist | 1 m | 最小制动距离 |
运行时动态调整围栏与避障行为,调用客户端的setSafety接口即可,其签名定义在 MultirotorApiBase.hpp 中——可同时传入启用的违规类型、净空距离、避障策略,以及围栏原点、半径/边长、高度上下限。
六、新手配置清单:5 分钟启用安全系统 ✅
- 选围栏形状:矩形场地选
CubeGeoFence,圆形测试区选SphereGeoFence,并预留高度上界(防止贴顶飞行); - 设置净空距离:室内小场景把
obs_clearance调小(如 1 m),室外或高速场景保持 2 m 以上; - 选避障策略:调试阶段用默认的
RaiseException快速暴露问题,演示/回放阶段可换ClosestMove让飞行更流畅; - 确认日志:围栏创建与每次
setSafety调用都会打印日志(如CubeGeoFence: min=..., max=...),方便核对配置是否生效; - 参考文档:传感器接入与设置项说明可查阅 docs/sensors.md 和 docs/settings.md,安全模块源码位于 AirLib/include/safety/,实现位于 AirLib/src/safety/。
🔒一句话总结:地理围栏管"能不能去",障碍物地图管"去了会不会撞",
SafetyEval则是二者的裁判长。理解并调好这三者,你的 AirSim 仿真飞行就拥有了一套完整的自主安全兜底。
【免费下载链接】AirSimOpen source simulator for autonomous vehicles built on Unreal Engine / Unity, from Microsoft AI & Research项目地址: https://gitcode.com/gh_mirrors/ai/AirSim
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考