AirSim安全系统详解:地理围栏与障碍物地图配置完整指南
2026/9/21 2:56:35 网站建设 项目流程

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,整个评估可概括为三步:

  1. 算目标点:对速度指令,先用制动距离模型(vel_to_breaking_dist)推算"急停后最终会到的位置",再做检查——这保证了评估的是实际落点而非指令本身;
  2. 算风险距离风险距离 = 到目标点距离 + 障碍物净空距离(obs_clearance) − 障碍物实际距离。结果 ≥ 0 说明"目标点比障碍物还近或撞进净空区",判定为潜在碰撞;
  3. 给建议:若判定不安全,还会扫描四周刻度,找到无遮挡方向输出suggested_vec建议速度向量,供上层避障使用。

避障策略(ObsAvoidanceStrategy)

检测到障碍物风险时,控制器按策略响应(见 SafetyEval.hpp):

策略行为
RaiseException抛出异常,建议速度置零(默认,最保守)
ClosestMove沿原目标方向寻找最近的无障碍落点
OppositeMove朝障碍物反方向寻找最近的无障碍落点

五、关键配置参数速查表

安全相关的车辆参数集中定义在 MultirotorCommon.hpp 的MultirotorApiParams中,调参时重点看这几个:

参数默认值说明
obs_clearance2 m与障碍物保持的最小净空距离,越大越保守
obs_window0检查目标方向 ± 多少个刻度,提高鲁棒性
distance_accuracy0.1 m位置估计的微分精度,影响"是否更远离围栏"的判定
vel_to_breaking_dist0.5速度→制动距离的换算系数
min_breaking_dist1 m最小制动距离

运行时动态调整围栏与避障行为,调用客户端的setSafety接口即可,其签名定义在 MultirotorApiBase.hpp 中——可同时传入启用的违规类型、净空距离、避障策略,以及围栏原点、半径/边长、高度上下限。

六、新手配置清单:5 分钟启用安全系统 ✅

  1. 选围栏形状:矩形场地选CubeGeoFence,圆形测试区选SphereGeoFence,并预留高度上界(防止贴顶飞行);
  2. 设置净空距离:室内小场景把obs_clearance调小(如 1 m),室外或高速场景保持 2 m 以上;
  3. 选避障策略:调试阶段用默认的RaiseException快速暴露问题,演示/回放阶段可换ClosestMove让飞行更流畅;
  4. 确认日志:围栏创建与每次setSafety调用都会打印日志(如CubeGeoFence: min=..., max=...),方便核对配置是否生效;
  5. 参考文档:传感器接入与设置项说明可查阅 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询