第2章:空间几何基础

各位同学好,我是你们这门课的老朋友。今天咱们聊聊Delta机器人运动学里最基础、也最绕不开的东西——空间几何。

说实话,我刚开始做机器人那会儿,觉得几何嘛,不就是高中那点东西?结果第一次调Delta机器人的轨迹,末端执行器直接飞出去了。嗯,从那以后我再也不敢小看坐标系和变换矩阵了。

2.1 坐标系定义

Delta机器人有三个并联臂,每个臂都在三维空间里运动。要描述它们的位置和姿态,我们得先定好坐标系。

2.1.1 世界坐标系

世界坐标系,说白了就是整个仿真世界的“绝对参考系”。我习惯把它放在Delta机器人的底座中心,Z轴竖直向上,X轴指向某个固定方向。

为什么这么放?因为Delta机器人的底座是固定的,底座中心就是最自然的原点。你想想看,如果我把世界坐标系放在天花板上,那每次算位置都得加个偏移,多麻烦。

我的习惯: 世界坐标系用大写字母 {W} 表示。原点在底座中心,Z轴向上,X轴指向机器人正前方。

2.1.2 基坐标系

基坐标系 {B} 和世界坐标系其实可以重合。但在实际项目中,我遇到过把机器人装在一个移动平台上的情况。这时候基坐标系就得跟着平台走。

基坐标系的原点通常固定在Delta机器人的静平台上。三个主动臂的电机就装在这个平台上,所以基坐标系是描述电机位置的最佳参考。

2.1.3 末端坐标系

末端坐标系 {E} 固定在Delta机器人的动平台上。这个坐标系的原点就是末端执行器的中心点。

为什么要单独定义末端坐标系?因为我们要控制的是末端的位置和姿态。比如抓取一个零件,你得知道末端相对于基座的位置,对吧?

关键点: 世界坐标系 {W} → 基坐标系 {B} → 末端坐标系 {E},这三者之间的变换关系,就是Delta机器人运动学要解决的核心问题。

2.2 向量与点的表示

在三维空间里,点和向量都用三个坐标表示。但两者有本质区别:点代表位置,向量代表方向和大小。

我记得有一次,一个学生把点和向量搞混了,结果算出来的雅可比矩阵全是错的。所以这里我特别强调一下:

  • 点: 用位置矢量表示,比如 P = [x, y, z]^T
  • 向量: 用方向矢量表示,比如 v = [vx, vy, vz]^T

在Python里,我习惯用NumPy数组来表示:

import numpy as np

# 点的表示
point_P = np.array([0.1, 0.2, -0.3])  # 单位:米

# 向量的表示
vector_v = np.array([0.5, 0.0, 0.866])  # 单位向量
避坑指南: 我曾经在仿真里直接用Python列表做向量运算,结果广播机制搞出了维度错误。建议从一开始就用NumPy,省心。

2.3 齐次变换矩阵

齐次变换矩阵,是机器人学里最常用的工具。它用一个4×4的矩阵,同时描述旋转和平移。

为什么是4×4?因为3×3的旋转矩阵只能描述旋转,要加上平移,就得用齐次坐标。说白了,就是把三维点扩展成四维:

# 齐次变换矩阵 T 的结构
T = [[R, t],
     [0, 1]]

# 其中 R 是 3×3 旋转矩阵
# t 是 3×1 平移向量

举个例子,从基坐标系到末端坐标系的变换:

def create_transform_matrix(R, t):
    """创建齐次变换矩阵"""
    T = np.eye(4)
    T[:3, :3] = R
    T[:3, 3] = t
    return T

# 假设末端相对于基座旋转30度,平移(0.1, 0.0, -0.5)
theta = np.deg2rad(30)
R = np.array([[np.cos(theta), -np.sin(theta), 0],
              [np.sin(theta),  np.cos(theta), 0],
              [0,              0,             1]])
t = np.array([0.1, 0.0, -0.5])

T_BE = create_transform_matrix(R, t)
print("基座到末端的变换矩阵:\n", T_BE)
我的经验: 在仿真中,我习惯把所有的变换矩阵都写成齐次形式。这样链式变换就变成了矩阵乘法,代码简洁,逻辑清晰。

2.4 欧拉角与四元数简介

旋转矩阵有9个元素,但自由度只有3个。所以我们需要更紧凑的表示方法——欧拉角和四元数。

2.4.1 欧拉角

欧拉角用三个角度描述旋转:绕X轴转(滚转)、绕Y轴转(俯仰)、绕Z轴转(偏航)。

但欧拉角有个大问题:万向锁。我当年做第一个Delta机器人仿真时,就栽在这个坑里。末端姿态突然卡死,怎么调都调不过来。

为什么会这样?因为当俯仰角达到±90度时,滚转和偏航的旋转轴会重合,丢失一个自由度。

避坑指南: 如果你用欧拉角做插值,一定要小心万向锁。我曾经在轨迹规划里用欧拉角插值,结果末端姿态在中间点突然翻转。从那以后,我改用四元数了。

2.4.2 四元数

四元数用四个数表示旋转:一个实部和三个虚部。它没有万向锁问题,而且插值平滑。

from scipy.spatial.transform import Rotation as R

# 用四元数表示旋转
quat = [0.707, 0.0, 0.707, 0.0]  # [w, x, y, z]
rotation = R.from_quat(quat)

# 转成旋转矩阵
rot_matrix = rotation.as_matrix()
print("四元数对应的旋转矩阵:\n", rot_matrix)

# 四元数插值
q1 = [1.0, 0.0, 0.0, 0.0]  # 单位四元数
q2 = [0.707, 0.0, 0.707, 0.0]
t = 0.5  # 插值参数
q_interp = R.from_quat([q1, q2]).mean(weights=[1-t, t])
print("插值后的四元数:", q_interp.as_quat())
我的建议: 在Delta机器人仿真中,我推荐用四元数表示姿态。虽然理解起来比欧拉角抽象一点,但用起来真的省心。特别是做轨迹规划时,四元数的球面线性插值(SLERP)效果非常好。

2.5 本章知识体系

下面这张图展示了本章的核心逻辑:

空间几何基础 - 知识体系 坐标系定义 向量与点的表示 齐次变换矩阵 世界坐标系 {W} 基坐标系 {B} 末端坐标系 {E} 点的位置矢量 向量的方向与大小 NumPy数组表示 旋转矩阵 R 平移向量 t 4×4齐次矩阵 核心:坐标系变换 → 运动学建模 → 仿真实现

嗯,以上就是本章的全部内容。空间几何是Delta机器人运动学的地基,地基打不牢,后面盖楼会歪的。我当年就是吃了这个亏,所以现在每次做仿真,第一件事就是检查坐标系定义对不对。

记住:坐标系、向量、变换矩阵,这三样东西搞明白了,Delta机器人的正逆解就是水到渠成的事。


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