2. 坐标系与变换基础:空间坐标系定义、齐次变换矩阵、欧拉角与四元数、坐标变换在Stewart平台中的应用
各位同学,大家好。我是你们的老朋友,一个在机械控制和嵌入式领域摸爬滚打了十几年的工程师。今天我们来聊聊Stewart平台控制里最基础、也最绕不开的一个话题——坐标系与变换。
说实话,我刚开始做Stewart平台那会儿,觉得这东西不就是个数学工具嘛,有啥好学的?结果第一次调试,平台乱转,差点把传感器撞坏。后来才明白,坐标系没搞对,后面全是白干。所以这一章,咱们把地基打牢。
2.1 空间坐标系定义
先说说坐标系。Stewart平台里,我们至少需要两个坐标系:一个是固定不动的基坐标系,另一个是跟着动平台跑的动坐标系。
基坐标系,我习惯把它放在底座的中心,Z轴朝上。动坐标系呢,放在动平台的中心,也是Z轴朝上。为什么这么放?因为对称,计算方便。我在项目里见过有人把动坐标系放在角落,结果后面算逆解的时候,自己把自己绕晕了。
这里有个小经验:坐标系的原点位置和轴向定义,一定要在项目一开始就定死。别今天用右手系,明天用左手系,那代码改起来真要命。
核心要点:
- 基坐标系 {B}:固定,原点在底座中心,Z轴垂直向上
- 动坐标系 {P}:随动,原点在动平台中心,Z轴垂直向上
- 两个坐标系都是右手系,这是行业惯例
2.2 齐次变换矩阵
有了两个坐标系,怎么把一个点从动坐标系转换到基坐标系?这就用到了齐次变换矩阵。
说白了,齐次变换矩阵就是一个4x4的矩阵,它把旋转和位移打包在一起。你想想看,如果没有它,你得先算旋转矩阵,再单独加位移向量,多麻烦。
它的形式长这样:
| R t |
| 0 1 |
其中R是3x3的旋转矩阵,t是3x1的位移向量。最后一行是[0 0 0 1],这是齐次坐标的固定格式。
我记得有一次,我在做平台标定时,发现动平台的位置总是偏一点。查了半天,原来是齐次变换矩阵里的位移向量写反了符号。嗯,这种低级错误,犯过一次就记住了。
我的习惯:写代码时,把齐次变换矩阵封装成一个结构体或类。里面包含旋转矩阵R和位移向量t。这样调用起来清晰,不容易出错。
2.3 欧拉角与四元数
旋转怎么表示?最直观的是欧拉角,但最靠谱的是四元数。
欧拉角,说白了就是绕三个轴依次转。比如Z-Y-X顺序,先绕Z转ψ,再绕Y转θ,最后绕X转φ。听起来简单,但有个大坑——万向锁。当θ接近90度时,ψ和φ就分不清了,系统会丢失一个自由度。
我在项目中遇到过这个情况。当时平台在做大角度俯仰时,突然卡住不动了。我一开始以为是电机堵转,后来一查,是欧拉角算法在万向锁附近炸了。从那以后,我内部计算一律用四元数,只在人机交互界面才转成欧拉角显示。
四元数,形式是q = w + xi + yj + zk,其中w是实部,x、y、z是虚部。它没有万向锁问题,而且插值平滑,非常适合做姿态控制。
怎么选?我建议:
- 人机交互:用欧拉角,直观好理解
- 内部计算与控制:用四元数,稳定可靠
- 传感器数据:IMU输出通常是四元数,直接拿来用
避坑指南:我曾经在四元数归一化上吃过亏。四元数如果不归一化,旋转矩阵会变形,导致姿态计算越来越偏。所以每次更新四元数后,记得做一次归一化。这是基本功,但很多人会忘。
2.4 坐标变换在Stewart平台中的应用
好了,理论讲完了,咱们看看在Stewart平台上怎么用。
Stewart平台的核心任务,就是根据动平台的目标位姿,算出六个电动缸的长度。这个过程叫运动学逆解。
具体步骤是这样的:
- 给定动平台的目标位姿(位置和姿态)
- 用齐次变换矩阵,把动平台上的铰点坐标转换到基坐标系下
- 计算每个铰点到对应底座铰点的距离,就是电动缸的长度
你看,每一步都离不开坐标变换。没有齐次变换矩阵,你连铰点在哪都算不出来。
下面我画了一张图,帮你理清整个知识体系:
你看这张图,从左到右,从基坐标系到动坐标系,中间靠齐次变换矩阵连接。旋转表示方式有两种,但最终都服务于运动学逆解。
在实际代码里,我一般这样组织:
// 伪代码示例:Stewart平台逆解
// 输入:动平台目标位姿 (x, y, z, roll, pitch, yaw)
// 输出:六个电动缸长度
// 1. 将欧拉角转为四元数(内部计算用四元数)
Quaternion q = eulerToQuaternion(roll, pitch, yaw);
// 2. 构建齐次变换矩阵
Matrix4x4 T = buildTransformMatrix(q, Vector3(x, y, z));
// 3. 对每个铰点进行坐标变换
for (int i = 0; i < 6; i++) {
Vector3 p_in_base = T * p_in_platform[i]; // 动平台铰点转到基坐标系
float length = (p_in_base - b_in_base[i]).norm(); // 计算缸长
actuator_lengths[i] = length;
}
这段代码看着简单,但每个细节都值得推敲。比如buildTransformMatrix函数,里面旋转矩阵的构造顺序一定要和你的欧拉角定义一致。我见过有人用ZYX顺序,但代码里写的是XYZ,结果平台姿态完全反了。
一个小技巧:调试阶段,可以用一个已知位姿来验证你的变换矩阵。比如让动平台只平移不旋转,看看缸长变化是否符合预期。这一步能帮你快速定位问题。
好了,这一章的内容就到这里。坐标系和变换是Stewart平台的数学基础,看似枯燥,但真的绕不过去。下一章我们会深入运动学,到时候你会发现,今天打下的基础全都能用上。
本章小结:
- 基坐标系和动坐标系是Stewart平台的两个基本参考系
- 齐次变换矩阵把旋转和位移打包在一起,是坐标变换的核心工具
- 欧拉角直观但有万向锁问题,四元数稳定适合内部计算
- 运动学逆解的本质,就是通过坐标变换计算电动缸长度