Advertisement
Guest User

DG AAP

a guest
Nov 13th, 2012
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.52 KB | None | 0 0
  1. -- Set up autopilot structures
  2. aap = {}
  3. aap.altid = nil
  4. aap.spdid = nil
  5. aap.bnkid = nil
  6. aap.hdgid = nil
  7. aap.tgtalt = nil
  8. aap.tgtspd = nil
  9. aap.tgtbnk = nil
  10. aap.tgthdg = nil
  11. aap.maxasc = 30
  12. aap.maxdsc = -20
  13.  
  14. -- Define help page
  15. dg_aap = {file='Html/Script/Stockvessels/DG/aap.chm'}
  16.  
  17. function setvessel (_v)
  18. v = vessel.get_interface(_v)
  19. class = v:get_classname()
  20. if (class ~= 'DeltaGlider') and (class ~= 'DG-S') then
  21. term.out('Warning: Autopilot is designed for use with DeltaGlider.')
  22. end
  23. end
  24.  
  25. function altitude ()
  26. alt = v:get_altitude()
  27. return alt
  28. end
  29.  
  30. function airspeed ()
  31. return v:get_airspeed()
  32. end
  33.  
  34. function slope ()
  35. as = v:get_horizonairspeedvector()
  36. xz = math.sqrt (as.x^2 + as.z^2)
  37. sl = math.atan2 (as.y, xz)
  38. return sl
  39. end
  40.  
  41. --[[ --------------------------------------------------------
  42. altitude autopilot (elevator control)
  43. argument 1: target altitude (m)
  44. note: does not terminate (run as background job and kill
  45. when done)
  46. --]]
  47.  
  48. function alt_ap (alt)
  49. if alt == nil then
  50. alt = 20e3
  51. end
  52. aap.tgtalt = alt
  53. local dslope0 = 0
  54. local dslope_rate
  55. while true do
  56. if aap.tgtalt ~= nil then
  57. local dt = oapi.get_simstep()
  58. alt = altitude()
  59. dalt = aap.tgtalt-alt
  60. tgt_slope = RAD*1e-2 * dalt
  61. if tgt_slope > aap.maxasc*RAD then
  62. tgt_slope = aap.maxasc*RAD
  63. elseif tgt_slope < aap.maxdsc*RAD then
  64. tgt_slope = aap.maxdsc*RAD
  65. end
  66. dslope = tgt_slope-slope()
  67. if dslope0 == 0 then
  68. dslope_rate = 0
  69. else
  70. dslope_rate = (dslope-dslope0)/dt
  71. end
  72. dslope0 = dslope
  73. delev = (dslope*0.1 + dslope_rate)*(dt*10.0)
  74. elev = v:get_adclevel(AIRCTRL.ELEVATOR)
  75. elev = elev+delev;
  76. if elev > 1 then elev = 1 elseif elev < -1 then elev = -1 end
  77. v:set_adclevel(AIRCTRL.ELEVATOR,elev)
  78. end
  79. proc.skip()
  80. end
  81. end
  82.  
  83. --[[ --------------------------------------------------------
  84. airspeed autopilot (throttle control)
  85. argument 1: target speed (m/s)
  86. note: does not terminate (run as background job and kill
  87. when done)
  88. --]]
  89.  
  90. function spd_ap (spd)
  91. if spd ~= nil then aap.tgtspd = spd end
  92. local spd0 = airspeed()
  93. local acc, dpsd
  94. local alpha = 1
  95. local beta = 1
  96. while true do
  97. if aap.tgtspd ~= nil then
  98. local dt = oapi.get_simstep()
  99. spd = airspeed()
  100. acc = (spd-spd0)/dt
  101. spd0 = spd
  102. dspd = aap.tgtspd-spd
  103. dthrott = (dspd*alpha - acc*beta)*dt
  104. thrott = v:get_thrustergrouplevel (THGROUP.MAIN)
  105. v:set_thrustergrouplevel (THGROUP.MAIN, thrott+dthrott)
  106. end
  107. proc.skip()
  108. end
  109. end
  110.  
  111. --[[ --------------------------------------------------------
  112. bank autopilot (aileron control)
  113. argument 1: bank angle [deg]
  114. note: does not terminate (run as background job and kill
  115. when done)
  116. --]]
  117.  
  118. function bank_ap (bnk)
  119. aap.tgtbnk = bnk
  120. local bnk0 = v:get_bank()
  121. while true do
  122. local dt = oapi.get_simstep()
  123. bnk = v:get_bank()
  124. dbnk = bnk-bnk0
  125. if dbnk < -PI then dbnk = dbnk+2*PI elseif dbnk > PI then dbnk = dbnk-2*PI end -- phase unwrap
  126. rate = dbnk/dt
  127. bnk0 = bnk
  128. dbnk = aap.tgtbnk*RAD - bnk
  129. if dbnk < -PI then dbnk = dbnk+2*PI elseif dbnk > PI then dbnk = dbnk-2*PI end -- phase unwrap
  130. dail = (-dbnk*0.1 + rate*0.3)*(dt*5.0) -- the damping term should really depend on atmospheric density
  131. ail = v:get_adclevel(AIRCTRL.AILERON)
  132. ail = ail+dail
  133. if ail > 1 then ail = 1 elseif ail < -1 then ail = -1 end
  134. v:set_adclevel(AIRCTRL.AILERON,ail)
  135. proc.skip()
  136. end
  137. end
  138.  
  139. --[[ --------------------------------------------------------
  140. heading autopilot (aileron+pitch control)
  141. argument 1: heading angle [deg]
  142. note: does not terminate (run as background job and kill
  143. when done)
  144. --]]
  145.  
  146. function heading_ap (hdg)
  147. aap.tgthdg = hdg
  148. local hdg0 = v:get_yaw()
  149. local tgtbank = v:get_bank()
  150. while true do
  151. local dt = oapi.get_simstep()
  152. hdg = v:get_yaw()
  153. dhdg = hdg-hdg0
  154. if dhdg < -PI then dhdg = dhdg+2*PI elseif dhdg > PI then dhdg = dhdg-2*PI end -- phase unwrap
  155. rate = dhdg/dt
  156. hdg0 = hdg
  157. dhdg = aap.tgthdg*RAD - hdg
  158. if dhdg < -PI then dhdg = dhdg+2*PI elseif dhdg > PI then dhdg = dhdg-2*PI end -- phase unwrap
  159. dbank = (-dhdg*100 + rate*1000)*dt
  160. tgtbank = v:get_bank() + dbank
  161. if tgtbank > 0.3*PI then tgtbank = 0.3*PI elseif tgtbank < -0.3*PI then tgtbank = -0.3*PI end
  162. aap.tgtbnk = tgtbank*DEG
  163. proc.skip()
  164. end
  165. end
  166.  
  167. -- -----------------------------------------------------------
  168. -- User level entry functions
  169. -- -----------------------------------------------------------
  170.  
  171. -- Invoke altitude autopilot as background job
  172.  
  173. function aap.alt (alt)
  174. if alt == nil then
  175. if aap.altid ~= nil then
  176. term.out('AP: altitude autopilot disabled')
  177. proc.kill(aap.altid)
  178. aap.altid = nil
  179. v:set_adclevel(AIRCTRL.ELEVATOR,0)
  180. end
  181. else
  182. term.out('AP: altitude target '..alt..' m')
  183. if aap.altid == nil then
  184. aap.altid = proc.bg(alt_ap,alt) -- launch altitude autopilot
  185. else
  186. aap.tgtalt = alt -- autopilot already running: just reset altitude
  187. end
  188. end
  189. end
  190.  
  191. -- Invoke speed autopilot as background job
  192.  
  193. function aap.spd (spd)
  194. if spd == nil then
  195. if aap.spdid ~= nil then
  196. term.out('AP: airspeed autopilot disabled')
  197. proc.kill(aap.spdid)
  198. aap.spdid = nil
  199. end
  200. else
  201. term.out('AP: airspeed target '..spd..' m/s')
  202. if aap.spdid == nil then
  203. aap.spdid = proc.bg(spd_ap,spd) -- launch airspeed autopilot
  204. else
  205. aap.tgtspd = spd -- autopilot already running: just reset target speed
  206. end
  207. end
  208. end
  209.  
  210. -- Invoke bank autopilot as background job
  211.  
  212. function aap.bank (bank)
  213. if bank == nil then
  214. if aap.bnkid ~= nil then
  215. term.out('AP: bank autopilot disabled')
  216. proc.kill(aap.bnkid)
  217. aap.bnkid = nil
  218. v:set_adclevel(AIRCTRL.AILERON,0)
  219. end
  220. else
  221. term.out('AP: bank target '..bank..' deg')
  222. if aap.bnkid == nil then
  223. aap.bnkid = proc.bg(bank_ap,bank) -- launch bank autopilot
  224. else
  225. aap.tgtbnk = bank -- autopilot already running: just reset target angle
  226. end
  227. end
  228. end
  229.  
  230. -- Invoke heading autopilot as background job
  231.  
  232. function aap.hdg (hdg)
  233. if hdg == nil then
  234. if aap.hdgid ~= nil then
  235. term.out('AP: heading autopilot disabled')
  236. proc.kill(aap.hdgid)
  237. aap.bank() -- kill bank ap
  238. aap.hdgid = nil
  239. end
  240. else
  241. term.out('AP: heading target '..hdg..' deg')
  242. if aap.hdgid == nil then
  243. aap.hdgid = proc.bg(heading_ap,hdg) -- launch heading autopilot
  244. aap.bank(0) -- invoke bank ap
  245. else
  246. aap.tgthdg = hdg -- autopilot already running: just reset target angle
  247. end
  248. end
  249. end
  250.  
  251. -- -----------------------------------------------------------
  252. -- Initialisation code
  253.  
  254. v = {}
  255.  
  256. term.out('DG: Atmospheric autopilot loaded.')
  257. term.out('For help, type: help(dg_aap)')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement