简介:面向机器人控制与并联机构方向的科研人员与技术爱好者,这份PDF文档围绕Stewart并联平台,给出从运动学逆解到动力学仿真的完整实现路径。内容以坐标变换、支腿长度求解与雅可比矩阵为主线,结合牛顿-欧拉法建立动力学方程,并延伸到Simscape Multibody三维仿真与实时可视化绘制,同时讨论了奇异位形检测、轨迹规划不合理等常见问题的处理思路。压缩包仅含1个PDF文件,体积约116KB,篇幅精简,但其中的代码片段可直接在MATLAB环境中运行,便于快速上手验证。目前已有192人学习。读者可据此打通理论推导到仿真验证的环节,掌握向量化逆解写法、旋转顺序选择、求解器选取与动画刷新优化等细节,并借助轨迹规划示例观察支腿长度变化,减少调试中反复试错的成本。
1. 先算清六条腿的账:Stewart 逆解为什么比正解更容易翻车
很多人以为 Stewart 平台的正解才是硬骨头,逆解不过是套一个旋转矩阵、减一减、求个范数。真拿 MATLAB 搭一套 Stewart 并联平台的运动学逆解与动力学仿真,翻车点几乎全在细节:铰点坐标系差一个负号,平台在动画里像抽风一样乱转;欧拉角顺序从 ZYX 换成 XYZ,六根支腿的长度曲线立刻对不上;雅可比矩阵量纲没统一,条件数判据在奇异面附近完全失灵。这套资源把逆解、雅可比组装、牛顿-欧拉动力学、Simscape Multibody 闭环仿真和三维可视化串成一条线,适合学过机器人学但一直没把并联机构跑通的开发者,也适合要做并联装备控制算法验证的工程人员。下面按我复现时的顺序拆,先讲建模,再讲判据,最后讲动力学和可视化。
2. 铰点建模与位姿参数化:从极坐标生成到向量化逆解
2.1 六个球铰的坐标怎么摆:极坐标生成与对称性校验
入门版最常见的是把六个铰点均匀铺在一个圆周上,上下平台各六个,用极坐标一次生成。这样做的好处是几何对称、手算容易校验,坏处是支腿容易在中心附近打架,实际工程里更常见的是相邻两个铰点成对靠近的“双三角”布置。复现时先用均匀分布把流程跑通,等逆解和可视化都对了,再换成成对布置只改一个角度数组,不用动后面的函数。
% 下平台(基座)与上平台(动平台)铰点,单位:米 R_base = 0.50; % 基座铰点分布圆半径 R_top = 0.30; % 动平台铰点分布圆半径 theta_b = linspace(0, 2*pi, 7)'; theta_b(end) = []; % 去掉重合的 2*pi,留下 6 个、间隔 60 度 theta_t = theta_b + deg2rad(30); % 上平台整体错开 30 度,避免支腿共面 base_pts = R_base * [cos(theta_b), sin(theta_b), zeros(6,1)]; top_pts = R_top * [cos(theta_t), sin(theta_t), zeros(6,1)]; % 对称性校验:几何中心必须落在原点 assert(norm(mean(base_pts)) < 1e-12 && norm(mean(top_pts)) < 1e-12, ... '铰点质心不在原点,回头检查角度生成');这段的核心是把角度做成列向量,cos、sin返回列,再和全零列拼成 6×3 的坐标矩阵。theta_b(end) = []那行是踩过坑之后加的:早期直接写linspace(0, 2*pi, 6),首尾间隔变成 72 度,六个铰点根本不对称,逆解算出来的六条腿长度在零位姿下就互不相等,还以为是公式推错了。assert那行属于后悔药,两秒钟的校验能省掉半天的怀疑人生。
参数上,R_base和R_top的比值一般落在 0.5 到 0.7 之间,比值越大平台越“稳”但工作空间越小;theta_t的偏移量决定支腿的初始倾角,偏移 30 度是均匀布置下的常用起点。上平台的 z 坐标先置零,是因为动平台坐标系定义在自身几何中心,后面统一靠位姿里的平移量抬升,不在建模阶段混入高度。
2.2 位姿参数化:ZYX 欧拉角与齐次变换矩阵的对应关系
逆解的输入是一个六维位姿:三个平移加三个姿态角。姿态部分最容易出事,问题不在数学,在 MATLAB 的eul2rotm上。这个函数默认的旋转序列就是'ZYX',但输入必须是 1×3 的行向量、角度单位必须是弧度。如果你从别处拷来的位姿是 6×1 的列向量,直接切片传进去,轻则报维度错误,重则在某些版本里静默广播出莫名其妙的结果。
function T = pose2tform(pose) % pose = [x; y; z; roll; pitch; yaw],角度单位 rad assert(numel(pose) == 6, '位姿必须是 6 维列向量'); R = eul2rotm(pose(4:6).', 'ZYX'); % 转置成行向量,并显式指定顺序 T = [R, pose(1:3); 0 0 0 1]; end显式写'ZYX'不是为了好看,是为了把假设钉死。ZYX 对应先绕 Z 转 yaw、再绕 Y 转 pitch、最后绕 X 转 roll 的外旋组合,和飞行器、并联平台常用的 RPY 习惯一致。同一组角度换成'XYZ',旋转矩阵的第三列会整列变号,支腿长度的偏差量级足以让行程校验误报,而现象只是“仿真看起来有点歪”,非常难查。
pose2tform返回 4×4 齐次矩阵,后面动力学里算惯量张量的姿态旋转、可视化里直接喂给hgtransform,都用这一个函数,避免各处重复拼矩阵。参数范围上,roll 和 yaw 在 ±30 度内随便用,pitch 接近 ±90 度会遇到万向锁,Stewart 平台的实际工作空间远达不到那个角度,但做工作空间扫描时要在边界处留个判断,别让eul2rotm在奇异姿态附近给出病态结果。
2.3 逆解函数:向量化写法与 for 循环对拍
逆解本身只有三步:把动平台铰点转到基座坐标系、减去基座铰点得到支腿向量、求每条向量的二范数。写成向量化版本,整个函数不到十行。
function L = inverse_kinematics(pose, base_pts, top_pts) % 输入:pose 6x1;base_pts / top_pts 均为 6x3 % 输出:L 6x1,六条支腿长度 R = eul2rotm(pose(4:6).', 'ZYX'); top_w = (R * top_pts.').' + pose(1:3).'; % 6x3,动铰点在世界系 leg_vec = top_w - base_pts; % 6x3 L = vecnorm(leg_vec, 2, 2); % 沿第 2 维求二范数 endtop_pts.'把 6×3 转成 3×6,左乘旋转矩阵再转置回来,得到世界系下的动铰点;加平移时利用 MATLAB 的隐式扩展,6×3 加 1×3 自动按行广播。vecnorm的第三个参数2表示沿列方向求范数,得到 6×1,这一点和vecnorm(A)默认沿第一个非单一维度求范数的行为不同,写错会得到 1×3 或直接报错。
向量化到底快多少,别靠感觉,写个对拍脚本跑一万次:
pose0 = [0; 0; 0.35; 0; 0; 0]; N = 10000; tic; for k = 1:N L1 = inverse_kinematics(pose0, base_pts, top_pts); end t_vec = toc; tic; L2 = zeros(6,1); for k = 1:N R = eul2rotm(pose0(4:6).', 'ZYX'); for i = 1:6 p = R * top_pts(i,:).' + pose0(1:3); L2(i) = norm(p - base_pts(i,:).'); end end t_loop = toc; fprintf('向量化 %.4f s,循环 %.4f s,加速比 %.1f\n', ... t_vec, t_loop, t_loop/t_vec); assert(max(abs(L1 - L2)) < 1e-10, '两种写法结果不一致');实测在普通笔记本上加速比通常在 3 到 5 之间,具体数字取决于 MATLAB 版本和 CPU,不用纠结。真正有价值的是最后那行assert:向量化改写最容易犯的错是维度对不上却因为广播“恰好”算出了形状正确的结果,数值校验是唯一的保险。
行程校验放在逆解外层,不要塞进函数里:
L_min = 0.25; L_max = 0.65; % 电缸行程,按你的硬件改 if any(L < L_min | L > L_max) warning('支腿超行程:min=%.3f, max=%.3f', min(L), max(L)); end提示:零位姿下的六条腿长度必须完全相等,这是建模正确的最快判据。如果零位姿就长短不一,问题一定在铰点生成或旋转矩阵,不在逆解公式。
3. 雅可比、奇异位形与工作空间:条件数 1e4 这条线怎么定
3.1 雅可比矩阵:微分法组装与数值差分对拍
逆解只告诉你“腿要多长”,雅可比才告诉你“平台动一点,腿要动多少”。并联机构的雅可比是 6×6,行对应六条支腿,前三列是线速度映射、后三列是角速度映射:L_dot = J * [v; omega]。
解析写法用支腿单位方向向量和动铰点相对平台中心的位置向量做叉乘:
function J = jacobian_analytic(pose, base_pts, top_pts) R = eul2rotm(pose(4:6).', 'ZYX'); top_w = (R * top_pts.').' + pose(1:3).'; leg_vec = top_w - base_pts; L = vecnorm(leg_vec, 2, 2); u = leg_vec ./ L; % 6x3,单位方向 r = top_w - pose(1:3).'; % 6x3,动铰点相对平台中心 J = zeros(6,6); for i = 1:6 J(i,1:3) = u(i,:); J(i,4:6) = cross(r(i,:), u(i,:)); end endu是按行归一化的,leg_vec ./ L利用了隐式扩展,6×3 除以 6×1 会按列广播,得到每行一个单位向量。叉乘那行的顺序不能反,cross(r, u)和cross(u, r)差一个负号,现象是角速度映射整体反向,轨迹跟踪时平台往反方向偏,但逆解完全正常,属于典型的“只错一半”的坑。
解析式容易推错,所以一定要有数值差分版本做对拍:
function J = jacobian_numeric(pose, base_pts, top_pts, h) if nargin < 4, h = 1e-6; end J = zeros(6,6); L0 = inverse_kinematics(pose, base_pts, top_pts); for k = 1:6 p = pose; p(k) = p(k) + h; J(:,k) = (inverse_kinematics(p, base_pts, top_pts) - L0) / h; end end差分的步长h取 1e-6 是经验值,取太大会被截断误差污染,取太小会被浮点舍入吞掉。姿态分量差分时h的单位是弧度,不要因为输入是角度就顺手改成deg2rad(0.001),量纲一乱,对拍误差会稳定地卡在 1e-2 量级,看起来像“解析解推错了”,其实是差分步长设错了。
对拍脚本很简单:
Ja = jacobian_analytic(pose0, base_pts, top_pts); Jn = jacobian_numeric(pose0, base_pts, top_pts); err = norm(Ja - Jn, 'fro') / norm(Jn, 'fro'); fprintf('雅可比相对误差:%.2e\n', err); % 正常应在 1e-6 以下3.2 奇异判据:条件数比行列式更稳
原始资料里用abs(det(J)) < 1e-6判断奇异,这个写法在量纲统一的矩阵上没问题,但 Stewart 的雅可比前三列是无量纲的方向余弦、后三列带长度量纲,行列式的数值会随平台尺寸整体缩放。换一个R_base = 0.5到R_base = 0.8的平台,同一个阈值就完全失效:要么永远不报警,要么正常工作空间里疯狂误报。
更稳的判据是条件数:
if cond(J) > 1e4 warning('接近奇异位形,cond(J) = %.2e', cond(J)); end1e4 这条线不是理论值,是试出来的。太低会在正常工作空间边缘频繁报警,太高则等真正踩进奇异区才响应,那时候腿长曲线已经出尖峰了。我的习惯是先扫一遍工作空间,把每个位姿的cond(J)记下来,看正常区域的分布集中在什么量级,再把阈值定在正常区域最大值的三到五倍。
真正踩进奇异区之后,不要硬求逆,换阻尼最小二乘:
lambda = 1e-3; % 阻尼系数,从 1e-6 开始试 dx = [v_des; omega_des]; % 期望的平台广义速度 dq = (J.'*J + lambda*eye(6)) \ (J.'*dx);lambda的作用是在奇异方向上把解“拉回”可行域,代价是跟踪精度下降。取值太小等于没加,太大则平台动作明显滞后,表现为“指令发了但平台慢半拍”。调参时盯着奇异点附近的腿速峰值,从 1e-6 往上加,加到峰值降到额定腿速以内就停。
3.3 工作空间扫描:z 高度与倾角的可行域
逆解和雅可比都对了之后,值得花十分钟扫一遍工作空间,把“哪些位姿能去、哪些不能去”画出来。这一步在调轨迹之前做,比事后看曲线猜原因高效得多。
z_list = 0.25:0.01:0.60; pitch_list = deg2rad(-15:1:15); ok = false(numel(z_list), numel(pitch_list)); for i = 1:numel(z_list) for j = 1:numel(pitch_list) pose = [0; 0; z_list(i); 0; pitch_list(j); 0]; L = inverse_kinematics(pose, base_pts, top_pts); J = jacobian_analytic(pose, base_pts, top_pts); ok(i,j) = all(L > 0.25 & L < 0.65) && cond(J) < 1e4; end end imagesc(pitch_list*180/pi, z_list, ok); axis xy; xlabel('pitch / deg'); ylabel('z / m'); colormap([0.85 0.85 0.85; 0.20 0.60 0.85]);外层扫高度、内层扫俯仰角,每个格点算一次逆解和条件数,两个条件同时满足才标为可行。imagesc画出来一般是一个上宽下窄的楔形:上边界由腿长上限卡住,下边界由奇异面卡住,左右边界由俯仰角对应的腿长下限卡住。步长 1 cm 和 1 度对调参够用,要做报告再缩到 2 mm。
扫描结果直接决定轨迹规划的安全裕度。我一般会在可行域内再缩一圈,把边界往里收 5% 到 10%,然后才让螺旋上升之类的轨迹在这个内缩后的区域里跑。原始资料里提到“z 轴位移超过 0.5 米时行列式趋近于零”,本质就是扫描图上边界和下边界的交点位置,用条件数扫一遍比手动试快得多。
4. 动力学仿真:牛顿-欧拉手推与 Simscape 闭环怎么对拍
4.1 牛顿-欧拉:把支腿力折到平台广义力
逆解和雅可比解决的是几何,动力学解决的是“要多大劲”。把动平台当刚体,六条支腿的驱动力通过雅可比转置折成平台广义力,方程写成:
M(q)*qdd + C(q,qd)*qd + G(q) = J.' * f + tau_ext
其中q是六维位姿,f是六条腿的轴向力,J.' * f就是折到平台上的等效力旋量。先写一个忽略腿质量和摩擦的简化版,把闭环跑通:
function [M, G] = platform_dynamics(pose, m, I_body) % m:动平台质量;I_body:3x3 惯量张量(体坐标系) R = eul2rotm(pose(4:6).', 'ZYX'); I_w = R * I_body * R.'; % 惯量张量转到世界系 M = blkdiag(m*eye(3), I_w); % 6x6 广义质量 g = [0; 0; -9.81]; G = -[m*g; zeros(3,1)]; % 重力广义力 endblkdiag拼出 6×6 质量矩阵,前三行对应平移、后三行对应转动,这是把平动和转动解耦后的写法。I_w = R * I_body * R.'这一行不能省:体坐标系下的惯量张量是常数,但平台一旦倾斜,世界系下的等效惯量就变了。原始资料里的动力学片段没有体现这一步,小角度下误差不明显,俯仰到十几度时力矩会差出可感知的量级,表现为“同样的 PD 参数,小角度稳、大角度抖”。
科氏项在纯代码版本里比较麻烦,工程上常用的近似是把C*qd用数值微分拼出来:
function Cqd = coriolis_term(pose, qd, m, I_body, h) if nargin < 5, h = 1e-6; end [M0, ~] = platform_dynamics(pose, m, I_body); Mdot_qd = zeros(6,1); for k = 1:6 p = pose; p(k) = p(k) + h; [M1, ~] = platform_dynamics(p, m, I_body); Mdot_qd = Mdot_qd + ((M1 - M0)/h) * qd(k); end Cqd = Mdot_qd * qd - 0.5 * Mdot_qd * qd; % 近似,够用于控制器初调 end这个写法不严谨,但胜在不用手推 Christoffel 符号,控制器初调阶段够用。要发论文或者做高精度对比,还是老老实实上 Simscape,或者用符号工具箱推一遍再转数值。
4.2 Simscape Multibody:闭环约束与求解器设置
CAD 模型导入是第一步,smimport会把装配体转成 Simscape Multibody 的刚体和关节,但转换出来的关节类型经常不对:球铰被识别成万向铰、移动副被识别成圆柱副,这类问题在模型树里逐级点开看关节图标最直接。六个支腿的驱动统一改成输入:
smimport('platform_assembly.xml'); set_param('platform_model/Prismatic_Joint_1','Motion','Provided by Input');六条腿要逐个改,命名规范一点,后面批量设置省事。并联机构的闭环结构是仿真崩掉的主要原因:六个支腿加上下平台构成多个闭环,约束方程一旦冲突,求解器会在第一步就报奇异。处理顺序是先锁死驱动、只让机构在重力下做被动运动,能跑通再逐步加驱动,最后才上闭环控制。
求解器设置比模型本身还关键:
set_param('platform_model', 'Solver', 'ode15s', ... 'RelTol', '1e-5', 'AbsTol', '1e-6', 'MaxStep', '1e-3');| 求解器 | 适用场景 | 在闭环 Stewart 上的表现 |
|---|---|---|
| ode45 | 非刚性、光滑系统 | 步长越压越小,10 秒仿真要跑几分钟 |
| ode15s | 刚性、带约束闭环 | 步长稳定,是默认选择 |
| ode23t | 中等刚性、需要能量守恒 | 长时间仿真漂移小,但启动慢 |
MaxStep设 1e-3 是为了让输出点和可视化刷新对齐,不设的话求解器会自己跳步,动画看起来一顿一顿的。RelTol再往下压到 1e-6 收益不大,仿真时间翻倍,除非要做力和位移的高精度对拍。
4.3 对拍:纯代码 ode15s 与 Simscape 结果比对
两套模型都跑通之后,必须做一次对拍,否则你不知道差异是模型错了还是求解器设错了。
odefun = @(t, x) platform_ode(t, x, base_pts, top_pts, m, I_body, tau_fun); opts = odeset('RelTol', 1e-6, 'AbsTol', 1e-8); [t_num, x_num] = ode15s(odefun, [0 5], x0, opts); % Simscape 输出用 logsout 导出,插值到同一时间轴 z_sim = interp1(t_sim, x_sim(:,3), t_num, 'pchip'); err_z = max(abs(z_sim - x_num(:,3))) / max(abs(z_sim)); fprintf('平台 z 位移最大相对偏差:%.2e\n', err_z);对拍指标看三个:平台 z 位移、俯仰角、三条代表性支腿的轴向力。位移和角度偏差在 1e-3 以内算通过,力的偏差允许到 5%,因为纯代码版省略了腿质量和关节摩擦。偏差超标时按“先查单位、再查惯量、最后查约束”的顺序排查,单位制问题占了这类偏差的一大半。
注意:Simscape 的默认单位是米和千克,但 CAD 导出的装配体经常是毫米。
smimport不会自动换算,现象是仿真一开始平台就飞出去,力和位移大三个数量级。导入后第一件事是检查模型树里每个刚体的质量属性,单位不对就整体缩放。
5. 避坑排查:六条支腿的五个翻车现场
5.1 现象:平台该绕 X 转,动画里却在绕 Z 转
原因几乎都是欧拉角顺序。eul2rotm不写第二个参数时用默认序列,而不同来源的位姿数据对“roll-pitch-yaw”的定义不一定一致;另一个高频原因是位姿是 6×1 列向量,切片后直接传进去,维度不匹配但被某些版本的隐式扩展吞掉了。
解决方法是把所有姿态转换收口到一个函数里,显式写'ZYX',入口处assert维度。改完之后在零位姿加一个已知的 10 度 roll,打印旋转矩阵的第一列,应该是[1; 0; 0]附近,对不上就说明顺序还是错的。
5.2 现象:腿长曲线突然出尖峰,求解器步长越跑越小
这是进入奇异位形的典型表现。平台走到某个位姿时雅可比接近降秩,逆解本身还正常,但一旦你把逆解接到速度控制或者动力学闭环上,腿速指令会瞬间冲到几百毫米每秒,求解器为了追上这个变化把步长压到极小。
解决分两层:轨迹层面在工作空间扫描图上把可行域向内缩,别贴着奇异面走;算法层面在速度映射处加条件数判断和阻尼最小二乘,cond(J) > 1e4时切到阻尼模式。只做其中一层都不够,轨迹贴着边界走、算法不加阻尼,照样会尖峰。
5.3 现象:动平台穿过基座,或者支腿在动画里交叉
坐标系定义反了。常见的是top_pts的 z 坐标符号写反,或者基座铰点和动平台铰点的角度偏移方向搞错,导致初始位姿下支腿就是交叉的。逆解依然能算出长度,所以数值上不报错,只有画出来才看得见。
解决方法是加一个零位姿的几何校验:六条腿长度必须相等,且任意两条相邻支腿的向量夹角必须大于某个下限。再进一步,把初始位姿的铰点坐标导出来和 CAD 里量的尺寸对一遍,别嫌麻烦,这一步五分钟,省掉的是后面两小时的“为什么动画看起来怪怪的”。
5.4 现象:动力学结果飞天,力矩大了好几个数量级
两个原因最常见:单位制混乱,以及惯量张量没随姿态旋转。CAD 导出的模型经常是毫米-克-秒,Simscape 按米-千克-秒解释,质量差 1000 倍、惯量差 10^12 倍;纯代码版本里忘了I_w = R * I_body * R.',大倾角下转动惯量用的是体坐标系的值,力矩自然对不上。
解决方法是统一 SI 单位,在导入和建模两处各加一次单位校验:平台质量应该在几千克到几十千克,惯量对角元在 0.01 到 1 kg·m² 量级,超出这个范围一律回头查单位。惯量旋转那行写成函数,所有用到惯量的地方统一调用,别到处手写。
5.5 现象:动画卡成 PPT,100 Hz 刷新掉到 10 Hz
每帧plot3重绘或者cla清屏重画,是性能杀手。MATLAB 的图形对象创建开销远大于属性修改,一百个点重绘一百次,帧率必然崩。
解决方法是hgtransform加drawnow limitrate:刚体只创建一次,每帧只改变换矩阵;drawnow limitrate会把刷新限制在每秒 20 帧左右,比裸drawnow快好几倍,而且不会丢关键帧。这一条在最后一章展开,因为它是可视化的核心技巧,不只是避坑。
6. 收尾技巧:动画、曲线与判据挂到同一条时间轴
6.1 用 hgtransform 做不掉帧的刚体动画
把动平台画成一个patch,挂到hgtransform下,每帧只更新变换矩阵,几何顶点一次都不重建:
ax = axes('XLim', [-0.8 0.8], 'YLim', [-0.8 0.8], 'ZLim', [0 0.9]); axis equal; grid on; view(35, 25); hold on; % 基座只画一次 patch('Vertices', base_pts, 'Faces', 1:6, ... 'FaceColor', [0.6 0.6 0.6], 'FaceAlpha', 0.4); h_top = hgtransform('Parent', ax); patch('Vertices', top_pts, 'Faces', 1:6, ... 'Parent', h_top, 'FaceColor', [0.2 0.5 0.8], 'FaceAlpha', 0.6); h_leg = gobjects(6,1); for i = 1:6 h_leg(i) = plot3([base_pts(i,1) top_pts(i,1)], ... [base_pts(i,2) top_pts(i,2)], ... [base_pts(i,3) top_pts(i,3)], 'k-', 'LineWidth', 1.5); end for k = 1:numel(t) T = pose2tform(x_num(k,1:6).'); set(h_top, 'Matrix', T); % 只改变换,不重画 top_w = (T(1:3,1:3) * top_pts.').' + T(1:3,4).'; for i = 1:6 set(h_leg(i), 'XData', [base_pts(i,1) top_w(i,1)], ... 'YData', [base_pts(i,2) top_w(i,2)], ... 'ZData', [base_pts(i,3) top_w(i,3)]); end drawnow limitrate; end关键点是set(h_top, 'Matrix', T)直接复用pose2tform的输出,和逆解、动力学用的是同一个位姿转换函数,动画和数值计算不会出现“看起来对但差一点”的错位。六条支腿的线段每帧只改XData/YData/ZData,不重建对象。drawnow limitrate放在循环末尾,刷新率被限制但不会积压事件。
6.2 验证清单
| 检查项 | 判据 | 不通过时先查 |
|---|---|---|
| 零位姿腿长 | 六条完全相等 | 铰点生成、旋转矩阵 |
| 雅可比对拍 | 相对误差 < 1e-6 | 叉乘顺序、差分步长 |
| 工作空间 | 可行域连续无空洞 | 条件数阈值、行程上下限 |
| 动力学对拍 | z 位移偏差 < 1e-3 | 单位制、惯量旋转 |
| 动画同步 | 动画帧与曲线时间轴一致 | 插值方式、采样率 |
这张表我一般贴在脚本开头当注释,每改一次模型就跑一遍,五项全过才往下做轨迹规划。
从那以后我每次新建 Stewart 模型,都强制先走这三步:零位姿腿长对 CAD、雅可比解析解对数值差分、动画时间轴对数据时间轴。三步加起来不到二十分钟,但能挡掉后面百分之八十的“玄学”问题。希望帮到你。
本文还有配套的精品资源,点击获取