Skip to content
LIBRARY
PlanarMechanics.examples.ParallelKinematicRobot.md

PlanarMechanics.examples.ParallelKinematicRobot

Usage

MultibodyComponents.PlanarMechanics.examples.ParallelKinematicRobot(a_length=0.53, b_length=0.4374, c_length=0.5, d_length=0.15, link_mass=1.5, w0=-0.5, phi0=deg2rad(10), alpha_tf=0, link_radius=0.03, link_color=[0.9, 0.9, 0.9, 1.0])

Parameters:

NameDescriptionUnitsDefault value
a_lengthm0.53
b_lengthm0.4374
c_lengthm0.5
d_lengthm0.15
link_masskg1.5
w0rad/s-0.5
phi0Initial angle of the base->a revolute jointraddeg2rad(10)
alpha_tfrad0
link_radius0.03
link_color[0.9, 0.9, 0.9, 1]

Behavior

[connect(base+frameb,basea+frame_a)connect(basea+frame_b,upperarm+frame_a)connect(upperarm+frame_b,acd+frame_a)connect(acd+frame_b,linkc+frame_a,linkd+frame_a)connect(base2+frameb,base2b+frame_a)connect(base2b+frame_b,linkb+frame_a)connect(linkb+frame_b,bd+frame_a)connect(bd+frame_b,linkd+frame_b)connect(linkc+frame_b,fixedrotation_tf+frame_a)connect(fixedrotation_tf+frame_b,endeffector+frame_a)connect(speed+spline,basea+flange_a)connect(w0const+y,speed+wref)connect(fixed+spline,speed+support)arrayliteral([2],base.frameb.x(t),base.frameb.y(t))=base.rbase.frameb.phi(t)=base.phiarrayliteral([2],base2.frameb.x(t),base2.frameb.y(t))=base2.rbase2.frameb.phi(t)=base2.phibasea.w(t)=dbasea.phi(t)dtbasea.alpha(t)=dbasea.w(t)dtbasea.frame_a.x(t)=basea.frame_b.x(t)basea.frame_a.y(t)=basea.frame_b.y(t)basea.phi(t)+basea.frame_a.phi(t)=basea.frame_b.phi(t)basea.frame_a.fx(t)+basea.frame_b.fx(t)=0basea.frame_b.fy(t)+basea.frame_a.fy(t)=0basea.frame_b.tau(t)+basea.frame_a.tau(t)=0basea.frame_a.tau(t)=basea.tau(t)basea.flange_a.phi(t)=basea.phi(t)basea.flange_a.tau(t)=basea.tau(t)basea.shape.r(t)=arrayliteral([3],basea.frame_a.x(t),basea.frame_a.y(t),basea.z_position)basea.shape.R(t)=arrayliteral([33],cos(basea.frame_a.phi(t)),sin(basea.frame_a.phi(t)),0,sin(basea.frame_a.phi(t)),cos(basea.frame_a.phi(t)),0,0,0,1)basea.shape.r_shape(t)=arrayliteral([3],0,0,12basea.cylinder_length)basea.shape.length_direction(t)=[001]basea.shape.width_direction(t)=[100]basea.shape.length(t)=basea.cylinder_lengthbasea.shape.width(t)=2basea.radiusbasea.shape.height(t)=2basea.radiusbase2b.w(t)=dbase2b.phi(t)dtbase2b.alpha(t)=dbase2b.w(t)dtbase2b.frame_a.x(t)=base2b.frame_b.x(t)base2b.frame_a.y(t)=base2b.frame_b.y(t)base2b.frame_a.phi(t)+base2b.phi(t)=base2b.frame_b.phi(t)base2b.frame_b.fx(t)+base2b.frame_a.fx(t)=0base2b.frame_b.fy(t)+base2b.frame_a.fy(t)=0base2b.frame_a.tau(t)+base2b.frame_b.tau(t)=0base2b.frame_a.tau(t)=base2b.tau(t)base2b.flange_a.phi(t)=base2b.phi(t)base2b.flange_a.tau(t)=base2b.tau(t)base2b.shape.r(t)=arrayliteral([3],base2b.frame_a.x(t),base2b.frame_a.y(t),base2b.z_position)base2b.shape.R(t)=arrayliteral([33],cos(base2b.frame_a.phi(t)),sin(base2b.frame_a.phi(t)),0,sin(base2b.frame_a.phi(t)),cos(base2b.frame_a.phi(t)),0,0,0,1)base2b.shape.r_shape(t)=arrayliteral([3],0,0,12base2b.cylinder_length)base2b.shape.length_direction(t)=[001]base2b.shape.width_direction(t)=[100]base2b.shape.length(t)=base2b.cylinder_lengthbase2b.shape.width(t)=2base2b.radiusbase2b.shape.height(t)=2base2b.radiusacd.w(t)=dacd.phi(t)dtacd.alpha(t)=dacd.w(t)dtacd.frame_a.x(t)=acd.frame_b.x(t)acd.frame_a.y(t)=acd.frame_b.y(t)acd.frame_a.phi(t)+acd.phi(t)=acd.frame_b.phi(t)acd.frame_a.fx(t)+acd.frame_b.fx(t)=0acd.frame_b.fy(t)+acd.frame_a.fy(t)=0acd.frame_b.tau(t)+acd.frame_a.tau(t)=0acd.frame_a.tau(t)=acd.tau(t)acd.flange_a.phi(t)=acd.phi(t)acd.flange_a.tau(t)=acd.tau(t)acd.shape.r(t)=arrayliteral([3],acd.frame_a.x(t),acd.frame_a.y(t),acd.z_position)acd.shape.R(t)=arrayliteral([33],cos(acd.frame_a.phi(t)),sin(acd.frame_a.phi(t)),0,sin(acd.frame_a.phi(t)),cos(acd.frame_a.phi(t)),0,0,0,1)acd.shape.r_shape(t)=arrayliteral([3],0,0,12acd.cylinder_length)acd.shape.length_direction(t)=[001]acd.shape.width_direction(t)=[100]acd.shape.length(t)=acd.cylinder_lengthacd.shape.width(t)=2acd.radiusacd.shape.height(t)=2acd.radiusbd.w(t)=dbd.phi(t)dtbd.alpha(t)=dbd.w(t)dtbd.frame_a.x(t)=bd.frame_b.x(t)bd.frame_a.y(t)=bd.frame_b.y(t)bd.frame_a.phi(t)+bd.phi(t)=bd.frame_b.phi(t)bd.frame_b.fx(t)+bd.frame_a.fx(t)=0bd.frame_b.fy(t)+bd.frame_a.fy(t)=0bd.frame_b.tau(t)+bd.frame_a.tau(t)=0bd.frame_a.tau(t)=bd.tau(t)bd.flange_a.phi(t)=bd.phi(t)bd.flange_a.tau(t)=bd.tau(t)bd.shape.r(t)=arrayliteral([3],bd.frame_a.x(t),bd.frame_a.y(t),bd.z_position)bd.shape.R(t)=arrayliteral([33],cos(bd.frame_a.phi(t)),sin(bd.frame_a.phi(t)),0,sin(bd.frame_a.phi(t)),cos(bd.frame_a.phi(t)),0,0,0,1)bd.shape.r_shape(t)=arrayliteral([3],0,0,12bd.cylinder_length)bd.shape.length_direction(t)=[001]bd.shape.width_direction(t)=[100]bd.shape.length(t)=bd.cylinder_lengthbd.shape.width(t)=2bd.radiusbd.shape.height(t)=2bd.radiusupperarm.rod_shape.r(t)=arrayliteral([3],upperarm.frame_a.x(t),upperarm.frame_a.y(t),upperarm.z_position)upperarm.rod_shape.R(t)=arrayliteral([33],1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0)upperarm.rod_shape.r_shape(t)=[000]upperarm.rod_shape.length_direction(t)=arrayliteral([3],upperarm.translation.r0_1(t)upperarm.l,upperarm.translation.r0_2(t)upperarm.l,0)upperarm.rod_shape.width_direction(t)=[001]upperarm.rod_shape.length(t)=upperarm.lupperarm.rod_shape.width(t)=2upperarm.radiusupperarm.rod_shape.height(t)=2upperarm.radiusconnect(framea,translation+framea,translationcm+frame_a)connect(frameb,translation+frameb)connect(translationcm+frame_b,body+framea)upperarm.translation.phi(t)=upperarm.translation.frame_a.phi(t)upperarm.translation.w(t)=dupperarm.translation.phi(t)dtupperarm.translation.r0(t)=arrayliteral([22],cos(upperarm.translation.phi(t)),sin(upperarm.translation.phi(t)),sin(upperarm.translation.phi(t)),cos(upperarm.translation.phi(t)))upperarm.translation.rupperarm.translation.r0(t)=arrayliteral([2],upperarm.translation.frame_a.x(t)+upperarm.translation.frame_b.x(t),upperarm.translation.frame_a.y(t)+upperarm.translation.frame_b.y(t))upperarm.translation.frame_a.phi(t)=upperarm.translation.frame_b.phi(t)upperarm.translation.frame_a.fx(t)+upperarm.translation.frame_b.fx(t)=0upperarm.translation.frame_a.fy(t)+upperarm.translation.frame_b.fy(t)=0upperarm.translation.frame_a.tau(t)+upperarm.translation.frame_b.tau(t)+upperarm.translation.r0_1(t)upperarm.translation.frame_b.fy(t)upperarm.translation.r0_2(t)upperarm.translation.frame_b.fx(t)=0upperarm.translation.shape.r(t)=arrayliteral([3],upperarm.translation.frame_a.x(t),upperarm.translation.frame_a.y(t),upperarm.translation.z_position)upperarm.translation.shape.R(t)=arrayliteral([33],1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0)upperarm.translation.shape.r_shape(t)=[000]upperarm.translation.shape.length_direction(t)=arrayliteral([3],upperarm.translation.r0_1(t)upperarm.translation.l,upperarm.translation.r0_2(t)upperarm.translation.l,0)upperarm.translation.shape.width_direction(t)=[001]upperarm.translation.shape.length(t)=upperarm.translation.lupperarm.translation.shape.width(t)=2upperarm.translation.radiusupperarm.translation.shape.height(t)=2upperarm.translation.radiusupperarm.translation_cm.phi(t)=upperarm.translation_cm.frame_a.phi(t)upperarm.translation_cm.w(t)=dupperarm.translation_cm.phi(t)dtupperarm.translation_cm.r0(t)=arrayliteral([22],cos(upperarm.translation_cm.phi(t)),sin(upperarm.translation_cm.phi(t)),sin(upperarm.translation_cm.phi(t)),cos(upperarm.translation_cm.phi(t)))upperarm.translation_cm.rupperarm.translation_cm.r0(t)=arrayliteral([2],upperarm.translation_cm.frame_b.x(t)upperarm.translation_cm.frame_a.x(t),upperarm.translation_cm.frame_a.y(t)+upperarm.translation_cm.frame_b.y(t))upperarm.translation_cm.frame_a.phi(t)=upperarm.translation_cm.frame_b.phi(t)upperarm.translation_cm.frame_b.fx(t)+upperarm.translation_cm.frame_a.fx(t)=0upperarm.translation_cm.frame_a.fy(t)+upperarm.translation_cm.frame_b.fy(t)=0upperarm.translation_cm.frame_a.tau(t)+upperarm.translation_cm.frame_b.tau(t)upperarm.translation_cm.frame_b.fx(t)upperarm.translation_cm.r0_2(t)+upperarm.translation_cm.r0_1(t)upperarm.translation_cm.frame_b.fy(t)=0upperarm.translation_cm.shape.r(t)=arrayliteral([3],upperarm.translation_cm.frame_a.x(t),upperarm.translation_cm.frame_a.y(t),upperarm.translation_cm.z_position)upperarm.translation_cm.shape.R(t)=arrayliteral([33],1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0)upperarm.translation_cm.shape.r_shape(t)=[000]upperarm.translation_cm.shape.length_direction(t)=arrayliteral([3],upperarm.translation_cm.r0_1(t)upperarm.translation_cm.l,upperarm.translation_cm.r0_2(t)upperarm.translation_cm.l,0)upperarm.translation_cm.shape.width_direction(t)=[001]upperarm.translation_cm.shape.length(t)=upperarm.translation_cm.lupperarm.translation_cm.shape.width(t)=2upperarm.translation_cm.radiusupperarm.translation_cm.shape.height(t)=2upperarm.translation_cm.radiusupperarm.body.r(t)=arrayliteral([2],upperarm.body.frame_a.x(t),upperarm.body.frame_a.y(t))upperarm.body.v(t)=dupperarm.body.r(t)dtupperarm.body.phi(t)=upperarm.body.frame_a.phi(t)upperarm.body.w(t)=dupperarm.body.phi(t)dtupperarm.body.a(t)=dupperarm.body.v(t)dtupperarm.body.alpha(t)=dupperarm.body.w(t)dtupperarm.body.f(t)=arrayliteral([2],upperarm.body.frame_a.fx(t),upperarm.body.frame_a.fy(t))arrayliteral([2],gn2d1upperarm.body.m,gn2d2upperarm.body.m)+upperarm.body.f(t)=upperarm.body.mupperarm.body.a(t)upperarm.body.Iupperarm.body.alpha(t)=upperarm.body.frame_a.tau(t)upperarm.body.shape.r(t)=arrayliteral([3],upperarm.body.frame_a.x(t),upperarm.body.frame_a.y(t),upperarm.body.z_position)upperarm.body.shape.R(t)=arrayliteral([33],cos(upperarm.body.phi(t)),sin(upperarm.body.phi(t)),0,sin(upperarm.body.phi(t)),cos(upperarm.body.phi(t)),0,0,0,1)upperarm.body.shape.r_shape(t)=[000]upperarm.body.shape.length_direction(t)=[001]upperarm.body.shape.width_direction(t)=[100]upperarm.body.shape.length(t)=2upperarm.body.radiusupperarm.body.shape.width(t)=2upperarm.body.radiusupperarm.body.shape.height(t)=2upperarm.body.radiuslinkb.rod_shape.r(t)=arrayliteral([3],linkb.frame_a.x(t),linkb.frame_a.y(t),linkb.z_position)linkb.rod_shape.R(t)=arrayliteral([33],1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0)linkb.rod_shape.r_shape(t)=[000]linkb.rod_shape.length_direction(t)=arrayliteral([3],linkb.translation.r0_1(t)linkb.l,linkb.translation.r0_2(t)linkb.l,0)linkb.rod_shape.width_direction(t)=[001]linkb.rod_shape.length(t)=linkb.llinkb.rod_shape.width(t)=2linkb.radiuslinkb.rod_shape.height(t)=2linkb.radiusconnect(framea,translation+framea,translationcm+frame_a)connect(frameb,translation+frameb)connect(translationcm+frame_b,body+framea)linkb.translation.phi(t)=linkb.translation.frame_a.phi(t)linkb.translation.w(t)=dlinkb.translation.phi(t)dtlinkb.translation.r0(t)=arrayliteral([22],cos(linkb.translation.phi(t)),sin(linkb.translation.phi(t)),sin(linkb.translation.phi(t)),cos(linkb.translation.phi(t)))linkb.translation.rlinkb.translation.r0(t)=arrayliteral([2],linkb.translation.frame_b.x(t)linkb.translation.frame_a.x(t),linkb.translation.frame_a.y(t)+linkb.translation.frame_b.y(t))linkb.translation.frame_a.phi(t)=linkb.translation.frame_b.phi(t)linkb.translation.frame_a.fx(t)+linkb.translation.frame_b.fx(t)=0linkb.translation.frame_a.fy(t)+linkb.translation.frame_b.fy(t)=0linkb.translation.frame_b.tau(t)+linkb.translation.frame_a.tau(t)+linkb.translation.frame_b.fy(t)linkb.translation.r0_1(t)linkb.translation.frame_b.fx(t)linkb.translation.r0_2(t)=0linkb.translation.shape.r(t)=arrayliteral([3],linkb.translation.frame_a.x(t),linkb.translation.frame_a.y(t),linkb.translation.z_position)linkb.translation.shape.R(t)=arrayliteral([33],1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0)linkb.translation.shape.r_shape(t)=[000]linkb.translation.shape.length_direction(t)=arrayliteral([3],linkb.translation.r0_1(t)linkb.translation.l,linkb.translation.r0_2(t)linkb.translation.l,0)linkb.translation.shape.width_direction(t)=[001]linkb.translation.shape.length(t)=linkb.translation.llinkb.translation.shape.width(t)=2linkb.translation.radiuslinkb.translation.shape.height(t)=2linkb.translation.radiuslinkb.translation_cm.phi(t)=linkb.translation_cm.frame_a.phi(t)linkb.translation_cm.w(t)=dlinkb.translation_cm.phi(t)dtlinkb.translation_cm.r0(t)=arrayliteral([22],cos(linkb.translation_cm.phi(t)),sin(linkb.translation_cm.phi(t)),sin(linkb.translation_cm.phi(t)),cos(linkb.translation_cm.phi(t)))linkb.translation_cm.rlinkb.translation_cm.r0(t)=arrayliteral([2],linkb.translation_cm.frame_b.x(t)linkb.translation_cm.frame_a.x(t),linkb.translation_cm.frame_b.y(t)linkb.translation_cm.frame_a.y(t))linkb.translation_cm.frame_a.phi(t)=linkb.translation_cm.frame_b.phi(t)linkb.translation_cm.frame_b.fx(t)+linkb.translation_cm.frame_a.fx(t)=0linkb.translation_cm.frame_a.fy(t)+linkb.translation_cm.frame_b.fy(t)=0linkb.translation_cm.frame_b.tau(t)+linkb.translation_cm.frame_a.tau(t)+linkb.translation_cm.r0_1(t)linkb.translation_cm.frame_b.fy(t)linkb.translation_cm.r0_2(t)linkb.translation_cm.frame_b.fx(t)=0linkb.translation_cm.shape.r(t)=arrayliteral([3],linkb.translation_cm.frame_a.x(t),linkb.translation_cm.frame_a.y(t),linkb.translation_cm.z_position)linkb.translation_cm.shape.R(t)=arrayliteral([33],1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0)linkb.translation_cm.shape.r_shape(t)=[000]linkb.translation_cm.shape.length_direction(t)=arrayliteral([3],linkb.translation_cm.r0_1(t)linkb.translation_cm.l,linkb.translation_cm.r0_2(t)linkb.translation_cm.l,0)linkb.translation_cm.shape.width_direction(t)=[001]linkb.translation_cm.shape.length(t)=linkb.translation_cm.llinkb.translation_cm.shape.width(t)=2linkb.translation_cm.radiuslinkb.translation_cm.shape.height(t)=2linkb.translation_cm.radiuslinkb.body.r(t)=arrayliteral([2],linkb.body.frame_a.x(t),linkb.body.frame_a.y(t))linkb.body.v(t)=dlinkb.body.r(t)dtlinkb.body.phi(t)=linkb.body.frame_a.phi(t)linkb.body.w(t)=dlinkb.body.phi(t)dtlinkb.body.a(t)=dlinkb.body.v(t)dtlinkb.body.alpha(t)=dlinkb.body.w(t)dtlinkb.body.f(t)=arrayliteral([2],linkb.body.frame_a.fx(t),linkb.body.frame_a.fy(t))arrayliteral([2],glinkb.body.mn2d1,glinkb.body.mn2d2)+linkb.body.f(t)=linkb.body.mlinkb.body.a(t)linkb.body.Ilinkb.body.alpha(t)=linkb.body.frame_a.tau(t)linkb.body.shape.r(t)=arrayliteral([3],linkb.body.frame_a.x(t),linkb.body.frame_a.y(t),linkb.body.z_position)linkb.body.shape.R(t)=arrayliteral([33],cos(linkb.body.phi(t)),sin(linkb.body.phi(t)),0,sin(linkb.body.phi(t)),cos(linkb.body.phi(t)),0,0,0,1)linkb.body.shape.r_shape(t)=[000]linkb.body.shape.length_direction(t)=[001]linkb.body.shape.width_direction(t)=[100]linkb.body.shape.length(t)=2linkb.body.radiuslinkb.body.shape.width(t)=2linkb.body.radiuslinkb.body.shape.height(t)=2linkb.body.radiuslinkc.rod_shape.r(t)=arrayliteral([3],linkc.frame_a.x(t),linkc.frame_a.y(t),linkc.z_position)linkc.rod_shape.R(t)=arrayliteral([33],1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0)linkc.rod_shape.r_shape(t)=[000]linkc.rod_shape.length_direction(t)=arrayliteral([3],linkc.translation.r0_1(t)linkc.l,linkc.translation.r0_2(t)linkc.l,0)linkc.rod_shape.width_direction(t)=[001]linkc.rod_shape.length(t)=linkc.llinkc.rod_shape.width(t)=2linkc.radiuslinkc.rod_shape.height(t)=2linkc.radiusconnect(framea,translation+framea,translationcm+frame_a)connect(frameb,translation+frameb)connect(translationcm+frame_b,body+framea)linkc.translation.phi(t)=linkc.translation.frame_a.phi(t)linkc.translation.w(t)=dlinkc.translation.phi(t)dtlinkc.translation.r0(t)=arrayliteral([22],cos(linkc.translation.phi(t)),sin(linkc.translation.phi(t)),sin(linkc.translation.phi(t)),cos(linkc.translation.phi(t)))linkc.translation.rlinkc.translation.r0(t)=arrayliteral([2],linkc.translation.frame_b.x(t)linkc.translation.frame_a.x(t),linkc.translation.frame_a.y(t)+linkc.translation.frame_b.y(t))linkc.translation.frame_a.phi(t)=linkc.translation.frame_b.phi(t)linkc.translation.frame_b.fx(t)+linkc.translation.frame_a.fx(t)=0linkc.translation.frame_b.fy(t)+linkc.translation.frame_a.fy(t)=0linkc.translation.frame_b.tau(t)+linkc.translation.frame_a.tau(t)linkc.translation.frame_b.fx(t)linkc.translation.r0_2(t)+linkc.translation.frame_b.fy(t)linkc.translation.r0_1(t)=0linkc.translation.shape.r(t)=arrayliteral([3],linkc.translation.frame_a.x(t),linkc.translation.frame_a.y(t),linkc.translation.z_position)linkc.translation.shape.R(t)=arrayliteral([33],1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0)linkc.translation.shape.r_shape(t)=[000]linkc.translation.shape.length_direction(t)=arrayliteral([3],linkc.translation.r0_1(t)linkc.translation.l,linkc.translation.r0_2(t)linkc.translation.l,0)linkc.translation.shape.width_direction(t)=[001]linkc.translation.shape.length(t)=linkc.translation.llinkc.translation.shape.width(t)=2linkc.translation.radiuslinkc.translation.shape.height(t)=2linkc.translation.radiuslinkc.translation_cm.phi(t)=linkc.translation_cm.frame_a.phi(t)linkc.translation_cm.w(t)=dlinkc.translation_cm.phi(t)dtlinkc.translation_cm.r0(t)=arrayliteral([22],cos(linkc.translation_cm.phi(t)),sin(linkc.translation_cm.phi(t)),sin(linkc.translation_cm.phi(t)),cos(linkc.translation_cm.phi(t)))linkc.translation_cm.rlinkc.translation_cm.r0(t)=arrayliteral([2],linkc.translation_cm.frame_a.x(t)+linkc.translation_cm.frame_b.x(t),linkc.translation_cm.frame_a.y(t)+linkc.translation_cm.frame_b.y(t))linkc.translation_cm.frame_a.phi(t)=linkc.translation_cm.frame_b.phi(t)linkc.translation_cm.frame_b.fx(t)+linkc.translation_cm.frame_a.fx(t)=0linkc.translation_cm.frame_b.fy(t)+linkc.translation_cm.frame_a.fy(t)=0linkc.translation_cm.frame_a.tau(t)+linkc.translation_cm.frame_b.tau(t)+linkc.translation_cm.frame_b.fy(t)linkc.translation_cm.r0_1(t)linkc.translation_cm.frame_b.fx(t)linkc.translation_cm.r0_2(t)=0linkc.translation_cm.shape.r(t)=arrayliteral([3],linkc.translation_cm.frame_a.x(t),linkc.translation_cm.frame_a.y(t),linkc.translation_cm.z_position)linkc.translation_cm.shape.R(t)=arrayliteral([33],1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0)linkc.translation_cm.shape.r_shape(t)=[000]linkc.translation_cm.shape.length_direction(t)=arrayliteral([3],linkc.translation_cm.r0_1(t)linkc.translation_cm.l,linkc.translation_cm.r0_2(t)linkc.translation_cm.l,0)linkc.translation_cm.shape.width_direction(t)=[001]linkc.translation_cm.shape.length(t)=linkc.translation_cm.llinkc.translation_cm.shape.width(t)=2linkc.translation_cm.radiuslinkc.translation_cm.shape.height(t)=2linkc.translation_cm.radiuslinkc.body.r(t)=arrayliteral([2],linkc.body.frame_a.x(t),linkc.body.frame_a.y(t))linkc.body.v(t)=dlinkc.body.r(t)dtlinkc.body.phi(t)=linkc.body.frame_a.phi(t)linkc.body.w(t)=dlinkc.body.phi(t)dtlinkc.body.a(t)=dlinkc.body.v(t)dtlinkc.body.alpha(t)=dlinkc.body.w(t)dtlinkc.body.f(t)=arrayliteral([2],linkc.body.frame_a.fx(t),linkc.body.frame_a.fy(t))arrayliteral([2],glinkc.body.mn2d1,glinkc.body.mn2d2)+linkc.body.f(t)=linkc.body.mlinkc.body.a(t)linkc.body.Ilinkc.body.alpha(t)=linkc.body.frame_a.tau(t)linkc.body.shape.r(t)=arrayliteral([3],linkc.body.frame_a.x(t),linkc.body.frame_a.y(t),linkc.body.z_position)linkc.body.shape.R(t)=arrayliteral([33],cos(linkc.body.phi(t)),sin(linkc.body.phi(t)),0,sin(linkc.body.phi(t)),cos(linkc.body.phi(t)),0,0,0,1)linkc.body.shape.r_shape(t)=[000]linkc.body.shape.length_direction(t)=[001]linkc.body.shape.width_direction(t)=[100]linkc.body.shape.length(t)=2linkc.body.radiuslinkc.body.shape.width(t)=2linkc.body.radiuslinkc.body.shape.height(t)=2linkc.body.radiuslinkd.rod_shape.r(t)=arrayliteral([3],linkd.frame_a.x(t),linkd.frame_a.y(t),linkd.z_position)linkd.rod_shape.R(t)=arrayliteral([33],1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0)linkd.rod_shape.r_shape(t)=[000]linkd.rod_shape.length_direction(t)=arrayliteral([3],linkd.translation.r0_1(t)linkd.l,linkd.translation.r0_2(t)linkd.l,0)linkd.rod_shape.width_direction(t)=[001]linkd.rod_shape.length(t)=linkd.llinkd.rod_shape.width(t)=2linkd.radiuslinkd.rod_shape.height(t)=2linkd.radiusconnect(framea,translation+framea,translationcm+frame_a)connect(frameb,translation+frameb)connect(translationcm+frame_b,body+framea)linkd.translation.phi(t)=linkd.translation.frame_a.phi(t)linkd.translation.w(t)=dlinkd.translation.phi(t)dtlinkd.translation.r0(t)=arrayliteral([22],cos(linkd.translation.phi(t)),sin(linkd.translation.phi(t)),sin(linkd.translation.phi(t)),cos(linkd.translation.phi(t)))linkd.translation.rlinkd.translation.r0(t)=arrayliteral([2],linkd.translation.frame_a.x(t)+linkd.translation.frame_b.x(t),linkd.translation.frame_a.y(t)+linkd.translation.frame_b.y(t))linkd.translation.frame_a.phi(t)=linkd.translation.frame_b.phi(t)linkd.translation.frame_b.fx(t)+linkd.translation.frame_a.fx(t)=0linkd.translation.frame_a.fy(t)+linkd.translation.frame_b.fy(t)=0linkd.translation.frame_b.tau(t)+linkd.translation.frame_a.tau(t)linkd.translation.frame_b.fx(t)linkd.translation.r0_2(t)+linkd.translation.frame_b.fy(t)linkd.translation.r0_1(t)=0linkd.translation.shape.r(t)=arrayliteral([3],linkd.translation.frame_a.x(t),linkd.translation.frame_a.y(t),linkd.translation.z_position)linkd.translation.shape.R(t)=arrayliteral([33],1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0)linkd.translation.shape.r_shape(t)=[000]linkd.translation.shape.length_direction(t)=arrayliteral([3],linkd.translation.r0_1(t)linkd.translation.l,linkd.translation.r0_2(t)linkd.translation.l,0)linkd.translation.shape.width_direction(t)=[001]linkd.translation.shape.length(t)=linkd.translation.llinkd.translation.shape.width(t)=2linkd.translation.radiuslinkd.translation.shape.height(t)=2linkd.translation.radiuslinkd.translation_cm.phi(t)=linkd.translation_cm.frame_a.phi(t)linkd.translation_cm.w(t)=dlinkd.translation_cm.phi(t)dtlinkd.translation_cm.r0(t)=arrayliteral([22],cos(linkd.translation_cm.phi(t)),sin(linkd.translation_cm.phi(t)),sin(linkd.translation_cm.phi(t)),cos(linkd.translation_cm.phi(t)))linkd.translation_cm.rlinkd.translation_cm.r0(t)=arrayliteral([2],linkd.translation_cm.frame_a.x(t)+linkd.translation_cm.frame_b.x(t),linkd.translation_cm.frame_a.y(t)+linkd.translation_cm.frame_b.y(t))linkd.translation_cm.frame_a.phi(t)=linkd.translation_cm.frame_b.phi(t)linkd.translation_cm.frame_a.fx(t)+linkd.translation_cm.frame_b.fx(t)=0linkd.translation_cm.frame_a.fy(t)+linkd.translation_cm.frame_b.fy(t)=0linkd.translation_cm.frame_b.tau(t)+linkd.translation_cm.frame_a.tau(t)+linkd.translation_cm.r0_1(t)linkd.translation_cm.frame_b.fy(t)linkd.translation_cm.r0_2(t)linkd.translation_cm.frame_b.fx(t)=0linkd.translation_cm.shape.r(t)=arrayliteral([3],linkd.translation_cm.frame_a.x(t),linkd.translation_cm.frame_a.y(t),linkd.translation_cm.z_position)linkd.translation_cm.shape.R(t)=arrayliteral([33],1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0)linkd.translation_cm.shape.r_shape(t)=[000]linkd.translation_cm.shape.length_direction(t)=arrayliteral([3],linkd.translation_cm.r0_1(t)linkd.translation_cm.l,linkd.translation_cm.r0_2(t)linkd.translation_cm.l,0)linkd.translation_cm.shape.width_direction(t)=[001]linkd.translation_cm.shape.length(t)=linkd.translation_cm.llinkd.translation_cm.shape.width(t)=2linkd.translation_cm.radiuslinkd.translation_cm.shape.height(t)=2linkd.translation_cm.radiuslinkd.body.r(t)=arrayliteral([2],linkd.body.frame_a.x(t),linkd.body.frame_a.y(t))linkd.body.v(t)=dlinkd.body.r(t)dtlinkd.body.phi(t)=linkd.body.frame_a.phi(t)linkd.body.w(t)=dlinkd.body.phi(t)dtlinkd.body.a(t)=dlinkd.body.v(t)dtlinkd.body.alpha(t)=dlinkd.body.w(t)dtlinkd.body.f(t)=arrayliteral([2],linkd.body.frame_a.fx(t),linkd.body.frame_a.fy(t))linkd.body.f(t)+arrayliteral([2],glinkd.body.mn2d1,glinkd.body.mn2d2)=linkd.body.mlinkd.body.a(t)linkd.body.Ilinkd.body.alpha(t)=linkd.body.frame_a.tau(t)linkd.body.shape.r(t)=arrayliteral([3],linkd.body.frame_a.x(t),linkd.body.frame_a.y(t),linkd.body.z_position)linkd.body.shape.R(t)=arrayliteral([33],cos(linkd.body.phi(t)),sin(linkd.body.phi(t)),0,sin(linkd.body.phi(t)),cos(linkd.body.phi(t)),0,0,0,1)linkd.body.shape.r_shape(t)=[000]linkd.body.shape.length_direction(t)=[001]linkd.body.shape.width_direction(t)=[100]linkd.body.shape.length(t)=2linkd.body.radiuslinkd.body.shape.width(t)=2linkd.body.radiuslinkd.body.shape.height(t)=2linkd.body.radiusfixedrotation_tf.frame_a.x(t)=fixedrotation_tf.frame_b.x(t)fixedrotation_tf.frame_a.y(t)=fixedrotation_tf.frame_b.y(t)fixedrotation_tf.alpha+fixedrotation_tf.frame_a.phi(t)=fixedrotation_tf.frame_b.phi(t)fixedrotation_tf.frame_a.fx(t)+fixedrotation_tf.frame_b.fx(t)=0fixedrotation_tf.frame_b.fy(t)+fixedrotation_tf.frame_a.fy(t)=0fixedrotation_tf.frame_b.tau(t)+fixedrotation_tf.frame_a.tau(t)=0connect(framea,body+framea)endeffector.body.r(t)=arrayliteral([2],endeffector.body.frame_a.x(t),endeffector.body.frame_a.y(t))endeffector.body.v(t)=dendeffector.body.r(t)dtendeffector.body.phi(t)=endeffector.body.frame_a.phi(t)endeffector.body.w(t)=dendeffector.body.phi(t)dtendeffector.body.a(t)=dendeffector.body.v(t)dtendeffector.body.alpha(t)=dendeffector.body.w(t)dtendeffector.body.f(t)=arrayliteral([2],endeffector.body.frame_a.fx(t),endeffector.body.frame_a.fy(t))endeffector.body.f(t)+arrayliteral([2],endeffector.body.mgn2d1,endeffector.body.mgn2d2)=endeffector.body.mendeffector.body.a(t)endeffector.body.Iendeffector.body.alpha(t)=endeffector.body.frame_a.tau(t)endeffector.body.shape.r(t)=arrayliteral([3],endeffector.body.frame_a.x(t),endeffector.body.frame_a.y(t),endeffector.body.z_position)endeffector.body.shape.R(t)=arrayliteral([33],cos(endeffector.body.phi(t)),sin(endeffector.body.phi(t)),0,sin(endeffector.body.phi(t)),cos(endeffector.body.phi(t)),0,0,0,1)endeffector.body.shape.r_shape(t)=[000]endeffector.body.shape.length_direction(t)=[001]endeffector.body.shape.width_direction(t)=[100]endeffector.body.shape.length(t)=2endeffector.body.radiusendeffector.body.shape.width(t)=2endeffector.body.radiusendeffector.body.shape.height(t)=2endeffector.body.radiusspeed.support.phi(t)=speed.phisupport(t)speed.support.tau(t)=speed.spline.tau(t)speed.phi(t)=speed.spline.phi(t)speed.phisupport(t)speed.w(t)=dspeed.phi(t)dtspeed.w(t)=speed.wref(t)w0const.y(t)=w0const.kworld.frameb.x(t)=0world.frameb.y(t)=0world.frameb.phi(t)=0connect(frameb,framevis+frame_a)world.framevis.phi(t)=world.framevis.frame_a.phi(t)world.framevis.x_shape.r(t)=arrayliteral([3],world.framevis.frame_a.x(t),world.framevis.frame_a.y(t),world.framevis.z_position)world.framevis.x_shape.R(t)=arrayliteral([33],cos(world.framevis.phi(t)),sin(world.framevis.phi(t)),0,sin(world.framevis.phi(t)),cos(world.framevis.phi(t)),0,0,0,1)world.framevis.x_shape.r_shape(t)=[000]world.framevis.x_shape.length_direction(t)=[100]world.framevis.x_shape.width_direction(t)=[001]world.framevis.x_shape.length(t)=world.framevis.axis_lengthworld.framevis.x_shape.width(t)=2world.framevis.axis_radiusworld.framevis.x_shape.height(t)=2world.framevis.axis_radiusworld.framevis.y_shape.r(t)=arrayliteral([3],world.framevis.frame_a.x(t),world.framevis.frame_a.y(t),world.framevis.z_position)world.framevis.y_shape.R(t)=arrayliteral([33],cos(world.framevis.phi(t)),sin(world.framevis.phi(t)),0,sin(world.framevis.phi(t)),cos(world.framevis.phi(t)),0,0,0,1)world.framevis.y_shape.r_shape(t)=[000]world.framevis.y_shape.length_direction(t)=[010]world.framevis.y_shape.width_direction(t)=[001]world.framevis.y_shape.length(t)=world.framevis.axis_lengthworld.framevis.y_shape.width(t)=2world.framevis.axis_radiusworld.framevis.y_shape.height(t)=2world.framevis.axis_radiusworld.framevis.z_shape.r(t)=arrayliteral([3],world.framevis.frame_a.x(t),world.framevis.frame_a.y(t),world.framevis.z_position)world.framevis.z_shape.R(t)=arrayliteral([33],cos(world.framevis.phi(t)),sin(world.framevis.phi(t)),0,sin(world.framevis.phi(t)),cos(world.framevis.phi(t)),0,0,0,1)world.framevis.z_shape.r_shape(t)=[000]world.framevis.z_shape.length_direction(t)=[001]world.framevis.z_shape.width_direction(t)=[100]world.framevis.z_shape.length(t)=world.framevis.axis_lengthworld.framevis.z_shape.width(t)=2world.framevis.axis_radiusworld.framevis.z_shape.height(t)=2world.framevis.axis_radiusfixed.spline.phi(t)=fixed.phi0]

