Автоматический тифон в составах AI
Добавлено: 28 янв 2016, 15:42
Всем доброго дня
Представляю вашему вниманию пару путевых объектов, назначение которых - заставить составы под управлением АI подавать сигнал в нужные моменты.
Дополнение состоит из 2 объектов - "RU-UA Сигналы. Встречное движение" и "RU-UA Сигналы. Сигнал "Свисток" Авто". Для приема сигналов ПО локомотив должен быть оборудован "дешифратором".
Я предоставляю скрипт для Class166, с которым проводились испытания. Код открыт, приветствуются любые предложения по оптимизации и расширению функционала. Путевые объекты можно скачать здесь (10 кБ). Установка ПО - через менеджер пакетов, с очисткой кэша после установки, для отображения в редакторе необходимо подключить пакет FSA/Addon в фильтре активов. ПО будут доступны во вкладке "Инфраструктура линии". Индекс - RU-UA.
Скриптом для Class166 можно заменить дефолтный, но бэкап обязателен, так как этот скрипт отрабатывался на Class166 времен Railworks 2.
Тестирование дополнений производилось на 2 маршрутах. ПС - Class166, BR294 (оба дефолтные), ТЭМ2. Сигнализация - британская, из маршрута "Экатеринбург - Глазго" и наша, на тестовом отрезке. Влияния ПО на работу сигнализации, поведение трафика и работу АЛСН не обнаружено.
ПРИМЕЧАНИЯ
1. Из-за того, что локомотив мониторит путь "позади себя", срабатывание ПО возможно только после проследования локомотивом линка 0! Также я не знаю, что считается "передом" при работе функции GetNextRestrictiveSignal - то, что впереди при движении, или то, что заложено как "перед" при создании модели. Поэтому я не гарантирую срабатывание ЛД при движении локомотива "хвостом" вперед.
2. ПО, кроме установки кода на треке, передает пользовательское сообщение с кодом "0619010301"
За предоставленную 3D-модельку искренне благодарю Артёма ака dison202. Выражаю благодарность с занесением в карму
Ну вот, как-то так. Надеюсь, этот труд будет полезен не только мне
Представляю вашему вниманию пару путевых объектов, назначение которых - заставить составы под управлением АI подавать сигнал в нужные моменты.
Дополнение состоит из 2 объектов - "RU-UA Сигналы. Встречное движение" и "RU-UA Сигналы. Сигнал "Свисток" Авто".
Спойлер
В основу работы путевых объектов (ПО) положен постоянный мониторинг трека с целью обнаружения состава, определения расстояния к нему, а также скорости и направления его движения. В двухлинковом ПО, мониторятся, естественно, оба трека. В момент заданного блоком условий положения состава (составов) ПО изменяет свой статус на предупредительный. Так как ПО является сигнальным объектом, изменение его статуса отслеживается составом, и, как результат, это дает возможность оказывать влияние на этот состав.
Для уменьшения затрат времени процессора на обслуживание ПО, применен метод таймеризации работы. В отключенном состоянии ПО опрашивается с интервалом 12 сек, во включенном - интервал опроса зависит от расстояния между составом и точкой срабатывания, уменьшаясь до 0,5 сек перед этой точкой. Сразу после срабатывания ПО интервал опроса снова устанавливается в 12 сек. Когда состав покидает зону работы ПО, происходит отключение.
Срабатывание ПО имеет 2 этапа. В первом этапе (предупредительном) ПО устанавливает код, куда входит зафиксированное расстояние передней части состава. Во втором этапе ПО устанавливает код, инициирующий запуск функции "Signal" в составе.
Таймеризация ПО представлена в логе:
Для уменьшения затрат времени процессора на обслуживание ПО, применен метод таймеризации работы. В отключенном состоянии ПО опрашивается с интервалом 12 сек, во включенном - интервал опроса зависит от расстояния между составом и точкой срабатывания, уменьшаясь до 0,5 сек перед этой точкой. Сразу после срабатывания ПО интервал опроса снова устанавливается в 12 сек. Когда состав покидает зону работы ПО, происходит отключение.
Срабатывание ПО имеет 2 этапа. В первом этапе (предупредительном) ПО устанавливает код, куда входит зафиксированное расстояние передней части состава. Во втором этапе ПО устанавливает код, инициирующий запуск функции "Signal" в составе.
Таймеризация ПО представлена в логе:
Код: Выделить всё
00:00:00 Пуск
00:00:12 Расстояние до м. 0 - -1123, расстояние до м. 1 - 0, дистанция - 1200, модуль отключен, тайминг - 12
00:00:12 Расстояние до м. 0 - -1123, расстояние до м. 1 - 0, дистанция - 1200, модуль отключен, тайминг - 12
00:00:24 Расстояние до м. 0 - -995, расстояние до м. 1 - 0, дистанция - 1200, модуль отключен, тайминг - 12
00:00:24 Расстояние до м. 0 - -995, расстояние до м. 1 - 0, дистанция - 1200, модуль отключен, тайминг - 12
00:00:36 Расстояние до м. 0 - -782, расстояние до м. 1 - 0, дистанция - 1200, модуль отключен, тайминг - 12
00:00:36 Расстояние до м. 0 - -781, расстояние до м. 1 - 0, дистанция - 1200, модуль отключен, тайминг - 12
00:00:48 Расстояние до м. 0 - -781, расстояние до м. 1 - -1182, дистанция - 1200, модуль отключен, тайминг - 12
00:00:48 Расстояние до м. 0 - -504, расстояние до м. 1 - -1182, дистанция - 1200, модуль отключен, тайминг - 12
00:01:00 Расстояние до м. 0 - -504, расстояние до м. 1 - -1033, дистанция - 1200, модуль отключен, тайминг - 12
00:01:00 Расстояние до м. 0 - -222, расстояние до м. 1 - -1033, дистанция - 1200, модуль отключен, тайминг - 12
00:01:12 Расстояние до м. 0 - -222, расстояние до м. 1 - -883, дистанция - 1200, модуль отключен, тайминг - 12
00:01:12 Расстояние до м. 0 - 60, расстояние до м. 1 - -883, дистанция - 1200, модуль включен, тайминг - 8
00:01:20 Расстояние до м. 0 - 60, расстояние до м. 1 - -783, дистанция - 723, модуль включен, тайминг - 7
00:01:20 Расстояние до м. 0 - 249, расстояние до м. 1 - -783, дистанция - 534, модуль включен, тайминг - 5
00:01:25 Расстояние до м. 0 - 249, расстояние до м. 1 - -721, дистанция - 472, модуль включен, тайминг - 4
00:01:25 Расстояние до м. 0 - 366, расстояние до м. 1 - -721, дистанция - 355, модуль включен, тайминг - 3
00:01:28 Расстояние до м. 0 - 366, расстояние до м. 1 - -684, дистанция - 318, модуль включен, тайминг - 3
00:01:28 Расстояние до м. 0 - 437, расстояние до м. 1 - -684, дистанция - 247, модуль включен, тайминг - 2
00:01:30 Расстояние до м. 0 - 437, расстояние до м. 1 - -659, дистанция - 222, модуль включен, тайминг - 2
00:01:30 Расстояние до м. 0 - 484, расстояние до м. 1 - -659, дистанция - 175, модуль включен, тайминг - 1
00:01:31 Расстояние до м. 0 - 484, расстояние до м. 1 - -646, дистанция - 162, модуль включен, тайминг - 1
00:01:31 Расстояние до м. 0 - 508, расстояние до м. 1 - -646, дистанция - 138, модуль включен, тайминг - 1
00:01:32 Расстояние до м. 0 - 508, расстояние до м. 1 - -633, дистанция - 125, модуль включен, тайминг - 1
00:01:32 Расстояние до м. 0 - 532, расстояние до м. 1 - -633, дистанция - 101, модуль включен, тайминг - 1
00:01:33 Расстояние до м. 0 - 532, расстояние до м. 1 - -621, дистанция - 89, модуль включен, тайминг - 0.5
00:01:33 Расстояние до м. 0 - 556, расстояние до м. 1 - -621, дистанция - 65, модуль включен, тайминг - 0.5
00:01:33 Расстояние до м. 0 - 556, расстояние до м. 1 - -614, дистанция - 58, модуль включен, тайминг - 0.5
00:01:33 Расстояние до м. 0 - 568, расстояние до м. 1 - -614, дистанция - 46, модуль включен, тайминг - 0.5
00:01:34 Расстояние до м. 0 - 568, расстояние до м. 1 - -608, дистанция - 40, модуль включен, тайминг - 0.5
00:01:34 Расстояние до м. 0 - 580, расстояние до м. 1 - -608, дистанция - 28, модуль включен, тайминг - 0.5
00:01:34 Расстояние до м. 0 - 580, расстояние до м. 1 - -602, дистанция - 22, модуль включен, тайминг - 0.5
00:01:34 Расстояние до м. 0 - 592, расстояние до м. 1 - -602, дистанция - 10, модуль включен, тайминг - 0.5
00:01:35 Расстояние до м. 0 - 592, расстояние до м. 1 - -595, дистанция - 3, модуль включен, тайминг - 0.5
00:01:35 Расстояние до м. 0 - 604, расстояние до м. 1 - -595, дистанция - 1200, модуль включен, тайминг - 12
00:01:47 Расстояние до м. 0 - 604, расстояние до м. 1 - -446, дистанция - 1200, модуль включен, тайминг - 12
00:01:47 Расстояние до м. 0 - 886, расстояние до м. 1 - -446, дистанция - 1200, модуль включен, тайминг - 12
00:01:59 Расстояние до м. 0 - 886, расстояние до м. 1 - -297, дистанция - 1200, модуль включен, тайминг - 12
00:01:59 Расстояние до м. 0 - 1167, расстояние до м. 1 - -297, дистанция - 1200, модуль включен, тайминг - 12
00:02:11 Расстояние до м. 0 - 1167, расстояние до м. 1 - -147, дистанция - 1200, модуль включен, тайминг - 12
00:02:11 Расстояние до м. 0 - 1407, расстояние до м. 1 - -147, дистанция - 1200, модуль включен, тайминг - 12
00:02:23 Расстояние до м. 0 - 1407, расстояние до м. 1 - 2, дистанция - 1200, модуль включен, тайминг - 12
00:02:23 Расстояние до м. 0 - 1407, расстояние до м. 1 - 3, дистанция - 1200, модуль включен, тайминг - 12
00:02:35 Расстояние до м. 0 - 1407, расстояние до м. 1 - 152, дистанция - 1200, модуль отключен, тайминг - 12
00:02:35 Расстояние до м. 0 - 1407, расстояние до м. 1 - 152, дистанция - 1200, модуль отключен, тайминг - 12
Спойлер
В основе работы локомотивного дешифратора (ЛД) использована функция GetNextRestrictiveSignal, главной особенностью которой является работа под AI.
С целью снижения потерь времени на обработку этой функции, применен метод динамической таймеризации, немного сходный с примененным в ПО. Единственное различие - интервалы опроса зависят от скорости движения состава.
Когда функция "обнаруживает" установленный на треке предупредительный код, происходит проверка местонахождения локомотива относительно ПО, и если разница между значением расстояний, присланного ПО и измеренном локомотивом, в допустимых пределах, включается разрешение на продолжение работы, иначе происходит блокировка. Цель всего этого - подготовить локомотив к приему команды и разрешить работу только первому локомотиву, если их несколько. Во время испытаний из 3 составов по 3 DMU, сцепленных вместе, свисток подавал только первый из них.
С целью снижения потерь времени на обработку этой функции, применен метод динамической таймеризации, немного сходный с примененным в ПО. Единственное различие - интервалы опроса зависят от скорости движения состава.
Когда функция "обнаруживает" установленный на треке предупредительный код, происходит проверка местонахождения локомотива относительно ПО, и если разница между значением расстояний, присланного ПО и измеренном локомотивом, в допустимых пределах, включается разрешение на продолжение работы, иначе происходит блокировка. Цель всего этого - подготовить локомотив к приему команды и разрешить работу только первому локомотиву, если их несколько. Во время испытаний из 3 составов по 3 DMU, сцепленных вместе, свисток подавал только первый из них.
Спойлер
Путевой объект "RU-UA Сигналы. Сигнал "Свисток" Авто" необходимо устанавливать за 75-100 метров до места подачи свистка. Линк должен быть направлен против движения состава!
Путевой объект "RU-UA Сигналы. Встречное движение" устанавливается на 2-путных участках, при этом линки должны быть противонаправлены, а линк 0 направлен против направления движения!. Действие ПО будет распространяться на тот трек, на котором расположен линк 0.
Данный ПО действует только на участке 1200м за линком 0. Но в связи с наличием "мертвой зоны" в пределах 100м от линка (время реакции локомотивного дешифратора), следующий ПО желательно устанавливать на расстоянии не больше 1100 м.
Также, если трек под линком 0 предназначен для двухстороннего движения и оборудован светофорной сигнализацией в обоих направлениях, желательно линк 0 устанавливать перед линком 0 светофора как можно поближе к нему*.
При установке ПО в зоне действия другого ПО никаких конфликтов на этот момент не обнаружено. Локомотив мониторит ближайший к нему.
Модельки ПО видимы только в режиме редактора.
Также предусмотрена возможность использования ПО в режиме редактора сценариев.
*Вообще я пока не рекомендую применять ПО этой версии в таком режиме, так как пока не изучено их влияние на поведение трафика в таких условиях. Как вариант, можно линк 0 ПО ставить за линком 0 светофора, но тогда любой сигнал светофора (кроме зеленого) будет блокировать ПО
Путевой объект "RU-UA Сигналы. Встречное движение" устанавливается на 2-путных участках, при этом линки должны быть противонаправлены, а линк 0 направлен против направления движения!. Действие ПО будет распространяться на тот трек, на котором расположен линк 0.
Данный ПО действует только на участке 1200м за линком 0. Но в связи с наличием "мертвой зоны" в пределах 100м от линка (время реакции локомотивного дешифратора), следующий ПО желательно устанавливать на расстоянии не больше 1100 м.
Также, если трек под линком 0 предназначен для двухстороннего движения и оборудован светофорной сигнализацией в обоих направлениях, желательно линк 0 устанавливать перед линком 0 светофора как можно поближе к нему*.
При установке ПО в зоне действия другого ПО никаких конфликтов на этот момент не обнаружено. Локомотив мониторит ближайший к нему.
Модельки ПО видимы только в режиме редактора.
Также предусмотрена возможность использования ПО в режиме редактора сценариев.
*Вообще я пока не рекомендую применять ПО этой версии в таком режиме, так как пока не изучено их влияние на поведение трафика в таких условиях. Как вариант, можно линк 0 ПО ставить за линком 0 светофора, но тогда любой сигнал светофора (кроме зеленого) будет блокировать ПО
Спойлер
Вот 2 функции, которые нужно добавить в любое место скрипта локомотива:
В функцию Initialise () нужно добавить несколько новых переменных:
А в функцию Update ( time ) вписать вызов добавленных функций: В функции MonitorRoute () происходит вызов функции Signal () и отсылается значение 111. Для Class166 первая цифра может быть только "1", потому что других сигналов у него нет. А вот изменив другую цифру, можно заставить его посвистеть не 1 раз, а больше (максимум - 9), третья же цифра - это продолжительность каждого гудка в секундах (максимум - 9 сек). В данный момент код инициирует 1 гудок продолжительностью в 1 сек.
Кроме того, в функции Signal () применена задержка перед включением тифона. Время задержки - случайное, от 0,1 до 1,5 сек, чтобы 2 одинаковых локомотива не начали гудеть одновременно .
Код: Выделить всё
function MonitorRoute ()
if (Call ( "GetIsEngineWithKey" )) == 0 then
if ( MonitorTM + MonitorFr ) < Call( "*:GetSimulationTime") then
type, state, distance, aspect = Call("*:GetNextRestrictiveSignal", 1, 0, 1250)
type = type or 0
state = state or 0
distance = distance or 0
aspect = aspect or 0
MonitorTM = Call( "*:GetSimulationTime")
if MonitorAk == false then
if type == 1 and state == 1 and (aspect > 199 and aspect < 321) then
MonitorAk = true
end
elseif type == 1 and state == 1 and (aspect > 199 and aspect < 321) then
if SurveyCom == false then
local DistCtrl = ((aspect - 200) * 10)
if DistCtrl > (distance + 25) then
OperationEn = false
MonitorFr = 15
else
OperationEn = true
end
SurveyCom = true
end
elseif OperationEn == true and type == 1 and state == 1 and (aspect == 71 or aspect == 70) then
Signal (111)
if aspect == 70 then
MonitorFr = 3
OperationEn = false
else
-- MonitorFr = 0.5
end
else
MonitorFr = 2
MonitorAk = false
SurveyCom = false
OperationEn = false
end
end
end
end
function Signal (value)
value = value or 0
if ( HornAktiv == 4 ) or ( value ~= 0 ) then
if value ~= 0 and value >= 111 then
Property = tonumber(string.sub(value,1,1));
if Property < 3 then
SignMode= Property;
QuaSign = tonumber(string.sub(value,2,2));
DurSign = tonumber(string.sub(value,3,3));
else
SignMode = 1;
QuaSign = ( math.random (1, 3) );
DurSign = 1;
end
HornAktiv, Timer = 4, math.random (0.1, 1.5);
end
if ( Timer + DurSign ) <= Call( "*:GetSimulationTime") then
if HornAktiv == 4 then
Timer = Call( "*:GetSimulationTime");
if Call( "*:GetControlValue", Mode[SignMode], 0 ) == 1 then
Call( "*:SetControlValue", Mode[SignMode], 0, 0 );
if QuaSign > 0 then
else
HornAktiv = 0
SignMode, DurSign = 0, 0;
end
else
QuaSign = QuaSign - 1
if Property == 3 then
SignMode = ( math.random (1, 2) );
DurSign = ( math.random (1, 3) );
end
Call( "*:SetControlValue", Mode[SignMode], 0, 1 );
end
end
end
end
Mode = {"Horn", "Whistle"}
end
Код: Выделить всё
function Initialise ()
Timer = 0
HornAktiv = 0
MonitorFr = 2
MonitorTM = 0
MonitorAk = false
SurveyCom = false
OperationEn = false
Call( "BeginUpdate" );
end
Код: Выделить всё
function Update ( time )
Signal ()
MonitorRoute ()
end
Кроме того, в функции Signal () применена задержка перед включением тифона. Время задержки - случайное, от 0,1 до 1,5 сек, чтобы 2 одинаковых локомотива не начали гудеть одновременно .
Скриптом для Class166 можно заменить дефолтный, но бэкап обязателен, так как этот скрипт отрабатывался на Class166 времен Railworks 2.
Тестирование дополнений производилось на 2 маршрутах. ПС - Class166, BR294 (оба дефолтные), ТЭМ2. Сигнализация - британская, из маршрута "Экатеринбург - Глазго" и наша, на тестовом отрезке. Влияния ПО на работу сигнализации, поведение трафика и работу АЛСН не обнаружено.
ПРИМЕЧАНИЯ
1. Из-за того, что локомотив мониторит путь "позади себя", срабатывание ПО возможно только после проследования локомотивом линка 0! Также я не знаю, что считается "передом" при работе функции GetNextRestrictiveSignal - то, что впереди при движении, или то, что заложено как "перед" при создании модели. Поэтому я не гарантирую срабатывание ЛД при движении локомотива "хвостом" вперед.
2. ПО, кроме установки кода на треке, передает пользовательское сообщение с кодом "0619010301"
За предоставленную 3D-модельку искренне благодарю Артёма ака dison202. Выражаю благодарность с занесением в карму
Ну вот, как-то так. Надеюсь, этот труд будет полезен не только мне