第1章:坐标与向量基础

各位同学好,我是你们的避障算法讲师。今天咱们从最基础的东西聊起——坐标与向量。

你可能会想:「这玩意儿我高中就学过,还用讲?」

嗯,说实话,我当年也是这么想的。直到我在项目中踩了坑,才发现基础不牢,地动山摇。有一次做机器人路径规划,因为坐标系搞混了,机器人直接往墙上撞……那场面,别提多尴尬了。

所以,咱们老老实实把基础打牢。后面30章的内容,全得靠这些基础撑着。

1.1 二维与三维坐标系

先说坐标系。避障算法里,我们最常用的是笛卡尔坐标系

二维坐标系很简单:一个x轴,一个y轴。原点在(0,0)。机器人在地面上移动,通常就用二维坐标表示位置。

三维坐标系呢?多了一个z轴。无人机、机械臂这些,就得用三维坐标了。

这里有个坑——坐标系的方向。不同的传感器、不同的库,坐标系定义可能不一样。比如ROS里用的是右手系,而某些摄像头用的是左手系。

我曾经在融合激光雷达和IMU数据时,因为坐标系没对齐,算出来的位置差了十万八千里。排查了整整两天,最后发现是z轴方向反了。

所以,拿到数据第一件事:搞清楚坐标系定义。别偷懒。

1.2 向量加减法

向量是什么?说白了,就是带方向的箭头

在避障里,机器人的速度、加速度、位置偏移,全都可以用向量表示。

向量加法:两个向量首尾相接,结果就是合向量。

举个例子:机器人先向东走3米,再向北走4米。位移向量分别是(3,0)和(0,4)。加起来是(3,4)。合位移是5米,方向东北偏东。

向量减法:A - B,就是从B指向A的向量。

这个在避障里特别有用。你想让机器人从当前位置A走到目标点B,方向向量就是B - A。

// 二维向量加减法示例
struct Vector2D {
    float x, y;
};

Vector2D add(Vector2D a, Vector2D b) {
    return {a.x + b.x, a.y + b.y};
}

Vector2D subtract(Vector2D a, Vector2D b) {
    return {a.x - b.x, a.y - b.y};
}

// 使用示例
Vector2D robotPos = {2.0, 3.0};
Vector2D targetPos = {8.0, 7.0};
Vector2D direction = subtract(targetPos, robotPos);
// direction = {6.0, 4.0}
我个人习惯:在代码里把向量运算封装成函数,别手算。手算出错的概率太高了。

1.3 点积与叉积

这两个东西,很多同学觉得抽象。我换个角度讲。

点积:判断方向关系

点积的公式:A · B = |A| * |B| * cos(θ)

说白了,点积衡量的是两个向量在同一个方向上的投影大小

  • 点积 > 0:方向大致相同(夹角小于90°)
  • 点积 = 0:垂直
  • 点积 < 0:方向相反(夹角大于90°)

在避障里,点积用来判断障碍物在机器人前方还是后方。比如,机器人的前进方向向量和障碍物方向向量做点积,正数说明障碍物在前面。

float dotProduct(Vector2D a, Vector2D b) {
    return a.x * b.x + a.y * b.y;
}

// 判断障碍物是否在机器人前方
Vector2D robotForward = {1.0, 0.0};  // 朝x轴正方向
Vector2D obstacleDir = {3.0, 2.0};   // 障碍物方向
float dot = dotProduct(robotForward, obstacleDir);
if (dot > 0) {
    // 障碍物在前方,需要避障
}

叉积:判断左右关系

叉积的结果是一个垂直于两个向量的新向量。在二维里,我们通常只看叉积的z分量。

公式:A × B = |A| * |B| * sin(θ)

  • 叉积 > 0:B在A的左侧
  • 叉积 = 0:共线
  • 叉积 < 0:B在A的右侧

这个在路径规划里太常用了。判断障碍物在机器人的左边还是右边,决定往哪边躲。

float crossProduct2D(Vector2D a, Vector2D b) {
    return a.x * b.y - a.y * b.x;
}

// 判断障碍物在机器人左侧还是右侧
Vector2D robotForward = {1.0, 0.0};
Vector2D obstacleDir = {2.0, 1.0};
float cross = crossProduct2D(robotForward, obstacleDir);
if (cross > 0) {
    // 障碍物在左侧,向右躲
} else {
    // 障碍物在右侧,向左躲
}
记住这个口诀:点积看前后,叉积看左右。我在项目里全靠这个快速判断。

1.4 欧氏距离与曼哈顿距离

距离度量,避障算法里绕不开的话题。

欧氏距离:直线距离。就是我们平时用尺子量的那个距离。

公式:d = sqrt((x2-x1)² + (y2-y1)²)

曼哈顿距离:只能横着走、竖着走的距离。像曼哈顿的街道,不能穿楼。

公式:d = |x2-x1| + |y2-y1|

距离类型 适用场景 计算量 特点
欧氏距离 自由移动的机器人、无人机 较大(有开方) 最真实,但计算慢
曼哈顿距离 网格地图、四方向移动 小(只有加减) 计算快,但不够精确

你想想看,在A*算法里,用曼哈顿距离做启发式函数,比欧氏距离快得多。但如果你做的是无人机避障,用曼哈顿距离就不合适了——无人机能斜着飞啊。

我建议:在实时性要求高的场景,优先用曼哈顿距离。如果精度要求高,再用欧氏距离。别一上来就开方,CPU扛不住。

1.5 本章知识体系

下面这张图,把本章的核心逻辑串起来了。你仔细看看,后面30章的内容,全是从这里延伸出去的。

坐标与向量基础 - 知识体系 避障算法数学基础 坐标系 二维坐标系 (x, y) 三维坐标系 (x, y, z) 向量运算 加减法 点积(前后判断) 叉积(左右判断) 距离度量 欧氏距离(直线) 曼哈顿距离(网格) 传感器数据对齐 障碍物方向判断 路径规划与A*算法 核心:坐标系对齐 → 向量运算 → 距离度量 → 避障决策

这张图你看懂了吗?从上到下,就是避障算法的完整链路。坐标系是基础,向量运算是工具,距离度量是判断依据。三者结合,才能做出正确的避障决策。

好了,第一章就到这里。内容不多,但都是硬通货。你把这些基础吃透了,后面学起来会轻松很多。

有什么问题,欢迎交流。咱们下章见。


公众号:蓝海资料掘金营,微信deep3321