robot_manipulation

第5章:坐标系与姿态表示

机器人系统的精确控制依赖于对空间位置和姿态的准确描述。本章深入探讨机器人学中的坐标系建立、姿态表示方法及其工程权衡。我们将对比传统的DH参数法与现代的指数积方法,分析四元数、旋转矩阵、欧拉角在不同场景下的优劣,并介绍李群/李代数这一强大的数学工具。通过NASA瓦尔基里机器人的实例,我们将看到这些理论如何应用于复杂系统的设计中。

5.1 坐标系建立方法

5.1.1 Denavit-Hartenberg (DH) 参数法

DH参数法是1955年提出的经典方法,通过四个参数完整描述相邻关节间的坐标变换。其核心思想是通过系统化的坐标系分配,将任意复杂的关节用最少的参数表示。

标准DH参数定义:

变换矩阵: \(T_i^{i-1} = \begin{bmatrix} \cos\theta_i & -\sin\theta_i\cos\alpha_i & \sin\theta_i\sin\alpha_i & a_i\cos\theta_i \\ \sin\theta_i & \cos\theta_i\cos\alpha_i & -\cos\theta_i\sin\alpha_i & a_i\sin\theta_i \\ 0 & \sin\alpha_i & \cos\alpha_i & d_i \\ 0 & 0 & 0 & 1 \end{bmatrix}\)

DH参数的工程优势:

  1. 参数最少(每个关节仅4个参数)
  2. 系统化流程,易于教学和实施
  3. 大量机器人制造商采用,工业标准成熟

DH参数的局限性:

  1. 坐标系分配规则复杂,初学者易出错
  2. 存在奇异性配置(如连续平行轴)
  3. 不同DH约定(标准vs修改)导致混淆
  4. 数值稳定性问题:小角度近似时精度损失
标准DH坐标系建立流程:
      z_{i-1}
        |
        | d_i
        |
  x_{i-1}----> x_i (沿公垂线)
       /|
      / |a_i
     /  |
    z_i |

5.1.2 Product of Exponentials (PoE) 方法

PoE方法基于螺旋理论,将刚体运动表示为绕螺旋轴的指数映射。这种方法在现代机器人学中越来越受欢迎,特别是在需要优雅处理奇异性和进行几何直觉分析时。

螺旋轴表示: 对于旋转关节,螺旋轴$\xi_i$定义为: \(\xi_i = \begin{bmatrix} \omega_i \\ v_i \end{bmatrix} = \begin{bmatrix} \omega_i \\ -\omega_i \times q_i \end{bmatrix}\)

其中$\omega_i$是旋转轴方向,$q_i$是轴上任意一点。

指数映射: \(T(\theta) = e^{\hat{\xi}\theta} = I + \hat{\xi}\theta + \frac{(\hat{\xi}\theta)^2}{2!} + \frac{(\hat{\xi}\theta)^3}{3!} + ...\)

对于纯旋转,Rodrigues公式给出闭式解: \(e^{[\omega]\theta} = I + [\omega]\sin\theta + [\omega]^2(1-\cos\theta)\)

PoE的工程优势:

  1. 全局坐标系,避免累积误差
  2. 奇异性处理优雅,无需特殊案例
  3. 与现代优化算法(如梯度下降)兼容性好
  4. 几何直觉清晰,便于可视化

PoE的实施考虑:

  1. 需要更强的数学背景(李代数)
  2. 工业支持相对较少
  3. 参数识别需要专门工具

5.1.3 DH vs PoE 工程选择指南

场景 推荐方法 原因
工业机器人编程 DH 制造商支持,标准接口
研究原型开发 PoE 灵活性高,数值稳定
并联机构 PoE 自然处理闭链约束
教育入门 DH 系统化流程,资料丰富
轨迹优化 PoE 梯度计算简洁
实时控制 DH 计算效率略高

5.2 姿态表示方法对比

5.2.1 旋转矩阵

旋转矩阵$R \in SO(3)$是最直接的姿态表示,保持向量长度和夹角不变。

性质:

工程优势:

  1. 无奇异性,全局唯一
  2. 直接用于坐标变换
  3. 数值稳定性好(配合正交化)

