第2章:空间几何基础
各位同学好,我是你们这门课的老朋友。今天咱们聊聊Delta机器人运动学里最基础、也最绕不开的东西——空间几何。
说实话,我刚开始做机器人那会儿,觉得几何嘛,不就是高中那点东西?结果第一次调Delta机器人的轨迹,末端执行器直接飞出去了。嗯,从那以后我再也不敢小看坐标系和变换矩阵了。
2.1 坐标系定义
Delta机器人有三个并联臂,每个臂都在三维空间里运动。要描述它们的位置和姿态,我们得先定好坐标系。
2.1.1 世界坐标系
世界坐标系,说白了就是整个仿真世界的“绝对参考系”。我习惯把它放在Delta机器人的底座中心,Z轴竖直向上,X轴指向某个固定方向。
为什么这么放?因为Delta机器人的底座是固定的,底座中心就是最自然的原点。你想想看,如果我把世界坐标系放在天花板上,那每次算位置都得加个偏移,多麻烦。
2.1.2 基坐标系
基坐标系 {B} 和世界坐标系其实可以重合。但在实际项目中,我遇到过把机器人装在一个移动平台上的情况。这时候基坐标系就得跟着平台走。
基坐标系的原点通常固定在Delta机器人的静平台上。三个主动臂的电机就装在这个平台上,所以基坐标系是描述电机位置的最佳参考。
2.1.3 末端坐标系
末端坐标系 {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]) # 单位向量
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())
2.5 本章知识体系
下面这张图展示了本章的核心逻辑:
嗯,以上就是本章的全部内容。空间几何是Delta机器人运动学的地基,地基打不牢,后面盖楼会歪的。我当年就是吃了这个亏,所以现在每次做仿真,第一件事就是检查坐标系定义对不对。
记住:坐标系、向量、变换矩阵,这三样东西搞明白了,Delta机器人的正逆解就是水到渠成的事。
公众号:蓝海资料掘金营,微信deep3321