Source

dyad
example component ParallelKinematicRobot
  base = MultibodyComponents.PlanarMechanics.Fixed(r = [0.0, 0.520]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 260, "y1": 630, "x2": 460, "y2": 830, "rot": 0}
      },
      "tags": []
    }
  }
  base2 = MultibodyComponents.PlanarMechanics.Fixed(r = [0.15, 0.525]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 0, "y1": 240, "x2": 200, "y2": 440, "rot": 0}
      },
      "tags": []
    }
  }
  base_a = MultibodyComponents.PlanarMechanics.Revolute(radius = 1.3 * link_radius, color = link_color) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 520, "y1": 630, "x2": 720, "y2": 830, "rot": 0}
      },
      "tags": []
    }
  }
  base2_b = MultibodyComponents.PlanarMechanics.Revolute(radius = 1.3 * link_radius, color = link_color) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 260, "y1": 240, "x2": 460, "y2": 440, "rot": 0}
      },
      "tags": []
    }
  }
  a_cd = MultibodyComponents.PlanarMechanics.Revolute(radius = 1.3 * link_radius, color = link_color) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 1040, "y1": 630, "x2": 1240, "y2": 830, "rot": 0}
      },
      "tags": []
    }
  }
  b_d = MultibodyComponents.PlanarMechanics.Revolute(radius = 1.3 * link_radius, color = link_color) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 780, "y1": 240, "x2": 980, "y2": 440, "rot": 0}
      },
      "tags": []
    }
  }
  upper_arm = MultibodyComponents.PlanarMechanics.BodyShape(m = link_mass, r = [0, a_length], radius = link_radius, color = link_color) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 780, "y1": 630, "x2": 980, "y2": 830, "rot": 0}
      },
      "tags": []
    }
  }
  link_b = MultibodyComponents.PlanarMechanics.BodyShape(m = link_mass, r = [0, b_length], radius = link_radius, color = link_color) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 520, "y1": 240, "x2": 720, "y2": 440, "rot": 0}
      },
      "tags": []
    }
  }
  link_c = MultibodyComponents.PlanarMechanics.BodyShape(m = link_mass, r = [-c_length, 0], radius = link_radius, color = link_color) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 1300, "y1": 630, "x2": 1500, "y2": 830, "rot": 0}
      },
      "tags": []
    }
  }
  link_d = MultibodyComponents.PlanarMechanics.BodyShape(m = link_mass, r = [d_length, 0], radius = link_radius, color = link_color) {
    "Dyad": {
      "placement": {
        "diagram": {
          "iconName": "default",
          "x1": 1170,
          "y1": 380,
          "x2": 1370,
          "y2": 580,
          "rot": 270
        }
      },
      "tags": []
    }
  }
  fixed_rotation_tf = MultibodyComponents.PlanarMechanics.FixedRotation(alpha = alpha_tf) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 1560, "y1": 630, "x2": 1760, "y2": 830, "rot": 0}
      },
      "tags": []
    }
  }
  end_effector = EndEffector() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 1810, "y1": 630, "x2": 2010, "y2": 830, "rot": 0}
      },
      "tags": []
    }
  }
  speed = RotationalComponents.Sources.SpeedSource() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 260, "y1": 860, "x2": 460, "y2": 1060, "rot": 0}
      },
      "tags": []
    }
  }
  w0_const = BlockComponents.Sources.Constant(k = w0) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 0, "y1": 860, "x2": 200, "y2": 1060, "rot": 0}
      },
      "tags": []
    }
  }
  world = MultibodyComponents.PlanarMechanics.World() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 0, "y1": 550, "x2": 200, "y2": 750, "rot": 0}
      },
      "tags": []
    }
  }
  fixed = RotationalComponents.Components.Fixed() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 310, "y1": 1130, "x2": 410, "y2": 1230, "rot": 0}
      },
      "tags": []
    }
  }
  parameter a_length::Length = 0.53
  parameter b_length::Length = 0.4374
  parameter c_length::Length = 0.5
  parameter d_length::Length = 0.15
  parameter link_mass::Dyad.Mass = 1.5
  parameter w0::AngularVelocity = -0.5
  "Initial angle of the base->a revolute joint"
  parameter phi0::Angle = deg2rad(10)
  parameter alpha_tf::Angle = 0
  parameter link_radius::Real = 0.03
  parameter link_color::Real[4] = [0.9, 0.9, 0.9, 1.0]
