50 #include "LinearMath/btVector3.h"
58 BigPuppySymmetricSpiralMetrics::BigPuppySymmetricSpiralMetrics(
int segments,
int hips,
int legs) :
62 m_subStructures = segments + hips + legs;
65 BigPuppySymmetricSpiralMetrics::~BigPuppySymmetricSpiralMetrics()
69 void BigPuppySymmetricSpiralMetrics::addNodesLeg(
tgStructure& s,
double r){
78 void BigPuppySymmetricSpiralMetrics::addRodsLeg(
tgStructure& s){
86 void BigPuppySymmetricSpiralMetrics::addNodesHip(
tgStructure& s,
double r){
93 void BigPuppySymmetricSpiralMetrics::addRodsHip(
tgStructure& s){
99 void BigPuppySymmetricSpiralMetrics::addNodesVertebra(
tgStructure& s,
double r){
107 void BigPuppySymmetricSpiralMetrics::addRodsVertebra(
tgStructure& s){
115 const double offsetDist = r+1;
116 const double offsetDist2 = offsetDist*6;
117 const double offsetDist3 = offsetDist2+2;
118 const double yOffset_leg = -(2*r+1);
119 const double yOffset_foot = -(2*r+6);
122 btVector3 offset(offsetDist,0.0,0);
124 btVector3 offset1(offsetDist*2,0.0,offsetDist);
125 btVector3 offset2(offsetDist2,0.0,offsetDist);
126 btVector3 offset3(offsetDist*2,0.0,-offsetDist);
127 btVector3 offset4(offsetDist2,0.0,-offsetDist);
129 btVector3 offset5(offsetDist3,yOffset_leg,offsetDist);
130 btVector3 offset6(offsetDist3,yOffset_leg,-offsetDist);
131 btVector3 offset7(r*2,yOffset_leg,offsetDist);
132 btVector3 offset8(r*2,yOffset_leg,-offsetDist);
134 btVector3 offset9(offsetDist3+1,yOffset_foot,offsetDist);
135 btVector3 offset10(offsetDist3+1,yOffset_foot,-offsetDist);
136 btVector3 offset11(r*2+1,yOffset_foot,offsetDist);
137 btVector3 offset12(r*2+1,yOffset_foot,-offsetDist);
139 for(std::size_t i = 0; i < m_segments; i++) {
141 t->addTags(
tgString(
"spine segment num", i + 1));
142 t->move((i + 1)*offset);
146 t->
addRotation(btVector3((i + 1) * offsetDist, 0.0, 0.0), btVector3(1, 0, 0), 0.0);
151 t->
addRotation(btVector3((i + 1) * offsetDist, 0.0, 0.0), btVector3(1, 0, 0), M_PI/2.0);
158 for(std::size_t i = m_segments; i < (m_segments + 2); i++) {
160 t->addTags(
tgString(
"segment num", i + 1));
164 t->
addRotation(btVector3(offsetDist2, 0.0, offsetDist), btVector3(0, 1, 0), M_PI);
169 t->
addRotation(btVector3(offsetDist*2, 0.0, offsetDist), btVector3(0, 1, 0), M_PI);
175 for(std::size_t i = (m_segments + 2); i < (m_segments + m_hips); i++) {
177 t->addTags(
tgString(
"segment num", i + 1));
190 for(std::size_t i = (m_segments + m_hips); i < (m_segments + m_hips + 2); i++) {
192 t->addTags(
tgString(
"segment num", i + 1));
196 t->
addRotation(btVector3(offsetDist3, yOffset_leg, offsetDist), btVector3(0, 1, 0), M_PI);
201 t->
addRotation(btVector3(r*2, yOffset_leg, offsetDist), btVector3(0, 1, 0), M_PI);
210 for(std::size_t i = (m_segments + m_hips + 2); i < (m_segments + m_hips + m_legs); i++) {
212 t->addTags(
tgString(
"segment num", i + 1));
216 t->
addRotation(btVector3(offsetDist3, yOffset_leg, -offsetDist), btVector3(0, 1, 0), M_PI);
221 t->
addRotation(btVector3(r*2, yOffset_leg, -offsetDist), btVector3(0, 1, 0), M_PI);
229 void BigPuppySymmetricSpiralMetrics::addMuscles(
tgStructure& puppy){
231 std::vector<tgStructure*> children = puppy.
getChildren();
232 for(std::size_t i = 2; i < (children.size() - (m_hips + m_legs)); i++) {
234 tgNodes n0 = children[i-2]->getNodes();
235 tgNodes n1 = children[i-1]->getNodes();
236 tgNodes n2 = children[i]->getNodes();
291 if (i >= 2 && i < 7){
309 tgNodes n0 = children[0]->getNodes();
310 tgNodes n1 = children[1]->getNodes();
311 tgNodes n2 = children[2]->getNodes();
312 tgNodes n3 = children[3]->getNodes();
313 tgNodes n4 = children[4]->getNodes();
314 tgNodes n5 = children[5]->getNodes();
315 tgNodes n6 = children[6]->getNodes();
316 tgNodes n7 = children[7]->getNodes();
317 tgNodes n8 = children[8]->getNodes();
318 tgNodes n9 = children[9]->getNodes();
319 tgNodes n10 = children[10]->getNodes();
320 tgNodes n11 = children[11]->getNodes();
321 tgNodes n12 = children[12]->getNodes();
322 tgNodes n13 = children[13]->getNodes();
323 tgNodes n14 = children[14]->getNodes();
333 puppy.
addPair(n7[1], n1[4],
tgString(
"all left shoulder front upper muscleAct1 seg", 7) +
tgString(
" seg", 1));
338 puppy.
addPair(n7[3], n1[4],
tgString(
"all left shoulder front lower muscleAct1 seg", 7) +
tgString(
" seg", 1));
339 puppy.
addPair(n7[3], n0[1],
tgString(
"all left shoulder front bottom muscleAct1 seg", 7) +
tgString(
" seg", 0));
340 puppy.
addPair(n7[3], n2[4],
tgString(
"all left shoulder rear bottom muscleAct1 seg", 7) +
tgString(
" seg", 2));
362 puppy.
addPair(n9[1], n1[2],
tgString(
"all right shoulder rear upper muscleAct1 seg", 9) +
tgString(
" seg", 1));
363 puppy.
addPair(n9[1], n1[3],
tgString(
"all right shoulder front upper muscleAct1 seg", 9) +
tgString(
" seg", 1));
367 puppy.
addPair(n9[3], n1[2],
tgString(
"all right shoulder rear lower muscleAct1 seg", 9) +
tgString(
" seg", 1));
368 puppy.
addPair(n9[3], n1[3],
tgString(
"all right shoulder front lower muscleAct1 seg", 9) +
tgString(
" seg", 1));
369 puppy.
addPair(n9[3], n0[1],
tgString(
"all right shoulder front bottom muscleAct1 seg", 9) +
tgString(
" seg", 0));
370 puppy.
addPair(n9[3], n2[4],
tgString(
"all right shoulder rear bottom muscleAct1 seg", 9) +
tgString(
" seg", 2));
396 puppy.
addPair(n11[4], n1[4],
tgString(
"left foreleg front abdomen connection muscle seg", 11) +
tgString(
" seg", 1));
397 puppy.
addPair(n11[3], n1[1],
tgString(
"left foreleg front abdomen connection muscle seg", 11) +
tgString(
" seg", 1));
398 puppy.
addPair(n11[2], n1[4],
tgString(
"left foreleg front abdomen connection muscle seg", 11) +
tgString(
" seg", 1));
403 puppy.
addPair(n11[2], n7[3],
tgString(
"left foreleg outer front tricep muscle seg", 11) +
tgString(
" seg", 7));
404 puppy.
addPair(n11[2], n7[2],
tgString(
"left foreleg inner front tricep muscle seg", 11) +
tgString(
" seg", 7));
412 puppy.
addPair(n13[4], n1[3],
tgString(
"right foreleg front abdomen connection muscle seg", 13) +
tgString(
" seg", 1));
413 puppy.
addPair(n13[3], n1[2],
tgString(
"right foreleg front abdomen connection muscle seg", 13) +
tgString(
" seg", 1));
414 puppy.
addPair(n13[2], n1[3],
tgString(
"right foreleg front abdomen connection muscle seg", 13) +
tgString(
" seg", 1));
420 puppy.
addPair(n13[2], n9[2],
tgString(
"right foreleg inner front tricep muscle seg", 13) +
tgString(
" seg", 9));
421 puppy.
addPair(n13[2], n9[3],
tgString(
"right foreleg outer front tricep muscle seg", 13) +
tgString(
" seg", 9));
430 puppy.
addPair(n12[4], n3[1],
tgString(
"left hindleg rear abdomen connection muscle seg", 12) +
tgString(
" seg", 3));
431 puppy.
addPair(n12[3], n5[1],
tgString(
"left hindleg rear abdomen connection muscle seg", 12) +
tgString(
" seg", 5));
432 puppy.
addPair(n12[2], n5[4],
tgString(
"left hindleg rear abdomen connection muscle seg", 12) +
tgString(
" seg", 5));
447 puppy.
addPair(n14[4], n3[2],
tgString(
"right hindleg rear abdomen connection muscle seg", 14) +
tgString(
" seg", 3));
448 puppy.
addPair(n14[3], n5[2],
tgString(
"right hindleg rear abdomen connection muscle seg", 14) +
tgString(
" seg", 5));
449 puppy.
addPair(n14[2], n5[3],
tgString(
"right hindleg rear abdomen connection muscle seg", 14) +
tgString(
" seg", 5));
455 puppy.
addPair(n14[2], n10[2],
tgString(
"right hindleg inner front calf muscle seg", 14) +
tgString(
" seg", 10));
456 puppy.
addPair(n14[2], n10[3],
tgString(
"right hindleg outer front calf muscle seg", 14) +
tgString(
" seg", 10));
466 const double density = 4.2/300.0;
467 const double radius = 0.5;
468 const double rod_space = 10.0;
469 const double rod_space2 = 8.0;
470 const double friction = 0.5;
471 const double rollFriction = 0.0;
472 const double restitution = 0.0;
474 const tgRod::Config rodConfig(radius, density, friction, rollFriction, restitution);
476 const double stiffness = 1000.0;
477 const double stiffnessPassive = 4000.0;
478 const double stiffnessPassive2 = 3000.0;
479 const double damping = .01*stiffness;
480 const double pretension = 0.0;
481 const bool history =
true;
482 const double maxTens = 7000.0;
483 const double maxSpeed = 12.0;
485 const double passivePretension = 1000;
486 const double passivePretension2 = 3500;
487 const double passivePretension3 = 3500;
488 const double passivePretension4 = 2500.0;
492 const double mRad = 1.0;
493 const double motorFriction = 10.0;
494 const double motorInertia = 1.0;
495 const bool backDrivable =
false;
496 #ifdef PASSIVE_STRUCTURE
498 mRad, motorFriction, motorInertia, backDrivable,
499 history, maxTens, maxSpeed);
501 mRad, motorFriction, motorInertia, backDrivable,
502 history, maxTens, maxSpeed);
505 mRad, motorFriction, motorInertia, backDrivable,
506 history, maxTens, maxSpeed);
508 mRad, motorFriction, motorInertia, backDrivable,
509 history, maxTens, maxSpeed);
512 mRad, motorFriction, motorInertia, backDrivable,
513 history, maxTens, maxSpeed);
516 mRad, motorFriction, motorInertia, backDrivable,
517 history, maxTens, maxSpeed);
520 mRad, motorFriction, motorInertia, backDrivable,
521 history, maxTens, maxSpeed);
523 mRad, motorFriction, motorInertia, backDrivable,
524 history, maxTens, maxSpeed);
529 #ifdef PASSIVE_STRUCTURE
546 addNodesLeg(leg,rod_space);
551 addNodesVertebra(vertebra,rod_space);
552 addRodsVertebra(vertebra);
556 addNodesHip(hip,rod_space);
562 const double yOffset_foot = -(2*rod_space+6);
564 addSegments(puppy,vertebra,hip,leg,rod_space);
566 puppy.move(btVector3(0.0,-yOffset_foot,0.0));
571 std::vector<tgStructure*> children = puppy.
getChildren();
575 spec.addBuilder(
"rod",
new tgRodInfo(rodConfig));
579 #ifdef PASSIVE_STRUCTURE
593 #ifdef PASSIVE_STRUCTURE
617 m_allMuscles = tgCast::filter<tgModel, tgSpringCableActuator> (
getDescendants());
619 m_allSegments = this->find<tgModel> (
"segment");
632 throw std::invalid_argument(
"dt is not positive");
const std::vector< tgStructure * > & getChildren() const
void addChild(tgStructure *child)
Definition of class tgRodInfo.
virtual void setup(tgWorld &world)
Convenience function for combining strings with ints, mostly for naming structures.
virtual void step(double dt)
Definition of class tgBasicActuatorInfo.
Contains the definition of class tgSimulation.
Contains the definition of class tgModel.
void addPair(int fromNodeIdx, int toNodeIdx, std::string tags="")
Contains the definition of class tgSimViewGraphics.
Contains the definition of abstract base class tgSpringCableActuator. Assumes that the string is line...
virtual void setup(tgWorld &world)
void addRotation(const btVector3 &fixedPoint, const btVector3 &axis, double angle)
Implementing the Flemons quadruped model (roughly), but as a subclass of Brian's BaseSpineModelLearni...
Contains the definition of class tgBasicActuator.
std::string tgString(std::string s, int i)
Contains the definition of class tgWorld $Id$.
Definition of class tgStructure.
Definition of class tgStructureInfo.
virtual void step(double dt)
Contains the definition of class tgSimView.
Definition of class tgKinematicActuatorInfo.
Contains the definition of class tgRod.
Definition of class tgBuildSpec.
std::vector< tgModel * > getDescendants() const
void buildInto(tgModel &model, tgWorld &world)
void addNode(double x, double y, double z, std::string tags="")