50 #include "LinearMath/btVector3.h"
58 BigDoxie::BigDoxie(
int segments,
int hips,
int legs,
int feet) :
70 void BigDoxie::addNodesFoot(
tgStructure& s,
double r1,
double r2){
88 void BigDoxie::addNodesLeg(
tgStructure& s,
double r){
105 void BigDoxie::addNodesHip(
tgStructure& s,
double r){
118 void BigDoxie::addNodesVertebra(
tgStructure& s,
double r){
135 const double offsetDist = r+1;
136 const double offsetDist2 = offsetDist*8;
137 const double offsetDist3 = offsetDist2+4;
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);
247 for(std::size_t i = (m_segments + m_hips + m_legs); i < (m_segments + m_hips + m_legs + 2); i++) {
249 t->addTags(
tgString(
"segment num", i + 1));
253 t->
addRotation(btVector3(offsetDist3+1, yOffset_foot, offsetDist), btVector3(0, 1, 0), 0.0);
258 t->
addRotation(btVector3(r*2+1, yOffset_foot, offsetDist), btVector3(0, 1, 0), 0.0);
264 for(std::size_t i = (m_segments + m_hips + m_legs + 2); i < (m_segments + m_hips + m_legs + m_feet); i++) {
266 t->addTags(
tgString(
"segment num", i + 1));
270 t->
addRotation(btVector3(offsetDist3+1, yOffset_foot, -offsetDist), btVector3(0, 1, 0), 0.0);
275 t->
addRotation(btVector3(r*2+1, yOffset_foot, -offsetDist), btVector3(0, 1, 0), 0.0);
284 std::vector<tgStructure*> children = puppy.
getChildren();
285 for(std::size_t i = 2; i < (children.size() - (m_hips + m_legs + m_feet)); i++) {
287 tgNodes n0 = children[i-2]->getNodes();
288 tgNodes n1 = children[i-1]->getNodes();
289 tgNodes n2 = children[i]->getNodes();
329 if(i > 0 && i < m_segments){
344 if(i == m_segments - 1){
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();
371 tgNodes n15 = children[15]->getNodes();
372 tgNodes n16 = children[16]->getNodes();
497 for(std::size_t i = (m_segments + m_hips + m_legs); i < children.size(); i++) {
498 tgNodes ni = children[i]->getNodes();
499 tgNodes ni4 = children[i-4]->getNodes();
532 const double density = 4.2/300.0;
533 const double radius = 0.5;
534 const double rod_space = 10.0;
535 const double rod_space2 = 8.0;
536 const double friction = 0.5;
537 const double rollFriction = 0.0;
538 const double restitution = 0.0;
540 const tgRod::Config rodConfig(radius, density, friction, rollFriction, restitution);
542 const double stiffness = 1000.0;
543 const double stiffnessPassive = 3000.0;
544 const double damping = .01*stiffness;
545 const double pretension = 0.0;
546 const bool history =
true;
547 const double maxTens = 7000.0;
548 const double maxSpeed = 12.0;
550 const double passivePretension = 1000;
551 const double passivePretension2 = 2500;
552 const double passivePretension3 = 2500;
556 const double mRad = 1.0;
557 const double motorFriction = 10.0;
558 const double motorInertia = 1.0;
559 const bool backDrivable =
false;
560 #ifdef PASSIVE_STRUCTURE
562 mRad, motorFriction, motorInertia, backDrivable,
563 history, maxTens, maxSpeed);
566 mRad, motorFriction, motorInertia, backDrivable,
567 history, maxTens, maxSpeed);
570 mRad, motorFriction, motorInertia, backDrivable,
571 history, maxTens, maxSpeed);
574 mRad, motorFriction, motorInertia, backDrivable,
575 history, maxTens, maxSpeed);
577 mRad, motorFriction, motorInertia, backDrivable,
578 history, maxTens, maxSpeed);
581 mRad, motorFriction, motorInertia, backDrivable,
582 history, maxTens, maxSpeed);
585 mRad, motorFriction, motorInertia, backDrivable,
586 history, maxTens, maxSpeed);
589 mRad, motorFriction, motorInertia, backDrivable,
590 history, maxTens, maxSpeed);
593 mRad, motorFriction, motorInertia, backDrivable,
594 history, maxTens, maxSpeed);
596 mRad, motorFriction, motorInertia, backDrivable,
597 history, maxTens, maxSpeed);
602 #ifdef PASSIVE_STRUCTURE
620 addNodesFoot(foot,rod_space,rod_space2);
625 addNodesLeg(leg,rod_space);
630 addNodesVertebra(vertebra,rod_space);
631 addRodsVertebra(vertebra);
635 addNodesHip(hip,rod_space);
641 const double yOffset_foot = -(2*rod_space+6);
643 addSegments(puppy,vertebra,hip,leg,foot,rod_space);
645 puppy.move(btVector3(0.0,-yOffset_foot,0.0));
650 std::vector<tgStructure*> children = puppy.
getChildren();
654 spec.addBuilder(
"rod",
new tgRodInfo(rodConfig));
658 #ifdef PASSIVE_STRUCTURE
674 #ifdef PASSIVE_STRUCTURE
700 m_allMuscles = tgCast::filter<tgModel, tgSpringCableActuator> (
getDescendants());
702 m_allSegments = this->find<tgModel> (
"spine segment");
715 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.
Implementing the Flemons quadruped model (roughly), but as a subclass of Brian's BaseSpineModelLearni...
virtual void setup(tgWorld &world)
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...
void addRotation(const btVector3 &fixedPoint, const btVector3 &axis, double angle)
virtual void step(double dt)
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)
std::vector< tgModel * > getDescendants() const
void buildInto(tgModel &model, tgWorld &world)
void addNode(double x, double y, double z, std::string tags="")