diff --git a/rocolib/builders/PivotBuilder.py b/rocolib/builders/PivotBuilder.py new file mode 100644 index 0000000000000000000000000000000000000000..e34238aad750c3fa176749c091d06499a0ccc4ad --- /dev/null +++ b/rocolib/builders/PivotBuilder.py @@ -0,0 +1,49 @@ +from rocolib.api.components.Component import Component + +c = Component() + +c.addParameter("length", 76, paramType="length", minValue=65) #tested minValue +c.addParameter("width", 60, paramType="length", minValue=60) #tested minValue + +c.addSubcomponent("servo", "MountedServo", inherit="angle") +c.addParameter("driveservo", "pivotservo", paramType="dimension") +c.addConstraint(("servo", "servo"), "driveservo") +c.addConstraint(("servo", "length"), "driveservo", 'getDim(x, "motorlength") + 2 * getDim(x, "shoulderlength")') +c.addConstConstraint(("servo", "center"), False) + +for i in range(7): + c.addSubcomponent("belt%d" %i, "Rectangle") + c.addConstraint(("belt%d"%i, "w"), "driveservo", 'getDim(x, "motorheight")') + +for i in range(3): + c.addConstraint(("belt%d"%i, "l"), ("width", "driveservo"), "(x[0]-getDim(x[1], 'motorwidth'))/2") + +for i in range(3, 5): + c.addConstraint(("belt%d" % i, "l"), "driveservo", 'getDim(x, "motorlength") + 2 * getDim(x, "shoulderlength")') + +for i in range(5, 7): + c.addConstraint(("belt%d"%i, "l"), "length") + +c.addConnection(("servo", "botedge3"), ("belt0", "l"), angle=-90) +c.addConnection(("servo", "botedge1"), ("belt1", "l"), angle=-90) +c.addConnection(("servo", "topedge1"), ("belt3", "l"), angle=-180) +c.addConnection(("servo", "topedge3"), ("belt4", "l"), angle=-180) +c.addConnection(("belt2", "l"), ("belt4", "r"), angle=90) + +c.addConnection(("belt0", "r"), ("belt5", "l"), angle=90) +c.addConnection(("belt1", "r"), ("belt6", "l"), angle=90) + +c.addSubcomponent("pivotface", "Trapezoid") +c.addConstraint(("pivotface", "width"), "width", "x-(2*x*.15)") +c.addConstraint(("pivotface", "depth"), "driveservo", "getDim(x, 'motorlength')") +c.addConstraint(("pivotface", "bangle"), ("width", "driveservo"), + "float(np.atan(getDim(x[1], 'motorlength')/(x[0]*.15))* 180 * 0.318309)") + +c.addConnection(("servo", "mount"), ("pivotface", "face0")) + +c.inheritAllInterfaces("servo") +c.inheritAllInterfaces("pivotface") +for i in range(3): + c.inheritAllInterfaces("belt%d" %i) + +c.toLibrary("Pivot") \ No newline at end of file diff --git a/rocolib/library/Pivot.yaml b/rocolib/library/Pivot.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1c98f9abaf6994ba9128a0fc228adcb33e2f3080 --- /dev/null +++ b/rocolib/library/Pivot.yaml @@ -0,0 +1,282 @@ +connections: + connection0: + - - servo + - botedge3 + - - belt0 + - l + - angle: -90 + connection1: + - - servo + - botedge1 + - - belt1 + - l + - angle: -90 + connection2: + - - servo + - topedge1 + - - belt3 + - l + - angle: -180 + connection3: + - - servo + - topedge3 + - - belt4 + - l + - angle: -180 + connection4: + - - belt2 + - l + - - belt4 + - r + - angle: 90 + connection5: + - - belt0 + - r + - - belt5 + - l + - angle: 90 + connection6: + - - belt1 + - r + - - belt6 + - l + - angle: 90 + connection7: + - - servo + - mount + - - pivotface + - face0 + - {} +interfaces: + belt0.b: + interface: b + subcomponent: belt0 + belt0.face: + interface: face + subcomponent: belt0 + belt0.l: + interface: l + subcomponent: belt0 + belt0.r: + interface: r + subcomponent: belt0 + belt0.t: + interface: t + subcomponent: belt0 + belt1.b: + interface: b + subcomponent: belt1 + belt1.face: + interface: face + subcomponent: belt1 + belt1.l: + interface: l + subcomponent: belt1 + belt1.r: + interface: r + subcomponent: belt1 + belt1.t: + interface: t + subcomponent: belt1 + belt2.b: + interface: b + subcomponent: belt2 + belt2.face: + interface: face + subcomponent: belt2 + belt2.l: + interface: l + subcomponent: belt2 + belt2.r: + interface: r + subcomponent: belt2 + belt2.t: + interface: t + subcomponent: belt2 + pivotface.botedge: + interface: botedge + subcomponent: pivotface + pivotface.face0: + interface: face0 + subcomponent: pivotface + pivotface.ledge: + interface: ledge + subcomponent: pivotface + pivotface.redge: + interface: redge + subcomponent: pivotface + pivotface.topedge: + interface: topedge + subcomponent: pivotface + servo.botedge0: + interface: botedge0 + subcomponent: servo + servo.botedge1: + interface: botedge1 + subcomponent: servo + servo.botedge2: + interface: botedge2 + subcomponent: servo + servo.botedge3: + interface: botedge3 + subcomponent: servo + servo.face0: + interface: face0 + subcomponent: servo + servo.face1: + interface: face1 + subcomponent: servo + servo.face2: + interface: face2 + subcomponent: servo + servo.face3: + interface: face3 + subcomponent: servo + servo.horn: + interface: horn + subcomponent: servo + servo.mount: + interface: mount + subcomponent: servo + servo.mount.decoration: + interface: mount.decoration + subcomponent: servo + servo.slotedge: + interface: slotedge + subcomponent: servo + servo.tabedge: + interface: tabedge + subcomponent: servo + servo.topedge0: + interface: topedge0 + subcomponent: servo + servo.topedge1: + interface: topedge1 + subcomponent: servo + servo.topedge2: + interface: topedge2 + subcomponent: servo + servo.topedge3: + interface: topedge3 + subcomponent: servo +parameters: + driveservo: + defaultValue: pivotservo + spec: + valueType: str + length: + defaultValue: 76 + spec: + minValue: 65 + units: mm + valueType: (float, int) + servo.angle: + defaultValue: 0 + spec: + maxValue: null + minValue: null + units: degrees + valueType: (float, int) + width: + defaultValue: 60 + spec: + minValue: 60 + units: mm + valueType: (float, int) +source: ../builders/PivotBuilder.py +subcomponents: + belt0: + classname: Rectangle + kwargs: {} + parameters: + l: + function: (x[0]-getDim(x[1], 'motorwidth'))/2 + parameter: &id001 + - width + - driveservo + w: + function: getDim(x, "motorheight") + parameter: driveservo + belt1: + classname: Rectangle + kwargs: {} + parameters: + l: + function: (x[0]-getDim(x[1], 'motorwidth'))/2 + parameter: *id001 + w: + function: getDim(x, "motorheight") + parameter: driveservo + belt2: + classname: Rectangle + kwargs: {} + parameters: + l: + function: (x[0]-getDim(x[1], 'motorwidth'))/2 + parameter: *id001 + w: + function: getDim(x, "motorheight") + parameter: driveservo + belt3: + classname: Rectangle + kwargs: {} + parameters: + l: + function: getDim(x, "motorlength") + 2 * getDim(x, "shoulderlength") + parameter: driveservo + w: + function: getDim(x, "motorheight") + parameter: driveservo + belt4: + classname: Rectangle + kwargs: {} + parameters: + l: + function: getDim(x, "motorlength") + 2 * getDim(x, "shoulderlength") + parameter: driveservo + w: + function: getDim(x, "motorheight") + parameter: driveservo + belt5: + classname: Rectangle + kwargs: {} + parameters: + l: + parameter: length + w: + function: getDim(x, "motorheight") + parameter: driveservo + belt6: + classname: Rectangle + kwargs: {} + parameters: + l: + parameter: length + w: + function: getDim(x, "motorheight") + parameter: driveservo + pivotface: + classname: Trapezoid + kwargs: {} + parameters: + bangle: + function: float(np.atan(getDim(x[1], 'motorlength')/(x[0]*.15))* 180 * 0.318309) + parameter: *id001 + depth: + function: getDim(x, 'motorlength') + parameter: driveservo + width: + function: x-(2*x*.15) + parameter: width + servo: + classname: MountedServo + kwargs: {} + parameters: + angle: + parameter: servo.angle + center: false + length: + function: getDim(x, "motorlength") + 2 * getDim(x, "shoulderlength") + parameter: driveservo + servo: + parameter: driveservo diff --git a/rocolib/library/Right45Triangle.py b/rocolib/library/Right45Triangle.py new file mode 100644 index 0000000000000000000000000000000000000000..845cc0194463506c450d7a55453ef3584d0b8b79 --- /dev/null +++ b/rocolib/library/Right45Triangle.py @@ -0,0 +1,28 @@ +from rocolib.api.components import FoldedComponent +from rocolib.api.composables.graph.Face import Face + +class Right45Triangle(FoldedComponent): + + def define(self): + self.addParameter("height", 3, paramType="length") + self.addParameter("base", 4, paramType="length") + self.addParameter("hypotenuse", 5, paramType="length") + self.addParameter("angle", 45, paramType="angle", minValue=45, maxValue=45) + + self.addEdgeInterface("hedge", "r0.e0", "height") + self.addEdgeInterface("bedge", "r0.e1", "base") + self.addEdgeInterface("hypoedge", "r0.e2", "hypotenuse") + + def assemble(self): + h = self.getParameter("height") + b = self.getParameter("base") + x = h**2 + b**2 + + rs = [] + rs.append(Face("", ((b, 0), (0,0), (0, -h)))) + self.attachEdge(None, rs[0], "e0", prefix="r0", angle=90) + + +if __name__ == "__main__": + Right45Triangle.test() +