@@ -43,7 +43,7 @@ class Rocket_Model_6DoF:
43
43
A 6 degree of freedom rocket landing problem.
44
44
"""
45
45
46
- def __init__ (self ):
46
+ def __init__ (self , rng ):
47
47
"""
48
48
A large r_scale for a small scale problem will
49
49
ead to numerical problems as parameters become excessively small
@@ -92,7 +92,7 @@ def __init__(self):
92
92
# Vector from thrust point to CoM
93
93
self .r_T_B = np .array ([- 1e-2 , 0. , 0. ])
94
94
95
- self .set_random_initial_state ()
95
+ self .set_random_initial_state (rng )
96
96
97
97
self .x_init = np .concatenate (
98
98
((self .m_wet ,), self .r_I_init , self .v_I_init , self .q_B_I_init , self .w_B_init ))
@@ -102,29 +102,32 @@ def __init__(self):
102
102
self .r_scale = np .linalg .norm (self .r_I_init )
103
103
self .m_scale = self .m_wet
104
104
105
- def set_random_initial_state (self ):
105
+ def set_random_initial_state (self , rng ):
106
+ if rng is None :
107
+ rng = np .random .default_rng ()
108
+
106
109
self .r_I_init = np .array ((0. , 0. , 0. ))
107
- self .r_I_init [0 ] = np . random .uniform (3 , 4 )
108
- self .r_I_init [1 :3 ] = np . random .uniform (- 2 , 2 , size = 2 )
110
+ self .r_I_init [0 ] = rng .uniform (3 , 4 )
111
+ self .r_I_init [1 :3 ] = rng .uniform (- 2 , 2 , size = 2 )
109
112
110
113
self .v_I_init = np .array ((0. , 0. , 0. ))
111
- self .v_I_init [0 ] = np . random .uniform (- 1 , - 0.5 )
112
- self .v_I_init [1 :3 ] = np . random . uniform (
113
- - 0.5 , - 0.2 , size = 2 ) * self .r_I_init [1 :3 ]
114
+ self .v_I_init [0 ] = rng .uniform (- 1 , - 0.5 )
115
+ self .v_I_init [1 :3 ] = rng . uniform (- 0.5 , - 0.2 ,
116
+ size = 2 ) * self .r_I_init [1 :3 ]
114
117
115
118
self .q_B_I_init = self .euler_to_quat ((0 ,
116
- np . random .uniform (- 30 , 30 ),
117
- np . random .uniform (- 30 , 30 )))
119
+ rng .uniform (- 30 , 30 ),
120
+ rng .uniform (- 30 , 30 )))
118
121
self .w_B_init = np .deg2rad ((0 ,
119
- np . random .uniform (- 20 , 20 ),
120
- np . random .uniform (- 20 , 20 )))
122
+ rng .uniform (- 20 , 20 ),
123
+ rng .uniform (- 20 , 20 )))
121
124
122
125
def f_func (self , x , u ):
123
126
m , rx , ry , rz , vx , vy , vz , q0 , q1 , q2 , q3 , wx , wy , wz = x [0 ], x [1 ], x [
124
127
2 ], x [3 ], x [4 ], x [5 ], x [6 ], x [7 ], x [8 ], x [9 ], x [10 ], x [11 ], x [12 ], x [13 ]
125
128
ux , uy , uz = u [0 ], u [1 ], u [2 ]
126
129
127
- return np .matrix ([
130
+ return np .array ([
128
131
[- 0.01 * np .sqrt (ux ** 2 + uy ** 2 + uz ** 2 )],
129
132
[vx ],
130
133
[vy ],
@@ -149,7 +152,7 @@ def A_func(self, x, u):
149
152
2 ], x [3 ], x [4 ], x [5 ], x [6 ], x [7 ], x [8 ], x [9 ], x [10 ], x [11 ], x [12 ], x [13 ]
150
153
ux , uy , uz = u [0 ], u [1 ], u [2 ]
151
154
152
- return np .matrix ([
155
+ return np .array ([
153
156
[0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],
154
157
[0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],
155
158
[0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],
@@ -177,7 +180,7 @@ def B_func(self, x, u):
177
180
2 ], x [3 ], x [4 ], x [5 ], x [6 ], x [7 ], x [8 ], x [9 ], x [10 ], x [11 ], x [12 ], x [13 ]
178
181
ux , uy , uz = u [0 ], u [1 ], u [2 ]
179
182
180
- return np .matrix ([
183
+ return np .array ([
181
184
[- 0.01 * ux / np .sqrt (ux ** 2 + uy ** 2 + uz ** 2 ),
182
185
- 0.01 * uy / np .sqrt (ux ** 2 + uy ** 2 + uz ** 2 ),
183
186
- 0.01 * uz / np .sqrt (ux ** 2 + uy ** 2 + uz ** 2 )],
@@ -219,14 +222,14 @@ def euler_to_quat(self, a):
219
222
return q
220
223
221
224
def skew (self , v ):
222
- return np .matrix ([
225
+ return np .array ([
223
226
[0 , - v [2 ], v [1 ]],
224
227
[v [2 ], 0 , - v [0 ]],
225
228
[- v [1 ], v [0 ], 0 ]
226
229
])
227
230
228
231
def dir_cosine (self , q ):
229
- return np .matrix ([
232
+ return np .array ([
230
233
[1 - 2 * (q [2 ] ** 2 + q [3 ] ** 2 ), 2 * (q [1 ] * q [2 ]
231
234
+ q [0 ] * q [3 ]), 2 * (q [1 ] * q [3 ] - q [0 ] * q [2 ])],
232
235
[2 * (q [1 ] * q [2 ] - q [0 ] * q [3 ]), 1 - 2
@@ -236,7 +239,7 @@ def dir_cosine(self, q):
236
239
])
237
240
238
241
def omega (self , w ):
239
- return np .matrix ([
242
+ return np .array ([
240
243
[0 , - w [0 ], - w [1 ], - w [2 ]],
241
244
[w [0 ], 0 , w [2 ], - w [1 ]],
242
245
[w [1 ], - w [2 ], 0 , w [0 ]],
@@ -304,7 +307,7 @@ def get_constraints(self, X_v, U_v, X_last_p, U_last_p):
304
307
]
305
308
306
309
# linearized lower thrust constraint
307
- rhs = [U_last_p [:, k ] / cvxpy .norm (U_last_p [:, k ]) * U_v [:, k ]
310
+ rhs = [U_last_p [:, k ] / cvxpy .norm (U_last_p [:, k ]) @ U_v [:, k ]
308
311
for k in range (X_v .shape [1 ])]
309
312
constraints += [
310
313
self .T_min <= cvxpy .vstack (rhs )
@@ -460,11 +463,11 @@ def __init__(self, m, K):
460
463
# x_t+1 = A_*x_t+B_*U_t+C_*U_T+1*S_*sigma+zbar+nu
461
464
constraints += [
462
465
self .var ['X' ][:, k + 1 ] ==
463
- cvxpy .reshape (self .par ['A_bar' ][:, k ], (m .n_x , m .n_x )) *
466
+ cvxpy .reshape (self .par ['A_bar' ][:, k ], (m .n_x , m .n_x )) @
464
467
self .var ['X' ][:, k ] +
465
- cvxpy .reshape (self .par ['B_bar' ][:, k ], (m .n_x , m .n_u )) *
468
+ cvxpy .reshape (self .par ['B_bar' ][:, k ], (m .n_x , m .n_u )) @
466
469
self .var ['U' ][:, k ] +
467
- cvxpy .reshape (self .par ['C_bar' ][:, k ], (m .n_x , m .n_u )) *
470
+ cvxpy .reshape (self .par ['C_bar' ][:, k ], (m .n_x , m .n_u )) @
468
471
self .var ['U' ][:, k + 1 ] +
469
472
self .par ['S_bar' ][:, k ] * self .var ['sigma' ] +
470
473
self .par ['z_bar' ][:, k ] +
@@ -606,9 +609,9 @@ def plot_animation(X, U): # pragma: no cover
606
609
plt .pause (0.5 )
607
610
608
611
609
- def main ():
612
+ def main (rng = None ):
610
613
print ("start!!" )
611
- m = Rocket_Model_6DoF ()
614
+ m = Rocket_Model_6DoF (rng )
612
615
613
616
# state and input list
614
617
X = np .empty (shape = [m .n_x , K ])
0 commit comments