第二章:坐标系与空间建模

各位同学好,我是老张。今天咱们聊聊坐标系和空间建模。说实话,这是整个巡检路径规划里最基础、也最容易出问题的一环。我见过太多项目,最后炸机或者漏检,追根溯源都是坐标系没搞明白。

2.1 无人机常用坐标系

做叶片巡检,你至少得跟三个坐标系打交道:NED、机体坐标系、相机坐标系。嗯,咱们一个一个说。

2.1.1 NED坐标系(北东地)

NED,全称North-East-Down。说白了,就是以北为X轴正方向,以东为Y轴正方向,指向地心为Z轴正方向。这个坐标系是全局的,用来描述无人机在空间中的绝对位置。

我个人习惯把NED坐标系当作“世界坐标系”。所有的路径点、叶片位置、风场数据,最终都要统一到NED下。你想想看,如果各个传感器各说各话,那不乱套了吗?

小技巧: 在Pixhawk等飞控中,NED坐标系默认使用。但注意,GPS给出的经纬高数据需要先转换到UTM坐标系,再转到NED。我早期做项目时直接拿经纬度算距离,结果偏了十几米,后来才发现是坐标系没对齐。

2.1.2 机体坐标系

机体坐标系是跟着无人机走的。X轴指向机头,Y轴指向右侧,Z轴指向下方。这个坐标系主要用来描述无人机的姿态——俯仰、横滚、偏航。

为什么要区分机体和NED?举个例子:你让无人机“向前飞”,这个“前”是机头方向还是北方向?在NED里是北,在机体里就是机头。路径规划时,我们通常用NED规划路径,但控制指令要转换到机体坐标系下发。

// 从NED到机体坐标系的旋转矩阵示例(简化版)
// 假设偏航角为yaw,俯仰角为pitch,横滚角为roll
R = Rz(yaw) * Ry(pitch) * Rx(roll)

// 将NED下的速度向量v_ned转换到机体坐标系
v_body = R^T * v_ned

2.1.3 相机坐标系

相机坐标系是最后一级。Z轴指向镜头前方(拍摄方向),X轴向右,Y轴向下。这个坐标系决定了你拍到的图像是什么样的。

我记得有一次在现场调试,无人机明明对准了叶片,但拍出来的照片总是偏的。查了半天,原来是相机安装角度有偏差,相机坐标系和机体坐标系之间差了5度。嗯,这个标定工作千万别省。

避坑指南: 我曾经因为相机内参标定不准,导致三维重建出来的叶片模型扭曲了10%。后来花了整整两天重新标定。建议每次更换相机或镜头后,先用棋盘格做一次完整标定。

2.2 叶片三维模型简化

叶片模型太复杂,计算量扛不住。太简单,又不够精确。怎么平衡?我一般分三步走。

2.2.1 叶片几何参数提取

从风机设计图纸或实测数据中,提取关键参数:

  • 叶片长度:从叶根到叶尖的距离
  • 弦长分布:沿叶片长度方向,每个截面的宽度
  • 扭角分布:每个截面相对于叶根的扭转角度
  • 预弯量:叶片在静止状态下的弯曲程度

这些参数决定了叶片的基本形状。我一般用三次样条插值来拟合弦长和扭角的变化曲线,效果还不错。

2.2.2 模型简化策略

实际叶片是复杂曲面,但路径规划不需要那么精细。我常用的简化方法:

  1. 分段线性化:将叶片分成10-20段,每段视为一个直线段
  2. 截面椭圆近似:每个截面用椭圆代替实际翼型
  3. 忽略表面细节:防雷条、排水孔等特征全部去掉

你想想看,路径规划关心的是“无人机离叶片多远”,而不是“叶片表面有没有凹坑”。所以简化后的模型只要保证几何包络正确就行。

# 叶片简化模型生成伪代码
def generate_blade_model(length, chord_profile, twist_profile):
    segments = 15  # 分段数
    model_points = []
    
    for i in range(segments + 1):
        r = i / segments * length  # 当前位置距叶根距离
        chord = chord_profile(r)   # 当前弦长
        twist = twist_profile(r)   # 当前扭角
        
        # 生成截面椭圆上的点
        for theta in range(0, 360, 30):
            x = r
            y = chord/2 * cos(theta) * cos(twist)
            z = chord/2 * sin(theta)
            model_points.append([x, y, z])
    
    return model_points

2.2.3 模型验证

简化模型做好后,一定要验证。我通常的做法是:把简化模型和原始CAD模型做对比,计算最大偏差。如果偏差超过5厘米,就增加分段数。嗯,这个阈值可以根据巡检精度要求调整。

核心要点: 叶片模型简化的目标是“够用就行”。在保证路径规划安全的前提下,尽量降低计算复杂度。我一般控制在20个截面以内,再多就影响实时性了。

2.3 风场环境建模

风是无人机巡检最大的敌人。没有之一。我见过太多无人机因为突风撞上叶片。所以风场建模必须认真对待。

2.3.1 风场影响因素

因素 影响程度 说明
平均风速 决定无人机能否起飞和悬停
湍流强度 影响无人机姿态稳定性
风切变 不同高度风速差异,影响爬升/下降
塔影效应 塔筒后方形成的低速区
叶片尾流 低-中 叶片旋转产生的扰动气流

实际项目中,我主要关注平均风速和湍流强度。这两个参数可以直接从风机SCADA系统获取,或者用机载风速计实时测量。

2.3.2 风场模型建立

常用的风场模型有两种:

  • 均匀风场模型:假设整个空间风速风向一致。简单,但不够准确。
  • CFD仿真模型:用计算流体力学模拟风场分布。精确,但计算量大。

我个人习惯折中——用均匀风场做初步规划,再用CFD结果修正关键区域(比如叶片附近)。这样既保证了实时性,又提高了安全性。

// 风场对无人机影响的简化模型
// 假设风速为V_wind,无人机空速为V_air
// 地速 V_ground = V_air + V_wind

// 路径规划时,需要预留风补偿
// 安全裕度 = 最大风速 * 1.5(我习惯用1.5倍,留点余量)
float safety_margin = max_wind_speed * 1.5;

// 规划路径点时,将安全裕度加入避障距离
float safe_distance = blade_radius + safety_margin;

2.3.3 实时风场更新

风是动态的。模型建得再好,也得实时更新。我一般在无人机上搭载超声波风速计,每0.5秒更新一次风场数据。如果检测到风速超过安全阈值(比如8m/s),立即触发返航或悬停等待。

避坑指南: 我曾经遇到过一种情况:地面风速只有3m/s,但塔筒顶部风速达到10m/s。这就是风切变。从那以后,我坚持在多个高度层测量风速,而不是只看地面数据。

知识体系总览

说了这么多,咱们用一张图把整个知识体系串起来。这张图是我自己画的,涵盖了坐标系、叶片模型、风场建模的核心逻辑。

坐标系与空间建模知识体系 坐标系 叶片三维模型 风场环境建模 NED坐标系 机体坐标系 相机坐标系 几何参数提取 分段线性化 截面椭圆近似 模型验证 平均风速/湍流 均匀风场模型 CFD仿真模型 实时风场更新 核心逻辑:统一坐标系 → 简化叶片模型 → 叠加风场影响 所有路径点最终都要转换到NED坐标系下,并考虑风场安全裕度

好了,这一章的内容就到这里。坐标系和空间建模是基础中的基础,但也是最容易踩坑的地方。记住:坐标系统一、模型够用、风场留余量。做到这三点,后面的路径规划就顺了。


专注资料整理