Moon lander with autopilot in python
In the previous example, the user was the pilot. See if you can design an autopilot which will land the lunar landing module on the moon. You need to design a function which calculates a new burn value based on available data, altitude, speed, gravity. Here is my simple example.
burn=20 if speed + gravity > 2 * impact: burn = 10 * (speed + gravity - (impact) * 2) if impact < 2: burn = 10 * (2 * speed + gravity - altitude)
It is a bit erratic but lands properly at the end. See if you can develop a formula which has a smoother burn control.
Altitude=1000.000 Speed=30.000 Fuel=1500.000 Impact=33.333 Previous burn= 0.000 Altitude= 970.000 Speed=29.622 Fuel=1480.000 Impact=32.746 Previous burn=20.000 Altitude= 940.378 Speed=29.244 Fuel=1460.000 Impact=32.156 Previous burn=20.000 Altitude= 911.134 Speed=28.866 Fuel=1440.000 Impact=31.564 Previous burn=20.000 Altitude= 882.268 Speed=28.488 Fuel=1420.000 Impact=30.970 Previous burn=20.000 Altitude= 853.780 Speed=28.110 Fuel=1400.000 Impact=30.373 Previous burn=20.000 Altitude= 825.670 Speed=27.732 Fuel=1380.000 Impact=29.773 Previous burn=20.000 Altitude= 797.938 Speed=27.354 Fuel=1360.000 Impact=29.171 Previous burn=20.000 Altitude= 770.584 Speed=26.976 Fuel=1340.000 Impact=28.566 Previous burn=20.000 Altitude= 743.608 Speed=26.598 Fuel=1320.000 Impact=27.957 Previous burn=20.000 Altitude= 717.010 Speed=26.220 Fuel=1300.000 Impact=27.346 Previous burn=20.000 Altitude= 690.790 Speed=25.842 Fuel=1280.000 Impact=26.731 Previous burn=20.000 Altitude= 664.948 Speed=25.464 Fuel=1260.000 Impact=26.113 Previous burn=20.000 Altitude= 639.484 Speed=25.086 Fuel=1240.000 Impact=25.492 Previous burn=20.000 Altitude= 614.398 Speed=24.708 Fuel=1220.000 Impact=24.866 Previous burn=20.000 Altitude= 589.690 Speed=24.330 Fuel=1200.000 Impact=24.237 Previous burn=20.000 Altitude= 565.360 Speed=23.952 Fuel=1180.000 Impact=23.604 Previous burn=20.000 Altitude= 541.408 Speed=23.574 Fuel=1160.000 Impact=22.966 Previous burn=20.000 Altitude= 517.834 Speed=23.196 Fuel=1140.000 Impact=22.324 Previous burn=20.000 Altitude= 494.638 Speed=22.818 Fuel=1120.000 Impact=21.678 Previous burn=20.000 Altitude= 471.820 Speed=22.440 Fuel=1100.000 Impact=21.026 Previous burn=20.000 Altitude= 449.380 Speed=22.062 Fuel=1080.000 Impact=20.369 Previous burn=20.000 Altitude= 427.318 Speed=21.684 Fuel=1060.000 Impact=19.707 Previous burn=20.000 Altitude= 405.634 Speed=21.306 Fuel=1040.000 Impact=19.038 Previous burn=20.000 Altitude= 384.328 Speed=20.928 Fuel=1020.000 Impact=18.364 Previous burn=20.000 Altitude= 363.400 Speed=20.550 Fuel=1000.000 Impact=17.684 Previous burn=20.000 Altitude= 342.850 Speed=20.172 Fuel= 980.000 Impact=16.996 Previous burn=20.000 Altitude= 322.678 Speed=19.794 Fuel= 960.000 Impact=16.302 Previous burn=20.000 Altitude= 302.884 Speed=19.416 Fuel= 940.000 Impact=15.600 Previous burn=20.000 Altitude= 283.468 Speed=19.038 Fuel= 920.000 Impact=14.890 Previous burn=20.000 Altitude= 264.430 Speed=18.660 Fuel= 900.000 Impact=14.171 Previous burn=20.000 Altitude= 245.770 Speed=18.282 Fuel= 880.000 Impact=13.443 Previous burn=20.000 Altitude= 227.488 Speed=17.904 Fuel= 860.000 Impact=12.706 Previous burn=20.000 Altitude= 209.584 Speed=17.526 Fuel= 840.000 Impact=11.958 Previous burn=20.000 Altitude= 192.058 Speed=17.148 Fuel= 820.000 Impact=11.200 Previous burn=20.000 Altitude= 174.910 Speed=16.770 Fuel= 800.000 Impact=10.430 Previous burn=20.000 Altitude= 158.140 Speed=16.392 Fuel= 780.000 Impact= 9.647 Previous burn=20.000 Altitude= 141.748 Speed=16.014 Fuel= 760.000 Impact= 8.852 Previous burn=20.000 Altitude= 125.734 Speed=15.636 Fuel= 740.000 Impact= 8.041 Previous burn=20.000 Altitude= 110.098 Speed=16.083 Fuel= 728.246 Impact= 6.846 Previous burn=11.754 Altitude= 94.015 Speed=13.692 Fuel= 688.115 Impact= 6.867 Previous burn=40.131 Altitude= 80.324 Speed=13.733 Fuel= 672.314 Impact= 5.849 Previous burn=15.802 Altitude= 66.590 Speed=11.698 Fuel= 635.736 Impact= 5.693 Previous burn=36.577 Altitude= 54.893 Speed=11.385 Fuel= 616.393 Impact= 4.821 Previous burn=19.343 Altitude= 43.508 Speed= 9.643 Fuel= 582.748 Impact= 4.512 Previous burn=33.645 Altitude= 33.865 Speed= 9.024 Fuel= 560.339 Impact= 3.753 Previous burn=22.409 Altitude= 24.841 Speed= 7.506 Fuel= 528.936 Impact= 3.310 Previous burn=31.403 Altitude= 17.335 Speed= 6.619 Fuel= 503.853 Impact= 2.619 Previous burn=25.083 Altitude= 10.716 Speed= 5.238 Fuel= 473.818 Impact= 2.046 Previous burn=30.035 Altitude= 5.478 Speed= 4.092 Fuel= 446.138 Impact= 1.339 Previous burn=27.680 Altitude= 1.386 Speed= 1.386 Fuel= 402.864 Impact= 1.000 Previous burn=43.274 Altitude= 0.000 Speed= 0.000 Fuel= 372.780 Last burn=30.084 You have landed
Here is the full code
# moonlanderautopilot.py # this game simulates a lunar landing module (LLM) landing on the moon # The programmer is the autopilot and needs to control how much fuel is burnt in the # retro rockets so that the descent speed slows to zero just as the # altitude above the moon's surface reaches zero. If it impacts the moon # more than 5 m below the surface, or your speed on impact is # greater than 5 m/s then it has crashed. # Otherwise it is considered to be a 'good' landing. # If it runs out of fuel, LLM will accelerate towards moon by gravity. # set up the initial parameters speed = 30 # speed approaching the moon fuel = 1500 # how much fuel is left altitude = 1000 # altitude above moon gravity = 1.622 # acceleration due to gravity burn = 0 # initial rate of burning fuel in retrorockets # while LLM is above the moon's surface, # calculate flight data and take input from pilot while altitude > 0: # calculate how long until LLM will impact moon at current speed (impact) if speed <= 0: impact = 1000 else: impact = altitude / speed # display flight data print("Altitude={:8.3f} Speed={:6.3f} Fuel={:8.3f} Impact={:6.3f} Previous burn={:6.3f}".format(altitude,speed,fuel,impact,burn)) # let autopilot calculate the new burn rate burn=20 if speed + gravity > 2 * impact: burn = 10 * (speed + gravity - (impact) * 2) if impact < 2: burn = 10 * (2 * speed + gravity - altitude) # ensure rate of fuel burning is within rocket's capability and doesn't exceed remaining fuel if burn < 0: burn = 0 if burn > 50: burn = 50 if burn > fuel: burn = fuel #calculate new flight data altitude -= speed speed += gravity - burn/10 fuel -= burn # loop has ended so we must have hit moon's surface # display final flight data and assess whether it was a crash or a good landing print("Altitude={:8.3f} Speed={:6.3f} Fuel={:8.3f} Last burn={:6.3f}".format(altitude,speed,fuel,burn)) if altitude <- 5 or speed > 5: print("You have crashed") else: print("You have landed")