工程劣势:

  1. 9个参数表示3个自由度,冗余度高
  2. 存储开销大
  3. 插值困难(不在线性空间)
  4. 需要定期正交化以维持约束

正交化算法(Gram-Schmidt):

# 伪代码
def orthogonalize(R):
    c1 = R[:, 0]
    c1 = c1 / ||c1||
    c2 = R[:, 1] - (c1 · R[:, 1]) * c1
    c2 = c2 / ||c2||
    c3 = c1 × c2
    return [c1, c2, c3]

5.2.2 欧拉角

欧拉角用三个连续旋转表示任意姿态,常见约定包括ZYX(航空)、ZYZ(机械臂)等。

ZYX欧拉角(Roll-Pitch-Yaw): \(R_{ZYX}(\phi, \theta, \psi) = R_z(\psi)R_y(\theta)R_x(\phi)\)

工程优势:

  1. 最小参数表示(3个角度)
  2. 直观易懂,便于人机交互
  3. 存储效率高

工程劣势:

  1. 万向节锁(Gimbal Lock):当pitch接近±90°时,roll和yaw退化
  2. 不连续性:同一姿态多种表示
  3. 插值路径不直观
  4. 数值微分在奇异点附近不稳定

万向节锁检测与处理:

# 检测万向节锁
if abs(pitch) > 85 * pi/180:  # 接近±90度
    # 切换到四元数表示
    use_quaternion_control()
else:
    # 安全使用欧拉角
    use_euler_control()

5.2.3 四元数

四元数$q = [q_w, q_x, q_y, q_z]$提供了紧凑且无奇异性的姿态表示。

基本运算:

工程优势:

  1. 无奇异性,全局表示
  2. 紧凑(4参数,1约束)
  3. 插值简单(SLERP算法)
  4. 计算效率高于矩阵

工程劣势:

  1. 不直观,调试困难
  2. 双覆盖问题:$q$和$-q$表示同一旋转
  3. 需要归一化维护
  4. 与经典控制理论接口复杂

SLERP插值实现: \(q_t = \frac{\sin((1-t)\theta)}{\sin\theta}q_0 + \frac{\sin(t\theta)}{\sin\theta}q_1\) 其中$\cos\theta = q_0 \cdot q_1$

5.2.4 工程选择决策树

开始
  |
  v
需要人机交互? --是--> 欧拉角(配合范围限制)
  |
  否
  v
需要优化/插值? --是--> 四元数(SLERP)
  |
  否
  v
需要直接变换? --是--> 旋转矩阵
  |
  否
  v
存储受限? --是--> 轴角表示
  |
  否
  v
默认:四元数(通用性最好)

5.3 李群与李代数在机器人学中的应用

5.3.1 李群基础

李群是既具有群结构又具有流形结构的数学对象,在机器人学中主要涉及:

$SE(3)$群元素: \(T = \begin{bmatrix} R & p \\ 0 & 1 \end{bmatrix} \in SE(3)\) 其中$R \in SO(3)$,$p \in \mathbb{R}^3$

群运算性质:

  1. 封闭性:$T_1 \cdot T_2 \in SE(3)$
  2. 结合律:$(T_1 \cdot T_2) \cdot T_3 = T_1 \cdot (T_2 \cdot T_3)$
  3. 单位元:$I = \begin{bmatrix} I_3 & 0 \ 0 & 1 \end{bmatrix}$
  4. 逆元素:$T^{-1} = \begin{bmatrix} R^T & -R^Tp \ 0 & 1 \end{bmatrix}$

5.3.2 李代数表示

李代数是李群在单位元处的切空间,提供了李群的线性化表示:

$\mathfrak{se}(3)$元素(螺旋): \(\xi^{\wedge} = \begin{bmatrix} [\omega]_{\times} & v \\ 0 & 0 \end{bmatrix} \in \mathfrak{se}(3)\)

其中$[\omega]_{\times}$是反对称矩阵: \([\omega]_{\times} = \begin{bmatrix} 0 & -\omega_z & \omega_y \\ \omega_z & 0 & -\omega_x \\ -\omega_y & \omega_x & 0 \end{bmatrix}\)

5.3.3 指数映射与对数映射