relations
  guess link_d.body.phi = 0
  guess link_d.translation.phi = 0
  guess link_b.translation.frame_b.fx = 1e-10
  guess end_effector.body.frame_a.tau = 1e-10
  guess link_b.translation.frame_b.fy = 1e-10
  guess link_b.body.phi = 1e-10
  guess link_b.translation.phi = 1e-10
  guess speed.phi = 1e-10
  guess end_effector.body.alpha = 1e-10
  initial base_a.phi = phi0
  # First chain: base → upper_arm → elbow
  connect(base.frame_b, base_a.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(base_a.frame_b, upper_arm.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(upper_arm.frame_b, a_cd.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(a_cd.frame_b, link_c.frame_a, link_d.frame_a) {
    "Dyad": {
      "edges": [
        {"S": 1, "M": [], "E": -1},
        {"S": -1, "M": [], "E": 2},
        {"S": -1, "M": [], "E": 3}
      ],
      "junctions": [{"x": 1270, "y": 730}],
      "renderStyle": "standard"
    }
  }
  # Second chain: base2 → link_b → link_d (closes the loop)
  connect(base2.frame_b, base2_b.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(base2_b.frame_b, link_b.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(link_b.frame_b, b_d.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(b_d.frame_b, link_d.frame_b) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 1270, "y": 340}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  # End-effector: on link_c via fixed rotation
  connect(link_c.frame_b, fixed_rotation_tf.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(fixed_rotation_tf.frame_b, end_effector.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  # Drive the base revolute at constant angular velocity
  connect(speed.spline, base_a.flange_a) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 620, "y": 960}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(w0_const.y, speed.w_ref) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(fixed.spline, speed.support) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
metadata {"Dyad": {"tests": {"case1": {"stop": 10}}}}
end
Flattened Source
dyad
example component ParallelKinematicRobot
  base = MultibodyComponents.PlanarMechanics.Fixed(r = [0.0, 0.520]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 260, "y1": 630, "x2": 460, "y2": 830, "rot": 0}
      },
      "tags": []
    }
  }
  base2 = MultibodyComponents.PlanarMechanics.Fixed(r = [0.15, 0.525]) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 0, "y1": 240, "x2": 200, "y2": 440, "rot": 0}
      },
      "tags": []
    }
  }
  base_a = MultibodyComponents.PlanarMechanics.Revolute(radius = 1.3 * link_radius, color = link_color) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 520, "y1": 630, "x2": 720, "y2": 830, "rot": 0}
      },
      "tags": []
    }
  }
  base2_b = MultibodyComponents.PlanarMechanics.Revolute(radius = 1.3 * link_radius, color = link_color) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 260, "y1": 240, "x2": 460, "y2": 440, "rot": 0}
      },
      "tags": []
    }
  }
  a_cd = MultibodyComponents.PlanarMechanics.Revolute(radius = 1.3 * link_radius, color = link_color) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 1040, "y1": 630, "x2": 1240, "y2": 830, "rot": 0}
      },
      "tags": []
    }
  }
  b_d = MultibodyComponents.PlanarMechanics.Revolute(radius = 1.3 * link_radius, color = link_color) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 780, "y1": 240, "x2": 980, "y2": 440, "rot": 0}
      },
      "tags": []
    }
  }
  upper_arm = MultibodyComponents.PlanarMechanics.BodyShape(m = link_mass, r = [0, a_length], radius = link_radius, color = link_color) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 780, "y1": 630, "x2": 980, "y2": 830, "rot": 0}
      },
      "tags": []
    }
  }
  link_b = MultibodyComponents.PlanarMechanics.BodyShape(m = link_mass, r = [0, b_length], radius = link_radius, color = link_color) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 520, "y1": 240, "x2": 720, "y2": 440, "rot": 0}
      },
      "tags": []
    }
  }
  link_c = MultibodyComponents.PlanarMechanics.BodyShape(m = link_mass, r = [-c_length, 0], radius = link_radius, color = link_color) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 1300, "y1": 630, "x2": 1500, "y2": 830, "rot": 0}
      },
      "tags": []
    }
  }
  link_d = MultibodyComponents.PlanarMechanics.BodyShape(m = link_mass, r = [d_length, 0], radius = link_radius, color = link_color) {
    "Dyad": {
      "placement": {
        "diagram": {
          "iconName": "default",
          "x1": 1170,
          "y1": 380,
          "x2": 1370,
          "y2": 580,
          "rot": 270
        }
      },
      "tags": []
    }
  }
  fixed_rotation_tf = MultibodyComponents.PlanarMechanics.FixedRotation(alpha = alpha_tf) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 1560, "y1": 630, "x2": 1760, "y2": 830, "rot": 0}
      },
      "tags": []
    }
  }
  end_effector = EndEffector() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 1810, "y1": 630, "x2": 2010, "y2": 830, "rot": 0}
      },
      "tags": []
    }
  }
  speed = RotationalComponents.Sources.SpeedSource() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 260, "y1": 860, "x2": 460, "y2": 1060, "rot": 0}
      },
      "tags": []
    }
  }
  w0_const = BlockComponents.Sources.Constant(k = w0) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 0, "y1": 860, "x2": 200, "y2": 1060, "rot": 0}
      },
      "tags": []
    }
  }
  world = MultibodyComponents.PlanarMechanics.World() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 0, "y1": 550, "x2": 200, "y2": 750, "rot": 0}
      },
      "tags": []
    }
  }
  fixed = RotationalComponents.Components.Fixed() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 310, "y1": 1130, "x2": 410, "y2": 1230, "rot": 0}
      },
      "tags": []
    }
  }
  parameter a_length::Length = 0.53
  parameter b_length::Length = 0.4374
  parameter c_length::Length = 0.5
  parameter d_length::Length = 0.15
  parameter link_mass::Dyad.Mass = 1.5
  parameter w0::AngularVelocity = -0.5
  "Initial angle of the base->a revolute joint"
  parameter phi0::Angle = deg2rad(10)
  parameter alpha_tf::Angle = 0
  parameter link_radius::Real = 0.03
  parameter link_color::Real[4] = [0.9, 0.9, 0.9, 1.0]
