|
17 | 17 | psi_d: desired yaw angle (deg)
|
18 | 18 | n_d: desired propeller revolution (rpm)
|
19 | 19 | V_c: current speed (m/s)
|
20 |
| - beta_c: current direction (deg) |
| 20 | + beta_c: current direction (deg) |
| 21 | + fins: number of fins (equally spaced) |
21 | 22 |
|
22 | 23 | Methods:
|
23 | 24 |
|
24 | 25 | [nu,u_actual] = dynamics(eta,nu,u_actual,u_control,sampleTime ) returns
|
25 | 26 | nu[k+1] and u_actual[k+1] using Euler's method. The control input is:
|
26 | 27 |
|
27 |
| - u_control = [ delta_r rudder angle (rad) |
28 |
| - delta_s stern plane angle (rad) |
| 28 | + u_control = [ delta_r_top rudder angle (rad) |
| 29 | + delta_r_bottom rudder angle (rad) |
| 30 | + delta_s_star stern plane angle (rad) |
| 31 | + delta_s_port stern plane angle (rad) |
29 | 32 | n propeller revolution (rpm) ]
|
30 | 33 |
|
31 | 34 | u = depthHeadingAutopilot(eta,nu,sampleTime)
|
@@ -115,7 +118,6 @@ def __init__(
|
115 | 118 |
|
116 | 119 | self.nu = np.array([0, 0, 0, 0, 0, 0], float) # velocity vector
|
117 | 120 | self.u_actual = np.zeros(fins+1, float) # control input vector
|
118 |
| - # TODO make this the length of the fins |
119 | 121 | self.controls = [
|
120 | 122 | "T Tail rudder (deg)",
|
121 | 123 | "B Tail rudder (deg)",
|
@@ -189,14 +191,14 @@ def __init__(
|
189 | 191 | self.w_pitch = math.sqrt( self.W * ( self.r_bg[2]-self.r_bb[2] ) /
|
190 | 192 | self.M[4][4] )
|
191 | 193 |
|
192 |
| - S_fin = 0.00665; # one fin area |
| 194 | + S_fin = 0.00665; # fin area |
193 | 195 | CL_delta_r = 0.5 # rudder lift coefficient
|
194 | 196 | CL_delta_s = 0.7 # stern-plane lift coefficient
|
195 | 197 |
|
196 |
| - portSternFin = fin(S_fin, CL_delta_s, -a, angle=0) |
197 |
| - bottomRudderFin = fin(S_fin, CL_delta_r, -a, angle=90) |
198 |
| - starSternFin = fin(S_fin, CL_delta_s, -a, angle=180) |
199 |
| - topRudderFin = fin(S_fin, CL_delta_r, -a, angle=270) |
| 198 | + portSternFin = fin(S_fin, CL_delta_s, -a, angle=0, rho=self.rho) |
| 199 | + bottomRudderFin = fin(S_fin, CL_delta_r, -a, angle=90, rho=self.rho) |
| 200 | + starSternFin = fin(S_fin, CL_delta_s, -a, angle=180, rho=self.rho) |
| 201 | + topRudderFin = fin(S_fin, CL_delta_r, -a, angle=270, rho=self.rho) |
200 | 202 | self.fins = [topRudderFin, bottomRudderFin , starSternFin, portSternFin]
|
201 | 203 |
|
202 | 204 | # Low-speed linear damping matrix parameters
|
@@ -344,17 +346,16 @@ def dynamics(self, eta, nu, u_actual, u_control, sampleTime):
|
344 | 346 | # Restoring forces and moments
|
345 | 347 | g = gvect(self.W,self.B,eta[4],eta[3],self.r_bg,self.r_bb)
|
346 | 348 |
|
347 |
| - # Fin torques |
| 349 | + # Fin force vector |
348 | 350 | tau_fins = np.zeros(6,float)
|
349 | 351 | for i in range(len(self.fins)):
|
350 | 352 | tau_fins += self.fins[i].torque(nu_r)
|
351 |
| - u_actual[i] = self.fins[i].actuate(sampleTime, u_control[i]) |
| 353 | + u_actual[i] = self.fins[i].actuate(sampleTime, u_control[i]) # Actuator Dynamics |
352 | 354 |
|
353 |
| - # Generalized force vector |
| 355 | + # Thrust force vector |
354 | 356 | # K_Prop scaled down by a factor of 10 to match exp. results
|
355 | 357 | tau_thrust = np.array([(1-t_prop) * X_prop, 0, 0, K_prop / 10, 0, 0], float)
|
356 | 358 |
|
357 |
| - tau_debug = tau_fins + tau_thrust |
358 | 359 | # AUV dynamics
|
359 | 360 | tau_sum = tau_thrust + tau_fins + tau_liftdrag + tau_crossflow - np.matmul(C+D,nu_r) - g
|
360 | 361 | nu_dot = Dnu_c + np.matmul(self.Minv, tau_sum)
|
@@ -382,7 +383,7 @@ def stepInput(self, t):
|
382 | 383 | n propeller revolution (rpm) ]
|
383 | 384 | """
|
384 | 385 | delta_r = 5 * self.D2R # rudder angle (rad)
|
385 |
| - delta_s = 5 * self.D2R # stern angle (rad) |
| 386 | + delta_s = -5 * self.D2R # stern angle (rad) |
386 | 387 | n = 1525 # propeller revolution (rpm)
|
387 | 388 |
|
388 | 389 | if t > 100:
|
|
0 commit comments