指数映射(李代数→李群): \(\exp: \mathfrak{se}(3) \rightarrow SE(3)\)

对于纯旋转($v=0$): \(e^{[\omega]_{\times}\theta} = I + \frac{\sin\theta}{\theta}[\omega]_{\times} + \frac{1-\cos\theta}{\theta^2}[\omega]_{\times}^2\)

对于一般螺旋运动: \(e^{\xi^{\wedge}\theta} = \begin{bmatrix} e^{[\omega]_{\times}\theta} & J(\theta)v \\ 0 & 1 \end{bmatrix}\)

其中$J(\theta)$是左雅可比: \(J(\theta) = I\theta + \frac{1-\cos\theta}{\theta}[\omega]_{\times} + \frac{\theta-\sin\theta}{\theta}[\omega]_{\times}^2\)

对数映射(李群→李代数): \(\log: SE(3) \rightarrow \mathfrak{se}(3)\)

给定$T = \begin{bmatrix} R & p \ 0 & 1 \end{bmatrix}$:

  1. 计算旋转角:$\theta = \arccos\left(\frac{\text{tr}(R)-1}{2}\right)$
  2. 提取旋转轴:$\omega = \frac{1}{2\sin\theta}\begin{bmatrix} R_{32}-R_{23} \ R_{13}-R_{31} \ R_{21}-R_{12} \end{bmatrix}$
  3. 计算线速度:$v = J^{-1}(\theta)p$

5.3.4 工程应用

1. 轨迹优化中的应用: 李代数提供了无约束优化空间,避免了旋转矩阵的正交约束:

优化问题:
min_{ξ} ||f(exp(ξ^∧)T_0) - T_target||²

梯度计算:
∂f/∂ξ = ∂f/∂T · ∂exp(ξ^∧)/∂ξ

2. 滤波器设计: 扩展卡尔曼滤波在$SE(3)$上的实现:

3. 插值与平滑:

# SE(3)测地线插值
def geodesic_interp(T1, T2, t):
    T_rel = inv(T1) @ T2
    xi = log(T_rel)
    return T1 @ exp(t * xi)

4. 速度与加速度计算: 空间速度(Body Velocity): \(V^b = T^{-1}\dot{T} = \begin{bmatrix} [\omega^b]_{\times} & v^b \\ 0 & 0 \end{bmatrix}\)

空间加速度需要考虑科里奥利项: \(\dot{V}^b = \text{ad}_{V^b}V^b + T^{-1}\ddot{T}\)

5.3.5 数值实现注意事项

  1. 小角度处理: 当$\theta < \epsilon$时,使用泰勒展开避免数值不稳定: \(\frac{\sin\theta}{\theta} \approx 1 - \frac{\theta^2}{6}\) \(\frac{1-\cos\theta}{\theta^2} \approx \frac{1}{2} - \frac{\theta^2}{24}\)

  2. 归一化策略: 定期将$SO(3)$元素正交化,$SE(3)$保持最后一行为$[0,0,0,1]$

  3. 计算效率优化:

    • 预计算常用的指数映射
    • 使用闭式解而非级数展开
    • 利用对称性减少计算量

5.4 奇异性分析与规避策略

5.4.1 奇异性类型

机器人系统中的奇异性主要分为三类:

1. 运动学奇异性:

2. 表示奇异性:

3. 算法奇异性:

5.4.2 奇异性检测

雅可比奇异性检测:

def detect_singularity(J, threshold=1e-3):
    # 方法1:条件数
    cond_num = np.linalg.cond(J)
    if cond_num > 1/threshold:
        return True, "High condition number"
    
    # 方法2:最小奇异值
    _, s, _ = np.linalg.svd(J)
    if s[-1] < threshold:
        return True, "Small singular value"
    
    # 方法3:可操作度
    manipulability = np.sqrt(np.linalg.det(J @ J.T))
    if manipulability < threshold:
        return True, "Low manipulability"
    
    return False, "Non-singular"

几何奇异性检测:

5.4.3 奇异性规避策略

