Автоматический тифон в составах AI

Обсуждение вопросов и решение проблем, связанных с внутриигровым редактором, а также процессом разработки самостоятельных дополнений или игровых модификаций.
Ответить
Аватара пользователя
Света
Разработчик
Сообщения: 752
Зарегистрирован: 13 мар 2015
Репутация: 1470

Автоматический тифон в составах AI

Сообщение Света »

Всем доброго дня :)
Представляю вашему вниманию пару путевых объектов, назначение которых - заставить составы под управлением АI подавать сигнал в нужные моменты.
Дополнение состоит из 2 объектов - "RU-UA Сигналы. Встречное движение" и "RU-UA Сигналы. Сигнал "Свисток" Авто".
Спойлер
В основу работы путевых объектов (ПО) положен постоянный мониторинг трека с целью обнаружения состава, определения расстояния к нему, а также скорости и направления его движения. В двухлинковом ПО, мониторятся, естественно, оба трека. В момент заданного блоком условий положения состава (составов) ПО изменяет свой статус на предупредительный. Так как ПО является сигнальным объектом, изменение его статуса отслеживается составом, и, как результат, это дает возможность оказывать влияние на этот состав.
Для уменьшения затрат времени процессора на обслуживание ПО, применен метод таймеризации работы. В отключенном состоянии ПО опрашивается с интервалом 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, сцепленных вместе, свисток подавал только первый из них.
Спойлер
Путевой объект "RU-UA Сигналы. Сигнал "Свисток" Авто" необходимо устанавливать за 75-100 метров до места подачи свистка. Линк должен быть направлен против движения состава!
Изображение
Путевой объект "RU-UA Сигналы. Встречное движение" устанавливается на 2-путных участках, при этом линки должны быть противонаправлены, а линк 0 направлен против направления движения!. Действие ПО будет распространяться на тот трек, на котором расположен линк 0.
Изображение
Данный ПО действует только на участке 1200м за линком 0. Но в связи с наличием "мертвой зоны" в пределах 100м от линка (время реакции локомотивного дешифратора), следующий ПО желательно устанавливать на расстоянии не больше 1100 м.
Также, если трек под линком 0 предназначен для двухстороннего движения и оборудован светофорной сигнализацией в обоих направлениях, желательно линк 0 устанавливать перед линком 0 светофора как можно поближе к нему*.
При установке ПО в зоне действия другого ПО никаких конфликтов на этот момент не обнаружено. Локомотив мониторит ближайший к нему.
Модельки ПО видимы только в режиме редактора.
Также предусмотрена возможность использования ПО в режиме редактора сценариев.

*Вообще я пока не рекомендую применять ПО этой версии в таком режиме, так как пока не изучено их влияние на поведение трафика в таких условиях. Как вариант, можно линк 0 ПО ставить за линком 0 светофора, но тогда любой сигнал светофора (кроме зеленого) будет блокировать ПО
Спойлер
Вот 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
В функцию Initialise () нужно добавить несколько новых переменных:

Код: Выделить всё

 function Initialise ()

Timer = 0
HornAktiv = 0

MonitorFr = 2
MonitorTM = 0
MonitorAk = false
SurveyCom = false
OperationEn = false

Call( "BeginUpdate" );

end
А в функцию Update ( time ) вписать вызов добавленных функций:

Код: Выделить всё

function Update ( time )

Signal ()
MonitorRoute ()

end
В функции MonitorRoute () происходит вызов функции Signal () и отсылается значение 111. Для Class166 первая цифра может быть только "1", потому что других сигналов у него нет. А вот изменив другую цифру, можно заставить его посвистеть не 1 раз, а больше (максимум - 9), третья же цифра - это продолжительность каждого гудка в секундах (максимум - 9 сек). В данный момент код инициирует 1 гудок продолжительностью в 1 сек.
Кроме того, в функции Signal () применена задержка перед включением тифона. Время задержки - случайное, от 0,1 до 1,5 сек, чтобы 2 одинаковых локомотива не начали гудеть одновременно =) .
Я предоставляю скрипт для Class166, с которым проводились испытания. Код открыт, приветствуются любые предложения по оптимизации и расширению функционала. Путевые объекты можно скачать здесь (10 кБ). Установка ПО - через менеджер пакетов, с очисткой кэша после установки, для отображения в редакторе необходимо подключить пакет FSA/Addon в фильтре активов. ПО будут доступны во вкладке "Инфраструктура линии". Индекс - RU-UA.
Скриптом для Class166 можно заменить дефолтный, но бэкап обязателен, так как этот скрипт отрабатывался на Class166 времен Railworks 2.
Тестирование дополнений производилось на 2 маршрутах. ПС - Class166, BR294 (оба дефолтные), ТЭМ2. Сигнализация - британская, из маршрута "Экатеринбург - Глазго" и наша, на тестовом отрезке. Влияния ПО на работу сигнализации, поведение трафика и работу АЛСН не обнаружено.

