【发布时间】:2019-05-16 09:16:15
【问题描述】:
目前我正在使用 vpasolve 命令来求解一个由 3 个方程组成的系统,其中包含 3 个未知数。这 3 个方程用于模拟机器人机械臂的运动学运动,未知数是机器人连杆的长度或关节的旋转角度。 vpasolve 命令设法正确求解方程,问题是我得到的解并不接近。不关闭是什么意思?如果我得到一个角度为 1.5、0.3、-0.4 [rad] 的解,则运动下一步的下一个解将是任何其他可以解决它的随机角度,但实际上没有用,所以它可能类似于 -0.8 -1.5 2 [rad]。当然,机器人从 1.5 rad 跳到 -0.8 rad 只是将其终点移动 1 cm 是没有意义的。相反,我希望得到一个尽可能接近前一个解决方案的角度的解决方案。
方程看起来像这样:
x == 1*cos(theta1)*cos(0) + 1*cos(theta1 + theta2)*cos(0 + 0) + 1*cos(theta1 + theta2 + theta3)*cos(0 + 0 + 0)
y == 1*cos(theta1)*sin(0) + 1*cos(theta1 + theta2)*sin(0 + 0) + 1*cos(theta1 + theta2 + theta3)*sin(0 + 0 + 0)
z == 1*sin(theta1) + 1*sin(theta1 + theta2) + 1*sin(theta1 + theta2 + theta3)
我给他们不同的 x y 和 z 值并求解这些值的 thetas。例如:
t = 0:0.1:1;
x = 2 * t;
y = 0;
z = 1;
所以这里我们有10个不同的位置,我知道有“连续”的解决方案,我只是不知道如何让vpasolve给我这些解决方案,这是我的使用方法:
syms x y z theta1 theta2 theta3
xEquation = 'x == 1*cos(theta1)*cos(0) + 1*cos(theta1 + theta2)*cos(0 + 0) + 1*cos(theta1 + theta2 + theta3)*cos(0 + 0 + 0)';
yEquation = 'y == 1*cos(theta1)*sin(0) + 1*cos(theta1 + theta2)*sin(0 + 0) + 1*cos(theta1 + theta2 + theta3)*sin(0 + 0 + 0)';
zEquation = 'z == 1*sin(theta1) + 1*sin(theta1 + theta2) + 1*sin(theta1 + theta2 + theta3)';
t = 0:0.1:1;
x = 2 * t;
y = 0;
z = 1;
xEquationEv = eval(xEquation);
yEquationEv = eval(yEquation);
zEquationEv = eval(zEquation);
for f = 1:size(x, 2)
sol(f) = vpasolve([xEquationEv(f), yEquationEv, zEquationEv], [theta1, theta2, theta3], [-pi pi; -pi pi; -pi pi]);
end
sol.theta1
sol.theta2
sol.theta3
您会看到这些值并非一直平滑地递增或递减,但有时它们会出现大幅跳跃。
注意:我从字符串和 eval 开始,因为方程可能会改变,我有另一个生成它们的算法。
【问题讨论】:
-
为什么你的一些周期函数有常量参数?在我看来,整个问题就像你应该研究解决微分方程。
-
这些常数参数是连杆的长度和其他没有变化的关节角度,我只是从这些广义方程开始,并将我的值代入其中