Прогулка по лунолётам. 2 - User RPL и динамика

| рубрика «Программы» | автор st
Метки: , , ,

Все прогулки: первая, вторая, третья и четвёртая.

На предыдущей прогулке мы выразили почтение авторам классической программы и получили достаточно простую и понятную модель симулятора полёта вблизи лишенных атмосферы планет. Однако, статичность расчетов делала симулятор похожим скорее на учебный пример, чем реалистичную игру. Попробуем добавить динамики с помощью HP-50g и встроенного в него языка RPL.

Прежде всего, немного изменим ввод. Вместо двух рычагов расхода и времени манёвра оставим только один - ускорение. Примем интервал в 1 секунду для дискретизации каждого шага расчетов. Пока обойдёмся без графики, нужно отработать модель на нашем динамическом симуляторе, а движущимися картинками можно будет заняться на одной из следующих прогулок.

Добавим немного сервиса по вводу начальных параметров. Пока используем те же значения, что и у Перепёлкина.

Время пошло (ресурс жизнеобеспечения в первой строке), лунолёт пока стоит на старте. Чтобы сдвинуть его, придадим ускорение, используя стрелку вверх. 1 м/с2... 1,5 м/с2... 2 м/с2... Поехали!

Теперь наберем высоту, сбросим ускорение (стрелка вниз) до нуля или даже придадим отрицательное и будем пробовать плавно прилуниться. Горизонтальные стрелки (вправо и влево) изменяют соответственно на 0,1 м/с2 шаг приращения ускорения вертикальными стрелками, который по умолчанию равен 0,5 м/с2. То есть, нажав стрелку вправо и после стрелку вверх получим приращение уже на 0,6 м/с2

При достижении поверхности компьютер выбросит транспарант "Landing".

Чтобы возобновить полет (дозаправка не предусмотрена), нажмите на кнопку меню "New".

Кнопка "Quit" позволяет в любой момент завершить полёт.

Ниже приведен исходный текст первого варианта программы "Лунолет-1" (расчетный блок, пригоден и для "Лунолет-2"), который можно взять за основу. Как уже упоминалось, язык User RPL позволяет нам манипулировать графическими образами. На следующей прогулке мы попробуем наблюдать траекторию полёта в динамике...

В помощь разработчику и испытателю

Для разработки и тестирования программ очень удобна среда "Debug4x" (http://www.debug4x.com/). Даже если у вас пока нет ПМК типа HP-48/49/50, вы можете прогонять все примеры в этой среде.

%%HP: T(0)A(D)F(.);

«
  PUSH
  CLLCD
  "Lunar ship"
  {
    {"g   " "Acceleration of gravity, m/sec2" 0}
    {"nflow" "Nozzle flow, m/sec" 0}
    {"life" "Life support, sec" 0}
    {"alim" "Acceleration limit, m/sec2" 0}
    {"mship" "Ship mass w/o fuel, kg" 0}
    {"mfuel" "Fuel mass, kg" 0}
    {"h0  " "Initial altitude, m" 0}
  }
  2
  {1.62 3660 3600 29.4 2250 400 0}
  {1.62 3660 3600 29.4 2250 400 0}
  INFORM
  IF 1 ==
  THEN
    OBJ\->
    DROP
    'hi'  STO
    'mf'  STO
    'ms'  STO
    'alim'  STO
    'ls'  STO
    'nf'  STO
    'g'   STO

    0 'tostop' STO
    1 'newgame' STO

    CLLCD
    {
      {"Quit" « »}
      {"New" « »}
    }
    TMENU
    "Any key to start..." 1 DISP
    -1 WAIT DROP

    DO
      IF newgame 1 ==
      THEN
        0.0 'xi'  STO
        0.0 'a'   STO
        0.5 'da'  STO
        0.0 'ui'  STO @ vertical velocity
        0.0 'vi'  STO @ horisontal velosity
        0.0 'dmf' STO @ fuel consumption
        0.0 'q'   STO
        0.0 'ac'  STO @ angle of climb in degrees; 0 for vertical flight mode
        1.0 'dt'  STO @ Maneuver discrete time in sec

        0.0 't' STO
        0 'launched' STO
        0 'landed' STO
        0 'newgame' STO
      END

      ls 1 - 'ls' STO
      @ output data
      "Life support: " ls \->STR + " sec" +
      1 DISP
      "Fuel: " mf \->STR + " kg" +
      2 DISP
      "Acceler.: " a \->STR + " m/sec2" +
      3 DISP
      "Altitude: " hi \->STR + " m" +
      4 DISP
      "V(vert): " ui \->STR + " m/sec" +
      5 DISP
      1 WAIT
      WHILE KEY
      REPEAT
      \-> k
      «
        IF landed 0 ==
        THEN
          CASE
            k 25 == THEN a da + 'a' STO END
            k 34 == THEN da 0.1 - 'da' STO END
            k 35 == THEN a da - 'a' STO END
            k 36 == THEN da 0.1 + 'da' STO END
          END
        END
        CASE
          k 11 == THEN 1 'tostop' STO END
          k 12 == THEN 1 'newgame' STO END
        END
      »
      END

      @ input checks
      IF a alim >
      THEN
        alim 'a' STO
      END
      IF mf 0 \<=
      THEN
        0. 'a' STO
      END
      dt 't' STO
      IF
        hi 0 >
        a 0 >
        AND
      THEN
        1 'launched' STO
      END
      IF
        hi 0 ==
        launched 1 ==
        AND
      THEN
        IF landed 0 ==
        THEN
          "Landing!" MSGBOX
          1 'landed' STO
        END
      END

      @ calculate maneuver
      DO
        a ms mf + * nf /
          DUP 'q' STO
        t * 'dmf' STO
        vi DUP a t * ac SIN * +
          DUP 'vi' STO
        + 2 / t * xi + 'xi' STO
        ui DUP a ac COS * g - t * +
          DUP 'ui' STO
        + 2 / t * hi + 'hi' STO
        mf q t * - DUP 'mf' STO
        IF 0 <
        THEN
          mf q / 't' STO
        END
        IF hi 0 <
        THEN
          hi 2 * DUP g a ac COS * - *
            ui SQ + \v/ ui - /
          't' STO
        END
      UNTIL
        mf 0 \>=
        hi 0 \>=
        AND
      END

    UNTIL
      tostop 1 ==
    END

    {
      'tostop'
      'launched'
      'landed'
      'newgame'
      'a'
      'ac'
      'da'
      'ui'
      'vi'
      'dmf'
      'dt'
      't'
      'q'
      'xi'
      'hi'
      'mf'
      'ms'
      'alim'
      'ls'
      'nf'
      'g'
    } PURGE

    CLEAR
    0 MENU
  END
  POP
»

@ Commands to install
HOME
'Lunar' PURGE
'Lunar' STO
CLEAR
2. MENU
11.1 KEYEVAL