ПРИМЕЧАНИЯ
1. Из-за того, что локомотив мониторит путь "позади себя", срабатывание ПО возможно только после проследования локомотивом линка 0! Также я не знаю, что считается "передом" при работе функции GetNextRestrictiveSignal - то, что впереди при движении, или то, что заложено как "перед" при создании модели. Поэтому я не гарантирую срабатывание ЛД при движении локомотива "хвостом" вперед.
2. ПО, кроме установки кода на треке, передает пользовательское сообщение с кодом "0619010301"

За предоставленную 3D-модельку искренне благодарю Артёма ака dison202. Выражаю благодарность с занесением в карму :Rose:
Ну вот, как-то так. Надеюсь, этот труд будет полезен не только мне :)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Сильные люди - это не те, у которых всё хорошо, а те, у которых всё хорошо несмотря ни на что.
Аватара пользователя
Cross
Разработчик
Сообщения: 6330
Зарегистрирован: 14 дек 2011
Откуда: Москва
Репутация: 2985

Re: Автоматический тифон в составах AI

Сообщение Cross »

Также я не знаю, что считается "передом" при работе функции GetNextRestrictiveSignal - то, что впереди при движении, или то, что заложено как "перед" при создании модели. Поэтому я не гарантирую срабатывание ЛД при движении локомотива "хвостом" вперед.
Свет, здесь на помощь может прийти дополнительное условие Call("GetSpeed"). Если мы ставим > 0, это будет означать, что локомотив едет вперёд, если < 0, тогда локомотив едет назад. В теории должно работать, если я всё верно понимаю из обозначенного вопроса. В подробности не вдавался. Суть в том, что данное условие чётко задаёт условие, при котором срабатывает функция, помимо этого данное условие наглядно покажет, где перед и где зад локомотива (если вдруг место машиниста посередине расположено, как в BR 294)
*Train Simulator 2018*
Изображение
Аватара пользователя
yurinn
Магистр
Магистр
Сообщения: 964
Зарегистрирован: 16 мар 2014
Откуда: Нижний Новгород
Репутация: 90

Re: Автоматический тифон в составах AI

Сообщение yurinn »

Спойлер
В ТРСке такой маркер 100 лет как реализован :-)
Аватара пользователя
dreamlight777
Профессор
Профессор
Сообщения: 2166
Зарегистрирован: 06 янв 2012
Откуда: Башкортостан
Репутация: 1196

Re: Автоматический тифон в составах AI

Сообщение dreamlight777 »

yurinn писал(а):
Спойлер
В ТРСке такой маркер 100 лет как реализован :-)
В ТРСке сто лет не могут нормальную систему сценариев реализовать и графику завести... Про убийственную систему куидов молчу уж...
Спойлер
Изображение
Изображение
Изображение
Аватара пользователя
Света
Разработчик
Сообщения: 752
Зарегистрирован: 13 мар 2015
Репутация: 1470

Re: Автоматический тифон в составах AI

Сообщение Света »

Cross писал(а):...на помощь может прийти дополнительное условие Call("GetSpeed"). Если мы ставим > 0, это будет означать, что локомотив едет вперёд, если < 0, тогда локомотив едет назад.
Очень хороший вариант, в локомотивах с 2 кабинами или маневровых обязательно надо будет применить, чтобы не было привязки к их положению :good: .
Тот код, что я предлагаю - это только каркас, обеспечивающий работу, а по-хорошему надо для каждого локомотива проводить подгонку, расширять набор условий. Например, в высокоскоростных составах частоту мониторинга есть смысл повысить, и наоборот, если локомотив тихоходный, нет смысла мониторить путь каждых 3 сек., как в этом коде.
В том числе, можно реализовать 2-тональный тифон, свисток при сцепке/расцепке... Много чего :wink: .
yurinn писал(а):В ТРСке такой маркер 100 лет как реализован :-)
Ну и что? А в TS не было, зато теперь есть =) .
Сильные люди - это не те, у которых всё хорошо, а те, у которых всё хорошо несмотря ни на что.
Romazan67
Активный
Активный
Сообщения: 64
Зарегистрирован: 28 мар 2014
Откуда: Смол. область
Репутация: 104

Re: Автоматический тифон в составах AI

Сообщение Romazan67 »

Света, когда я проходил сценарий "Подковы" в ночное время и погудел, мне в итоговых оценках поставили ошибку за неправильное использование сигнала (наверное был в населенном пункте). Если это правильно то может тогда еще добавить временные рамки в пределах населенных пунктов ? Если такое возможно конечно.
YuriA
Эксперт
Эксперт
Сообщения: 580
Зарегистрирован: 14 фев 2013
Откуда: Московская обл.
Репутация: 105

