Linear Algebra¶
English contract: Foundations overview · Primary references: Linear algebra
前置要求: 01-python-for-robotics.md(会 NumPy 基本操作) 预计学习时间: 3–4 小时 完成后你能: 用向量/矩阵描述机器人状态与变换,计算特征值并理解其几何含义,掌握概率分布/期望/方差,看懂项目中 14 维状态向量、神经网络权重矩阵与 Jacobian 的数学结构
目录¶
1. 为什么机器人离不开线性代数?¶
机器人学的几乎每一个公式都是线性代数:
状态表示 → 向量 (关节角 q ∈ ℝⁿ, 末端位姿 ∈ ℝ⁶)
坐标变换 → 矩阵乘法 (旋转 R、平移 t、齐次变换 T)
微分关系 → Jacobian (∂x/∂q,一个矩阵)
神经网络 → 矩阵乘法 (y = Wx + b)
概率/统计 → 向量空间 (期望、协方差)
直觉:把机器人想成一台"搬运数字的机器"——输入一个状态向量,经过若干矩阵相乘(变换、网络层),输出一个动作向量。线性代数就是描述这台机器的语言。
2. 向量:机器人状态的基本单位¶
定义:向量是一组有序的数 $\mathbf{v} = [v_1, v_2, \dots, v_n]^\top \in \mathbb{R}^n$。在机器人里,它常表示"一组同时存在的量",比如 7 个关节角、3D 位置。
2.1 加法与减法¶
对应分量相加减,要求维度相同。几何上就是"首尾相接"的平行四边形法则。
import numpy as np
pos = np.array([1.0, 2.0]) # 当前位置
delta = np.array([0.5, -0.3]) # 位移
new_pos = pos + delta # [1.5, 1.7]
机器人含义:
pos + delta正是 PushCube 环境里机械臂移动的写法——new_arm = self.arm_pos + movement。
2.2 点乘(内积)¶
$\mathbf{a} \cdot \mathbf{b} = \sum_i a_i b_i = |\mathbf{a}||\mathbf{b}|\cos\theta$。
点乘衡量"两个向量有多同向":结果为正表示夹角 < 90°,为 0 表示垂直。
a = np.array([1.0, 0.0])
b = np.array([0.0, 1.0])
print(np.dot(a, b)) # 0 → 互相垂直
# 计算 a 在 b 方向上的投影长度
proj = np.dot(a, b) / np.linalg.norm(b)
机器人含义:专家策略
expert_action里用np.dot(arm_rel, behind_dir)判断机械臂是否在方块"后方"——点乘为正说明二者同向。
2.3 叉乘(外积,仅 3D)¶
$\mathbf{a} \times \mathbf{b}$ 得到一个同时垂直于 a、b 的向量,方向由右手定则决定,模长等于二者张成的平行四边形面积。
a = np.array([1, 0, 0])
b = np.array([0, 1, 0])
print(np.cross(a, b)) # [0 0 1] z 方向
机器人含义:力矩 $\boldsymbol{\tau} = \mathbf{r} \times \mathbf{F}$;用叉乘求平面的法向量(碰撞检测、接触建模常用)。
2.4 范数(长度)¶
$|\mathbf{v}|_2 = \sqrt{\sum_i v_i^2}$,即欧氏距离。
dist = np.linalg.norm(np.array([3.0, 4.0])) # 5.0
机器人含义:PushCube 的奖励
reward = -dist、成功判定dist < goal_threshold都靠范数算距离。
3. 矩阵:变换与权重¶
定义:矩阵 $A \in \mathbb{R}^{m \times n}$ 是 m 行 n 列的数表。它有两种角色:① 一个线性变换(把向量从 ℝⁿ 映射到 ℝᵐ);② 一组向量的集合(每列是一个向量)。
3.1 矩阵乘法¶
$C = AB$ 要求 A 的列数 = B 的行数。$(AB){ij} = \sum_k A$。} B_{kj
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print(A @ B) # [[19 22], [43 50]]
机器人含义:神经网络的一层就是
y = W @ x + b——权重矩阵 W 把输入向量 x 变换成特征向量。整章深度学习都建立在这个运算上。
3.2 转置¶
$A^\top$ 把行列互换。$(AB)^\top = B^\top A^\top$。
print(A.T) # [[1 3], [2 4]]
机器人含义:Jacobian 伪逆用到 $J^\top$;
A.T @ A在最小二乘里反复出现。
3.3 逆矩阵¶
$A^{-1}$ 满足 $A A^{-1} = I$。只有方阵且行列式非零时才可逆。
A_inv = np.linalg.inv(A)
print(A @ A_inv) # ≈ 单位阵
机器人含义:逆运动学解 $\Delta q = J^{-1} \Delta x$ 直接用逆;不可逆时用伪逆或阻尼最小二乘(见第 7 课)。
3.4 行列式¶
$\det(A)$ 是矩阵变换对体积的缩放因子。$\det = 0$ 表示矩阵"压扁"了空间(不可逆,存在信息丢失方向)。
print(np.linalg.det(A)) # -2.0 (非零 → 可逆)
机器人含义:Jacobian 行列式为 0 对应"奇异位形"——此时机械臂末端在该方向上动弹不得,是 IK 的痛点。
4. 特征值与特征向量¶
定义:对方阵 $A$,若存在标量 $\lambda$ 和非零向量 $\mathbf{v}$ 使 $A\mathbf{v} = \lambda\mathbf{v}$,则称 $\lambda$ 为特征值,$\mathbf{v}$ 为特征向量。
直觉:特征向量是"被矩阵作用后方向不变、只被缩放"的特殊方向,缩放倍数就是特征值。
A = np.array([[4, -2], [1, 1]])
eigvals, eigvecs = np.linalg.eig(A)
print(eigvals) # [3. 2.]
print(eigvecs) # 每列是一个特征向量
# 验证: A @ v ≈ λ * v
print(A @ eigvecs[:, 0], eigvals[0] * eigvecs[:, 0])
机器人含义: - 协方差矩阵的特征值 = 数据在各主方向上的方差,主成分分析(PCA)据此降维。 - 惯性张量的特征值 = 刚体绕主轴的转动惯量(机械设计中决定稳定性)。 - 动力系统矩阵的特征值 = 系统是否稳定:特征值实部全负则稳定(控制理论核心)。
5. 向量空间与线性变换¶
向量空间:一组向量的集合,对加法和数乘封闭。机器人里最常见的是 $\mathbb{R}^n$(所有 n 维实向量)。
线性变换:满足 $T(\mathbf{u}+\mathbf{v})=T(\mathbf{u})+T(\mathbf{v})$ 且 $T(c\mathbf{u})=c\,T(\mathbf{u})$ 的映射。任何有限维线性变换都可用矩阵表示。
# 旋转 30° 的线性变换(2D 旋转矩阵)
theta = np.deg2rad(30)
R = np.array([[np.cos(theta), -np.sin(theta)],
[np.sin(theta), np.cos(theta)]])
v = np.array([1.0, 0.0])
v_rot = R @ v # 把 v 旋转 30°
print(v_rot)
机器人含义:旋转矩阵 $R$、齐次变换矩阵 $T$ 都是线性变换(第 5、6 课详讲)。"基变换"在坐标系之间转换坐标时出现。神经网络每一层
W @ x也是一个线性变换——把输入"扭"到更适合分类/回归的空间。
秩(rank):矩阵列向量张成空间的维数,即"变换后保留的维度数"。秩亏意味着信息丢失,RL 中状态维度过高但实际有效维度低时,可用秩分析冗余。
6. 概率基础:分布、期望、方差¶
机器学习本质是在不确定性下做决策,概率是描述不确定性的语言。
6.1 随机变量与分布¶
期望:$E[X] = \sum_i x_i p_i$,即"长期平均"。方差:$\mathrm{Var}(X) = E[(X-E[X])^2]$,衡量波动大小。
rng = np.random.RandomState(42)
# 均匀分布:PushCube 复位时方块位置用它采样
samples = rng.uniform(-0.4, 0.4, size=10000)
print("期望(理论0):", samples.mean()) # ≈ 0
print("方差(理论 (0.8²)/12≈0.0533):", samples.var())
# 正态分布:神经网络权重初始化、传感器噪声建模常用
noise = rng.normal(loc=0.0, scale=0.01, size=1000)
print("噪声期望:", noise.mean(), "标准差:", noise.std())
6.2 协方差矩阵¶
多变量情况下,协方差矩阵 $\Sigma$ 的对角元是各维方差,非对角元是两两协方差。
data = rng.multivariate_normal(
mean=[0, 0],
cov=[[1.0, 0.8], [0.8, 1.0]], # 两维强正相关
size=2000,
)
print(np.cov(data.T)) # 接近 [[1, 0.8],[0.8, 1]]
机器人含义: - 环境随机性:PushCube 每次复位用
rng.uniform随机化方块位置,正是均匀分布的工程实例。 - 策略随机性:RL 策略 $\pi(a|s)$ 是动作的概率分布,训练时按分布采样动作。 - 不确定性估计:World Model 预测下一状态时输出均值+方差,方差大表示预测不可靠。 - 协方差矩阵的特征向量就是数据主方向(联系第 4 节 PCA)。
7. 连接项目代码¶
把本课概念映射到项目实际代码:
| 线性代数概念 | 在项目中的体现 |
|---|---|
| 14 维向量 | unified_pushcube_env.py 的 get_state_vector() 拼出 $\mathbb{R}^{14}$ 状态 |
| 向量加法 | step() 里 new_arm = self.arm_pos + movement |
| 点乘 | expert_action() 用 np.dot(arm_rel, behind_dir) 判断机械臂相对方块的位置 |
| 范数(距离) | np.linalg.norm(active_cube - self.target_pos) 算奖励与成功 |
| 矩阵乘法 | 神经网络层 y = W @ x + b(VLA/RL/WM 全用到) |
| 矩阵求逆 | fk_ik_demo.py 数值 IK 用 np.linalg.inv(J @ J.T + λ²I) |
| Jacobian 矩阵 | _jacobian() 返回 $\partial \text{末端}/\partial \text{关节}$,把关节速度映射到末端速度 |
Jacobian 是什么? 它是一个矩阵 $J$,满足 $\dot{\mathbf{x}} = J\,\dot{\mathbf{q}}$——末端速度 = Jacobian × 关节速度。它把"关节空间"线性映射到"任务空间",是连接第 3 节矩阵与第 5 节线性变换的完美例子。
# 节选自 fk_ik_demo.py 的 _jacobian(2-DOF 臂)
def _jacobian(self, theta1, theta2):
J = np.array([
[-self.l1*np.sin(theta1) - self.l2*np.sin(theta1+theta2),
-self.l2*np.sin(theta1+theta2)],
[ self.l1*np.cos(theta1) + self.l2*np.cos(theta1+theta2),
self.l2*np.cos(theta1+theta2)]
])
return J # shape (2,2):2 个末端维 × 2 个关节
思考:阻尼最小二乘 $\Delta q = J^\top (J J^\top + \lambda^2 I)^{-1} \Delta x$ 里同时出现了转置 $J^\top$、矩阵乘法 $JJ^\top$、求逆 $(\cdot)^{-1}$、单位阵 $I$——本课的每一个矩阵运算都在这一个公式里登场。
8. 检查理解¶
练习 1(向量运算):给定机械臂位置 $\mathbf{p}=[0.2, -0.1]$、目标 $\mathbf{g}=[0.4, 0.3]$,用 NumPy 求:(a) 指向目标的单位向量;(b) 当前距离;(c) 若以单位向量×0.08 为步长移动一步后的新位置。
练习 2(点乘直觉):解释为什么 np.dot(arm_rel, behind_dir) > 0 能判断机械臂在方块"后方"。如果改成 < 0 代表什么几何关系?
练习 3(矩阵与逆):构造 $A = [[2,1],[1,3]]$,用代码验证 $A A^{-1} = I$,并计算 $\det(A)$,说明为什么它一定可逆。
练习 4(特征值):对协方差矩阵 $\Sigma = [[1, 0.8],[0.8, 1]]$ 求特征值,解释两个特征值分别代表数据在哪个方向上方差最大/最小(提示:画散点图观察)。
练习 5(Jacobian):在 fk_ik_demo.py 的 _jacobian 中,$J$ 是 2×2 矩阵。若 $\dot{q}=[0.1, 0.2]$,用 J @ dq 算出末端速度,并说明它的两个分量分别对应 x、y 方向。
练习 6(概率):PushCube 用 rng.uniform(-0.4, 0.4) 采样方块位置。写出该均匀分布的期望和方差的理论值,并用 10000 次采样验证。
完成 6 道题中的 5 道,即可进入 03-deep-learning-basics.md。