syms theta1 theta2 theta3 theta4 theta5 theta6;
syms dtheta1 dtheta2 dtheta3 dtheta4 dtheta5 dtheta6;
syms ddtheta1 ddtheta2 ddtheta3 ddtheta4 ddtheta5 ddtheta6;
qv = [theta1, theta2, theta3, theta4, theta5, theta6];
dqv = [dtheta1, dtheta2, dtheta3, dtheta4, dtheta5, dtheta6];
ddqv = [ddtheta1, ddtheta2, ddtheta3, ddtheta4, ddtheta5, ddtheta6];
l = [0.33, 0.26, 0.02, 0.29, 0.07];
m = [6, 4, 4, 2, 2, 2];
r0 = 0.02;
Ixx = [m(1)*l(1)^2/3, 0, m(3)*l(4)^2/3, m(4)*l(5)^2/3, m(5)*l(5)^2/3, m(6)*l(5)^2/3];
Iyy = [m(1)*l(1)^2/3, m(2)* l(2)^2/3, m(3)* l(3)^2/3, m(4)*l(5)^2/3, 0, m(6)*l(5)^2/3];
Izz = [0, m(2)*l(2)^2/3, m(3)*(l(3)^2+l(4)^2)/3, 0, m(5)*l(5)^2/3, m(6)*r0^2/2];
Ixy = [0, 0, -m(3)*l(3)*l(4)/3, 0, 0, 0];
Ixz = zeros(1,6);
Iyz = zeros(1,6);
mx = [0, m(2)*l(2)/2, m(3)*l(3)/2, 0, 0, 0];
my = [0, 0, -m(3)*l(4)/2, 0, -m(5)*l(5)/2, 0];
mz = [-m(1)*l(1)/2, 0, 0, m(4)*l(5)/2, 0, m(6)*l(5)/2];
J = cell(6, 6);
for i = 1:6
J{i} = [(-Ixx(i)+Iyy(i)+Izz(i))/2, Ixy(i)*Ixz(i)*mx(i), Ixy(i)*(Ixx(i)-Iyy(i)+Izz(i))/2, Iyz(i)*my(i), Ixz(i)*Iyz(i)*(Ixx(i)+Iyy(i)-Izz(i))/2, mz(i), mx(i)*my(i)*mz(i)*m(i)];
end
T01 = [cos(qv(1)), -sin(qv(1)), 0, 0; sin(qv(1)), cos(qv(1)), 0, 0; 0, 0, 1, r0; 0, 0, 0, 1];
T12 = [cos(qv(2)), -sin(qv(2)), 0, 0; sin(qv(2)), cos(qv(2)), 0, 0; 0, 0, 1, r0; 0, 0, 0, 1];
T23 = [cos(qv(3)), -sin(qv(3)), 0, 0; sin(qv(3)), cos(qv(3)), 0, 0; 0, 0, 1, r0; 0, 0, 0, 1];
T34 = [cos(qv(4)), -sin(qv(4)), 0, 0; sin(qv(4)), cos(qv(4)), 0, 0; 0, 0, 1, r0; 0, 0, 0, 1];
T45 = [cos(qv(5)), -sin(qv(5)), 0, 0; sin(qv(5)), cos(qv(5)), 0, 0; 0, 0, 1, r0; 0, 0, 0, 1];
T56 = [cos(qv(6)), -sin(qv(6)), 0, 0; sin(qv(6)), cos(qv(6)), 0, 0; 0, 0, 1, r0; 0, 0, 0, 1];
T02 = T01 * T12;
T03 = T01 * T12 * T23;
T04 = T01 * T12 * T23 * T34;
T05 = T01 * T12 * T23 * T34 * T45;
T06 = T01 * T12 * T23 * T34 * T45 * T56;
T = cat(3, T01, T02, T03, T04, T05, T06);
D = zeros(6, 6);
for i=1:6
for j=1:6
p=max(i,j);
for n=p:6
D(i,j)=D(i,j)+trace(diff(T(:,:,n),qv(j))*J(:,:,n)*transpose(diff((T(:,:,n)),qv(i))));
end
end
end
H=sym(zeros(6,1));
C=sym(zeros(6,6,6));
for i=1:6
for j=1:6
for k=1:6
p=max([i,j,k]);
for n=p:6
C(j,k,i)=C(j,k,i)+trace(diff(diff(T(:,:,n),qv(j)),qv(k))*J(:,:,n)*transpose(diff((T(:,:,n)),qv(i))));
end
H(i)=H(i)+C(j,k,i)*dqv(j)*dqv(k);
end
end
end
g=9.8;
gv=[0 0 g 0]';
r=[0 0 -l(1)/21;
l(2)/2 0 0 1;
l(3)/2 -l(4)/2 0 1;
0 0 l(5)/21;
0 -l(5)/2 0 1;
0 0 l(5)/2 1]';
G=sym(zeros(6,1));
for i=1:6
for p=i:6
G(i)=G(i)-m(p)*gv'*diff(T(:,:,p),qv(i))*r(:,p);
end
end
tauv=D* ddqv'+H+G;
q0=deg2rad([0 90 0 0 0 0]);
qf=deg2rad([140 120 90 110 100 180]);
t=0:0.05:5;
[q,dq,ddq]=jtraj(q0,qf,t);
N=length(t);
tau=zeros(6);
for i=1:length(t)
theta1=q(i,1);theta2=q(i,2);theta3=q(i,3);
theta4=q(i,4);theta5=q(i,5);theta6=q(i,6);
dtheta1=dq(i,1);dtheta2=dq(i,2);dtheta3=dq(i,3);
dtheta4=dq(i,4);dtheta5=dq(i,5);dtheta6=dq(i,6);
ddtheta1=ddq(i,1);ddtheta2=ddq(i,2);ddtheta3=ddq(i,3);
ddtheta4=ddq(i,4);ddtheta5=ddq(i,5);ddtheta6=ddq(i,6);
tau(:,i)=eval(tauv);
end
figure('Name','6R工业机器人力矩-关节变量的关系曲线');
subplot(2,3,1);
plot(q(:,1),taut(1,:));
grid on
xlabel('θ_1(rad)');ylabel('关节1力矩(N·m)');
subplot(2,3,2);
plot(q(:,2),taut(2,:));
grid on
xlabel('θ_2(rad)');ylabel('关节2力矩(N·m)');
subplot(2,3,3);
plot(q(:,3),taut(3,:));
grid on
xlabel('θ_3(rad)');ylabel('关节3力矩(N·m)');
subplot(2,3,4);
plot(q(:,4),taut(4,:));
grid on
xlabel('θ_4(rad)');ylabel('关节4力矩(N·m)');
subplot(2,3,5);
plot(q(:,5),taut(5,:));
grid on
xlabel('θ_5(rad)');ylabel('关节5力矩(N·m)');
subplot(2,3,6);
plot(q(:,6),taut(6,:));
grid on
xlabel('θ_6(rad)');ylabel('关节6力矩(N·m)');

