ode45求解变刚度阻尼双足机器人动力学方程,求动力学方程中某个参数对所有变量求偏导MATLA
时间: 2023-06-24 09:08:11 浏览: 192
机器人运动学方程的Matlab求解.docx
假设动力学方程为:
M(q) * q'' + C(q, q') * q' + G(q) B * u
其中,M(q)是质量矩阵,C(q, q')是科氏力矩阵,G(q)是重力向量,B是控制输入的转换矩阵,u是控制输入向量。
现在需要求解某个参数p对所有变量的偏导数:
∂(M(q) * q'' + C(q, q') * q' + G(q)) / ∂p
首先,根据链式法则,可以将偏导数分解为多个偏导数的乘积形式:
∂(M(q) * q'' + C(q, q') * q' + G(q)) / ∂p = ∂M(q) / ∂p * q'' + M(q) * ∂q'' / ∂p + ∂C(q, q') / ∂p * q' + C(q, q') * ∂q' / ∂p + ∂G(q) / ∂p
其中,∂M(q) / ∂p表示M(q)对参数p的偏导数,∂C(q, q') / ∂p表示C(q, q')对参数p的偏导数,∂G(q) / ∂p表示G(q)对参数p的偏导数。
接下来,可以使用MATLAB中的符号计算工具箱来求解这个偏导数。具体步骤如下:
1. 定义符号变量:
syms q1 q2 q3 q4 q5 q6 q1d q2d q3d q4d q5d q6d real
syms m1 m2 m3 m4 m5 m6 real
syms l1 l2 l3 l4 l5 l6 real
syms g real
syms p real
其中,q1~q6是关节角度,q1d~q6d是关节角速度,m1~m6是质量,l1~l6是长度,g是重力加速度,p是需要求导的参数。
2. 定义质心位置向量:
r1 = [l1/2; 0; 0];
r2 = [l2/2; 0; 0];
r3 = [l3/2; 0; 0];
r4 = [l4/2; 0; 0];
r5 = [l5/2; 0; 0];
r6 = [l6/2; 0; 0];
3. 定义转动惯量矩阵:
I1 = (1/12) * m1 * [0, 0, 0; 0, l1^2, 0; 0, 0, l1^2];
I2 = (1/12) * m2 * [0, 0, 0; 0, l2^2, 0; 0, 0, l2^2];
I3 = (1/12) * m3 * [0, 0, 0; 0, l3^2, 0; 0, 0, l3^2];
I4 = (1/12) * m4 * [0, 0, 0; 0, l4^2, 0; 0, 0, l4^2];
I5 = (1/12) * m5 * [0, 0, 0; 0, l5^2, 0; 0, 0, l5^2];
I6 = (1/12) * m6 * [0, 0, 0; 0, l6^2, 0; 0, 0, l6^2];
4. 定义正向运动学矩阵:
T01 = [cos(q1), -sin(q1), 0, l1*cos(q1);
sin(q1), cos(q1), 0, l1*sin(q1);
0, 0, 1, 0;
0, 0, 0, 1];
T12 = [cos(q2), -sin(q2), 0, l2*cos(q2);
sin(q2), cos(q2), 0, l2*sin(q2);
0, 0, 1, 0;
0, 0, 0, 1];
T23 = [cos(q3), -sin(q3), 0, l3*cos(q3);
sin(q3), cos(q3), 0, l3*sin(q3);
0, 0, 1, 0;
0, 0, 0, 1];
T34 = [cos(q4), -sin(q4), 0, l4*cos(q4);
sin(q4), cos(q4), 0, l4*sin(q4);
0, 0, 1, 0;
0, 0, 0, 1];
T45 = [cos(q5), -sin(q5), 0, l5*cos(q5);
sin(q5), cos(q5), 0, l5*sin(q5);
0, 0, 1, 0;
0, 0, 0, 1];
T56 = [cos(q6), -sin(q6), 0, l6*cos(q6);
sin(q6), cos(q6), 0, l6*sin(q6);
0, 0, 1, 0;
0, 0, 0, 1];
T06 = T01 * T12 * T23 * T34 * T45 * T56;
5. 定义质心位置向量在末端坐标系下的表示:
r1e = simplify(T06 * [r1; 1]);
r2e = simplify(T06 * [r2; 1]);
r3e = simplify(T06 * [r3; 1]);
r4e = simplify(T06 * [r4; 1]);
r5e = simplify(T06 * [r5; 1]);
r6e = simplify(T06 * [r6; 1]);
6. 定义质量矩阵:
M = simplify(m1 * (r1e.' * r1e) + m2 * (r2e.' * r2e) + m3 * (r3e.' * r3e) + m4 * (r4e.' * r4e) + m5 * (r5e.' * r5e) + m6 * (r6e.' * r6e));
7. 定义科氏力矩矩阵:
C = sym(zeros(6, 6));
for i = 1:6
for j = 1:6
for k = 1:6
C(i, j) = C(i, j) + (diff(M(i, j), q(k)) + diff(M(i, k), q(j)) - diff(M(k, j), q(i))) * qd(k);
end
end
end
8. 定义重力向量:
G = sym(zeros(6, 1));
for i = 1:6
G(i) = simplify(diff(M(i), g) * g);
end
9. 定义控制输入转换矩阵和控制输入向量:
B = sym(zeros(6, 6));
B(1, 1) = 1;
B(2, 2) = 1;
B(3, 3) = 1;
B(4, 4) = 1;
B(5, 5) = 1;
B(6, 6) = 1;
u = [0; 0; 0; 0; 0; 0];
10. 计算偏导数:
dMdp = simplify(diff(M, p));
dqddp = sym(zeros(6, 1));
for i = 1:6
dqddp(i) = diff(diff(M(i), qd), p);
end
dCdp = sym(zeros(6, 6));
for i = 1:6
for j = 1:6
for k = 1:6
dCdp(i, j) = dCdp(i, j) + (diff(dMdp(i, j), q(k)) + diff(dMdp(i, k), q(j)) - diff(dMdp(k, j), q(i))) * qd(k) + (diff(M(i, j), q(k)) + diff(M(i, k), q(j)) - diff(M(k, j), q(i))) * dqddp(k);
end
end
end
dGdp = sym(zeros(6, 1));
for i = 1:6
dGdp(i) = simplify(diff(G(i), p));
11. 最终的偏导数表达式为:
dynamics_eq = dMdp * qdd + M * diff(qdd, p) + dCdp * qd + C * diff(qd, p) + dGdp
其中,qdd表示关节加速度向量。
阅读全文