Re: Автоматический тифон в составах AI

Сообщение YuriA »

Romazan67 писал(а):Света, когда я проходил сценарий "Подковы" в ночное время и погудел, мне в итоговых оценках поставили ошибку за неправильное использование сигнала (наверное был в населенном пункте). Если это правильно то может тогда еще добавить временные рамки в пределах населенных пунктов ? Если такое возможно конечно.
Для подачи звуковых сигналов стоит специальный знак "С" (Россия), "S" (кажись в Латвии), "W" ( у басурман). Временные рамки здесь ни причём.
Аватара пользователя
PseudoStalker
Ветеран
Сообщения: 3235
Зарегистрирован: 09 авг 2012
Репутация: 1810

Re: Автоматический тифон в составах AI

Сообщение PseudoStalker »

YuriA, причем тут реальность, если речь об игре. Игра считает неприемлемым подачу звукового сигнала в ночное время. Знак - это декорация, он не разрешает подавать сигналы и не запрещает этого делать, он просто "мебель".
Аватара пользователя
Света
Разработчик
Сообщения: 752
Зарегистрирован: 13 мар 2015
Репутация: 1470

Re: Автоматический тифон в составах AI

Сообщение Света »

Romazan67 писал(а):...может тогда еще добавить временные рамки в пределах населенных пунктов ? Если такое возможно конечно.
Маркеры заставляют подавать сигнал трафик, поэтому если кому-то и будет засчитано нарушение, то боту =) . Тем не менее, раз бывают ограничения по времени, то, конечно же, надо будет это реализовать, чтобы не заставлять АI свистеть тогда, когда все спят. Это не проблема. Вот только надо определиться с вариантами решения. Можно сделать несколько моделек с жестко заданными временными окнами, определяющими когда маркер активен, а когда - нет. Недостаток - в невозможности подстроить время под свои потребности. Если честно, то я не знаю, какие временные интервалы существуют, и насколько их много. Другой вариант - использовать одну модельку, но в окошке имени вручную вводить желаемое время начала и конца "тишины". Минус этого варианта - использование окошка имени, которое в дальнейшем может пригодиться для чего-то другого. Плюс - очень широкие возможности в установке времени для каждого отрезка пути. Поэтому я пока спешить не буду, возьму только этот нюанс на заметку - обязательно надо будет это реализовать.
Сильные люди - это не те, у которых всё хорошо, а те, у которых всё хорошо несмотря ни на что.
YuriA
Эксперт
Эксперт
Сообщения: 580
Зарегистрирован: 14 фев 2013
Откуда: Московская обл.
Репутация: 105

Re: Автоматический тифон в составах AI

Сообщение YuriA »

PseudoStalker знать бы эти временные рамки :oops: . А то у меня складывается мнение, что на немецких маршрутах нельзя "дудеть" даже днём. Чуть трону пробел и читаю в отчёте сценария ругань :x
Аватара пользователя
boroda6304
Активный
Активный
Сообщения: 68
Зарегистрирован: 15 сен 2015
Откуда: Москва
Репутация: 51

Автоматический тифон в составах AI

Сообщение boroda6304 »

Всё верно, в Германии поезда ездят тихо, без звуковых сигналов.
Аватара пользователя
hungry-bear
Эксперт
Эксперт
Сообщения: 520
Зарегистрирован: 27 фев 2013
Откуда: Чехия
Репутация: 304

Re: Автоматический тифон в составах AI

Сообщение hungry-bear »

ошибку за неправильное использование сигнала (наверное был в населенном пункте)
Временные рамки здесь ни причём.
В реальной жизни есть основная разница между гудком на основании сигнала/правил (должен быть не различая время/место) и излишним гудением "только так для радости".
Второе считается неправильным и наказывается (то весь день, то ночю серезней) - в реале машинист на 90% выговорится на нужное приминение гудка по обстоятельствам (человек/зверь у/на пути), в игре "РС-судью" не обманеш.
Аватара пользователя
Cross
Разработчик
Сообщения: 6330
Зарегистрирован: 14 дек 2011
Откуда: Москва
Репутация: 2985

Re: Автоматический тифон в составах AI

Сообщение Cross »

Света
В игре есть возможность задать не только временной промежуток, но и выбрать один из четырёх сезонов.
*** = SysCall("ScenarioManager:GetSeason") - получает текущее время года.
*** = SysCall("ScenarioManager:GetTimeOfDay") - получает текущее время суток.
Основываясь на этих условиях можно довольно гибко настроить функцию применения сигнала AI составами
*Train Simulator 2018*
Изображение
Ответить