use of artisynth.core.mechmodels.PlanarConnector in project artisynth_core by artisynth.
the class ForceTarget method prerender.
@Override
public void prerender(RenderList list) {
super.prerender(list);
if (myConnector instanceof PlanarConnector) {
RigidTransform3d TDW = myConnector.getCurrentTDW();
startvec = TDW.p;
endvec.transform(TDW, Vector3d.Z_UNIT);
endvec.scale(arrowSize / endvec.norm());
endvec.scale(myTargetLambda.get(0));
endvec.add(startvec);
set(start, startvec);
set(end, endvec);
} else if (myConnector instanceof SphericalJointBase) {
startvec = myConnector.getCurrentTCW().p;
endvec.x = myTargetLambda.get(0) * arrowSize;
endvec.y = myTargetLambda.get(1) * arrowSize;
endvec.z = myTargetLambda.get(2) * arrowSize;
endvec.add(startvec);
set(start, startvec);
set(end, endvec);
}
}
use of artisynth.core.mechmodels.PlanarConnector in project artisynth_core by artisynth.
the class ForceTargetDemo method build.
public void build(String[] args) throws IOException {
// create MechModel and add to RootModel
mech = new MechModel("mech");
addModel(mech);
// create the components
p1 = new Particle("p1", /*mass=*/
2, /*x,y,z=*/
0, 0, 0.15);
p2 = new Particle("p2", 2, 10, 0, 0.15);
p3 = new Particle("p3", 2, 5, 5, 0);
p4 = new Particle("p4", 2, 5, -5, 0);
p5 = new Particle("p5", 0, 5, 0, 5);
p6 = new Particle("p6", 0, 5, 0, -5);
box = RigidBody.createBox("box", /*wx,wy,wz=*/
0.5, 0.3, 0.3, /*density=*/
1);
box.setPose(new RigidTransform3d(/*x,y,z=*/
5, 0, -0.15));
// create marker point and connect it to the box:
FrameMarker mkr = new FrameMarker(/*x,y,z=*/
0, 0, 0.15);
mkr.setFrame(box);
// create the muscle:
muscle = new Muscle("mus1", /*restLength=*/
5);
muscle.setPoints(p1, mkr);
muscle.setMaterial(new SimpleAxialMuscle(/*stiffness=*/
0, /*damping=*/
10, /*maxf=*/
1000));
muscle2 = new Muscle("mus2", /*restLength=*/
5);
muscle2.setPoints(p2, mkr);
muscle2.setMaterial(new SimpleAxialMuscle(/*stiffness=*/
0, /*damping=*/
10, /*maxf=*/
1000));
muscle3 = new Muscle("mus3", /*restLength=*/
5);
muscle3.setPoints(p3, mkr);
muscle3.setMaterial(new SimpleAxialMuscle(/*stiffness=*/
0, /*damping=*/
10, /*maxf=*/
4000));
muscle4 = new Muscle("mus4", /*restLength=*/
5);
muscle4.setPoints(p4, mkr);
muscle4.setMaterial(new SimpleAxialMuscle(/*stiffness=*/
0, /*damping=*/
10, /*maxf=*/
4000));
muscle5 = new Muscle("mus5", /*restLength=*/
5);
muscle5.setPoints(p5, mkr);
muscle5.setMaterial(new SimpleAxialMuscle(/*stiffness=*/
0, /*damping=*/
10, /*maxf=*/
4000));
muscle6 = new Muscle("mus6", /*restLength=*/
5);
muscle6.setPoints(p6, mkr);
muscle6.setMaterial(new SimpleAxialMuscle(/*stiffness=*/
0, /*damping=*/
10, /*maxf=*/
4000));
if (two_cons == true) {
RigidTransform3d XPW = new RigidTransform3d(5, 0, 0);
XPW.R.mulAxisAngle(1, 0, 0, Math.toRadians(90));
// Connection on the corner
// PlanarConnector connector =
// new PlanarConnector (box, new Vector3d (lenx/2, -2.5, 1.5), XPW);
// Connection in the center
con = new PlanarConnector(box, new Vector3d(0, 0, 0.15), XPW);
con.setUnilateral(false);
con.setPlaneSize(2);
RenderProps props = con.createRenderProps();
props.setPointColor(Color.blue);
props.setPointStyle(Renderer.PointStyle.SPHERE);
props.setPointRadius(0.06);
con.setRenderProps(props);
// con = new ParticlePlaneConstraint(p5, pl);
// RenderProps.setDrawEdges (con, true);
// RenderProps.setVisible (con, true);
RigidTransform3d XPW2 = new RigidTransform3d(5, 0, 0);
XPW2.R.mulAxisAngle(1, 0, 0, 0);
// Connection on the corner
// PlanarConnector connector =
// new PlanarConnector (box, new Vector3d (lenx/2, -2.5, 1.5), XPW);
// Connection in the center
con2 = new PlanarConnector(box, new Vector3d(0, 0, 0.15), XPW2);
con2.setUnilateral(false);
con2.setPlaneSize(2);
con2.setRenderProps(props);
} else {
RigidTransform3d XPW = new RigidTransform3d(5, 0, 0);
XPW.R.mulAxisAngle(1, 0, 0, Math.toRadians(45));
con = new PlanarConnector(box, new Vector3d(0, 0, 0.15), XPW);
con.setUnilateral(false);
con.setPlaneSize(2);
RenderProps props = con.createRenderProps();
props.setPointColor(Color.blue);
props.setPointStyle(Renderer.PointStyle.SPHERE);
props.setPointRadius(0.06);
con.setRenderProps(props);
}
// con.setRenderProps (myRenderProps);
// add components to the mech model
mech.addParticle(p1);
mech.addParticle(p2);
mech.addParticle(p3);
mech.addParticle(p4);
mech.addParticle(p5);
mech.addParticle(p6);
mech.addRigidBody(box);
mech.addFrameMarker(mkr);
// mech.addParticle (p5);
mech.addAxialSpring(muscle);
mech.addAxialSpring(muscle2);
mech.addAxialSpring(muscle3);
mech.addAxialSpring(muscle4);
mech.addAxialSpring(muscle5);
mech.addAxialSpring(muscle6);
con.setName("con1");
if (two_cons == true) {
con2.setName("con2");
}
if (cons == true) {
mech.addBodyConnector(con);
ConnectorForceRenderer rend = new ConnectorForceRenderer(con);
myRenderProps = rend.createRenderProps();
myRenderProps.setLineStyle(LineStyle.CYLINDER);
myRenderProps.setLineRadius(0.175);
myRenderProps.setLineColor(Color.BLUE);
rend.setRenderProps(myRenderProps);
rend.setArrowSize(0.1);
addMonitor(rend);
}
if (two_cons == true) {
mech.addBodyConnector(con2);
}
// first particle set to be fixed
p1.setDynamic(false);
p2.setDynamic(false);
p3.setDynamic(false);
p4.setDynamic(false);
p5.setDynamic(false);
p6.setDynamic(false);
// increase model bounding box for the viewer
mech.setBounds(/*min=*/
-1, 0, -1, /*max=*/
1, 0, 0);
// set render properties for the components
setPointRenderProps(p1);
setPointRenderProps(p2);
setPointRenderProps(p3);
setPointRenderProps(p4);
setPointRenderProps(p5);
setPointRenderProps(p6);
setPointRenderProps(mkr);
setLineRenderProps(muscle);
setLineRenderProps(muscle2);
setLineRenderProps(muscle3);
setLineRenderProps(muscle4);
setLineRenderProps(muscle5);
setLineRenderProps(muscle6);
addTrackingController(mkr);
if (cons = true) {
addConForceProbe(10, 0.1);
}
}
use of artisynth.core.mechmodels.PlanarConnector in project artisynth_core by artisynth.
the class MechModelDemo method build.
public void build(String[] args) {
myMech = new MechModel("mechMod");
// mechMod.setProfiling (true);
myMech.setGravity(0, 0, -50);
// myMech.setRigidBodyDamper (new FrameDamper (1.0, 4.0));
myMech.setFrameDamping(1.0);
myMech.setRotaryDamping(4.0);
myMech.setIntegrator(MechSystemSolver.Integrator.SymplecticEuler);
RigidTransform3d XMB = new RigidTransform3d();
RigidTransform3d XLW = new RigidTransform3d();
RigidTransform3d TCA = new RigidTransform3d();
RigidTransform3d TCB = new RigidTransform3d();
RigidTransform3d XAB = new RigidTransform3d();
PolygonalMesh mesh;
// number of slices for approximating a circle
int nslices = 16;
// // set view so tha points upwards
// X.R.setAxisAngle (1, 0, 0, -Math.PI/2);
// viewer.setTransform (X);
double lenx0 = 15;
double leny0 = 15;
double lenz0 = 1.5;
RigidBody base = new RigidBody("base");
base.setInertia(SpatialInertia.createBoxInertia(10, lenx0, leny0, lenz0));
mesh = MeshFactory.createBox(lenx0, leny0, lenz0);
// XMB.setIdentity();
// XMB.R.setAxisAngle (1, 1, 1, 2*Math.PI/3);
// mesh.transform (XMB);
// mesh.setRenderMaterial (Material.createSpecial (Material.GRAY));
base.setMesh(mesh, /* fileName= */
null);
XLW.setIdentity();
XLW.p.set(0, 0, 22);
base.setPose(XLW);
base.setDynamic(false);
myMech.addRigidBody(base);
RenderProps props;
FrameMarker mk0 = new FrameMarker();
props = mk0.createRenderProps();
// props.setColor (Color.GREEN);
props.setPointRadius(0.5);
props.setPointStyle(Renderer.PointStyle.SPHERE);
mk0.setRenderProps(props);
myMech.addFrameMarker(mk0, base, new Point3d(lenx0 / 2, leny0 / 2, 0));
FrameMarker mk1 = new FrameMarker();
mk1.setRenderProps(props);
myMech.addFrameMarker(mk1, base, new Point3d(-lenx0 / 2, -leny0 / 2, 0));
FrameMarker mk2 = new FrameMarker();
mk2.setRenderProps(props);
FrameMarker mk3 = new FrameMarker();
mk3.setRenderProps(props);
double ks = 10;
double ds = 10;
AxialSpring spr0 = new AxialSpring(50, 10, 0);
AxialSpring spr1 = new AxialSpring(50, 10, 0);
props = spr0.createRenderProps();
props.setLineStyle(Renderer.LineStyle.CYLINDER);
props.setLineRadius(0.2);
props.setLineColor(Color.RED);
spr0.setRenderProps(props);
spr1.setRenderProps(props);
// myMech.addRigidBody (base);
// first link
double lenx1 = 10;
double leny1 = 2;
double lenz1 = 3;
RigidBody link1 = new RigidBody("link1");
link1.setInertia(SpatialInertia.createBoxInertia(10, lenx1, leny1, lenz1));
mesh = MeshFactory.createRoundedBox(lenx1, leny1, lenz1, nslices / 2);
XMB.setIdentity();
XMB.R.setAxisAngle(1, 1, 1, 2 * Math.PI / 3);
mesh.transform(XMB);
// mesh.setRenderMaterial (Material.createSpecial (Material.GRAY));
link1.setMesh(mesh, /* fileName= */
null);
XLW.R.setAxisAngle(1, 0, 0, Math.PI / 2);
// XLW.R.mulAxisAngle (0, 1, 0, Math.PI/4);
XLW.p.set(0, 0, 1.5 * lenx1);
link1.setPose(XLW);
myMech.addRigidBody(link1);
myMech.addFrameMarker(mk2, link1, new Point3d(-lenx1 / 2, 0, -lenz1 / 2));
myMech.addFrameMarker(mk3, link1, new Point3d(-lenx1 / 2, 0, lenz1 / 2));
// // joint 1
// if (usePlanarJoint)
// {
// TCA.setIdentity();
// TCA.p.set (-lenx1/2, 0, 0);
// TCA.R.setAxisAngle (1, 0, 0, -Math.PI/2);
// TCB.p.set (0, 0, lenx1);
// // TCB.R.setAxisAngle (1, 0, 0, -Math.PI/2);
// PlanarConnector planar =
// new PlanarConnector (link1, TCA.p, TCB);
// planar.setName ("plane1");
// planar.setPlaneSize (20);
// RenderProps.setColor (planar, Color.BLUE);
// joint1 = planar;
// }
// else
// {
// TCA.setIdentity();
// TCA.p.set (-lenx1/2, 0, 0);
// // TCA.R.mulAxisAngle (0, 1, 0, Math.PI/4);
// TCB.set (link1.myState.XFrameToWorld);
// TCB.mul (TCA);
// RevoluteJoint rjoint = new RevoluteJoint (link1, TCA, TCB);
// rjoint.setName ("joint1");
// rjoint.setAxisLength (4);
// RenderProps.setLineRadius(rjoint, 0.2);
// joint1 = rjoint;
// // SphericalJoint sjoint = new SphericalJoint (
// // link1, TCA, TCB);
// // sjoint.setName ("joint1");
// // sjoint.setAxisLength (5);
// // joint1 = sjoint;
// }
// second link
double lenx2 = 10;
double leny2 = 2;
double lenz2 = 2;
RigidBody link2 = new RigidBody("link2");
if (// useSphericalJoint)
false) {
mesh = MeshFactory.createRoundedCylinder(leny2 / 2, lenx2, nslices, /*nsegs=*/
1, /*flatBottom=*/
false);
link2.setInertia(SpatialInertia.createBoxInertia(10, leny2, leny2, lenx2));
XLW.R.setAxisAngle(1, 0, 0, Math.PI / 2);
XLW.p.set(lenx1 / 2, lenx2 / 2, lenx1);
link2.setPose(XLW);
}
mesh = MeshFactory.createRoundedCylinder(leny2 / 2, lenx2, nslices, /*nsegs=*/
1, /*flatBottom=*/
false);
mesh.transform(XMB);
link2.setInertia(SpatialInertia.createBoxInertia(10, lenx2, leny2, lenz2));
XLW.R.setAxisAngle(1, 0, 0, Math.PI / 2);
XLW.p.set(lenx1 / 2 + lenx2 / 2, 0, 1.5 * lenx1);
if (useSphericalJoint) {
// Math.PI/4;
double ang = 0;
XLW.R.mulAxisAngle(0, 1, 0, ang);
XLW.p.y += Math.sin(ang) * lenx2 / 2;
XLW.p.x -= (1 - Math.cos(ang)) * lenx2 / 2;
}
link2.setPose(XLW);
link2.setMesh(mesh, /* fileName= */
null);
myMech.addRigidBody(link2);
BodyConnector joint2 = null;
// joint 2
if (useSphericalJoint) {
TCA.setIdentity();
TCA.p.set(-lenx2 / 2, 0, 0);
XAB.mulInverseLeft(link1.getPose(), link2.getPose());
TCB.mul(XAB, TCA);
SphericalJoint sjoint = new SphericalJoint(link2, TCA, link1, TCB);
// RevoluteJoint joint2 = new RevoluteJoint (link2, TCA, TCB);
sjoint.setName("joint2");
// RenderProps.setLineRadius(sjoint, 0.2);
sjoint.setAxisLength(4);
joint2 = sjoint;
} else {
TCA.setIdentity();
TCA.p.set(-lenx2 / 2, 0, 0);
// TCA.R.mulAxisAngle (1, 0, 0, -Math.toRadians(90));
XAB.mulInverseLeft(link1.getPose(), link2.getPose());
TCB.mul(XAB, TCA);
RevoluteJoint rjoint = new RevoluteJoint(link2, TCA, link1, TCB);
// TCB.mul (link2.getPose(), TCA);
// RevoluteJoint rjoint =
// new RevoluteJoint (link2, TCA, TCB);
// RigidTransform3d X = new RigidTransform3d();
// X.R.setAxisAngle (1, 0, 0, -Math.toRadians(90));
// X.mul (TCB, X);
// X.mulInverseRight (X, TCB);
// rjoint.transformGeometry (X);
// rjoint.printData();
rjoint.setName("joint2");
rjoint.setAxisLength(4);
RenderProps.setLineRadius(rjoint, 0.2);
// RigidTransform3d X = new RigidTransform3d();
// RigidTransform3d TDW = rjoint.getXDW();
// System.out.println ("getXDW=\n" + TDW.toString("%8.3f"));
// X.R.setAxisAngle (1, 0, 0, Math.toRadians(80));
// X.mulInverseRight (X, TDW);
// X.mul (TDW, X);
// rjoint.transformGeometry (X, rjoint);
joint2 = rjoint;
}
// myMech.addBodyConnector (joint1);
if (joint2 != null) {
myMech.addBodyConnector(joint2);
}
myMech.attachAxialSpring(mk0, mk2, spr0);
myMech.attachAxialSpring(mk1, mk3, spr1);
if (usePlanarContacts) {
TCA.setIdentity();
TCA.p.set(lenx2 / 2 + leny2 / 2, 0, 0);
TCB.setIdentity();
// TCB.p.set (0, 0, -lenx2/2);
// TCB.p.set (0, 0, lenx2/2);
TCB.R.setIdentity();
TCB.R.setAxisAngle(0, 0, 1, Math.PI / 2);
TCB.R.mulAxisAngle(1, 0, 0, Math.toRadians(20));
PlanarConnector contact1 = new PlanarConnector(link2, TCA.p, TCB);
contact1.setUnilateral(true);
contact1.setName("contact1");
contact1.setPlaneSize(20);
RenderProps.setFaceColor(contact1, new Color(0.5f, 0.5f, 1f));
RenderProps.setAlpha(contact1, 0.5);
myMech.addBodyConnector(contact1);
TCB.R.setIdentity();
TCB.R.setAxisAngle(0, 0, 1, Math.PI / 2);
TCB.R.mulAxisAngle(1, 0, 0, -Math.toRadians(20));
PlanarConnector contact2 = new PlanarConnector(link2, TCA.p, TCB);
contact2.setUnilateral(true);
contact2.setName("contact2");
contact2.setPlaneSize(20);
RenderProps.setFaceColor(contact2, new Color(0.5f, 0.5f, 1f));
RenderProps.setAlpha(contact2, 0.5);
myMech.addBodyConnector(contact2);
}
myMech.setBounds(new Point3d(0, 0, -10), new Point3d(0, 0, 10));
addModel(myMech);
addControlPanel(myMech);
// RigidTransform3d X = new RigidTransform3d (link1.getPose());
// X.R.mulRpy (Math.toRadians(-10), 0, 0);
// link1.setPose (X);
// myMech.projectRigidBodyPositionConstraints();
// myMech.setProfiling (true);
// myMech.setIntegrator (Integrator.ForwardEuler);
// addBreakPoint (0.57);
}
use of artisynth.core.mechmodels.PlanarConnector in project artisynth_core by artisynth.
the class FrameMarkerEditor method applyAction.
public void applyAction(String actionCommand, LinkedList<ModelComponent> selection, Rectangle popupBounds) {
if (containsSingleSelection(selection, FrameMarker.class)) {
if (actionCommand == "Add PlanarConnector") {
FrameMarker mkr = (FrameMarker) selection.get(0);
RigidTransform3d XPW = new RigidTransform3d();
XPW.p.set(mkr.getPosition());
if (mkr.getFrame() instanceof RigidBody && mkr.getGrandParent() instanceof MechModel) {
PlanarConnector pc = new PlanarConnector();
pc.set((RigidBody) mkr.getFrame(), mkr.getLocation(), Vector3d.Z_UNIT);
pc.setPlaneSize(getDefaultPlaneSize());
((MechModel) mkr.getGrandParent()).addBodyConnector(pc);
} else {
System.out.println("Unable to create PlanarConnector from selected FrameMarker");
}
}
}
}
use of artisynth.core.mechmodels.PlanarConnector in project artisynth_core by artisynth.
the class ForceTarget method addForceJacobian.
public int addForceJacobian(SparseBlockMatrix J, int bi, int solve_index) {
MatrixBlock blk = null;
if (myConnector instanceof PlanarConnector) {
blk = new Matrix1x1Block();
blk.set(0, 0, 1d);
J.addBlock(bi, solve_index, blk);
} else if (myConnector instanceof SphericalJointBase) {
blk = new Matrix3x3DiagBlock(1d, 1d, 1d);
J.addBlock(bi, solve_index, blk);
} else {
System.err.println("ForceTarget.addForceJacobian: unsupported connector type: " + myConnector.getClass());
}
return bi++;
}
Aggregations