{"id":445,"date":"2017-08-27T08:12:49","date_gmt":"2017-08-27T08:12:49","guid":{"rendered":"https:\/\/www.triptera.com.au\/wordpress\/?p=445"},"modified":"2017-08-27T08:15:01","modified_gmt":"2017-08-27T08:15:01","slug":"moon-lander-with-autopilot-in-python","status":"publish","type":"post","link":"https:\/\/www.triptera.com.au\/wordpress\/2017\/08\/27\/moon-lander-with-autopilot-in-python\/","title":{"rendered":"Moon lander with autopilot in python"},"content":{"rendered":"<p>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.<\/p>\n<pre class=\"brush: python; title: ; wrap-lines: false; notranslate\" title=\"\">\r\n    burn=20\r\n    if speed + gravity &gt; 2 * impact:\r\n        burn = 10 * (speed + gravity - (impact) * 2)\r\n    if impact &lt; 2:\r\n        burn = 10 * (2 * speed + gravity - altitude)\r\n<\/pre>\n<p>It is a bit erratic but lands properly at the end. See if you can develop a formula which has a smoother burn control.<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; wrap-lines: false; notranslate\" title=\"\">Altitude=1000.000 Speed=30.000 Fuel=1500.000 Impact=33.333 Previous burn= 0.000\r\nAltitude= 970.000 Speed=29.622 Fuel=1480.000 Impact=32.746 Previous burn=20.000\r\nAltitude= 940.378 Speed=29.244 Fuel=1460.000 Impact=32.156 Previous burn=20.000\r\nAltitude= 911.134 Speed=28.866 Fuel=1440.000 Impact=31.564 Previous burn=20.000\r\nAltitude= 882.268 Speed=28.488 Fuel=1420.000 Impact=30.970 Previous burn=20.000\r\nAltitude= 853.780 Speed=28.110 Fuel=1400.000 Impact=30.373 Previous burn=20.000\r\nAltitude= 825.670 Speed=27.732 Fuel=1380.000 Impact=29.773 Previous burn=20.000\r\nAltitude= 797.938 Speed=27.354 Fuel=1360.000 Impact=29.171 Previous burn=20.000\r\nAltitude= 770.584 Speed=26.976 Fuel=1340.000 Impact=28.566 Previous burn=20.000\r\nAltitude= 743.608 Speed=26.598 Fuel=1320.000 Impact=27.957 Previous burn=20.000\r\nAltitude= 717.010 Speed=26.220 Fuel=1300.000 Impact=27.346 Previous burn=20.000\r\nAltitude= 690.790 Speed=25.842 Fuel=1280.000 Impact=26.731 Previous burn=20.000\r\nAltitude= 664.948 Speed=25.464 Fuel=1260.000 Impact=26.113 Previous burn=20.000\r\nAltitude= 639.484 Speed=25.086 Fuel=1240.000 Impact=25.492 Previous burn=20.000\r\nAltitude= 614.398 Speed=24.708 Fuel=1220.000 Impact=24.866 Previous burn=20.000\r\nAltitude= 589.690 Speed=24.330 Fuel=1200.000 Impact=24.237 Previous burn=20.000\r\nAltitude= 565.360 Speed=23.952 Fuel=1180.000 Impact=23.604 Previous burn=20.000\r\nAltitude= 541.408 Speed=23.574 Fuel=1160.000 Impact=22.966 Previous burn=20.000\r\nAltitude= 517.834 Speed=23.196 Fuel=1140.000 Impact=22.324 Previous burn=20.000\r\nAltitude= 494.638 Speed=22.818 Fuel=1120.000 Impact=21.678 Previous burn=20.000\r\nAltitude= 471.820 Speed=22.440 Fuel=1100.000 Impact=21.026 Previous burn=20.000\r\nAltitude= 449.380 Speed=22.062 Fuel=1080.000 Impact=20.369 Previous burn=20.000\r\nAltitude= 427.318 Speed=21.684 Fuel=1060.000 Impact=19.707 Previous burn=20.000\r\nAltitude= 405.634 Speed=21.306 Fuel=1040.000 Impact=19.038 Previous burn=20.000\r\nAltitude= 384.328 Speed=20.928 Fuel=1020.000 Impact=18.364 Previous burn=20.000\r\nAltitude= 363.400 Speed=20.550 Fuel=1000.000 Impact=17.684 Previous burn=20.000\r\nAltitude= 342.850 Speed=20.172 Fuel= 980.000 Impact=16.996 Previous burn=20.000\r\nAltitude= 322.678 Speed=19.794 Fuel= 960.000 Impact=16.302 Previous burn=20.000\r\nAltitude= 302.884 Speed=19.416 Fuel= 940.000 Impact=15.600 Previous burn=20.000\r\nAltitude= 283.468 Speed=19.038 Fuel= 920.000 Impact=14.890 Previous burn=20.000\r\nAltitude= 264.430 Speed=18.660 Fuel= 900.000 Impact=14.171 Previous burn=20.000\r\nAltitude= 245.770 Speed=18.282 Fuel= 880.000 Impact=13.443 Previous burn=20.000\r\nAltitude= 227.488 Speed=17.904 Fuel= 860.000 Impact=12.706 Previous burn=20.000\r\nAltitude= 209.584 Speed=17.526 Fuel= 840.000 Impact=11.958 Previous burn=20.000\r\nAltitude= 192.058 Speed=17.148 Fuel= 820.000 Impact=11.200 Previous burn=20.000\r\nAltitude= 174.910 Speed=16.770 Fuel= 800.000 Impact=10.430 Previous burn=20.000\r\nAltitude= 158.140 Speed=16.392 Fuel= 780.000 Impact= 9.647 Previous burn=20.000\r\nAltitude= 141.748 Speed=16.014 Fuel= 760.000 Impact= 8.852 Previous burn=20.000\r\nAltitude= 125.734 Speed=15.636 Fuel= 740.000 Impact= 8.041 Previous burn=20.000\r\nAltitude= 110.098 Speed=16.083 Fuel= 728.246 Impact= 6.846 Previous burn=11.754\r\nAltitude=  94.015 Speed=13.692 Fuel= 688.115 Impact= 6.867 Previous burn=40.131\r\nAltitude=  80.324 Speed=13.733 Fuel= 672.314 Impact= 5.849 Previous burn=15.802\r\nAltitude=  66.590 Speed=11.698 Fuel= 635.736 Impact= 5.693 Previous burn=36.577\r\nAltitude=  54.893 Speed=11.385 Fuel= 616.393 Impact= 4.821 Previous burn=19.343\r\nAltitude=  43.508 Speed= 9.643 Fuel= 582.748 Impact= 4.512 Previous burn=33.645\r\nAltitude=  33.865 Speed= 9.024 Fuel= 560.339 Impact= 3.753 Previous burn=22.409\r\nAltitude=  24.841 Speed= 7.506 Fuel= 528.936 Impact= 3.310 Previous burn=31.403\r\nAltitude=  17.335 Speed= 6.619 Fuel= 503.853 Impact= 2.619 Previous burn=25.083\r\nAltitude=  10.716 Speed= 5.238 Fuel= 473.818 Impact= 2.046 Previous burn=30.035\r\nAltitude=   5.478 Speed= 4.092 Fuel= 446.138 Impact= 1.339 Previous burn=27.680\r\nAltitude=   1.386 Speed= 1.386 Fuel= 402.864 Impact= 1.000 Previous burn=43.274\r\nAltitude=   0.000 Speed= 0.000 Fuel= 372.780 Last burn=30.084\r\nYou have landed\r\n<\/pre>\n<p>Here is the full code<\/p>\n<pre class=\"brush: python; title: ; wrap-lines: false; notranslate\" title=\"\">\r\n# moonlanderautopilot.py\r\n# this game simulates a lunar landing module (LLM) landing on the moon\r\n# The programmer is the autopilot and needs to control how much fuel is burnt in the\r\n# retro rockets so that the descent speed slows to zero just as the\r\n# altitude above the moon's surface reaches zero. If it impacts the moon\r\n# more than 5 m below the surface, or your speed on impact is\r\n# greater than 5 m\/s then it has crashed.\r\n# Otherwise it is considered to be a 'good' landing.\r\n# If it runs out of fuel, LLM will accelerate towards moon by gravity.\r\n\r\n# set up the initial parameters\r\nspeed = 30      # speed approaching the moon\r\nfuel = 1500     # how much fuel is left\r\naltitude = 1000 # altitude above moon\r\ngravity = 1.622 # acceleration due to gravity\r\nburn = 0        # initial rate of burning fuel in retrorockets\r\n\r\n# while LLM is above the moon's surface,\r\n# calculate flight data and take input from pilot\r\nwhile altitude &gt; 0:\r\n    # calculate how long until LLM will impact moon at current speed (impact)\r\n    if speed &lt;= 0:\r\n        impact = 1000\r\n    else:\r\n        impact = altitude \/ speed\r\n    # display flight data\r\n    print(&quot;Altitude={:8.3f} Speed={:6.3f} Fuel={:8.3f} Impact={:6.3f} Previous burn={:6.3f}&quot;.format(altitude,speed,fuel,impact,burn))\r\n    # let autopilot calculate the new burn rate\r\n    burn=20\r\n    if speed + gravity &gt; 2 * impact:\r\n        burn = 10 * (speed + gravity - (impact) * 2)\r\n    if impact &lt; 2:\r\n        burn = 10 * (2 * speed + gravity - altitude)\r\n    # ensure rate of fuel burning is within rocket's capability and doesn't exceed remaining fuel\r\n    if burn &lt; 0:\r\n        burn = 0\r\n    if burn &gt; 50:\r\n        burn = 50\r\n    if burn &gt; fuel:\r\n        burn = fuel\r\n    #calculate new flight data\r\n    altitude -= speed\r\n    speed += gravity - burn\/10\r\n    fuel -= burn\r\n# loop has ended so we must have hit moon's surface\r\n# display final flight data and assess whether it was a crash or a good landing\r\nprint(&quot;Altitude={:8.3f} Speed={:6.3f} Fuel={:8.3f} Last burn={:6.3f}&quot;.format(altitude,speed,fuel,burn))\r\nif altitude &lt;- 5 or speed &gt; 5:\r\n    print(&quot;You have crashed&quot;)\r\nelse:\r\n    print(&quot;You have landed&quot;)\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>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 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","footnotes":""},"categories":[13],"tags":[],"class_list":["post-445","post","type-post","status-publish","format-standard","hentry","category-coderdojo"],"_links":{"self":[{"href":"https:\/\/www.triptera.com.au\/wordpress\/wp-json\/wp\/v2\/posts\/445","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.triptera.com.au\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.triptera.com.au\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.triptera.com.au\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.triptera.com.au\/wordpress\/wp-json\/wp\/v2\/comments?post=445"}],"version-history":[{"count":4,"href":"https:\/\/www.triptera.com.au\/wordpress\/wp-json\/wp\/v2\/posts\/445\/revisions"}],"predecessor-version":[{"id":449,"href":"https:\/\/www.triptera.com.au\/wordpress\/wp-json\/wp\/v2\/posts\/445\/revisions\/449"}],"wp:attachment":[{"href":"https:\/\/www.triptera.com.au\/wordpress\/wp-json\/wp\/v2\/media?parent=445"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.triptera.com.au\/wordpress\/wp-json\/wp\/v2\/categories?post=445"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.triptera.com.au\/wordpress\/wp-json\/wp\/v2\/tags?post=445"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}