alfonsogonzalez / AWP

Astrodynamics with Python book, software, and videos. Spacecraft trajectory and attitude modeling and simulation
312 stars 76 forks source link

Pinpoint Landing #41

Open brunopinto900 opened 2 years ago

brunopinto900 commented 2 years ago

Hello,

Me and my colleagues want to implement several algorithms to land a spacecraft on the ground, GFOLD is one of the solutions. Is this possible with the current state of this repo?

Thank you.

rslippert commented 9 months ago

? Did Alfonso ever responded to this ? I would say; No, the CR3BP.py code does not have mass or the ability to thrust. It looks like this code assumes zero mass. But it should be easy to modify.

You will need to add mass like Alfonso did with Spacecraft.py For thrust you need to add acceleration terms into states 3,4,5 of the of diffy_q() function

def diffy_q( self, et, state ):
    rx, ry, rz, vx, vy, vz, mass = state

    r13_vec = [ rx + self.mu, ry, rz ]        # vector barycenter - Earth
    r23_vec = [ rx - 1 + self.mu, ry, rz ]    # vector barycenter - moon
    r13_3   = np.linalg.norm( r13_vec ) ** 3
    r23_3   = np.linalg.norm( r23_vec ) ** 3
    omega_x = rx - self.one_mu * ( rx + self.mu ) / r13_3 -\
                self.mu * ( rx - 1 + self.mu ) / r23_3
    omega_y = ry - self.one_mu * ry / r13_3 - self.mu * ry / r23_3
    omega_z = -self.one_mu * rz / r13_3 - self.mu * rz / r23_3
    state_dot       = np.zeros( 7 )
    state_dot[ :3 ] = [ vx, vy, vz ]
    accel, mdot, a_mag = self.thruster( et, mass ) # get rocket thrust scalars
    state_dot[  3 ] =  2 * vy + omega_x + accel[0]
    state_dot[  4 ] = -2 * vx + omega_y + accel[1]
    state_dot[  5 ] =           omega_z + accel[2]
    state_dot[ 6  ] = mdot
    return state_dot

then the thruster ( thrust to accel and mdot) looks like this_:

def thruster( self, et, mass ): #  Thrust at time
    T_mag = np.linalg.norm( self.thrust )  # thrust magnitude (N)
    self.T_mag = T_mag
    mdot = -T_mag / (self.impulse[0] * 9.80665)*EM['Time_K'] # fuel flow kg/EMsec
    ax = EM['Accel_K'] * self.thrust[0]/mass  # CR3BP acceleration
    ay = EM['Accel_K'] * self.thrust[1]/mass
    az = EM['Accel_K'] * self.thrust[2]/mass
    if self.fuel < 0.5: # if out of fuel
        return( [0.,0.,0.], 0., 0.)  # return no acceleration
    A_mag = np.linalg.norm( [ax,ay,az ] ) # acceleration magnitude m/sec2
    return( [ ax, ay, az], mdot, A_mag) #return accel due to thrust

EM={'lunar_r' : 1737.4, # mean radius of moon km 'earth_r' : 6371, # mean radius of Earth 'NRHO_period' : 6.531, # days for 1 Gateway orbit 'NRHO_Jacobi' : 3.047, # jacobi const of Gateway orbit 'Dist_K' : 384400., # Distance km in 1 EMBR_dist constant 'Time_K' : 375700., # Seconds in 1 EMBR_time constant 'days_K' : 4.348378, # Days in 1 EMBR_time constant 'Vel_K' : 1023.157, # m/sec orbital velocity of moon 1000*Dist_K/Time_K 'Accel_K': 367.201, # Time_K / Vel_K 'lunar_sid': 27.32167, # days for 1 lunar sidereal rotation (earth rel.) 'lunar_syn': 29.53059, # days for 1 lunar synodic phases (solar rel.) 'lunar_vel' : 1023.157, # lunar velocity m/sec RL 'mu': 0.0121505844, # Earth Moon combined gravity parameter 'lunarX': 0.98784638, # EMBR X location of moon 'L1': 0.8362925909457, # location L1 EMBR 'L2': 1.1561681659055, # location L2 EMBR 'L3':-1.0051155116069, # location L3 EMBR 'mass2':7.34578765e22, # mass of Moon 'mass1':5.9721671e24 # mass of Earth }

rslippert commented 8 months ago

BTW I will be releasing Gateway24 software includes Spacecraft mass,fuel plus moon landing. Gateway24 switches from CR3BP to Kepler style differential equations for landing on moon. For landing, a 14 state, 6DOF state vector is needed, An example TVC python github code is natronimo search for "tvc simulation python mass thrust vector"