一、Simmechanics
到MALTAB官网下载simlink
https://cn.mathworks.com/products/simmechanics/download_smlink.html
按照步骤安装,然后在 SolidWorks 工具-插件里勾选simscape multibody link选项
在工具栏可以看到simscape multibody link,选择export,选择第一个(不要选第二个first generation,因为MATLAB快不支持第一代了),完成以上步骤后就会自动生成xml文件了(中文名零件名可能会影响导出)。
二、SolidWorks生成URDF文件
下载插件sw2urdf,在工具-插件勾选sw2urdf
然后在工具栏最下面的file选项,点击生成urdf文件
自定义关节继承关系、属性、角限位等
此项一定要填,不然会出错,最容易出错的就是这个继承对应关系,要注意
生成urdf后可以在MATLAB打开生成rigidbodytree,就可以用robotics system toolbox了。
另一种方法建立rigidbodytree就是从头开始建立,建立body、joint,用D-H参数建立关节关系,插入属性
MH = robotics.RigidBodyTree; % insert bodies body1 = robotics.RigidBody('b1'); body2 = robotics.RigidBody('b2'); body3 = robotics.RigidBody('b3'); body4 = robotics.RigidBody('b4'); body5 = robotics.RigidBody('b5'); body6 = robotics.RigidBody('b6'); body7 = robotics.RigidBody('b7'); % insert joints jnt1 = robotics.Joint('jnt1','revolute'); jnt2 = robotics.Joint('jnt2','revolute'); jnt3 = robotics.Joint('jnt3','revolute'); jnt4 = robotics.Joint('jnt4','revolute'); jnt5 = robotics.Joint('jnt5','revolute'); jnt6 = robotics.Joint('jnt6','revolute'); jnt7 = robotics.Joint('jnt7','revolute'); % D-H l_arm = 0.3000; l_forearm = 0.3500; h = 0.1347; dhparams = [ % % a alpah d theta % % %================================== 0 pi/2 0 0; l_arm 0 0 0; l_forearm -pi/2 0 0; 0 pi/2 h 0; 0 -pi/2 0 0; 0 pi/2 0 0; 0 0 0 0; ]; % a alpah d theta %================================== % 0 0 0 0; % 0 pi/2 0 -pi/2; % l_arm 0 0 pi/2; % l_forearm -pi/2 h 0; % 0 pi/2 0 0; % 0 -pi/2 0 -pi/2; % 0 pi/2 0 pi/2; % ]; % insert D-H parameters setFixedTransform(jnt1,dhparams(1,:),'dh'); setFixedTransform(jnt2,dhparams(2,:),'dh'); setFixedTransform(jnt3,dhparams(3,:),'dh'); setFixedTransform(jnt4,dhparams(4,:),'dh'); setFixedTransform(jnt5,dhparams(5,:),'dh'); setFixedTransform(jnt6,dhparams(6,:),'dh'); setFixedTransform(jnt7,dhparams(7,:),'dh'); % define joints body1.Joint = jnt1; body2.Joint = jnt2; body3.Joint = jnt3; body4.Joint = jnt4; body5.Joint = jnt5; body6.Joint = jnt6; body7.Joint = jnt7; % add bodies in tree basename = MH.BaseName; addBody(MH,body1,basename) addBody(MH,body2,'b1') addBody(MH,body3,'b2') addBody(MH,body4,'b3') addBody(MH,body5,'b4') addBody(MH,body6,'b5') addBody(MH,body7,'b6') % insert dynamics parameters body1.Mass = 2.5821065477099703; body1.CenterOfMass = [-0.26329659042131059 158.72447498623089 32.938176506248787]; body1.Inertia = [16041.582424563505 7051.1754123926148 13088.880352015873 -4141.6894962543802 -22.754297015214494 -87.900979228745442]; body2.Mass = 0.95068534123025306; body2.CenterOfMass = [-17.236168916095959 22.127697430967604 -21.016908976944325]; body2.Inertia = [12975.722899322729 954.70243767950433 13441.442230712533 1288.282590132515 -130.31919082259617 1075.4651029099809]; body3.Mass = 0.38670320971519206; body3.CenterOfMass = [0.1908081566990967 -17.865474466941961 -222.13772550818976]; body3.Inertia = [4463.9503328208039 4464.8231105514187 72.490142706051088 -30.84429243830429 13.600455398698957 -3.1231045481430746]; body4.Mass = 3.4690235497900648e-05; body4.CenterOfMass = [77.547591577672861 -33.465682164229897 -0.039161288781911781]; body4.Inertia = [0.058020692722918002 0.082300857011192913 0.13284300061145118 -1.9246996929474e-05 4.0460432714558584e-05 0.03872541278802373]; body5.Mass = 2.0892809449960028e-05; body5.CenterOfMass = [-48.405480558479738 28.636770084664331 0.027346481660805749]; body5.Inertia = [0.030293749741555756 0.026352212661226965 0.053727763158712909 -3.5730098499112016e-05 2.2082435688263238e-05 0.016601561408768908]; body6.Mass = 2.2036300278286587e-05; body6.CenterOfMass = [0.02571156554487955 -31.745742486558129 6.6814730637257682]; body6.Inertia = [0.03282466484366197 0.012571625157927193 0.023282119684803097 -0.0073201098466462366 -9.0762265047841154e-06 -7.5550470324971825e-07]; body7.Mass = 3.1739768939109369e-05; body7.CenterOfMass = [0.018075377787587516 -21.866042781275841 -4.4259541225431001]; body7.Inertia = [0.053486732030183323 0.027288070887356616 0.031992871949931917 0.00050430471511754603 -1.5392937621131819e-05 4.7755426986294462e-06]; MH.Gravity = [0 0 -0.981]; show(MH); axis([-1,1,-1,1,-1,1]) axis off