1. 阻尼最小二乘(DLS): \(\dot{q} = J^T(JJ^T + \lambda^2I)^{-1}\dot{x}\) 其中$\lambda$是阻尼因子,可自适应调整: \(\lambda = \begin{cases} 0 & \text{if } \sigma_{min} \geq \epsilon \\ \lambda_{max}\left(1 - \left(\frac{\sigma_{min}}{\epsilon}\right)^2\right) & \text{if } \sigma_{min} < \epsilon \end{cases}\)

2. 梯度投影法: 利用零空间进行二次任务优化: \(\dot{q} = J^+\dot{x} + (I - J^+J)\nabla H\) 其中$H$是避奇异性的势函数: \(H = -\frac{1}{2}\log(\det(JJ^T))\)

3. 路径规划层面:

4. 冗余度利用:

# 7自由度机械臂的肘部角优化
def optimize_elbow_angle(q, J, task_vel):
    # 主任务
    q_dot_task = pinv(J) @ task_vel
    
    # 零空间基
    N = eye(7) - pinv(J) @ J
    
    # 肘部角梯度
    elbow_gradient = compute_elbow_gradient(q)
    
    # 综合速度
    q_dot = q_dot_task + N @ elbow_gradient
    return q_dot

5.4.4 实时奇异性处理

分层控制架构:

层级1:任务空间控制器
  ↓ (检测奇异性)
层级2:奇异性处理器
  - 切换到关节空间控制
  - 激活阻尼项
  - 调整任务优先级
  ↓
层级3:关节控制器

状态机设计:

正常模式 ←→ 近奇异模式 ←→ 奇异模式
   |            |              |
   ↓            ↓              ↓
笛卡尔控制   混合控制      关节控制

5.5 案例研究:NASA瓦尔基里机器人的坐标系设计

5.5.1 背景介绍

NASA瓦尔基里(Valkyrie/R5)是为火星探索任务设计的类人机器人,高1.8米,重125公斤,具有44个自由度。其坐标系设计需要满足:

5.5.2 坐标系架构

基础坐标系定义:

  1. 世界坐标系:北东地(NED)航空标准
  2. 基座坐标系:位于骨盆中心,Z轴向上
  3. 关节坐标系:修改DH参数,优化数值稳定性
  4. 传感器坐标系
    • IMU:与基座对齐,考虑振动隔离
    • 相机:前视坐标系,Z轴向前
    • 力传感器:腕部和踝部,局部坐标系

坐标系层级:

世界坐标系
    ↓
基座坐标系(骨盆)
    ├── 躯干链
    │   ├── 腰部(3 DOF)
    │   └── 头部(2 DOF + 相机)
    ├── 左臂链(7 DOF + 手)
    ├── 右臂链(7 DOF + 手)
    ├── 左腿链(6 DOF)
    └── 右腿链(6 DOF)

5.5.3 姿态表示选择

四元数为主,欧拉角为辅:

实现细节:

class ValkyriePose:
    def __init__(self):
        self.quat = [1, 0, 0, 0]  # w, x, y, z
        self.euler_display = None  # 仅用于显示
        
    def update_orientation(self, quat_new):
        # 主更新路径
        self.quat = normalize(quat_new)
        
        # 辅助显示更新
        if needs_display():
            self.euler_display = quat_to_euler_safe(self.quat)
    
    def quat_to_euler_safe(self, q):
        # 检测万向节锁
        test = q[0]*q[2] - q[1]*q[3]
        if abs(test) > 0.4999:  # 接近±90度
            return None  # 返回警告
        return quat_to_euler(q)

5.5.4 多传感器融合策略

扩展卡尔曼滤波(EKF)设计:

传感器同步:

IMU (1000Hz) ──┐
                ├─→ 时间同步器 ──→ EKF (200Hz)
相机 (30Hz) ────┤      │
                │      ↓
力传感器 (500Hz)┘   状态估计

5.5.5 遥操作坐标系映射

操作员视角到机器人视角:

  1. 操作员使用VR头显,自然坐标系
  2. 映射到机器人基座坐标系
  3. 考虑通信延迟(地火通信14-24分钟)
  4. 预测显示补偿延迟

坐标变换链: \(T_{robot}^{world} = T_{base}^{world} \cdot T_{link}^{base} \cdot T_{tool}^{link}\)

