1. Stewart平台运动学建模与仿真
任务目标
建立Stewart平台(6-SPS并联机构)的运动学模型,实现位置逆解(由动平台位姿求六支腿长度)与位置正解(由六支腿长度求动平台位姿),并在MATLAB中通过数值仿真验证模型正确性。
环境依赖
- MATLAB R2019b及以上(仅需基础模块,无需额外工具箱)
- 操作系统:Windows/Linux/macOS均可
运动学模型说明
采用6-SPS构型:静平台6个铰点均匀分布在半径\(R_b\)的圆上,动平台6个铰点均匀分布在半径\(R_p\)的圆上,上下铰点按角度错开布置。逆解:给定动平台位置\([x,y,z]\)与姿态(ZYX欧拉角\([\alpha,\beta,\gamma]\)),计算旋转矩阵\(\mathbf{R}\),各支腿向量\(\mathbf{l}_i = \mathbf{R}\mathbf{p}_i + \mathbf{t} - \mathbf{b}_i\),腿长\(L_i = \|\mathbf{l}_i\|\)。正解:采用牛顿-拉夫逊迭代,以逆解为初值,通过数值雅可比迭代逼近满足六条腿长约束的位姿。
关键完整代码(stewart_kinematics.m)
function stewart_kinematics()
% Stewart平台运动学建模与仿真(逆解+正解验证)
clear; clc;
% ---------- 几何参数 ----------
Rb = 1.0; % 静平台铰点分布圆半径
Rp = 0.6; % 动平台铰点分布圆半径
theta_b = 0; % 静平台第1铰点起始角(rad)
theta_p = pi/6; % 动平台第1铰点相对错位角(rad)
% 铰点角度(6个均匀分布,相邻间隔60°)
angles_b = theta_b + (0:5)*pi/3;
angles_p = theta_p + (0:5)*pi/3;
% 静平台铰点坐标 (6x3)
B = [Rb*cos(angles_b)', Rb*sin(angles_b)', zeros(6,1)];
% 动平台铰点在局部坐标系坐标 (6x3)
P_local = [Rp*cos(angles_p)', Rp*sin(angles_p)', zeros(6,1)];
% ---------- 目标位姿(用于验证) ----------
t_true = [0.1; 0.15; 0.8]; % 位置
euler_true = [5*pi/180; 8*pi/180; -3*pi/180]; % ZYX欧拉角(alpha,beta,gamma)
R_true = eul2rotm(euler_true, 'ZYX');
% ---------- 位置逆解 ----------
L = zeros(6,1);
for i = 1:6
L(i) = norm(R_true*P_local(i,:)' + t_true - B(i,:)');
end
fprintf('逆解得到的六支腿长度:\n');
disp(L');
% ---------- 位置正解(牛顿-拉夫逊迭代) ----------
% 以逆解结果L为输入,初值取静平台上方某点
x0 = [0; 0; 0.7; 0; 0; 0]; % [x,y,z,alpha,beta,gamma]
x = x0;
tol = 1e-10;
max_iter = 100;
for iter = 1:max_iter
% 当前位姿计算腿长
R_cur = eul2rotm(x(4:6)', 'ZYX');
L_cur = zeros(6,1);
for i = 1:6
L_cur(i) = norm(R_cur*P_local(i,:)' + x(1:3) - B(i,:)');
end
f = L_cur - L; % 残差
if norm(f) < tol
break;
end
% 数值雅可比 (6x6)
J = zeros(6,6);
delta = 1e-6;
for j = 1:6
xp = x; xp(j) = xp(j) + delta;
R_p = eul2rotm(xp(4:6)', 'ZYX');
L_p = zeros(6,1);
for i = 1:6
L_p(i) = norm(R_p*P_local(i,:)' + xp(1:3) - B(i,:)');
end
xm = x; xm(j) = xm(j) - delta;
R_m = eul2rotm(xm(4:6)', 'ZYX');
L_m = zeros(6,1);
for i = 1:6
L_m(i) = norm(R_m*P_local(i,:)' + xm(1:3) - B(i,:)');
end
J(:,j) = (L_p - L_m)/(2*delta);
end
dx = -J\f;
x = x + dx;
end
% ---------- 结果输出与验证 ----------
fprintf('\n正解迭代次数: %d\n', iter);
fprintf('正解位置误差: [%.2e, %.2e, %.2e] m\n', abs(x(1:3)-t_true'));
fprintf('正解姿态误差: [%.2e, %.2e, %.2e] rad\n', abs(x(4:6)-euler_true'));
% 验证:用正解结果重新计算腿长,与输入L对比
R_solved = eul2rotm(x(4:6)', 'ZYX');
L_check = zeros(6,1);
for i = 1:6
L_check(i) = norm(R_solved*P_local(i,:)' + x(1:3) - B(i,:)');
end
fprintf('腿长最大反算误差: %.2e m\n', max(abs(L_check - L)));
% ---------- 可视化 ----------
figure('Color','w','Position',[100 100 800 600]);
hold on; axis equal; grid on; view(45,30);
% 绘制静平台
plot3(B(:,1), B(:,2), B(:,3), 'ko', 'MarkerSize', 8, 'LineWidth', 1.5);
for i = 1:6
plot3([B(i,1) B(mod(i,6)+1,1)], [B(i,2) B(mod(i,6)+1,2)], ...
[B(i,3) B(mod(i,6)+1,3)], 'k-', 'LineWidth', 1.2);
end
% 绘制动平台(正解结果)
P_world = (R_solved*P_local')';
plot3(P_world(:,1), P_world(:,2), P_world(:,3), 'ro', 'MarkerSize', 8, 'LineWidth', 1.5);
for i = 1:6
plot3([P_world(i,1) P_world(mod(i,6)+1,1)], ...
[P_world(i,2) P_world(mod(i,6)+1,2)], ...
[P_world(i,3) P_world(mod(i,6)+1,3)], 'r-', 'LineWidth', 1.2);
end
% 绘制支腿
for i = 1:6
plot3([B(i,1) P_world(i,1)], [B(i,2) P_world(i,2)], [B(i,3) P_world(i,3)], ...
'b-', 'LineWidth', 1.5);
end
xlabel('X (m)'); ylabel('Y (m)'); zlabel('Z (m)');
title('Stewart平台运动学模型验证');
legend('静平台铰点','静平台','动平台铰点','动平台','支腿', 'Location', 'best');
hold off;
end
运行方式
将上述代码保存为 stewart_kinematics.m,在MATLAB命令行直接运行:
>> stewart_kinematics
验证方法与判定标准
- 逆解正确性:程序输出的六支腿长度均为正实数,且数值在合理范围内(本参数下约0.5~1.5 m)。
- 正解收敛性:命令行显示迭代次数小于100(通常10次以内收敛)。
- 精度判定:正解位置误差各分量小于1e-6 m,姿态误差各分量小于1e-6 rad,腿长最大反算误差小于1e-8 m,即视为模型正确。
- 可视化确认:图形窗口显示上下两个六边形平台,六条支腿连接对应铰点,无交叉错连,动平台位于静平台上方。
常见问题
- 正解不收敛:调整初值
x0为更接近真实位姿的值,或增大max_iter。 - 欧拉角奇异:当β接近±90°时ZYX欧拉角存在奇异,本案例验证位姿已避开奇异区域。
- 铰点角度错位:θ_p取π/6是常用布置,若取0会导致机构奇异,逆解矩阵病态。