2. 空间点与向量:点的表示、向量的运算、点积与叉积、齐次坐标

各位工程师朋友,大家好。今天我们聊聊笛卡尔空间里最基础的东西——点与向量。

你可能会觉得,点不就是坐标吗?向量不就是箭头吗?有什么好讲的?

嗯,我当年刚入行时也这么想。直到有一次,我在做机械臂的轨迹规划时,因为点积算错了方向,导致机器人差点撞到工件。那次之后,我才真正重视起这些基础概念。

说白了,机器人运动规划的所有计算,都建立在这些基础之上。你绕不开的。

2.1 点的表示

在三维笛卡尔空间中,一个点就是空间中的一个位置。我们用三个坐标值来表示它:

P = (x, y, z)

举个例子,点 P(2, 3, 5) 表示从原点出发,沿 X 轴走 2 个单位,沿 Y 轴走 3 个单位,沿 Z 轴走 5 个单位。

我个人习惯把点看作「静止的位置」。它没有方向,没有大小,就是一个位置标记。

小提示: 在机器人学中,我们通常用列向量表示点,比如 [x, y, z]^T。这样在做矩阵变换时更方便。

2.2 向量的运算

向量和点不同。向量有大小和方向,但没有固定位置。你可以把它想象成「从一个点到另一个点的位移」。

比如,从点 A(1,2,3) 到点 B(4,5,6) 的向量是:

v = B - A = (4-1, 5-2, 6-3) = (3, 3, 3)

向量的基本运算包括:

  • 加法: v + w = (vx+wx, vy+wy, vz+wz)
  • 减法: v - w = (vx-wx, vy-wy, vz-wz)
  • 数乘: k * v = (k*vx, k*vy, k*vz)
  • 模长: |v| = sqrt(vx² + vy² + vz²)

我记得有一次调试运动算法,发现轨迹总是不对。查了半天,原来是向量减法写反了。你想想看,方向反了,机器人当然往反方向跑。

2.3 点积与叉积

这两个运算在机器人学中太常用了。我几乎每天都会用到它们。

点积(内积)

点积的结果是一个标量。公式很简单:

v · w = vx*wx + vy*wy + vz*wz = |v| * |w| * cos(θ)

其中 θ 是两个向量之间的夹角。

点积有什么用?

  • 判断方向: 如果 v·w > 0,夹角小于 90°;等于 0,垂直;小于 0,夹角大于 90°。
  • 计算投影: 一个向量在另一个向量上的投影长度。
避坑指南: 我曾经在计算末端执行器朝向时,直接用点积判断是否对齐。结果发现数值误差导致误判。后来我加了一个小阈值,比如 |v·w - 1| < 0.001 才认为平行。这个习惯一直保留到现在。

叉积(外积)

叉积的结果是一个向量。它垂直于原来的两个向量:

v × w = (vy*wz - vz*wy, vz*wx - vx*wz, vx*wy - vy*wx)

叉积的模长等于 |v| * |w| * sin(θ),也就是两个向量围成的平行四边形面积。

叉积的典型应用:

  • 求法向量: 给定两个不共线的向量,叉积得到它们的法向量。
  • 判断旋转方向: 在机器人运动学中,叉积常用于计算角速度。

你想想看,如果没有叉积,我们怎么确定一个平面朝哪边?怎么计算力矩?

2.4 齐次坐标

齐次坐标是机器人学中一个非常巧妙的设计。它把三维点扩展成四维:

P_h = (x, y, z, w)

其中 w 是缩放因子。通常我们取 w=1,表示一个普通点。当 w=0 时,表示一个方向向量(无穷远点)。

为什么要用齐次坐标?

  • 统一变换: 旋转、平移、缩放可以用一个 4x4 矩阵表示。
  • 避免除法: 透视投影等操作可以线性化。

举个例子,平移变换在普通坐标下是加法,但在齐次坐标下变成了矩阵乘法:

| 1 0 0 tx |   | x |
| 0 1 0 ty | * | y |
| 0 0 1 tz |   | z |
| 0 0 0 1  |   | 1 |
注意: 齐次坐标的 w 分量不能为 0 表示点。如果 w=0,它表示一个方向。我在项目中见过有人把方向向量当点用,结果变换后位置全乱了。

知识体系总览

下面这张图总结了本章的核心内容,帮你理清思路:

空间点与向量 点的表示 P = (x, y, z) 三维空间中的位置标记 无方向、无大小 向量的运算 加法、减法、数乘 模长计算 有方向、有大小 点积与叉积 点积:标量,判断夹角 叉积:向量,求法向量 机器人运动学核心工具 齐次坐标 P_h = (x, y, z, w) 统一旋转、平移、缩放 4x4 矩阵变换 四个模块相互关联,构成笛卡尔空间运动规划的基础

总结

这一章的内容,说白了就是四个东西:

  1. 是位置,用三个坐标表示。
  2. 向量 是位移,有方向有大小。
  3. 点积和叉积 是向量运算的利器,一个算夹角,一个算法向量。
  4. 齐次坐标 把变换统一成矩阵乘法,方便又优雅。

这些概念看起来简单,但实际用起来坑不少。我建议你多动手算一算,写几行代码验证一下。纸上得来终觉浅,绝知此事要躬行。

我的经验: 每次写运动规划代码前,我都会先在纸上画一遍向量图。确认方向、夹角、变换矩阵都没问题,再开始写代码。这个习惯帮我避免了很多低级错误。

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