简介:面向机器人运动控制与仿真的Stewart平台六自由度并联机构Simulink模型包,适合高校学生、工程师及研究人员用于学习并联机器人建模、控制算法设计与动态仿真。包内将Stewart平台的物理结构抽象为可调用的Simulink模型,配合MATLAB脚本完成连杆长度计算与运动学求解,便于快速观察六自由度平移、旋转下的系统响应。压缩包共2个文件,包括1个mdl仿真模型文件与1个m脚本文件,整体仅17KB,轻量易用。已有360人学习下载。模型清晰展示了Stewart平台的腿部驱动关系、坐标系转换与仿真参数配置思路,学习者可在此基础上试验PID、滑模等控制策略,并完成误差分析与参数优化,从而深入理解六自由度并联机构的运动学、动力学及Simulink建模流程,是学习复杂动态系统仿真与控制设计的实用参考。
1. 用 Simulink 解算 Stewart 平台运动,先别急着导入压缩包
拿到一个叫 stewart-motion 的仿真文件,第一反应往往是打开模型立刻运行看波形。但 Stewart 平台这类六自由度并联机构的仿真,真正的门槛不在模型文件本身,而在你能否把运动学解算的每一环讲清楚:位姿映射成六条腿的长度,腿长再反推平台位姿。这里沿运动学理论、Simulink 建模、仿真调试、实时验证这条路径展开,适合做飞行模拟器、船舶运动补偿台、天线稳定平台或精密定位系统的工程师。读完你能从零搭一个可扩展的 Stewart 运动学仿真,拿到异常波形时也有明确的排查顺序,而不是反复改 PID 参数碰运气。
2. Stewart 运动学解算:逆解建模型,正解做数据复核
2.1 搭模型前先定坐标系与铰点布局
Stewart 平台的几何定义决定了所有后续代码。先建立两个直角坐标系:基座坐标系 {B} 固定在基座中心,Z 轴垂直向上;平台坐标系 {P} 固定在动平台中心,初始状态与 {B} 方向一致,两者高度差记为 z0。六个基座铰点在以原点为中心、半径 R_B 的圆上分布;六个平台铰点在半径 R_P 的圆上分布。
分布规律是:圆周上每 120 度一组,每组两个铰点对称排列。用半角 alpha_B、alpha_P 表示每组内铰点与组中线之间的夹角,这样比直接列 12 个角度更不容易出错,后期调整几何时也只需改四个参数。平台铰点和基座铰点通常还要错开一个角度,常见做法是错开 alpha_B + alpha_P,让六条腿在圆周方向上均匀展开。位姿描述采用位置加 ZYX 欧拉角,这个约定一旦定下就不要变,因为后续旋转矩阵、Simulink 模块和正解迭代都共用同一套映射。
2.2 位置逆解:从位姿直接算六条腿长
位置逆解(IK)是 Stewart 仿真里最常用、也最不可能绕开的一步。给定平台位姿 q = [x, y, z, roll, pitch, yaw],对第 i 个铰点,平台铰点在 {B} 系里的坐标为 p + R * P_i,减去基座铰点 B_i 得到腿矢量,腿长就是该矢量的模。这里直接给出可复用的 MATLAB 函数:
function L = stewart_ik(pose, param) % 位置逆解:由平台位姿计算六条腿长 % pose: [x, y, z, roll, pitch, yaw],角度单位弧度 % param: 几何参数结构体,见 3.2 节初始化脚本 % 1. 由半角生成六个基座铰点坐标 B = zeros(6, 3); for i = 1:6 group = floor((i-1)/2); % 当前铰点属于第几组 side = mod(i-1, 2); % 组内左/右 theta = group*2*pi/3 + (side*2-1)*param.alpha_base; B(i,:) = [param.R_base*cos(theta), param.R_base*sin(theta), 0]; end % 2. 生成平台铰点,并相对基座错开 alpha_base + alpha_platform P = zeros(6, 3); offset = param.alpha_base + param.alpha_platform; for i = 1:6 group = floor((i-1)/2); side = mod(i-1, 2); theta = group*2*pi/3 + (side*2-1)*param.alpha_platform + offset; P(i,:) = [param.R_platform*cos(theta), param.R_platform*sin(theta), 0]; end % 3. ZYX 顺序旋转矩阵,把平台铰点从 {P} 系转到 {B} 系 roll = pose(4); pitch = pose(5); yaw = pose(6); s1 = sin(roll); c1 = cos(roll); s2 = sin(pitch); c2 = cos(pitch); s3 = sin(yaw); c3 = cos(yaw); R = [c2*c3, c1*s3 + s1*s2*c3, s1*s3 - c1*s2*c3; -c2*s3, c1*c3 - s1*s2*s3, s1*c3 + c1*s2*s3; s2, -s1*c2, c1*c2]; % 4. 腿长 = 平台铰点基座系坐标与基座铰点之差的模 L = zeros(6, 1); for i = 1:6 d = pose(1:3)' + R*P(i,:)' - B(i,:)'; L(i) = norm(d); end end代码注释里已经把流程拆成四段。第 1、2 步用 group 和 side 两个整数把六根腿按 120 度分成三组,半角只影响组内两铰点的夹角,这是并联机构布局里最常见的 3+3 对称形式。第 3 步的旋转矩阵是 ZYX 欧拉角标准形式,行对应基座系坐标,列对应平台系坐标。第 4 步的相减顺序不要搞反,否则腿长正负号会随着位姿变化,正解时对初值更敏感。函数返回的是六条腿的标量长度,不包含方向向量,因为后续闭环控制用的是腿长指令。
2.3 位置正解:用腿长反推平台位姿
正解(FK)在离线仿真里不是必需的,但当你需要做位姿反馈、或者想验证球铰与执行器装配后的实际位置时,必须把六条腿长变成六个位姿参数。直接解非线性方程组不现实,常见做法是 Newton-Raphson 迭代,配合数值雅可比,避免手推偏导:
function pose = stewart_fk(L, pose0, param) % 位置正解:由六条腿长迭代求解平台位姿 % L: 6x1 腿长列向量 % pose0: 迭代初值 [x, y, z, roll, pitch, yaw] q = pose0; for it = 1:50 err = stewart_ik(q, param) - L; if max(abs(err)) < 1e-6 break; end h = 1e-6; J = zeros(6, 6); for j = 1:6 q_plus = q; q_minus = q; q_plus(j) = q_plus(j) + h; q_minus(j) = q_minus(j) - h; J(:, j) = (stewart_ik(q_plus, param) - stewart_ik(q_minus, param)) / (2*h); end q = q - J \ err; % 6x6 左除,等价于求逆乘误差 end pose = q; end这段代码的收敛速度取决于初值pose0。实践中最稳的初值是上一时刻的正解输出,或者直接把期望位姿拿来当初值,因为控制器跟踪误差通常只有几毫米。数值雅可比步长 h 取 1e-6 就够了,Simulink 里用的是 double 精度,再小会引入舍入误差。迭代上限 50 次对应离线仿真实时性足够,上实时机之前改成固定 5 次以内并观察残差更可靠。
3. 搭最小 Simulink 仿真:位姿输入、腿长输出与执行器闭环
3.1 选 MATLAB Function 还是 Simscape Multibody
Simscape Multibody 能直接拖出球铰、棱柱副和刚体,后处理还能看关节力,但仿真速度慢,模型升级后还容易因为连接器类型报错。如果目标是验证运动学解算、标定腿长范围、或给控制系统提供参考模型,我一般用 MATLAB Function 块内嵌逆解函数,配合几个基础信号模块就够了。这套方案在仿真速度、可读性和后续代码生成三方面最均衡。也就是说,Simulink 模型里只有信号流,没有刚体几何碰撞,六条腿的物理干涉检查交给后续详细模型去做。
3.2 几何参数表与模型初始化脚本
在模型回调里放一个初始化脚本,所有几何参数集中管理,比在 MATLAB Function 里写死数字容易维护。参数含义与取值如下:
| 参数 | 符号 | 取值 | 说明 |
|---|---|---|---|
| 基座铰点半径 | R_base | 0.80 m | 基座六铰点分布圆半径 |
| 平台铰点半径 | R_platform | 0.50 m | 平台六铰点分布圆半径 |
| 基座铰点半角 | alpha_base | 15 deg | 每组内两基座铰点夹角的一半 |
| 平台铰点半角 | alpha_platform | 15 deg | 每组内两平台铰点夹角的一半 |
| 初始高度 | z0 | 0.90 m | 初始位姿的 Z 坐标 |
| 腿长基准 | L0 | 0.95 m | 初始位姿下的六腿长度 |
初始化脚本放在模型属性(Model Properties -> Callbacks -> InitFcn)里:
%% Stewart 几何参数初始化 param.R_base = 0.80; param.R_platform = 0.50; param.alpha_base = 15*pi/180; param.alpha_platform = 15*pi/180; param.z0 = 0.90; param.L0 = sqrt((param.R_platform - param.R_base)^2 + param.z0^2);腿长基准不是随手给的。初始高度 0.9 m,平台与基座半径差 0.3 m,勾股定理得到约 0.95 m。这个值会直接影响饱和限幅的上下界,也是后面判断腿长是否超行程的基准。
3.3 信号接线与带执行器的闭环结构
模型接线从六个信号源开始。给 x、y 分别加 0.1 m、0.05 m 幅值的正弦波,roll、pitch、yaw 加 0.05 rad 的小幅正弦,频率错开避免共振叠加。六个信号用 Mux 合成 6 维向量,进 MATLAB Function 块,函数名填 stewart_ik 并指定 param 为额外输入。逆解输出的腿长先过饱和限幅,从 0.95 m 基准出发,实际行程按正负 0.15 m 设计,饱和上限 1.10 m、下限 0.80 m。
限幅后交给执行器模型,我这里用一个一阶惯性环节 1/(0.05s+1) 模拟液压或电动缸的带宽,输出为实际腿长。把实际腿长再接回一个 stewart_fk 正解块,就得到位姿反馈。整体信号流是期望位姿到逆解、逆解到腿长指令、指令到饱和度、饱和度到执行器、执行器到实际腿长、实际腿长到正解、正解再输出实际位姿。关节空间 PID 接在腿长误差上,Kp 取 200,Ki 取 50,Kd 取 5 起步。这里不需要位姿空间控制器,因为 Stewart 的雅可比随位形变化,关节空间 PID 更容易稳定。
4. 仿真调试与参数校准:Stewart 波形异常先查这 5 处
4.1 角度单位与旋转顺序检查
仿真中大部分平台发散问题出在角度单位。Simulink 的三角函数模块默认用弧度,而外部位姿指令常按角度给定。处理办法是让所有进入逆解的变量统一成弧度,在信号源后用 Gain 乘 pi/180,而不是在模块参数里改。旋转顺序也要和代码一致,stewart_ik 按 ZYX 解释欧拉角,如果用到 Aerospace Toolbox 的欧拉角转旋转矩阵模块,必须把旋转顺序设成 ZYX。混用 ZXY 或 YXZ 时,小角度下差别不大,但超过 10 度后波形会整体偏斜,六条腿的相位关系也会跟着乱。
4.2 铰点相位错位的三种波形特征
铰点角度写错是最隐蔽的几何错误。正常平台做单轴 roll 运动时,六条腿分成两两对称的三组变化;如果某两根相邻腿的相位完全相同或完全相反,先查铰点半角与错位角。另一个特征是腿长指令出现近似相等的 3+3 分组,这是没有做 alpha_B + alpha_P 错位的典型表现。正解迭代不收敛时,现象则是位姿反馈信号出现数值极大的跳变脉冲,用 Scope 直接看正解输出,比看原始腿长更直观。
4.3 腿长超行程与饱和度触发
限幅之后可以加一个 Probes 块统计 Saturation 的 active 状态。若饱和频繁触发,说明给定轨迹超过了机构可达空间。先用缩小幅值的方式确认运动学正确性,再扩大行程或调整几何参数。对 0.95 m 腿长基准,姿态角超过 8 度左右就可能触发限幅,这是并联机构的正常约束,不是模型错误。如果饱和触发但波形不畸变,说明执行器带宽足够,继续加大 PID 增益即可;如果饱和触发后出现持续振荡,则问题在积分项饱和。
4.4 用条件数提前定位病态位形
平台高度太低时,六个铰点几乎在同一水平面,姿态变化对腿长的映射变得迟钝。在某个位形下把逆解的雅可比条件数打出来:
q_test = [0 0 0.90 0 0 0]; h = 1e-6; J = zeros(6,6); for j = 1:6 q_p = q_test; q_m = q_test; q_p(j) = q_p(j)+h; q_m(j) = q_m(j)-h; J(:,j) = (stewart_ik(q_p,param)-stewart_ik(q_m,param))/(2*h); end kappa = cond(J)同样的代码把 z 改成 0.2 再跑一次,条件数可能从几十跳到几千。遇到这种情况先抬高初始高度,而不是硬调控制器。这步操作能把运动学问题与控制器参数问题彻底分开,是排查波形振荡最快的路径。
4.5 代数环与求解器步长
正解反馈回路里,stewart_fk 的初值若直接取逆解输出,容易形成代数环,Simulink 会提示红色警告。解法是在正解初值端口前加一个单位延迟 Memory 块,用上一拍的正解结果。变步长求解器下把最大步长限制在 0.01 s,避免执行器饱和后微分尖峰引起的步长反复收缩。
提示:代数环不一定出现在模型编译期,有时仿真中途才报错。只要正解初值引用了同一时刻的信号,就默认需要 Memory 块隔一拍。
5. 进阶应用:Simulink 外部模式实时跑 Stewart 的边界与技巧
5.1 外部模式联调时先校核腿长指令
Simulink 外部模式可以把模型部署到 dSPACE RTI、Speedgoat 这类实时目标机上,用真实执行器跑腿长指令。上电之前,把执行器断开,只烧录运动学部分,用 DAC 或总线接口输出六条腿长指令,与实物上的位移传感器对比。误差超过 3 mm 时,先查传感器量程映射,再查模型里的单位换算,最后才查机械装配。这个顺序能省掉大量机械碰撞风险。
5.2 正解初值复用,可以显著提升迭代稳定性
实时机上每个控制周期都要做一次正解,5 次以内的 Newton-Raphson 迭代要收敛,初值是最关键的因素。我一般把上一周期正解输出存在 Memory 块里,作为本周期 stewart_fk 的 pose0。因为相邻周期平台位移很小,这个初值几乎就在真实解附近,2 到 3 次迭代就满足残差。如果从固定零位开始迭代,大范围扫摆时很容易发散到相邻解,位姿反馈会突然跳变几十毫米。
5.3 需要跨软件复用时导出 FMU
当 Stewart 运动学模型要和车辆动力学、多体软件做联合仿真时,可以在模型配置参数里选择导出 FMU,固定步长下直接生成。FMU 导出后,参数仍保留模型内部的初始化脚本,因此几何参数要在导出前冻结,避免联合仿真时两边参数漂移。导出的 FMU 可以像普通模块一样在目标软件里拖入,腿长输出按 6 维总线引出,和 Simulink 里的信号排序保持一致即可。
本文还有配套的精品资源,点击获取