50 #include "LinearMath/btVector3.h"
58 BigPuppySymmetricSpiral1::BigPuppySymmetricSpiral1(
int segments,
int hips,
int legs,
int feet) :
66 BigPuppySymmetricSpiral1::~BigPuppySymmetricSpiral1()
70 void BigPuppySymmetricSpiral1::addNodesFoot(
tgStructure& s,
double r1,
double r2){
81 void BigPuppySymmetricSpiral1::addRodsFoot(
tgStructure& s){
88 void BigPuppySymmetricSpiral1::addNodesLeg(
tgStructure& s,
double r){
97 void BigPuppySymmetricSpiral1::addRodsLeg(
tgStructure& s){
105 void BigPuppySymmetricSpiral1::addNodesHip(
tgStructure& s,
double r){
112 void BigPuppySymmetricSpiral1::addRodsHip(
tgStructure& s){
118 void BigPuppySymmetricSpiral1::addNodesVertebra(
tgStructure& s,
double r){
126 void BigPuppySymmetricSpiral1::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);
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);
282 void BigPuppySymmetricSpiral1::addMuscles(
tgStructure& puppy){
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();
344 if (i >= 2 && i < 7){
378 tgNodes n0 = children[0]->getNodes();
379 tgNodes n1 = children[1]->getNodes();
380 tgNodes n2 = children[2]->getNodes();
381 tgNodes n3 = children[3]->getNodes();
382 tgNodes n4 = children[4]->getNodes();
383 tgNodes n5 = children[5]->getNodes();
384 tgNodes n6 = children[6]->getNodes();
385 tgNodes n7 = children[7]->getNodes();
386 tgNodes n8 = children[8]->getNodes();
387 tgNodes n9 = children[9]->getNodes();
388 tgNodes n10 = children[10]->getNodes();
389 tgNodes n11 = children[11]->getNodes();
390 tgNodes n12 = children[12]->getNodes();
391 tgNodes n13 = children[13]->getNodes();
392 tgNodes n14 = children[14]->getNodes();
517 for(std::size_t i = (m_segments + m_hips + m_legs); i < children.size(); i++) {
518 tgNodes ni = children[i]->getNodes();
519 tgNodes ni4 = children[i-4]->getNodes();
552 const double density = 4.2/300.0;
553 const double radius = 0.5;
554 const double rod_space = 10.0;
555 const double rod_space2 = 8.0;
556 const double friction = 0.5;
557 const double rollFriction = 0.0;
558 const double restitution = 0.0;
560 const tgRod::Config rodConfig(radius, density, friction, rollFriction, restitution);
562 const double stiffness = 1000.0;
563 const double stiffnessPassive = 4000.0;
564 const double damping = .01*stiffness;
565 const double pretension = 0.0;
566 const bool history =
true;
567 const double maxTens = 7000.0;
568 const double maxSpeed = 12.0;
570 const double passivePretension = 1000;
571 const double passivePretension2 = 3500;
572 const double passivePretension3 = 3500;
576 const double mRad = 1.0;
577 const double motorFriction = 10.0;
578 const double motorInertia = 1.0;
579 const bool backDrivable =
false;
580 #ifdef PASSIVE_STRUCTURE
582 mRad, motorFriction, motorInertia, backDrivable,
583 history, maxTens, maxSpeed);
586 mRad, motorFriction, motorInertia, backDrivable,
587 history, maxTens, maxSpeed);
590 mRad, motorFriction, motorInertia, backDrivable,
591 history, maxTens, maxSpeed);
594 mRad, motorFriction, motorInertia, backDrivable,
595 history, maxTens, maxSpeed);
597 mRad, motorFriction, motorInertia, backDrivable,
598 history, maxTens, maxSpeed);
603 #ifdef PASSIVE_STRUCTURE
617 addNodesFoot(foot,rod_space,rod_space2);
622 addNodesLeg(leg,rod_space);
627 addNodesVertebra(vertebra,rod_space);
628 addRodsVertebra(vertebra);
632 addNodesHip(hip,rod_space);
638 const double yOffset_foot = -(2*rod_space+6);
640 addSegments(puppy,vertebra,hip,leg,foot,rod_space);
642 puppy.move(btVector3(0.0,-yOffset_foot,0.0));
647 std::vector<tgStructure*> children = puppy.
getChildren();
651 spec.addBuilder(
"rod",
new tgRodInfo(rodConfig));
655 #ifdef PASSIVE_STRUCTURE
666 #ifdef PASSIVE_STRUCTURE
687 m_allMuscles = tgCast::filter<tgModel, tgSpringCableActuator> (
getDescendants());
689 m_allSegments = this->find<tgModel> (
"spine segment");
702 throw std::invalid_argument(
"dt is not positive");
Implementing the Flemons quadruped model (roughly), but as a subclass of Brian's BaseSpineModelLearni...
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.
virtual void setup(tgWorld &world)
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)
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 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="")