clear;clc;
syms theta1 theta2 theta3 l1 l2 l3%符号函数,真的好用
L(1) = Link([theta1 0 0 0],'modified');
L(2) = Link([theta2 0 l1 0],'modified');
L(3) = Link([theta3 0 l2 0],'modified');
Three_Link = SerialLink(L,'name','threelink');
Three_Link.display;
程序运行结果:
clc;clear;
syms theta1 theta2 theta3 theta4 l1 l2 l3
%齐次变换矩阵
syms alphai_1 ai_1 di thetai
i_1iT=[cos(thetai) -sin(thetai) 0 ai_1
sin(thetai)*cos(alphai_1) cos(thetai)*cos(alphai_1) -sin(alphai_1) -sin(alphai_1)*di
sin(thetai)*sin(alphai_1) cos(thetai)*sin(alphai_1) cos(alphai_1) cos(alphai_1)*di
0 0 0 1];
%R = subs(S, old, new) 利用new的值代替符号表达式中old的值
T01=subs(i_1iT,[alphai_1 ai_1 di thetai],[0 0 0 theta1])
T12=subs(i_1iT,[alphai_1 ai_1 di thetai],[0 l1 0 theta2])
T23=subs(i_1iT,[alphai_1 ai_1 di thetai],[0 l2 0 theta3])
T3H=subs(i_1iT,[alphai_1 ai_1 di thetai],[0 l3 0 0])
输出结果:
利用工具箱函数测试:
syms theta1 theta2 theta3 theta4 l1 l2 l3
L(1) = Link([theta1 0 0 0 0],'modified');
L(2) = Link([theta2 0 l1 0 0],'modified');
L(3) = Link([theta3 0 l2 0 0],'modified');
L(4) = Link([0 0 l3 0 1],'modified');%本文假定夹爪连接为移动关节,动关节也可;
T01 = L(1).A(theta1)%A(jlist,q)输入关节的编号jlist和对应的角度q,输入变换矩阵
T12 = L(2).A(theta2);
T23 = L(3).A(theta3);
T3H = L(4).A(theta4);
clc;clear;
syms theta1 theta2 theta3 theta4 l1 l2 l3
%齐次变换矩阵
syms alphai_1 ai_1 di thetai
i_1iT=[cos(thetai) -sin(thetai) 0 ai_1
sin(thetai)*cos(alphai_1) cos(thetai)*cos(alphai_1) -sin(alphai_1) -sin(alphai_1)*di
sin(thetai)*sin(alphai_1) cos(thetai)*sin(alphai_1) cos(alphai_1) cos(alphai_1)*di
0 0 0 1];
%R = subs(S, old, new) 利用new的值代替符号表达式中old的值
T01=subs(i_1iT,[alphai_1 ai_1 di thetai],[0 0 0 theta1]);
T12=subs(i_1iT,[alphai_1 ai_1 di thetai],[0 l1 0 theta2]);
T23=subs(i_1iT,[alphai_1 ai_1 di thetai],[0 l2 0 theta3]);
T3H=subs(i_1iT,[alphai_1 ai_1 di thetai],[0 l3 0 0]);
T03=T01*T12*T23
T0H=T01*T12*T23*T3H
T03i=subs(T03,[theta1 theta2 theta3],[0 0 0])
T0Hi=subs(T0H,[theta1 theta2 theta3],[0 0 0])
T03ii=subs(T03,[theta1 theta2 theta3],[10 20 30])
T0Hii=subs(T0H,[theta1 theta2 theta3],[10 20 30])
T03iii=subs(T03,[theta1 theta2 theta3],[10 20 30])
T0Hiii=subs(T0H,[theta1 theta2 theta3],[10 20 30])
结果太长,自己运行查看吧
利用工具箱函数测试:
syms theta1 theta2 theta3 L1 L2 L3
L(1) = Link([theta1 0 0 0 0],'modified');
L(2) = Link([theta2 0 4 0 0],'modified');
L(3) = Link([theta3 0 3 0 0],'modified');
L(4) = Link([0 0 2 0 1],'modified');
Three_Link = SerialLink(L,'name','threelink');
%用户输入均为角度
theta1 = input ('Please enter theta1 = ');
theta2 = input ('Please enter theta2 = ');
theta3 = input ('Please enter theta3 = ');
%只要有一个输入为空,就结束程序
empty = isempty(theta1)+isempty(theta2)+isempty(theta3);
if empty>0
fprintf('Error!');
else
digits(4);%设置只保留小数点后4位
T = Three_Link.fkine([theta1,theta2,theta3,0]);%此时为分数
A = vpa(T)%变换为小数输出
end
测试结果: