void createMyTree(KDL::Tree& a_tree) { unsigned int numberofsegments = 66; unsigned int numberofbranches = 5; std::string linknamecontainer[numberofsegments]; Joint jointcontainer[numberofsegments]; Frame framecontainer[numberofsegments]; Segment segmentcontainer[numberofsegments]; RigidBodyInertia inertiacontainer[numberofsegments]; RotationalInertia rotInerSeg(0.0, 0.0, 0.0, 0.0, 0.0, 0.0); //around symmetry axis of rotation double pointMass = 0.25; //in kg std::string jointname, linkname; //create names and segments of the tree for (unsigned int i = 0; i < numberofsegments - 2; i = i + 3) { //this name manipulation is required to ensure that //topological order of segments in the tree and the order std::map data structure are equivalent if (i < 10) { ostringstream converter, converter3; converter << "joint00" << i; jointname = converter.str(); converter3 << "link00" << i; linkname = converter3.str(); linknamecontainer[i] = linkname; // std::cout << jointname << linkname << std::endl; } else { ostringstream converter, converter3; converter << "joint0" << i; jointname = converter.str(); converter3 << "link0" << i; linkname = converter3.str(); linknamecontainer[i] = linkname; // std::cout << jointname << linkname << std::endl; } jointcontainer[i] = Joint(jointname, Joint::RotZ, 1, 0, 0.01); framecontainer[i] = Frame(Rotation::RPY(0.0, 0.0, 0.0), Vector(0.0, -0.4, 0.0)); segmentcontainer[i] = Segment(linkname, jointcontainer[i], framecontainer[i]); inertiacontainer[i] = RigidBodyInertia(pointMass, Vector(0.0, -0.4, 0.0), rotInerSeg); segmentcontainer[i].setInertia(inertiacontainer[i]); if (i < 9) { ostringstream converter1, converter4; converter1 << "joint00" << i + 1; jointname = converter1.str(); converter4 << "link00" << i + 1; linkname = converter4.str(); linknamecontainer[i + 1] = linkname; // std::cout << jointname << linkname << std::endl; } else { ostringstream converter1, converter4; converter1 << "joint0" << i + 1; jointname = converter1.str(); converter4 << "link0" << i + 1; linkname = converter4.str(); linknamecontainer[i + 1] = linkname; // std::cout << jointname << linkname << std::endl; } jointcontainer[i + 1] = Joint(jointname, Joint::RotX, 1, 0, 0.01); framecontainer[i + 1] = Frame(Rotation::RPY(0.0, 0.0, 0.0), Vector(0.0, -0.4, 0.0)); segmentcontainer[i + 1] = Segment(linkname, jointcontainer[i + 1], framecontainer[i + 1]); inertiacontainer[i + 1] = RigidBodyInertia(pointMass, Vector(0.0, -0.4, 0.0), rotInerSeg); segmentcontainer[i + 1].setInertia(inertiacontainer[i + 1]); if (i < 8) { ostringstream converter2, converter5; converter2 << "joint00" << i + 2; jointname = converter2.str(); converter5 << "link00" << i + 2; linkname = converter5.str(); linknamecontainer[i + 2] = linkname; // std::cout << jointname << linkname << std::endl; } else { ostringstream converter2, converter5; converter2 << "joint0" << i + 2; jointname = converter2.str(); converter5 << "link0" << i + 2; linkname = converter5.str(); linknamecontainer[i + 2] = linkname; // std::cout << jointname << linkname << std::endl; } jointcontainer[i + 2] = Joint(jointname, Joint::RotY, 1, 0, 0.01); framecontainer[i + 2] = Frame(Rotation::RPY(0.0, 0.0, 0.0), Vector(0.0, -0.4, 0.0)); segmentcontainer[i + 2] = Segment(linkname, jointcontainer[i + 2], framecontainer[i + 2]); inertiacontainer[i + 2] = RigidBodyInertia(pointMass, Vector(0.0, -0.4, 0.0), rotInerSeg); segmentcontainer[i + 2].setInertia(inertiacontainer[i + 2]); } //add created segments to the tree (1 initial base chain + 5 x branches) //connect initial base chain to tree root a_tree.addSegment(segmentcontainer[0], "L0"); std::cout << "Initial base chain" << std::endl; for (unsigned int i = 0; i < numberofbranches - 1; i++) //chain including link0-link4 (5 segments) { a_tree.addSegment(segmentcontainer[i + 1], linknamecontainer[i]); std::cout << linknamecontainer[i] << " and " << segmentcontainer[i + 1].getName() << std::endl; } int initialChainElementNumber = a_tree.getNrOfSegments(); //number of segments in initial base chain section of the tree int elementsInBranch = (numberofsegments - initialChainElementNumber) / numberofbranches; //number of elements in each branch //connect 1st branch to the last link of the initial chain a_tree.addSegment(segmentcontainer[numberofbranches], linknamecontainer[numberofbranches - 1]); std::cout << "Branch " << numberofbranches-4 << std::endl; //segments of the 1st tree branch for (unsigned int j = numberofbranches; j < (elementsInBranch + initialChainElementNumber) - 1; j++) { a_tree.addSegment(segmentcontainer[j + 1], linknamecontainer[j]); std::cout << linknamecontainer[j] << " and " << segmentcontainer[j + 1].getName() << std::endl; } //connect 2nd branch to the last link of the initial chain a_tree.addSegment(segmentcontainer[(elementsInBranch + initialChainElementNumber)], linknamecontainer[numberofbranches - 2]); std::cout << "Branch " << numberofbranches-3 << std::endl; //segments of the 2nd tree branch for (unsigned int j = (elementsInBranch + initialChainElementNumber); j < (2 * elementsInBranch + initialChainElementNumber) - 1; j++) { a_tree.addSegment(segmentcontainer[j + 1], linknamecontainer[j]); std::cout << linknamecontainer[j] << " and " << segmentcontainer[j + 1].getName() << std::endl; } //connect 3rd branch to the last link of the initial chain a_tree.addSegment(segmentcontainer[(2 * elementsInBranch + initialChainElementNumber)], linknamecontainer[numberofbranches - 3]); std::cout << "Branch " << numberofbranches-2 << std::endl; //segments of the 3rd tree branch for (unsigned int j = (2 * elementsInBranch + initialChainElementNumber); j < (3 * elementsInBranch + initialChainElementNumber) - 1; j++) { a_tree.addSegment(segmentcontainer[j + 1], linknamecontainer[j]); std::cout << linknamecontainer[j] << " and " << segmentcontainer[j + 1].getName() << std::endl; } //connect 4th branch to the last link of the initial chain a_tree.addSegment(segmentcontainer[(3 * elementsInBranch + initialChainElementNumber)], linknamecontainer[numberofbranches - 4]); std::cout << "Branch " << numberofbranches-1 << std::endl; //segments of the 4ht tree branch for (unsigned int j = (3 * elementsInBranch + initialChainElementNumber); j < (4 * elementsInBranch + initialChainElementNumber) - 1; j++) { a_tree.addSegment(segmentcontainer[j + 1], linknamecontainer[j]); std::cout << linknamecontainer[j] << " and " << segmentcontainer[j + 1].getName() << std::endl; } //connect 5th branch to the last link of the initial chain a_tree.addSegment(segmentcontainer[(4 * elementsInBranch + initialChainElementNumber)], linknamecontainer[numberofbranches - 1]); //segments of the 5th tree branch std::cout << "Branch " << numberofbranches << std::endl; for (unsigned int j = (4 * elementsInBranch + initialChainElementNumber); j < (5 * elementsInBranch + initialChainElementNumber) - 1; j++) { a_tree.addSegment(segmentcontainer[j + 1], linknamecontainer[j]); std::cout << linknamecontainer[j] << " and " << segmentcontainer[j + 1].getName() << std::endl; } }
void createMyTree(KDL::Tree& twoBranchTree) { KDL::Joint joint1 = KDL::Joint("j1", KDL::Joint::RotZ, 1, 0, 0.01); KDL::Joint joint2 = KDL::Joint("j2", KDL::Joint::RotZ, 1, 0, 0.01); KDL::Joint joint3 = KDL::Joint("j3", KDL::Joint::RotZ, 1, 0, 0.01); KDL::Joint joint4 = KDL::Joint("j4", KDL::Joint::RotZ, 1, 0, 0.01); KDL::Joint joint5 = KDL::Joint("j5", KDL::Joint::RotZ, 1, 0, 0.01); KDL::Joint joint6 = KDL::Joint("j6", KDL::Joint::RotZ, 1, 0, 0.01); KDL::Joint joint7 = KDL::Joint("j7", KDL::Joint::RotZ, 1, 0, 0.01); KDL::Joint joint8 = KDL::Joint("j8", KDL::Joint::RotZ, 1, 0, 0.01); KDL::Joint joint9 = KDL::Joint("j9", KDL::Joint::RotZ, 1, 0, 0.01); KDL::Joint joint10 = KDL::Joint("j10", KDL::Joint::RotZ, 1, 0, 0.01); KDL::Frame frame1(KDL::Rotation::RPY(0.0, 0.0, 0.0), KDL::Vector(0.0, -0.4, 0.0)); KDL::Frame frame2(KDL::Rotation::RPY(0.0, 0.0, 0.0), KDL::Vector(0.0, -0.4, 0.0)); KDL::Frame frame3(KDL::Rotation::RPY(0.0, 0.0, 0.0), KDL::Vector(0.0, -0.4, 0.0)); KDL::Frame frame4(KDL::Rotation::RPY(0.0, 0.0, 0.0), KDL::Vector(0.0, -0.4, 0.0)); KDL::Frame frame5(KDL::Rotation::RPY(0.0, 0.0, 0.0), KDL::Vector(0.0, -0.4, 0.0)); KDL::Frame frame6(KDL::Rotation::RPY(0.0, 0.0, 0.0), KDL::Vector(0.0, -0.4, 0.0)); KDL::Frame frame7(KDL::Rotation::RPY(0.0, 0.0, 0.0), KDL::Vector(0.0, -0.4, 0.0)); KDL::Frame frame8(KDL::Rotation::RPY(0.0, 0.0, 0.0), KDL::Vector(0.0, -0.4, 0.0)); KDL::Frame frame9(KDL::Rotation::RPY(0.0, 0.0, 0.0), KDL::Vector(0.0, -0.4, 0.0)); KDL::Frame frame10(KDL::Rotation::RPY(0.0, 0.0, 0.0), KDL::Vector(0.0, -0.4, 0.0)); KDL::Segment segment1 = KDL::Segment("L1", joint1, frame1); KDL::Segment segment2 = KDL::Segment("L2", joint2, frame2); KDL::Segment segment3 = KDL::Segment("L3", joint3, frame3); KDL::Segment segment4 = KDL::Segment("L4", joint4, frame4); KDL::Segment segment5 = KDL::Segment("L5", joint5, frame5); KDL::Segment segment6 = KDL::Segment("L6", joint6, frame6); KDL::Segment segment7 = KDL::Segment("L7", joint7, frame7); KDL::Segment segment8 = KDL::Segment("L8", joint8, frame8); KDL::Segment segment9 = KDL::Segment("L9", joint9, frame9); KDL::Segment segment10 = KDL::Segment("M0", joint10, frame10); KDL::RotationalInertia rotInerSeg1(0.0, 0.0, 0.0, 0.0, 0.0, 0.0); //around symmetry axis of rotation double pointMass = 0.25; //in kg KDL::RigidBodyInertia inerSegment1(pointMass, KDL::Vector(0.0, -0.4, 0.0), rotInerSeg1); KDL::RigidBodyInertia inerSegment2(pointMass, KDL::Vector(0.0, -0.4, 0.0), rotInerSeg1); KDL::RigidBodyInertia inerSegment3(pointMass, KDL::Vector(0.0, -0.4, 0.0), rotInerSeg1); KDL::RigidBodyInertia inerSegment4(pointMass, KDL::Vector(0.0, -0.4, 0.0), rotInerSeg1); KDL::RigidBodyInertia inerSegment5(pointMass, KDL::Vector(0.0, -0.4, 0.0), rotInerSeg1); KDL::RigidBodyInertia inerSegment6(pointMass, KDL::Vector(0.0, -0.4, 0.0), rotInerSeg1); KDL::RigidBodyInertia inerSegment7(pointMass, KDL::Vector(0.0, -0.4, 0.0), rotInerSeg1); KDL::RigidBodyInertia inerSegment8(pointMass, KDL::Vector(0.0, -0.4, 0.0), rotInerSeg1); KDL::RigidBodyInertia inerSegment9(pointMass, KDL::Vector(0.0, -0.4, 0.0), rotInerSeg1); KDL::RigidBodyInertia inerSegment10(pointMass, KDL::Vector(0.0, -0.4, 0.0), rotInerSeg1); segment1.setInertia(inerSegment1); segment2.setInertia(inerSegment2); segment3.setInertia(inerSegment3); segment4.setInertia(inerSegment4); segment5.setInertia(inerSegment5); segment6.setInertia(inerSegment6); segment7.setInertia(inerSegment7); segment8.setInertia(inerSegment8); segment9.setInertia(inerSegment9); segment10.setInertia(inerSegment10); //Tree twoBranchTree("L0"); twoBranchTree.addSegment(segment1, "L0"); twoBranchTree.addSegment(segment2, "L1"); twoBranchTree.addSegment(segment3, "L2"); twoBranchTree.addSegment(segment4, "L3"); twoBranchTree.addSegment(segment10, "L4"); // twoBranchTree.addSegment(segment5, "L2"); //branches connect at joint 3 and j5 is co-located with j3 // twoBranchTree.addSegment(segment6, "L5"); // twoBranchTree.addSegment(segment7, "L6"); // twoBranchTree.addSegment(segment8, "L7"); // twoBranchTree.addSegment(segment9, "L8"); }