5.5.6 经验教训

  1. 坐标系文档的重要性:NASA要求每个坐标系都有详细的定义文档和可视化
  2. 冗余表示的价值:关键姿态同时用四元数和旋转矩阵存储,用于交叉验证
  3. 坐标系可视化工具:开发专门的RViz插件显示所有坐标系
  4. 单元测试覆盖:所有坐标变换函数100%测试覆盖
  5. 故障恢复机制:当检测到数值错误时,自动切换到备份表示法

5.6 高级话题:双四元数与螺旋理论

5.6.1 双四元数基础

双四元数提供了统一表示旋转和平移的优雅框架: \(\hat{q} = q_r + \epsilon q_d\) 其中$q_r$是旋转四元数,$q_d$是对偶部分,$\epsilon^2 = 0$。

优势:

5.6.2 螺旋理论应用

瞬时螺旋轴: 任何刚体运动都可分解为绕某轴的旋转加沿该轴的平移: \(\mathcal{S} = \{\mathbf{s}; \mathbf{s}_0\}\) 其中$\mathbf{s}$是轴方向,$\mathbf{s}_0$是轴上一点。

Plücker坐标: 用6维向量表示空间直线: \(\mathcal{L} = (\mathbf{l}; \mathbf{m})\) 其中$\mathbf{l}$是方向向量,$\mathbf{m} = \mathbf{p} \times \mathbf{l}$是力矩。

5.6.3 工程应用实例

并联机构分析: Stewart平台的运动学用螺旋理论更简洁:

抓取分析: 接触点的约束用旋量表示:

本章小结

本章系统介绍了机器人学中的坐标系建立和姿态表示方法:

关键概念:

  1. DH参数提供系统化但可能遇到奇异性,PoE基于螺旋理论更现代
  2. 旋转矩阵无奇异但冗余,欧拉角直观但有万向节锁,四元数紧凑无奇异
  3. 李群/李代数为优化和滤波提供优雅框架
  4. 奇异性需要多层次检测和规避策略
  5. 实际系统常需多种表示法协同工作

关键公式:

练习题

基础题

习题5.1 给定DH参数表: | i | $a_i$ | $\alpha_i$ | $d_i$ | $\theta_i$ | |—|——-|————|——-|————| | 1 | 0 | 90° | 0.1 | $\theta_1$ | | 2 | 0.5 | 0° | 0 | $\theta_2$ | | 3 | 0.3 | 0° | 0 | $\theta_3$ |

计算当$\theta_1 = 30°$,$\theta_2 = 45°$,$\theta_3 = -60°$时末端执行器的位姿。

Hint: 逐个计算变换矩阵,然后连乘。

答案 通过连乘三个变换矩阵$T_0^3 = T_0^1 T_1^2 T_2^3$,得到末端位姿。 最终位置约为$[0.324, 0.187, 0.459]$,姿态需要从旋转矩阵提取。

习题5.2 证明旋转矩阵的行列式必须为1,并解释为什么-1的情况对应反射而非旋转。

Hint: 考虑旋转保持手性(chirality)。

答案 旋转保持向量长度和夹角,因此$\det(R) = \pm 1$。由于旋转必须保持右手坐标系为右手系(连续性),所以$\det(R) = 1$。$\det(R) = -1$会改变手性,对应反射变换。

习题5.3 实现四元数到旋转矩阵的转换函数,并验证单位四元数$q = [0.5, 0.5, 0.5, 0.5]$对应的旋转矩阵。

Hint: 使用公式$R = I + 2q_w[\mathbf{q}_v]_{\times} + 2[\mathbf{q}_v]_{\times}^2$

答案 $q = [0.5, 0.5, 0.5, 0.5]$对应120°绕轴$[1,1,1]$的旋转。 旋转矩阵为: $$R = \begin{bmatrix} 0 & 0 & 1 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{bmatrix}$$ 这是一个循环置换矩阵。

习题5.4 某机械臂在工作时检测到雅可比矩阵的条件数为1000,这意味着什么?应该采取什么措施?

Hint: 条件数反映矩阵的”病态”程度。

