50 #include "LinearMath/btVector3.h"
56 #define PASSIVE_STRUCTURE
58 BigPuppyNoFeet::BigPuppyNoFeet(
int segments,
int hips,
int legs,
int feet) :
66 BigPuppyNoFeet::~BigPuppyNoFeet()
70 void BigPuppyNoFeet::addNodesFoot(
tgStructure& s,
double r1,
double r2){
88 void BigPuppyNoFeet::addNodesLeg(
tgStructure& s,
double r){
105 void BigPuppyNoFeet::addNodesHip(
tgStructure& s,
double r){
118 void BigPuppyNoFeet::addNodesVertebra(
tgStructure& s,
double r){
126 void BigPuppyNoFeet::addRodsVertebra(
tgStructure& s){
135 const double offsetDist = r+1;
136 const double offsetDist2 = offsetDist*6;
137 const double offsetDist3 = offsetDist2+2;
138 const double yOffset_leg = -(2*r+1);
139 const double yOffset_foot = -(2*r+6);
142 btVector3 offset(offsetDist,0.0,0);
144 btVector3 offset1(offsetDist*2,0.0,offsetDist);
145 btVector3 offset2(offsetDist2,0.0,offsetDist);
146 btVector3 offset3(offsetDist*2,0.0,-offsetDist);
147 btVector3 offset4(offsetDist2,0.0,-offsetDist);
149 btVector3 offset5(offsetDist3,yOffset_leg,offsetDist);
150 btVector3 offset6(offsetDist3,yOffset_leg,-offsetDist);
151 btVector3 offset7(r*2,yOffset_leg,offsetDist);
152 btVector3 offset8(r*2,yOffset_leg,-offsetDist);
154 btVector3 offset9(offsetDist3+1,yOffset_foot,offsetDist);
155 btVector3 offset10(offsetDist3+1,yOffset_foot,-offsetDist);
156 btVector3 offset11(r*2+1,yOffset_foot,offsetDist);
157 btVector3 offset12(r*2+1,yOffset_foot,-offsetDist);
159 for(std::size_t i = 0; i < m_segments; i++) {
161 t->addTags(
tgString(
"spine segment num", i + 1));
162 t->move((i + 1)*offset);
166 t->
addRotation(btVector3((i + 1) * offsetDist, 0.0, 0.0), btVector3(1, 0, 0), 0.0);
171 t->
addRotation(btVector3((i + 1) * offsetDist, 0.0, 0.0), btVector3(1, 0, 0), M_PI/2.0);
178 for(std::size_t i = m_segments; i < (m_segments + 2); i++) {
180 t->addTags(
tgString(
"segment num", i + 1));
184 t->
addRotation(btVector3(offsetDist2, 0.0, offsetDist), btVector3(0, 1, 0), M_PI);
189 t->
addRotation(btVector3(offsetDist*2, 0.0, offsetDist), btVector3(0, 1, 0), M_PI);
195 for(std::size_t i = (m_segments + 2); i < (m_segments + m_hips); i++) {
197 t->addTags(
tgString(
"segment num", i + 1));
210 for(std::size_t i = (m_segments + m_hips); i < (m_segments + m_hips + 2); 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);
230 for(std::size_t i = (m_segments + m_hips + 2); i < (m_segments + m_hips + m_legs); i++) {
232 t->addTags(
tgString(
"segment num", i + 1));
236 t->
addRotation(btVector3(offsetDist3, yOffset_leg, -offsetDist), btVector3(0, 1, 0), M_PI);
241 t->
addRotation(btVector3(r*2, yOffset_leg, -offsetDist), btVector3(0, 1, 0), M_PI);
282 void BigPuppyNoFeet::addMuscles(
tgStructure& puppy){
284 std::vector<tgStructure*> children = puppy.
getChildren();
285 for(std::size_t i = 2; i < (children.size() - (m_hips + m_legs)); i++) {
287 tgNodes n0 = children[i-2]->getNodes();
288 tgNodes n1 = children[i-1]->getNodes();
289 tgNodes n2 = children[i]->getNodes();
356 tgNodes n0 = children[0]->getNodes();
357 tgNodes n1 = children[1]->getNodes();
358 tgNodes n2 = children[2]->getNodes();
359 tgNodes n3 = children[3]->getNodes();
360 tgNodes n4 = children[4]->getNodes();
361 tgNodes n5 = children[5]->getNodes();
362 tgNodes n6 = children[6]->getNodes();
363 tgNodes n7 = children[7]->getNodes();
364 tgNodes n8 = children[8]->getNodes();
365 tgNodes n9 = children[9]->getNodes();
366 tgNodes n10 = children[10]->getNodes();
367 tgNodes n11 = children[11]->getNodes();
368 tgNodes n12 = children[12]->getNodes();
369 tgNodes n13 = children[13]->getNodes();
370 tgNodes n14 = children[14]->getNodes();
530 const double density = 4.2/300.0;
531 const double radius = 0.5;
532 const double rod_space = 10.0;
533 const double rod_space2 = 8.0;
534 const double friction = 0.5;
535 const double rollFriction = 0.0;
536 const double restitution = 0.0;
538 const tgRod::Config rodConfig(radius, density, friction, rollFriction, restitution);
540 const double stiffness = 1000.0;
541 const double stiffnessPassive = 3000.0;
542 const double damping = .01*stiffness;
543 const double pretension = 0.0;
544 const bool history =
true;
545 const double maxTens = 7000.0;
546 const double maxSpeed = 12.0;
548 const double passivePretension = 1000;
549 const double passivePretension2 = 2500;
550 const double passivePretension3 = 2500;
554 const double mRad = 1.0;
555 const double motorFriction = 10.0;
556 const double motorInertia = 1.0;
557 const bool backDrivable =
false;
558 #ifdef PASSIVE_STRUCTURE
560 mRad, motorFriction, motorInertia, backDrivable,
561 history, maxTens, maxSpeed);
564 mRad, motorFriction, motorInertia, backDrivable,
565 history, maxTens, maxSpeed);
568 mRad, motorFriction, motorInertia, backDrivable,
569 history, maxTens, maxSpeed);
571 mRad, motorFriction, motorInertia, backDrivable,
572 history, maxTens, maxSpeed);
576 mRad, motorFriction, motorInertia, backDrivable,
577 history, maxTens, maxSpeed);
580 mRad, motorFriction, motorInertia, backDrivable,
581 history, maxTens, maxSpeed);
584 mRad, motorFriction, motorInertia, backDrivable,
585 history, maxTens, maxSpeed);
587 mRad, motorFriction, motorInertia, backDrivable,
588 history, maxTens, maxSpeed);
593 #ifdef PASSIVE_STRUCTURE
615 addNodesLeg(leg,rod_space);
620 addNodesVertebra(vertebra,rod_space);
621 addRodsVertebra(vertebra);
625 addNodesHip(hip,rod_space);
631 const double yOffset_foot = -(2*rod_space+6);
633 addSegments(puppy,vertebra,hip,leg,rod_space);
635 puppy.move(btVector3(0.0,26,0.0));
640 std::vector<tgStructure*> children = puppy.
getChildren();
644 spec.addBuilder(
"rod",
new tgRodInfo(rodConfig));
648 #ifdef PASSIVE_STRUCTURE
662 #ifdef PASSIVE_STRUCTURE
686 m_allMuscles = tgCast::filter<tgModel, tgSpringCableActuator> (
getDescendants());
688 m_allSegments = this->find<tgModel> (
"spine segment");
701 throw std::invalid_argument(
"dt is not positive");
const std::vector< tgStructure * > & getChildren() const
void addChild(tgStructure *child)
Definition of class tgRodInfo.
Convenience function for combining strings with ints, mostly for naming structures.
Implementing the Flemons quadruped model (roughly), but as a subclass of Brian's BaseSpineModelLearni...
virtual void setup(tgWorld &world)
Definition of class tgBasicActuatorInfo.
virtual void step(double dt)
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...
void addRotation(const btVector3 &fixedPoint, const btVector3 &axis, double angle)
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.
Contains the definition of class tgSimView.
Definition of class tgKinematicActuatorInfo.
Contains the definition of class tgRod.
Definition of class tgBuildSpec.
virtual void step(double dt)
virtual void setup(tgWorld &world)
std::vector< tgModel * > getDescendants() const
void buildInto(tgModel &model, tgWorld &world)
void addNode(double x, double y, double z, std::string tags="")