7
7
8
8
Ref:
9
9
- Python implementation of 'Successive Convexification for 6-DoF Mars Rocket Powered Landing with Free-Final-Time' paper
10
- by Michael Szmuk and Behçet Açıkmeşe .
10
+ by Michael Szmuk and Behcet Acıkmese .
11
11
12
12
- EmbersArc/SuccessiveConvexificationFreeFinalTime: Implementation of "Successive Convexification for 6-DoF Mars Rocket Powered Landing with Free-Final-Time" https://github.com/EmbersArc/SuccessiveConvexificationFreeFinalTime
13
13
@@ -129,12 +129,12 @@ def f_func(self, x, u):
129
129
[vx ],
130
130
[vy ],
131
131
[vz ],
132
- [(- 1.0 * m - ux * (2 * q2 ** 2 + 2 * q3 ** 2 - 1 ) - 2 * uy *
133
- (q0 * q3 - q1 * q2 ) + 2 * uz * (q0 * q2 + q1 * q3 )) / m ],
134
- [(2 * ux * (q0 * q3 + q1 * q2 ) - uy * (2 * q1 ** 2 +
135
- 2 * q3 ** 2 - 1 ) - 2 * uz * (q0 * q1 - q2 * q3 )) / m ],
136
- [(- 2 * ux * (q0 * q2 - q1 * q3 ) + 2 * uy *
137
- (q0 * q1 + q2 * q3 ) - uz * (2 * q1 ** 2 + 2 * q2 ** 2 - 1 )) / m ],
132
+ [(- 1.0 * m - ux * (2 * q2 ** 2 + 2 * q3 ** 2 - 1 ) - 2 * uy
133
+ * (q0 * q3 - q1 * q2 ) + 2 * uz * (q0 * q2 + q1 * q3 )) / m ],
134
+ [(2 * ux * (q0 * q3 + q1 * q2 ) - uy * (2 * q1 ** 2
135
+ + 2 * q3 ** 2 - 1 ) - 2 * uz * (q0 * q1 - q2 * q3 )) / m ],
136
+ [(- 2 * ux * (q0 * q2 - q1 * q3 ) + 2 * uy
137
+ * (q0 * q1 + q2 * q3 ) - uz * (2 * q1 ** 2 + 2 * q2 ** 2 - 1 )) / m ],
138
138
[- 0.5 * q1 * wx - 0.5 * q2 * wy - 0.5 * q3 * wz ],
139
139
[0.5 * q0 * wx + 0.5 * q2 * wz - 0.5 * q3 * wy ],
140
140
[0.5 * q0 * wy - 0.5 * q1 * wz + 0.5 * q3 * wx ],
@@ -154,20 +154,20 @@ def A_func(self, x, u):
154
154
[0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],
155
155
[0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],
156
156
[0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],
157
- [(ux * (2 * q2 ** 2 + 2 * q3 ** 2 - 1 ) + 2 * uy * (q0 * q3 - q1 * q2 ) - 2 * uz * (q0 * q2 + q1 * q3 )) / m ** 2 , 0 , 0 , 0 , 0 , 0 , 0 , 2 * (q2 * uz -
158
- q3 * uy ) / m , 2 * (q2 * uy + q3 * uz ) / m , 2 * (q0 * uz + q1 * uy - 2 * q2 * ux ) / m , 2 * (- q0 * uy + q1 * uz - 2 * q3 * ux ) / m , 0 , 0 , 0 ],
159
- [(- 2 * ux * (q0 * q3 + q1 * q2 ) + uy * (2 * q1 ** 2 + 2 * q3 ** 2 - 1 ) + 2 * uz * (q0 * q1 - q2 * q3 )) / m ** 2 , 0 , 0 , 0 , 0 , 0 , 0 , 2 * (- q1 * uz +
160
- q3 * ux ) / m , 2 * (- q0 * uz - 2 * q1 * uy + q2 * ux ) / m , 2 * (q1 * ux + q3 * uz ) / m , 2 * (q0 * ux + q2 * uz - 2 * q3 * uy ) / m , 0 , 0 , 0 ],
161
- [(2 * ux * (q0 * q2 - q1 * q3 ) - 2 * uy * (q0 * q1 + q2 * q3 ) + uz * (2 * q1 ** 2 + 2 * q2 ** 2 - 1 )) / m ** 2 , 0 , 0 , 0 , 0 , 0 , 0 , 2 * (q1 * uy -
162
- q2 * ux ) / m , 2 * (q0 * uy - 2 * q1 * uz + q3 * ux ) / m , 2 * (- q0 * ux - 2 * q2 * uz + q3 * uy ) / m , 2 * (q1 * ux + q2 * uy ) / m , 0 , 0 , 0 ],
163
- [0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - 0.5 * wx , - 0.5 * wy , -
164
- 0.5 * wz , - 0.5 * q1 , - 0.5 * q2 , - 0.5 * q3 ],
165
- [0 , 0 , 0 , 0 , 0 , 0 , 0 , 0.5 * wx , 0 , 0.5 * wz , -
166
- 0.5 * wy , 0.5 * q0 , - 0.5 * q3 , 0.5 * q2 ],
157
+ [(ux * (2 * q2 ** 2 + 2 * q3 ** 2 - 1 ) + 2 * uy * (q0 * q3 - q1 * q2 ) - 2 * uz * (q0 * q2 + q1 * q3 )) / m ** 2 , 0 , 0 , 0 , 0 , 0 , 0 , 2 * (q2 * uz
158
+ - q3 * uy ) / m , 2 * (q2 * uy + q3 * uz ) / m , 2 * (q0 * uz + q1 * uy - 2 * q2 * ux ) / m , 2 * (- q0 * uy + q1 * uz - 2 * q3 * ux ) / m , 0 , 0 , 0 ],
159
+ [(- 2 * ux * (q0 * q3 + q1 * q2 ) + uy * (2 * q1 ** 2 + 2 * q3 ** 2 - 1 ) + 2 * uz * (q0 * q1 - q2 * q3 )) / m ** 2 , 0 , 0 , 0 , 0 , 0 , 0 , 2 * (- q1 * uz
160
+ + q3 * ux ) / m , 2 * (- q0 * uz - 2 * q1 * uy + q2 * ux ) / m , 2 * (q1 * ux + q3 * uz ) / m , 2 * (q0 * ux + q2 * uz - 2 * q3 * uy ) / m , 0 , 0 , 0 ],
161
+ [(2 * ux * (q0 * q2 - q1 * q3 ) - 2 * uy * (q0 * q1 + q2 * q3 ) + uz * (2 * q1 ** 2 + 2 * q2 ** 2 - 1 )) / m ** 2 , 0 , 0 , 0 , 0 , 0 , 0 , 2 * (q1 * uy
162
+ - q2 * ux ) / m , 2 * (q0 * uy - 2 * q1 * uz + q3 * ux ) / m , 2 * (- q0 * ux - 2 * q2 * uz + q3 * uy ) / m , 2 * (q1 * ux + q2 * uy ) / m , 0 , 0 , 0 ],
163
+ [0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - 0.5 * wx , - 0.5 * wy ,
164
+ - 0.5 * wz , - 0.5 * q1 , - 0.5 * q2 , - 0.5 * q3 ],
165
+ [0 , 0 , 0 , 0 , 0 , 0 , 0 , 0.5 * wx , 0 , 0.5 * wz ,
166
+ - 0.5 * wy , 0.5 * q0 , - 0.5 * q3 , 0.5 * q2 ],
167
167
[0 , 0 , 0 , 0 , 0 , 0 , 0 , 0.5 * wy , - 0.5 * wz , 0 ,
168
168
0.5 * wx , 0.5 * q3 , 0.5 * q0 , - 0.5 * q1 ],
169
- [0 , 0 , 0 , 0 , 0 , 0 , 0 , 0.5 * wz , 0.5 * wy , -
170
- 0.5 * wx , 0 , - 0.5 * q2 , 0.5 * q1 , 0.5 * q0 ],
169
+ [0 , 0 , 0 , 0 , 0 , 0 , 0 , 0.5 * wz , 0.5 * wy ,
170
+ - 0.5 * wx , 0 , - 0.5 * q2 , 0.5 * q1 , 0.5 * q0 ],
171
171
[0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],
172
172
[0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],
173
173
[0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ]])
@@ -184,12 +184,12 @@ def B_func(self, x, u):
184
184
[0 , 0 , 0 ],
185
185
[0 , 0 , 0 ],
186
186
[0 , 0 , 0 ],
187
- [(- 2 * q2 ** 2 - 2 * q3 ** 2 + 1 ) / m , 2 *
188
- (- q0 * q3 + q1 * q2 ) / m , 2 * (q0 * q2 + q1 * q3 ) / m ],
189
- [2 * (q0 * q3 + q1 * q2 ) / m , (- 2 * q1 ** 2 - 2 *
190
- q3 ** 2 + 1 ) / m , 2 * (- q0 * q1 + q2 * q3 ) / m ],
191
- [2 * (- q0 * q2 + q1 * q3 ) / m , 2 * (q0 * q1 + q2 * q3 ) /
192
- m , (- 2 * q1 ** 2 - 2 * q2 ** 2 + 1 ) / m ],
187
+ [(- 2 * q2 ** 2 - 2 * q3 ** 2 + 1 ) / m , 2
188
+ * (- q0 * q3 + q1 * q2 ) / m , 2 * (q0 * q2 + q1 * q3 ) / m ],
189
+ [2 * (q0 * q3 + q1 * q2 ) / m , (- 2 * q1 ** 2 - 2
190
+ * q3 ** 2 + 1 ) / m , 2 * (- q0 * q1 + q2 * q3 ) / m ],
191
+ [2 * (- q0 * q2 + q1 * q3 ) / m , 2 * (q0 * q1 + q2 * q3 )
192
+ / m , (- 2 * q1 ** 2 - 2 * q2 ** 2 + 1 ) / m ],
193
193
[0 , 0 , 0 ],
194
194
[0 , 0 , 0 ],
195
195
[0 , 0 , 0 ],
@@ -227,12 +227,12 @@ def skew(self, v):
227
227
228
228
def dir_cosine (self , q ):
229
229
return np .matrix ([
230
- [1 - 2 * (q [2 ] ** 2 + q [3 ] ** 2 ), 2 * (q [1 ] * q [2 ] +
231
- q [0 ] * q [3 ]), 2 * (q [1 ] * q [3 ] - q [0 ] * q [2 ])],
232
- [2 * (q [1 ] * q [2 ] - q [0 ] * q [3 ]), 1 - 2 *
233
- (q [1 ] ** 2 + q [3 ] ** 2 ), 2 * (q [2 ] * q [3 ] + q [0 ] * q [1 ])],
234
- [2 * (q [1 ] * q [3 ] + q [0 ] * q [2 ]), 2 * (q [2 ] * q [3 ] -
235
- q [0 ] * q [1 ]), 1 - 2 * (q [1 ] ** 2 + q [2 ] ** 2 )]
230
+ [1 - 2 * (q [2 ] ** 2 + q [3 ] ** 2 ), 2 * (q [1 ] * q [2 ]
231
+ + q [0 ] * q [3 ]), 2 * (q [1 ] * q [3 ] - q [0 ] * q [2 ])],
232
+ [2 * (q [1 ] * q [2 ] - q [0 ] * q [3 ]), 1 - 2
233
+ * (q [1 ] ** 2 + q [3 ] ** 2 ), 2 * (q [2 ] * q [3 ] + q [0 ] * q [1 ])],
234
+ [2 * (q [1 ] * q [3 ] + q [0 ] * q [2 ]), 2 * (q [2 ] * q [3 ]
235
+ - q [0 ] * q [1 ]), 1 - 2 * (q [1 ] ** 2 + q [2 ] ** 2 )]
236
236
])
237
237
238
238
def omega (self , w ):
@@ -460,15 +460,15 @@ def __init__(self, m, K):
460
460
# x_t+1 = A_*x_t+B_*U_t+C_*U_T+1*S_*sigma+zbar+nu
461
461
constraints += [
462
462
self .var ['X' ][:, k + 1 ] ==
463
- cvxpy .reshape (self .par ['A_bar' ][:, k ], (m .n_x , m .n_x ))
464
- * self .var ['X' ][:, k ]
465
- + cvxpy .reshape (self .par ['B_bar' ][:, k ], (m .n_x , m .n_u ))
466
- * self .var ['U' ][:, k ]
467
- + cvxpy .reshape (self .par ['C_bar' ][:, k ], (m .n_x , m .n_u ))
468
- * self .var ['U' ][:, k + 1 ]
469
- + self .par ['S_bar' ][:, k ] * self .var ['sigma' ]
470
- + self .par ['z_bar' ][:, k ]
471
- + self .var ['nu' ][:, k ]
463
+ cvxpy .reshape (self .par ['A_bar' ][:, k ], (m .n_x , m .n_x )) *
464
+ self .var ['X' ][:, k ] +
465
+ cvxpy .reshape (self .par ['B_bar' ][:, k ], (m .n_x , m .n_u )) *
466
+ self .var ['U' ][:, k ] +
467
+ cvxpy .reshape (self .par ['C_bar' ][:, k ], (m .n_x , m .n_u )) *
468
+ self .var ['U' ][:, k + 1 ] +
469
+ self .par ['S_bar' ][:, k ] * self .var ['sigma' ] +
470
+ self .par ['z_bar' ][:, k ] +
471
+ self .var ['nu' ][:, k ]
472
472
for k in range (K - 1 )
473
473
]
474
474
@@ -486,10 +486,10 @@ def __init__(self, m, K):
486
486
487
487
# Objective:
488
488
sc_objective = cvxpy .Minimize (
489
- self .par ['weight_sigma' ] * self .var ['sigma' ]
490
- + self .par ['weight_nu' ] * cvxpy .norm (self .var ['nu' ], 'inf' )
491
- + self .par ['weight_delta' ] * self .var ['delta_norm' ]
492
- + self .par ['weight_delta_sigma' ] * self .var ['sigma_norm' ]
489
+ self .par ['weight_sigma' ] * self .var ['sigma' ] +
490
+ self .par ['weight_nu' ] * cvxpy .norm (self .var ['nu' ], 'inf' ) +
491
+ self .par ['weight_delta' ] * self .var ['delta_norm' ] +
492
+ self .par ['weight_delta_sigma' ] * self .var ['sigma_norm' ]
493
493
)
494
494
495
495
objective = sc_objective
@@ -550,20 +550,20 @@ def solve(self, **kwargs):
550
550
551
551
def axis3d_equal (X , Y , Z , ax ):
552
552
553
- max_range = np .array ([X .max () - X .min (), Y .max () -
554
- Y .min (), Z .max () - Z .min ()]).max ()
555
- Xb = 0.5 * max_range * np .mgrid [- 1 :2 :2 , - 1 :2 :2 , -
556
- 1 :2 :2 ][0 ].flatten () + 0.5 * (X .max () + X .min ())
557
- Yb = 0.5 * max_range * np .mgrid [- 1 :2 :2 , - 1 :2 :2 , -
558
- 1 :2 :2 ][1 ].flatten () + 0.5 * (Y .max () + Y .min ())
559
- Zb = 0.5 * max_range * np .mgrid [- 1 :2 :2 , - 1 :2 :2 , -
560
- 1 :2 :2 ][2 ].flatten () + 0.5 * (Z .max () + Z .min ())
553
+ max_range = np .array ([X .max () - X .min (), Y .max ()
554
+ - Y .min (), Z .max () - Z .min ()]).max ()
555
+ Xb = 0.5 * max_range * np .mgrid [- 1 :2 :2 , - 1 :2 :2 ,
556
+ - 1 :2 :2 ][0 ].flatten () + 0.5 * (X .max () + X .min ())
557
+ Yb = 0.5 * max_range * np .mgrid [- 1 :2 :2 , - 1 :2 :2 ,
558
+ - 1 :2 :2 ][1 ].flatten () + 0.5 * (Y .max () + Y .min ())
559
+ Zb = 0.5 * max_range * np .mgrid [- 1 :2 :2 , - 1 :2 :2 ,
560
+ - 1 :2 :2 ][2 ].flatten () + 0.5 * (Z .max () + Z .min ())
561
561
# Comment or uncomment following both lines to test the fake bounding box:
562
562
for xb , yb , zb in zip (Xb , Yb , Zb ):
563
563
ax .plot ([xb ], [yb ], [zb ], 'w' )
564
564
565
565
566
- def plot_animation (X , U ):
566
+ def plot_animation (X , U ): # pragma: no cover
567
567
568
568
fig = plt .figure ()
569
569
ax = fig .gca (projection = '3d' )
@@ -576,14 +576,14 @@ def plot_animation(X, U):
576
576
axis3d_equal (X [2 , :], X [3 , :], X [1 , :], ax )
577
577
578
578
rx , ry , rz = X [1 :4 , k ]
579
- vx , vy , vz = X [4 :7 , k ]
579
+ # vx, vy, vz = X[4:7, k]
580
580
qw , qx , qy , qz = X [7 :11 , k ]
581
581
582
582
CBI = np .array ([
583
583
[1 - 2 * (qy ** 2 + qz ** 2 ), 2 * (qx * qy + qw * qz ),
584
584
2 * (qx * qz - qw * qy )],
585
- [2 * (qx * qy - qw * qz ), 1 - 2 *
586
- (qx ** 2 + qz ** 2 ), 2 * (qy * qz + qw * qx )],
585
+ [2 * (qx * qy - qw * qz ), 1 - 2
586
+ * (qx ** 2 + qz ** 2 ), 2 * (qy * qz + qw * qx )],
587
587
[2 * (qx * qz + qw * qy ), 2 * (qy * qz - qw * qx ),
588
588
1 - 2 * (qx ** 2 + qy ** 2 )]
589
589
])
@@ -618,8 +618,6 @@ def main():
618
618
integrator = Integrator (m , K )
619
619
problem = SCProblem (m , K )
620
620
621
- last_linear_cost = None
622
-
623
621
converged = False
624
622
w_delta = W_DELTA
625
623
for it in range (iterations ):
@@ -633,7 +631,7 @@ def main():
633
631
X_last = X , U_last = U , sigma_last = sigma ,
634
632
weight_sigma = W_SIGMA , weight_nu = W_NU ,
635
633
weight_delta = w_delta , weight_delta_sigma = W_DELTA_SIGMA )
636
- info = problem .solve ()
634
+ problem .solve ()
637
635
638
636
X = problem .get_variable ('X' )
639
637
U = problem .get_variable ('U' )
@@ -658,7 +656,7 @@ def main():
658
656
print (f'Converged after { it + 1 } iterations.' )
659
657
break
660
658
661
- if show_animation :
659
+ if show_animation : # pragma: no cover
662
660
plot_animation (X , U )
663
661
664
662
print ("done!!" )
0 commit comments