relations
  guess link_d.body.phi = 0
  guess link_d.translation.phi = 0
  guess link_b.translation.frame_b.fx = 1e-10
  guess end_effector.body.frame_a.tau = 1e-10
  guess link_b.translation.frame_b.fy = 1e-10
  guess link_b.body.phi = 1e-10
  guess link_b.translation.phi = 1e-10
  guess speed.phi = 1e-10
  guess end_effector.body.alpha = 1e-10
  initial base_a.phi = phi0
  # First chain: base → upper_arm → elbow
  connect(base.frame_b, base_a.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(base_a.frame_b, upper_arm.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(upper_arm.frame_b, a_cd.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(a_cd.frame_b, link_c.frame_a, link_d.frame_a) {
    "Dyad": {
      "edges": [
        {"S": 1, "M": [], "E": -1},
        {"S": -1, "M": [], "E": 2},
        {"S": -1, "M": [], "E": 3}
      ],
      "junctions": [{"x": 1270, "y": 730}],
      "renderStyle": "standard"
    }
  }
  # Second chain: base2 → link_b → link_d (closes the loop)
  connect(base2.frame_b, base2_b.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(base2_b.frame_b, link_b.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(link_b.frame_b, b_d.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(b_d.frame_b, link_d.frame_b) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 1270, "y": 340}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  # End-effector: on link_c via fixed rotation
  connect(link_c.frame_b, fixed_rotation_tf.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(fixed_rotation_tf.frame_b, end_effector.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  # Drive the base revolute at constant angular velocity
  connect(speed.spline, base_a.flange_a) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 620, "y": 960}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(w0_const.y, speed.w_ref) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(fixed.spline, speed.support) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
metadata {"Dyad": {"tests": {"case1": {"stop": 10}}}}
end


Test Cases

Test Case case1

  • Examples

  • Experiments

  • Analyses