1、激光雷达基础:工作原理、点云数据格式与坐标系定义

各位同学,咱们今天聊聊激光雷达。说实话,这玩意儿在飞控圈子里越来越常见了。我最早接触激光雷达是在2016年做无人机避障项目的时候,那时候市面上能选的传感器真不多,价格还死贵。现在不一样了,消费级无人机都开始标配激光雷达了。

好,咱们正式开始。这一章我打算讲三个核心问题:激光雷达怎么工作的?点云数据长什么样?坐标系怎么定义?这三个问题搞清楚了,后面处理点云数据才不会晕头转向。

1.1 激光雷达工作原理

激光雷达,英文叫LiDAR(Light Detection And Ranging)。说白了,就是用激光来测距。原理其实不复杂:发射一束激光,打到目标物体上反射回来,接收器捕捉到回波,通过计算时间差或者相位差,就能知道目标有多远。

我给大家拆解一下常见的几种测距方式:

测距方式 原理简述 典型应用 我个人的看法
TOF(飞行时间法) 发射脉冲激光,测量发射到接收的时间差 无人机避障、自动驾驶 最常用,精度够用,成本适中
相位法 发射连续调制激光,测量回波相位差 室内测距、短距离测量 精度高,但距离受限
三角法 利用激光发射点和接收点的几何关系计算距离 工业测量、近距离扫描 近距离精度极高,远了就不行

在飞控领域,我们最常用的是TOF方式。为什么?因为无人机在空中飞,距离变化范围大,TOF能覆盖几米到几百米的距离,而且响应速度快。我记得有一次做植保无人机项目,需要在3米高度精准测距,TOF激光雷达的表现就非常稳定。

核心要点:激光雷达的核心就是「发射-反射-接收-计算」这个闭环。不管多贵的激光雷达,底层原理都一样。

另外,激光雷达还分机械式固态式。机械式就是有个旋转的镜头,像扫地机器人那样转着扫。固态式没有运动部件,靠电子扫描。嗯,这里要注意:在飞控应用中,机械式激光雷达因为重量和震动问题,其实不太适合小型无人机。我踩过这个坑——曾经把一颗16线机械雷达装到四旋翼上,结果震动导致数据全是噪点,根本没法用。

1.2 点云数据格式

激光雷达扫出来的数据,我们叫点云。点云是什么?就是一堆三维坐标点的集合。每个点都包含X、Y、Z三个坐标值,有些还会带上强度值(Intensity)或者时间戳

常见的点云数据格式,我列一下:

  • PCD格式:Point Cloud Data,PCL库的标配格式。可读性好,支持多种数据类型。
  • PLY格式:Polygon File Format,带网格信息,适合做三维重建。
  • LAS格式:激光雷达行业标准格式,常用于测绘领域。
  • BIN格式:二进制裸数据,体积小,解析快,飞控里常用。

在飞控嵌入式系统里,我个人习惯用BIN格式。为什么?因为嵌入式芯片资源有限,BIN格式解析起来最省CPU。你想想看,飞控芯片本来就要跑姿态解算、控制律、导航,哪有那么多算力去解析复杂的文本格式?

给大家看一个典型的点云数据片段(PCD格式):

# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z intensity
SIZE 4 4 4 4
TYPE F F F F
COUNT 1 1 1 1
WIDTH 1000
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 1000
DATA ascii
1.234 2.345 3.456 128
1.235 2.346 3.457 130
1.236 2.347 3.458 125
...

你看,每个点就是四个数值:X、Y、Z和强度。强度值反映了物体反射激光的能力——白色物体反射强,黑色物体反射弱。这个信息在飞控里很有用,比如区分地面和植被。

小技巧:在嵌入式平台上处理点云时,建议用定点数代替浮点数。我曾经把一个32位浮点数的点云数据改成16位定点数,内存占用直接减半,处理速度提升了40%。

1.3 坐标系定义

坐标系这个问题,说实话,是很多新手最容易搞混的地方。我见过太多因为坐标系没搞对,导致无人机撞树的案例了。

在激光雷达点云处理中,我们主要涉及三个坐标系:

  1. 传感器坐标系:以激光雷达自身为原点,通常X轴朝前,Y轴朝左,Z轴朝上。
  2. 机体坐标系:以无人机重心为原点,X轴朝机头,Y轴朝右翼,Z轴朝下。
  3. 世界坐标系:以起飞点为原点,通常北东地(NED)或者东北天(ENU)。

这里我画了一张图,帮大家理清这三个坐标系的关系:

激光雷达点云处理中的三大坐标系 传感器坐标系 X(前) Z(上) Y(左) LiDAR 外参标定 机体坐标系 X(机头) Z(下) Y(右) 姿态变换 世界坐标系 X(北) Z(天) Y(东) 🌍 坐标系转换流程:传感器坐标系 → 机体坐标系 → 世界坐标系 外参标定解决传感器到机体的转换,姿态解算解决机体到世界的转换

坐标系转换的流程是这样的:

  • 传感器坐标系 → 机体坐标系:通过外参标定。说白了,就是测量激光雷达装在无人机上的位置和角度偏移。
  • 机体坐标系 → 世界坐标系:通过姿态解算。利用IMU数据算出无人机的俯仰、横滚、偏航角,然后做旋转。

避坑指南:我曾经在项目里犯过一个低级错误——把传感器坐标系和机体坐标系的Y轴方向搞反了。结果无人机在避障时,明明左边有障碍物,它却往左边躲。嗯,那次差点炸机。所以,坐标系转换一定要做可视化验证,别光靠脑子想。

最后,给大家一个坐标系转换的代码示例(C语言风格,飞控里常用):

// 点云坐标系转换:传感器坐标系 -> 机体坐标系
// 假设外参矩阵为 T_sensor_to_body
void transform_point_to_body(Point3D* point, float T[4][4]) {
    float x = point->x;
    float y = point->y;
    float z = point->z;
    
    // 齐次坐标变换
    point->x = T[0][0]*x + T[0][1]*y + T[0][2]*z + T[0][3];
    point->y = T[1][0]*x + T[1][1]*y + T[1][2]*z + T[1][3];
    point->z = T[2][0]*x + T[2][1]*y + T[2][2]*z + T[2][3];
}

好了,这一章的内容就到这里。激光雷达的工作原理、点云数据格式、坐标系定义,这三个基础概念搞清楚了,后面咱们才能聊点云滤波、障碍物检测、地形跟随这些实战内容。

本章核心要点回顾:

  • 激光雷达测距原理:TOF最常用,适合飞控场景
  • 点云数据格式:嵌入式推荐BIN格式,省资源
  • 三大坐标系:传感器→机体→世界,转换要小心

专注资料整理