2. 空间点与向量:点的表示、向量的运算、点积与叉积、齐次坐标
各位工程师朋友,大家好。今天我们聊聊笛卡尔空间里最基础的东西——点与向量。
你可能会觉得,点不就是坐标吗?向量不就是箭头吗?有什么好讲的?
嗯,我当年刚入行时也这么想。直到有一次,我在做机械臂的轨迹规划时,因为点积算错了方向,导致机器人差点撞到工件。那次之后,我才真正重视起这些基础概念。
说白了,机器人运动规划的所有计算,都建立在这些基础之上。你绕不开的。
2.1 点的表示
在三维笛卡尔空间中,一个点就是空间中的一个位置。我们用三个坐标值来表示它:
P = (x, y, z)
举个例子,点 P(2, 3, 5) 表示从原点出发,沿 X 轴走 2 个单位,沿 Y 轴走 3 个单位,沿 Z 轴走 5 个单位。
我个人习惯把点看作「静止的位置」。它没有方向,没有大小,就是一个位置标记。
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 = (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 |
知识体系总览
下面这张图总结了本章的核心内容,帮你理清思路:
总结
这一章的内容,说白了就是四个东西:
- 点 是位置,用三个坐标表示。
- 向量 是位移,有方向有大小。
- 点积和叉积 是向量运算的利器,一个算夹角,一个算法向量。
- 齐次坐标 把变换统一成矩阵乘法,方便又优雅。
这些概念看起来简单,但实际用起来坑不少。我建议你多动手算一算,写几行代码验证一下。纸上得来终觉浅,绝知此事要躬行。
公众号:蓝海资料掘金营,微信deep3321