答案 条件数1000表示接近奇异配置,输入误差会被放大1000倍。措施包括: 1. 激活阻尼项,使用DLS方法 2. 降低运动速度 3. 考虑重新规划路径避开奇异区域 4. 如有冗余自由度,调整零空间配置

挑战题

习题5.5 设计一个算法,检测6自由度机械臂的所有奇异配置,并生成奇异性地图。考虑如何在实时控制中使用这个地图。

Hint: 考虑采样关节空间,计算雅可比行列式。

答案 算法步骤: 1. 均匀采样关节空间(如每个关节10°) 2. 计算每个配置的雅可比矩阵 3. 计算可操作度$w = \sqrt{\det(JJ^T)}$ 4. 标记$w < \epsilon$的配置为奇异 5. 使用k-d树或八叉树存储奇异区域 6. 实时控制时查询最近奇异点,计算"安全距离" 7. 在路径规划时添加奇异性势场

习题5.6 推导并实现SE(3)上的B样条插值算法,使其能生成$C^2$连续的轨迹。与线性插值和SLERP对比。

Hint: 在李代数空间进行B样条,然后指数映射回李群。

答案 SE(3) B样条算法: 1. 将控制点$T_i$映射到李代数:$\xi_i = \log(T_0^{-1}T_i)$ 2. 在$\mathfrak{se}(3)$中计算B样条:$\xi(t) = \sum_i B_i(t)\xi_i$ 3. 映射回SE(3):$T(t) = T_0 \exp(\xi(t))$ 优势:$C^2$连续,曲率变化平滑 劣势:计算量大于SLERP,需要对数映射

习题5.7 某火星探测机器人使用IMU和视觉进行状态估计。由于火星重力(3.71 m/s²)与地球不同,如何修改EKF?考虑IMU标定误差的影响。

Hint: 重力向量影响加速度计测量模型。

答案 修改方案: 1. 更新重力常数:$g_{Mars} = 3.71$ m/s² 2. 加速度计模型:$a_m = R^T(a - g_{Mars}) + b_a + n_a$ 3. 添加重力标定参数到状态向量:$x = [..., g_{est}]$ 4. 在线估计重力大小,补偿IMU标定误差 5. 使用视觉SLAM提供的垂直方向约束更新重力方向 6. 考虑火星大气和尘暴对视觉的影响,动态调整传感器权重

习题5.8 分析并联机器人Stewart平台在接近奇异配置时的坐标系选择策略。如何设计坐标系使奇异性分析更简单?

Hint: 考虑动平台中心vs关节空间表示。

答案 坐标系策略: 1. 基座中心坐标系:分析工作空间边界 2. 动平台质心坐标系:惯性矩阵对角化 3. 主螺旋坐标系:沿主要约束方向 4. 使用Grassmann坐标分析6条支链的线性相关性 5. 奇异配置时切换到约束流形的切空间坐标 6. 实时计算最小奇异值对应的方向,沿该方向建立"逃逸坐标系"

常见陷阱与错误 (Gotchas)

  1. DH参数符号混淆
    • 错误:混用标准DH和修改DH参数
    • 正确:明确声明使用的约定,保持一致性
  2. 四元数归一化遗忘
    • 错误:累积运算后不归一化
    • 正确:每次运算后检查模长,必要时归一化
  3. 欧拉角顺序错误
    • 错误:假设所有系统都用ZYX顺序
    • 正确:查阅文档确认旋转顺序,编写转换函数时明确标注
  4. 奇异性处理不当
    • 错误:使用固定阈值检测所有奇异性
    • 正确:根据机构特点设计自适应阈值
  5. 坐标系方向假设
    • 错误:假设Z轴总是向上
    • 正确:明确定义每个坐标系的方向约定
  6. 数值精度问题
    • 错误:直接比较浮点数是否相等
    • 正确:使用容差范围,如abs(a - b) < epsilon
  7. 插值路径选择
    • 错误:对旋转矩阵元素直接线性插值
    • 正确:转换到四元数或李代数进行插值
  8. 时间同步忽视
    • 错误:假设所有传感器数据时间戳对齐
    • 正确:实现时间同步机制,考虑传感器延迟

最佳实践检查清单

设计阶段

实现阶段

调试阶段

运行阶段