|
| 1 | +# -*- coding: utf-8 -*- |
| 2 | +""" |
| 3 | +Created on Mon July 22 2019 |
| 4 | +
|
| 5 | +@author: Bruno-Pier Busque |
| 6 | +""" |
| 7 | + |
| 8 | +############################################################################### |
| 9 | +import numpy as np |
| 10 | +############################################################################### |
| 11 | +from pyro.dynamic import manipulator |
| 12 | +############################################################################### |
| 13 | + |
| 14 | + |
| 15 | +############################################################################### |
| 16 | +# 3D Asimov |
| 17 | +############################################################################### |
| 18 | + |
| 19 | +class Asimov( manipulator.ThreeLinkManipulator3D ): |
| 20 | + """ |
| 21 | + Asimov Manipulator Class |
| 22 | + ------------------------------- |
| 23 | + """ |
| 24 | + |
| 25 | + ############################ |
| 26 | + def __init__(self): |
| 27 | + """ """ |
| 28 | + |
| 29 | + # initialize standard params |
| 30 | + manipulator.ThreeLinkManipulator3D.__init__(self) |
| 31 | + |
| 32 | + # Name |
| 33 | + self.name = 'Asimov Manipulator' |
| 34 | + |
| 35 | + # Kinematic params |
| 36 | + self.l1 = 0.5 # [m] |
| 37 | + self.baseradius = 0.3 # [m] |
| 38 | + self.armradius = 0.05 # [m] |
| 39 | + self.l2 = 0.525 # [m] |
| 40 | + self.l3 = 0.375 # [m] |
| 41 | + self.lc1 = self.l1/2 # [m] |
| 42 | + self.lc2 = self.l2/2 # [m] |
| 43 | + self.lc3 = self.l3/2 # [m] |
| 44 | + self.lw = (self.l1 + self.l2 + self.l3) # Total length |
| 45 | + |
| 46 | + # Inertia params |
| 47 | + self.m1 = 3.703 # [kg] |
| 48 | + self.mbras = 0.915 # [kg] |
| 49 | + self.mcoude = 0.832 # [kg] |
| 50 | + self.m2 = self.mbras + self.mcoude # [kg] |
| 51 | + self.m3 = 0.576 # [kg] |
| 52 | + |
| 53 | + self.I1z = self.m1*(self.baseradius**2)/2 |
| 54 | + |
| 55 | + self.I2x = (self.mbras*self.l2**2)/3 + self.mcoude*self.l2**2 |
| 56 | + self.I2y = self.I2x |
| 57 | + self.I2z = self.m2*(self.armradius**2)/2 |
| 58 | + |
| 59 | + self.I3x = (self.m3*self.l3**2)/3 |
| 60 | + self.I3y = self.I3x |
| 61 | + self.I3z = self.m3*(self.armradius**2)/2 |
| 62 | + |
| 63 | + # Labels, bounds and units |
| 64 | + self.x_ub = np.array([np.pi/2, -np.pi/4, np.pi/2]) |
| 65 | + self.x_lb = np.array([-np.pi/2, -3*np.pi/4, -np.pi/2]) |
| 66 | + |
| 67 | + |
| 68 | +############################################################################### |
| 69 | +# 2D Asimov |
| 70 | +############################################################################### |
| 71 | + |
| 72 | +class Asimov2D( manipulator.TwoLinkManipulator ): |
| 73 | + """ |
| 74 | + Asimov 2D Manipulator Class |
| 75 | + ------------------------------- |
| 76 | + A model of Asimov without the rotating base |
| 77 | + """ |
| 78 | + |
| 79 | + ############################ |
| 80 | + def __init__(self): |
| 81 | + """ """ |
| 82 | + |
| 83 | + # initialize standard params |
| 84 | + manipulator.TwoLinkManipulator.__init__(self) |
| 85 | + |
| 86 | + # Name |
| 87 | + self.name = 'Asimov 2D Manipulator' |
| 88 | + |
| 89 | + self.l1 = 0.525 # [m] |
| 90 | + self.l2 = 0.375 |
| 91 | + self.lc1 = self.l1/2 |
| 92 | + self.lc2 = self.l2/2 |
| 93 | + |
| 94 | + self.mbras = 0.915 # [kg] |
| 95 | + self.mcoude = 0.832 # [kg] |
| 96 | + self.m1 = self.mbras + self.mcoude # [kg] |
| 97 | + self.m2 = 0.576 # [kg] |
| 98 | + self.I1 = (self.mbras*self.l1**2)/3 + self.mcoude*self.l1**2 |
| 99 | + self.I2 = (self.m2*self.l2**2)/3 |
| 100 | + |
| 101 | + |
| 102 | +if __name__ == "__main__": |
| 103 | + """ MAIN TEST """ |
| 104 | + |
| 105 | + sys = Asimov() |
| 106 | + dsys = manipulator.SpeedControlledManipulator(sys) |
| 107 | + dsys.ubar = np.array([1, 1, 1]) |
| 108 | + dsys.show3([0.1, 0.1, 0.1]) |
| 109 | + x02 = np.array([0, 1, 1]) # Position initiale |
| 110 | + |
| 111 | + dsys.plot_animation(x02) |
| 112 | + dsys.sim.plot('xu') |
| 113 | + |
0 commit comments