100、安全机制:地理围栏与限高限速
飞控算法从入门到精通 · 100 · 安全机制:地理围栏与限高限速一次差点炸机的调试经历去年夏天,我在某款四旋翼上测试自主巡检航线。飞机起飞后一切正常,按预设路径飞向第一个航点。突然,地面站弹出一条“Geofence Violation”警告,紧接着飞机像被无形的手拽住一样,猛地悬停、然后开始垂直下降。我盯着日志里的“FENCE_BREACH”标志,后背一阵发凉——如果当时围栏逻辑没触发,飞机就会撞上旁边的高压铁塔。事后复盘发现,问题出在围栏边界判断的浮点精度上。GPS坐标在经纬度转换时,我用了单精度float,导致边界计算偏移了大约3米。3米,刚好让飞机“合法”地穿过了围栏边缘。从那以后,我所有地理围栏代码都强制使用double,并且在边界留出至少5%的冗余余量。地理围栏:不是画个圈那么简单很多人以为地理围栏就是在地图上画个多边形,然后判断飞机是否在里面。实际工程中,坑比想象的多。多边形内外判断的陷阱最常用的算法是射线法(Ray Casting)。从目标点向右发射一条水平射线,统计与多边形边的交点个数。奇数在内部,偶数在外部。听起来简单,但有几个边界情况必须处理:射线穿过顶点:如果射线恰好穿过多边形的一个顶点,算一个交点还是两个?标准做法是只统计“从下往上”穿过射线的边,忽略“从上往下”的边。这里踩过坑——我一开始没做方向判断,导致顶点附近的点被误判。点在边上:如果飞机正好