|
2 | 2 | import roboticstoolbox as rtb
|
3 | 3 | import spatialmath as sm
|
4 | 4 |
|
5 |
| -# q0 = np.array( |
6 |
| -# [ |
7 |
| -# -1.66441371, |
8 |
| -# -1.20998727, |
9 |
| -# 1.04248366, |
10 |
| -# -2.10222463, |
11 |
| -# 1.05097407, |
12 |
| -# 1.41173279, |
13 |
| -# 0.0053529, |
14 |
| -# ] |
15 |
| -# ) |
16 | 5 |
|
17 |
| -# tol = 1e-6 |
| 6 | +def rne(robot, q, qd, qdd): |
| 7 | + n = len(robot.links) |
18 | 8 |
|
19 |
| -# panda = rtb.models.Panda().ets() |
| 9 | + # allocate intermediate variables |
| 10 | + Xup = sm.SE3.Alloc(n) |
| 11 | + Xtree = sm.SE3.Alloc(n) |
20 | 12 |
|
21 |
| -# Tep = panda.eval([0, -0.3, 0, -2.2, 0, 2.0, np.pi / 4]) |
| 13 | + # The body velocities, accelerations and forces |
| 14 | + v = sm.SpatialVelocity.Alloc(n) |
| 15 | + a = sm.SpatialAcceleration.Alloc(n) |
| 16 | + f = sm.SpatialForce.Alloc(n) |
22 | 17 |
|
23 |
| -# solver = rtb.IK_QP() |
| 18 | + # The joint inertia |
| 19 | + I = sm.SpatialInertia.Alloc(n) # noqa: E741 |
24 | 20 |
|
25 |
| -# sol = panda.ik_LM(Tep, tol=tol, q0=q0, method="chan") |
| 21 | + # Joint motion subspace matrix |
| 22 | + s = [] |
26 | 23 |
|
27 |
| -robot = rtb.models.KinovaGen3() |
| 24 | + q = robot.qr |
| 25 | + qd = np.zeros(n) |
| 26 | + qdd = np.zeros(n) |
28 | 27 |
|
29 |
| -glink = rtb.Link( |
30 |
| - rtb.ET.tz(0.12), |
31 |
| - name="gripper_link", |
32 |
| - m=0.831, |
33 |
| - r=[0, 0, 0.0473], |
34 |
| - parent=robot.links[-1], |
35 |
| -) |
| 28 | + Q = np.zeros(n) |
36 | 29 |
|
37 |
| -robot.links.append(glink) |
| 30 | + for i, link in enumerate(robot.links): |
| 31 | + |
| 32 | + # Allocate the inertia |
| 33 | + I[i] = sm.SpatialInertia(link.m, link.r, link.I) |
| 34 | + |
| 35 | + # Compute the link transform |
| 36 | + Xtree[i] = sm.SE3(link.Ts, check=False) # type: ignore |
| 37 | + |
| 38 | + # Append the variable axis of the joint to s |
| 39 | + if link.v is not None: |
| 40 | + s.append(link.v.s) |
| 41 | + else: |
| 42 | + s.append(np.zeros(6)) |
| 43 | + |
| 44 | + a_grav = -sm.SpatialAcceleration([0, 0, 9.81]) |
| 45 | + |
| 46 | + # Forward recursion |
| 47 | + for i, link in enumerate(robot.links): |
| 48 | + |
| 49 | + if link.jindex is None: |
| 50 | + qi = 0 |
| 51 | + qdi = 0 |
| 52 | + qddi = 0 |
| 53 | + else: |
| 54 | + qi = q[link.jindex] |
| 55 | + qdi = qd[link.jindex] |
| 56 | + qddi = qdd[link.jindex] |
| 57 | + |
| 58 | + vJ = sm.SpatialVelocity(s[i] * qdi) |
| 59 | + |
| 60 | + # Transform from parent(j) to j |
| 61 | + if link.isjoint: |
| 62 | + Xup[i] = sm.SE3(link.A(qi)).inv() |
| 63 | + else: |
| 64 | + Xup[i] = sm.SE3(link.A()).inv() |
| 65 | + |
| 66 | + if link.parent is None: |
| 67 | + v[i] = vJ |
| 68 | + a[i] = Xup[i] * a_grav + sm.SpatialAcceleration(s[i] * qddi) |
| 69 | + else: |
| 70 | + v[i] = Xup[i] * v[i - 1] + vJ |
| 71 | + a[i] = Xup[i] * a[i - 1] + sm.SpatialAcceleration(s[i] * qddi) + v[i] @ vJ |
| 72 | + |
| 73 | + f[i] = I[i] * a[i] + v[i] @ (I[i] * v[i]) |
| 74 | + |
| 75 | + # backward recursion |
| 76 | + for i in reversed(range(n)): |
| 77 | + |
| 78 | + link = robot.links[i] |
| 79 | + |
| 80 | + Q[i] = sum(f[i].A * s[i]) |
| 81 | + |
| 82 | + if link.parent is not None: |
| 83 | + f[i - 1] = f[i - 1] + Xup[i] * f[i] |
| 84 | + |
| 85 | + return Q |
| 86 | + |
| 87 | + |
| 88 | +def rne_eff(robot, q, qd, qdd): |
| 89 | + n = len(robot.links) |
| 90 | + |
| 91 | + # allocate intermediate variables |
| 92 | + Xup = np.empty((n, 4, 4)) |
| 93 | + |
| 94 | + Xtree = np.empty((n, 4, 4)) |
| 95 | + |
| 96 | + # The body velocities, accelerations and forces |
| 97 | + v = sm.SpatialVelocity.Alloc(n) |
| 98 | + a = sm.SpatialAcceleration.Alloc(n) |
| 99 | + f = sm.SpatialForce.Alloc(n) |
| 100 | + |
| 101 | + # The joint inertia |
| 102 | + I = sm.SpatialInertia.Alloc(n) # noqa: E741 |
38 | 103 |
|
| 104 | + # Joint motion subspace matrix |
| 105 | + s = [] |
39 | 106 |
|
40 |
| -n = len(robot.links) |
| 107 | + q = robot.qr |
| 108 | + qd = np.zeros(n) |
| 109 | + qdd = np.zeros(n) |
41 | 110 |
|
42 |
| -print(n) |
| 111 | + Q = np.zeros(n) |
43 | 112 |
|
44 |
| -# allocate intermediate variables |
45 |
| -Xup = sm.SE3.Alloc(n) |
46 |
| -Xtree = sm.SE3.Alloc(n) |
| 113 | + for i, link in enumerate(robot.links): |
47 | 114 |
|
48 |
| -# The body velocities, accelerations and forces |
49 |
| -v = sm.SpatialVelocity.Alloc(n) |
50 |
| -a = sm.SpatialAcceleration.Alloc(n) |
51 |
| -f = sm.SpatialForce.Alloc(n) |
| 115 | + # Allocate the inertia |
| 116 | + I[i] = sm.SpatialInertia(link.m, link.r, link.I) |
52 | 117 |
|
53 |
| -# The joint inertia |
54 |
| -I = sm.SpatialInertia.Alloc(n) # noqa: E741 |
| 118 | + # Compute the link transform |
| 119 | + Xtree[i] = link.Ts |
55 | 120 |
|
56 |
| -# Joint motion subspace matrix |
57 |
| -s = [] |
| 121 | + # Append the variable axis of the joint to s |
| 122 | + if link.v is not None: |
| 123 | + s.append(link.v.s) |
| 124 | + else: |
| 125 | + s.append(np.zeros(6)) |
58 | 126 |
|
59 |
| -q = robot.qr |
60 |
| -qd = np.zeros(n) |
61 |
| -qdd = np.zeros(n) |
| 127 | + a_grav = -sm.SpatialAcceleration([0, 0, 9.81]) |
62 | 128 |
|
63 |
| -Q = np.zeros(n) |
| 129 | + # Forward recursion |
| 130 | + for i, link in enumerate(robot.links): |
| 131 | + |
| 132 | + if link.jindex is None: |
| 133 | + qi = 0 |
| 134 | + qdi = 0 |
| 135 | + qddi = 0 |
| 136 | + else: |
| 137 | + qi = q[link.jindex] |
| 138 | + qdi = qd[link.jindex] |
| 139 | + qddi = qdd[link.jindex] |
| 140 | + |
| 141 | + vJ = sm.SpatialVelocity(s[i] * qdi) |
| 142 | + |
| 143 | + # Transform from parent(j) to j |
| 144 | + if link.isjoint: |
| 145 | + Xup[i] = np.linalg.inv(link.A(qi)) |
| 146 | + else: |
| 147 | + Xup[i] = np.linalg.inv(link.A()) |
| 148 | + |
| 149 | + if link.parent is None: |
| 150 | + v[i] = vJ |
| 151 | + a[i] = Xup[i] * a_grav + sm.SpatialAcceleration(s[i] * qddi) |
| 152 | + else: |
| 153 | + v[i] = Xup[i] * v[i - 1] + vJ |
| 154 | + a[i] = Xup[i] * a[i - 1] + sm.SpatialAcceleration(s[i] * qddi) + v[i] @ vJ |
| 155 | + |
| 156 | + f[i] = I[i] * a[i] + v[i] @ (I[i] * v[i]) |
| 157 | + |
| 158 | + # backward recursion |
| 159 | + for i in reversed(range(n)): |
| 160 | + |
| 161 | + link = robot.links[i] |
| 162 | + |
| 163 | + Q[i] = sum(f[i].A * s[i]) |
| 164 | + |
| 165 | + if link.parent is not None: |
| 166 | + f[i - 1] = f[i - 1] + Xup[i] * f[i] |
| 167 | + |
| 168 | + return Q |
| 169 | + |
| 170 | + |
| 171 | +robot = rtb.models.KinovaGen3() |
| 172 | + |
| 173 | +glink = rtb.Link( |
| 174 | + rtb.ET.tz(0.12), |
| 175 | + name="gripper_link", |
| 176 | + m=0.831, |
| 177 | + r=[0, 0, 0.0473], |
| 178 | + parent=robot.links[-1], |
| 179 | +) |
| 180 | + |
| 181 | +robot.links.append(glink) |
64 | 182 |
|
65 | 183 | # for link in robot.links:
|
66 | 184 | # print()
|
67 | 185 | # print(link.name)
|
68 | 186 | # print(link.isjoint)
|
69 | 187 | # print(link.m)
|
| 188 | +# print(link.r) |
| 189 | +# print(link.I) |
70 | 190 |
|
71 |
| -# for link in robot.grippers[0].links: |
72 |
| -# print() |
73 |
| -# print(link.name) |
74 |
| -# print(link.isjoint) |
75 |
| -# print(link.m) |
| 191 | +# q = rne(robot, robot.qr, np.zeros(7), np.zeros(7)) |
| 192 | +# q = robot.qr |
| 193 | +# qd = np.zeros(7) |
| 194 | +# qdd = np.zeros(7) |
76 | 195 |
|
77 |
| -for i, link in enumerate(robot.links): |
| 196 | +# for i in range(1000): |
| 197 | +# tau = robot.rne(q, qd, qdd) |
| 198 | +# # q = rne(robot, robot.qr, np.zeros(7), np.zeros(7)) |
| 199 | +# # print(i) |
78 | 200 |
|
79 |
| - # Allocate the inertia |
80 |
| - I[i] = sm.SpatialInertia(link.m, link.r, link.I) |
81 | 201 |
|
82 |
| - # Compute the link transform |
83 |
| - Xtree[i] = sm.SE3(link.Ts, check=False) # type: ignore |
| 202 | +# print(np.round(tau, 2)) |
84 | 203 |
|
85 |
| - # Append the variable axis of the joint to s |
86 |
| - if link.v is not None: |
87 |
| - s.append(link.v.s) |
88 |
| - else: |
89 |
| - s.append(np.zeros(6)) |
| 204 | +# [ 0. 0. 14.2 0.12 -9.22 0. -4.47 -0. 0. 0. 0. ] |
90 | 205 |
|
91 |
| -a_grav = -sm.SpatialAcceleration([0, 0, 9.81]) |
| 206 | +l1a = rtb.Link(ets=rtb.ETS(rtb.ET.Rx()), m=1, r=[0.5, 0, 0], name="l1") |
| 207 | +l2a = rtb.Link(ets=rtb.ETS(rtb.ET.Rz()), m=1, r=[0, 0.5, 0], parent=l1a, name="l2") |
| 208 | +l3a = rtb.Link(ets=rtb.ETS(rtb.ET.Ry()), m=1, r=[0.0, 0, 0.5], parent=l2a, name="l3") |
| 209 | +robota = rtb.Robot([l1a, l2a, l3a], name="simple 3 link a") |
92 | 210 |
|
93 |
| -# Forward recursion |
94 |
| -for i, link in enumerate(robot.links): |
| 211 | +l1b = rtb.Link(ets=rtb.ETS(rtb.ET.Rx()), m=1, r=[0.5, 0, 0], name="l1") |
| 212 | +l2b = rtb.Link(ets=rtb.ETS(rtb.ET.Rz(0.5)), m=1, r=[0, 0.5, 0], parent=l1b, name="l2") |
| 213 | +l3b = rtb.Link(ets=rtb.ETS(rtb.ET.Ry()), m=1, r=[0.0, 0, 0.5], parent=l2b, name="l3") |
| 214 | +robotb = rtb.Robot([l1b, l2b, l3b], name="simple 3 link b") |
95 | 215 |
|
96 |
| - if link.jindex is None: |
97 |
| - qi = 0 |
98 |
| - qdi = 0 |
99 |
| - qddi = 0 |
100 |
| - else: |
101 |
| - qi = q[link.jindex] |
102 |
| - qdi = qd[link.jindex] |
103 |
| - qddi = qdd[link.jindex] |
| 216 | +l1c = rtb.Link(ets=rtb.ETS(rtb.ET.tx(0.5)), m=1, r=[0.5, 0, 0], name="l1") |
| 217 | +l2c = rtb.Link(ets=rtb.ETS(rtb.ET.Rx()), m=1, r=[0, 0.5, 0], parent=l1c, name="l2") |
104 | 218 |
|
105 |
| - vJ = sm.SpatialVelocity(s[i] * qdi) |
| 219 | +# Branch 1 |
| 220 | +l3c = rtb.Link(ets=rtb.ETS(rtb.ET.tz(0.5)), m=1, r=[0.0, 0, 0.5], parent=l2c, name="l3") |
| 221 | +l4c = rtb.Link(ets=rtb.ETS(rtb.ET.Rz()), m=1, r=[0.0, 0, 0.5], parent=l3c, name="l4") |
106 | 222 |
|
107 |
| - # Transform from parent(j) to j |
108 |
| - if link.isjoint: |
109 |
| - Xup[i] = sm.SE3(link.A(qi)).inv() |
110 |
| - else: |
111 |
| - Xup[i] = sm.SE3(link.A()).inv() |
| 223 | +# Branch 2 |
| 224 | +l5c = rtb.Link(ets=rtb.ETS(rtb.ET.tz(0.5)), m=1, r=[0.0, 0, 0.5], parent=l2c, name="l5") |
| 225 | +l6c = rtb.Link(ets=rtb.ETS(rtb.ET.Rz()), m=1, r=[0.0, 0, 0.5], parent=l5c, name="l6") |
112 | 226 |
|
113 |
| - if link.parent is None: |
114 |
| - v[i] = vJ |
115 |
| - a[i] = Xup[i] * a_grav + sm.SpatialAcceleration(s[i] * qddi) |
116 |
| - else: |
117 |
| - jp = link.parent.jindex # type: ignore |
118 |
| - v[i] = Xup[i] * v[i - 1] + vJ |
119 |
| - a[i] = Xup[i] * a[i - 1] + sm.SpatialAcceleration(s[i] * qddi) + v[i] @ vJ |
| 227 | +robotc = rtb.Robot([l1c, l2c, l3c, l4c, l5c, l6c], name="branch 3 link c") |
120 | 228 |
|
121 |
| - f[i] = I[i] * a[i] + v[i] @ (I[i] * v[i]) |
| 229 | +za = np.array([0.5, 0.5, 0.5]) |
| 230 | +zb = np.array([0.5, 0.5]) |
| 231 | +zc = np.array([0.5, 0.5, 0.5]) |
122 | 232 |
|
123 |
| -# backward recursion |
124 |
| -for i in reversed(range(n)): |
| 233 | +print("\nRobot A") |
| 234 | +taua = robota.rne(za, za, za) |
| 235 | +print(taua) |
125 | 236 |
|
126 |
| - link = robot.links[i] |
| 237 | +print("\nRobot B") |
| 238 | +taub = robotb.rne(zb, zb, zb) |
| 239 | +print(taub) |
127 | 240 |
|
128 |
| - Q[i] = sum(f[i].A * s[i]) |
| 241 | +print("\nRobot C") |
| 242 | +tauc = robotc.rne(zc, zc, zc) |
| 243 | +print(tauc) |
129 | 244 |
|
130 |
| - if link.parent is not None: |
131 |
| - f[i - 1] = f[i - 1] + Xup[i] * f[i] |
132 | 245 |
|
133 |
| -print(np.round(Q, 2)) |
| 246 | +# l1 = rtb.Link(ets=rtb.ETS(rtb.ET.Ry()), m=1, r=[0.5, 0, 0], name="l1") |
| 247 | +# l2 = rtb.Link(ets=rtb.ETS(rtb.ET.tx(1)), m=1, r=[0.5, 0, 0], parent=l1, name="l2") |
| 248 | +# l3 = rtb.Link(ets=rtb.ETS([rtb.ET.Ry()]), m=0, r=[0.0, 0, 0], parent=l2, name="l3") |
| 249 | +# robot = rtb.Robot([l1, l2, l3], name="simple 3 link") |
| 250 | +# z = np.zeros(robot.n) |
134 | 251 |
|
| 252 | +# # check gravity load |
| 253 | +# tau = robot.rne(z, z, z) / 9.81 |
| 254 | +# print(tau) |
| 255 | + |
| 256 | +# # nt.assert_array_almost_equal(tau, np.r_[-2, -0.5]) |
| 257 | + |
| 258 | +# print("\n\nNew Robot\n") |
| 259 | +# l1 = rtb.Link(ets=rtb.ETS(rtb.ET.Ry()), m=1, r=[0.5, 0, 0], name="l1") |
| 260 | +# l2 = rtb.Link( |
| 261 | +# ets=rtb.ETS([rtb.ET.tx(1), rtb.ET.Ry()]), m=1, r=[0.5, 0, 0], parent=l1, name="l2" |
| 262 | +# ) |
| 263 | +# robot = rtb.Robot([l1, l2], name="simple 2 link") |
| 264 | +# z = np.zeros(robot.n) |
135 | 265 |
|
136 |
| -for link in robot.links: |
137 |
| - print() |
138 |
| - print(link.name) |
139 |
| - print(link.isjoint) |
140 |
| - print(link.m) |
141 |
| - print(link.r) |
142 |
| - print(link.I) |
| 266 | +# # check gravity load |
| 267 | +# tau = robot.rne(z, z, z) / 9.81 |
| 268 | +# print(tau) |
0 commit comments