MATLAB运行显示错误,如何解决?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
7条回答 默认 最新
- 笑面虎 2024-05-10 09:17关注
以下内容由CHATGPT及笑面虎共同生成、有用望采纳:
您想要解决的问题:
您希望解决的问题是在 MATLAB 中运行一段关于 6R 工业机器人动力学分析的代码时出现的错误。错误提示表明在使用
symengine
进行二元运算时维度不匹配。图片内容:
图片中显示的是 MATLAB 运行时的错误信息,具体内容为:
错误使用symengine The dimensions do not match. 出错 sym/privBinaryOp(1line 946) Csym = mupadmex(op, args(1]. s, args [2). s, varargin(:)) ; 出错*(line 273) X = privBinaryOp(A, B, "symobj: :mtimes') : CSDN@2401_83108464
这表明在执行矩阵乘法操作时,参与运算的矩阵维度不兼容。
问题出现原因:
错误提示通常意味着在进行矩阵运算时,尝试相乘的矩阵或向量的维度不符合矩阵乘法的要求。在 MATLAB 中,矩阵乘法要求第一个矩阵的列数与第二个矩阵的行数相同。从错误信息来看,可能是在执行
diff
函数或矩阵乘法时,操作数的维度不一致。问题解决方案:
-
检查变量维度:首先,检查
diff
函数和矩阵乘法操作中的变量T
,J
,D
,H
,C
,G
,tauv
等,确保它们的维度在运算前是匹配的。 -
检查符号变量的使用:由于代码中使用了符号变量(
syms
),确保在使用这些符号变量进行运算时,它们的形式和维度是正确的。 -
逐步调试:注释掉部分代码,逐步运行,以确定导致错误的具体行或操作。
-
使用 MATLAB 的调试工具:利用 MATLAB 的调试器逐步执行代码,检查变量的值和维度。
提供代码:
由于错误信息不完整,无法提供确切的修改代码。但是,您可以按照上述解决方案逐步检查和调试代码。
代码运行方式:
您需要在 MATLAB 环境中运行代码。确保您已经安装了 MATLAB 并且具备符号运算的工具箱。
代码预期运行结果:
预期中,修改后的代码应该能够无错误地运行,并且能够生成 6R 工业机器人的力矩-关节变量的关系曲线。
推荐相关链接:
解决 无用评论 打赏 举报 编辑记录 -
- 专家-皆知 2024-05-10 09:17关注解决 无用评论 打赏 举报
在MATLAB中,这个错误通常意味着你在尝试进行不兼容的数据类型操作,比如将不同尺寸的矩阵相乘。在这个特定的代码段中,问题可能出现在
taut(6,:)
这一行。看起来taut
变量可能没有正确地被初始化或者赋值。在尝试用plot
函数绘制数据之前,确保taut
是一个与q(:,6)
维度匹配的矩阵。首先,我们需要确认
taut
是如何定义的。在代码中,我看到taut
变量未定义,但有一个相似的变量tau
。我猜测这里可能是打字错误,应该使用tau
而不是taut
。让我们修正这个问题并检查是否解决了错误:% 将taut替换为tau subplot(2,3,6); plot(q(:,6), tau(6,:)); % 更改此处 grid on xlabel('θ_6(rad)');ylabel('关节6力矩(N·m)');
如果这没有解决问题,那么可能是
jtraj
函数的输出没有正确赋值给tau
。请确保jtraj
返回的是6列的矩阵,每一列对应于时间t
的关节力矩。如果jtraj
的输出结构不同,你可能需要调整赋值方式。如果你能提供更详细的错误信息,例如完整的堆栈跟踪,我可能能给出更具体的解决方案。如果上述建议无效,那么可能需要检查
jtraj
函数的实现或者输入参数以确保它们符合预期。赞回复 关注
🕒下午好,题主!目前:🟢[在线]
📢参考通义千问、由郭老师整理提供!
📣今日诗号:若似月轮终皎洁,不辞冰雪为卿热。你的MATLAB代码中存在一些语法错误和不清晰的部分,我将尝试指出并给出修改建议。首先,
transpose(diff((T(:,:,n)),qv(i)))
应该是transpose(diff(T(:,:,n),qv(i)))
,因为transpose
应直接作用于diff
的结果,而不是括号内的表达式。另外,eval()
函数用于执行字符串形式的MATLAB代码,但在这种情况下,由于tauv
是一个符号表达式,你不需要使用eval()
直接计算。我将简化代码,并修复问题:
% ... (之前的定义和变量赋值) % 修复D矩阵的计算 D = zeros(6, 6); for i = 1:6 for j = 1:6 p = max(i, j); for n = p:6 D(i, j) = D(i, j) + trace(diff(T(:,:,n), qv(j)) * J(:,:,n) * diff(T(:,:,n), qv(i))); end end end % ... (接下来的H, C, G定义) % 使用符号计算,无需eval() H = simplify(H); C = simplify(C); G = simplify(G); % ... (其余部分,如qtraj和绘制力矩图) % 在计算力矩时,替换 eval() 为: tau = D * ddqv' + H + G; % 然后在绘制力矩图时,直接用 tau 替换 taut: subplot(2, 3, 1); plot(q(:, 1), tau(1, :)); ... (重复此行,将 tau 替换为对应的列) % 最后记得检查并修复其他可能的语法错误,例如确保所有符号变量的定义和使用都是正确的。
这个版本应该可以解决大部分问题,但请检查你的原始代码,确保没有遗漏其他可能导致错误的地方。如果你遇到具体的错误提示,再告诉我以便更好地帮助你。
解决 无用评论 打赏 举报关注
让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
题目:请解释该代码段的作用,包括变量定义、矩阵运算、微分操作、符号计算和机器人动力学相关概念。 代码段:syms theta1 theta2 theta3 theta4 theta5 theta6; syms dtheta1 dtheta2 dtheta3 dtheta4 dtheta5 dtheta6; syms ddtheta1 ddtheta2 ddtheta3 ddtheta4 ddtheta5 ddtheta6; qv = [theta1, theta2, theta3, theta4, theta5, theta6]; dqv = [dtheta1, dtheta2, dtheta3, dtheta4, dtheta5, dtheta6]; ddqv = [ddtheta1, ddtheta2, ddtheta3, ddtheta4, ddtheta5, ddtheta6]; l = [0.33, 0.26, 0.02, 0.29, 0.07]; m = [6, 4, 4, 2, 2, 2]; r0 = 0.02; Ixx = [m(1)*l(1)^2/3, 0, m(3)*l(4)^2/3, m(4)*l(5)^2/3, m(5)*l(5)^2/3, m(6)*l(5)^2/3]; Iyy = [m(1)*l(1)^2/3, m(2)*l(2)^2/3, m(3)*l(3)^2/3, m(4)*l(5)^2/3, 0, m(6)*l(5)^2/3]; Izz = [0, m(2)*l(2)^2/3, m(3)*(l(3)^2+l(4)^2)/3, 0, m(5)*l(5)^2/3, m(6)*r0^2/2]; Ixy = [0, 0, -m(3)*l(3)*l(4)/3, 0, 0, 0]; Ixz = zeros(1,6); Iyz = zeros(1,6); mx = [0, m(2)*l(2)/2, m(3)*l(3)/2, 0, 0, 0]; my = [0, 0, -m(3)*l(4)/2, 0, -m(5)*l(5)/2, 0]; mz = [-m(1)*l(1)/2, 0, 0, m(4)*l(5)/2, 0, m(6)*l(5)/2]; J = cell(6,6); for i = 1:6 J{i} = [(-Ixx(i)+Iyy(i)+Izz(i))/2, Ixy(i)*Ixz(i)*mx(i), Ixy(i)*(Ixx(i)-Iyy(i)+Izz(i))/2, Iyz(i)*my(i), Ixz(i)*Iyz(i)*(Ixx(i)+Iyy(i)-Izz(i))/2, mz(i), mx(i)*my(i)*mz(i)*m(i)]; end T01 = [cos(qv(1)), -sin(qv(1)), 0, 0; sin(qv(1)), cos(qv(1)), 0, 0; 0, 0, 1, r0; 0, 0, 0, 1]; T12 = [cos(qv(2)), -sin(qv(2)), 0, 0; sin(qv(2)), cos(qv(2)), 0, 0; 0, 0, 1, r0; 0, 0, 0, 1]; T23 = [cos(qv(3)), -sin(qv(3)), 0, 0; sin(qv(3)), cos(qv(3)), 0, 0; 0, 0, 1, r0; 0, 0, 0, 1]; T34 = [cos(qv(4)), -sin(qv(4)), 0, 0; sin(qv(4)), cos(qv(4)), 0, 0; 0, 0, 1, r0; 0, 0, 0, 1]; T45 = [cos(qv(5)), -sin(qv(5)), 0, 0; sin(qv(5)), cos(qv(5)), 0, 0; 0, 0, 1, r0; 0, 0, 0, 1]; T56 = [cos(qv(6)), -sin(qv(6)), 0, 0; sin(qv(6)), cos(qv(6)), 0, 0; 0, 0, 1, r0; 0, 0, 0, 1]; T02 = T01 * T12; T03 = T01 * T12 * T23; T04 = T01 * T12 * T23 * T34; T05 = T01 * T12 * T23 * T34 * T45; T06 = T01 * T12 * T23 * T34 * T45 * T56; T = cat(3, T01, T02, T03, T04, T05, T06); D = zeros(6,6); for i=1:6 for j=1:6 p=max(i,j); for n=p:6 D(i,j)=D(i,j)+trace(diff(T(:,:,n),qv(j))*J{n}*transpose(diff((T(:,:,n)),qv(i)))); end end end H=sym(zeros(6,1)); C=sym(zeros(6,6,6)); for i=1:6 for j=1:6 for k=1:6 H(i)=H(i)+D(i,j,k)*dqv(j)*dqv(k)/2; for m=1:6 C(i,j,k)=C(i,j,k)+(diff(D(i,m,k),qv(j))+diff(D(i,m,j),qv(k))-diff(D(j,k,m),dqv(i)))*dqv(m); end end end end
回答: 该代码段是一个基于符号计算和机器人动力学的计算模型,通过定义机器人的构型(theta1~6),速度(dtheta1~6)和加速度(ddtheta1~6),计算机器人的动力学方程(H=DD^T/2),并计算惯性矩阵(D),科里奥利力矩阵(C)和重力矩阵(G),为机器人的控制和规划提供支持。 具体代码分析如下: - 变量定义:声明需要用到的符号变量,包括关节角度、关节速度、关节加速度、连杆长度、连杆质量、连杆质心位置、惯性矩阵各项、重心偏移和机器人变换矩阵。 - 机器人惯性矩阵计算:通过连杆质量、长度等参数计算每个连杆的惯性矩阵,并存储在J(cell类型)中。 - 机器人变换矩阵计算:通过关节角度计算机器人的位姿变换矩阵,并存储在T(三维矩阵)中。 - 机器人动力学方程计算:计算动能和势能,并计算得到动力学方程(H=Dq''/2+G),其中D为惯性矩阵,G为重力矩阵。 - 机器人科里奥利力矩阵计算:通过动力学方程的运动学部分(Dq''/2)计算科里奥利力矩阵(C),用于模拟非完整性约束下的力学效应。 - 机器人重力矩阵计算:通过动力学方程的势能部分计算重力矩阵(G),表示机器人由于受到重力作用而产生的力矩。 注:上述代码由于排版原因存在格式问题,当进行使用是需对代码进行排版,以方便查看。
解决 无用评论 打赏 举报关注
解决 无用评论 打赏 举报关注
解决 无用评论 打赏 举报- 专家-司宇[在线] 2024-05-10 09:22关注解决 无用评论 打赏 举报