RE AI StopMarker - специальный маркер к котором возможно движение по критериям, а не имени.
RE AI TrainLight marker - предоставляет возможность изменять яркость прожектора для последующего поезда.
Команды:
AI zxPath Make path for closed signal - создаёт маршрут от закрытого станционного светофора с указанным приоритетом. До сбора маршрута и открытия светофора выполняет движение поезда вплоть до целевого светофора (требуется sU + zxPath)
AI zxPath Prepare path for closed signal - задаёт критерий сборки маршрута от закрытого станционного светофора и завершается. Маршрут будет собран, как только будет доступна такая возможность. (требуется sU + zxPath)
AI zxPath Shunt to - Выполняет манёвр к или за указанный светофор. При необходимости строит маневровый маршрут до целевого светофора. (требуется sU + zxPath)
AI Wait until green signal - ожидает появления зелёного сигнала на впереди стоящем светофоре
AI Wait until not red signal - Ожидает появления отличного от красного сигнала на впереди стоящем светофоре.
AI Sound signal - Управляет поведением звуковых сигналов (тифон - свисток)
AI Drive to train - Выполняет движение к стоящему впереди составу
AI Couple with train - Сцепляется с впереди стоящим составом
AI Driver - выполняет движение к указанному маркеру или стоп-маркеру с заданными критериями
AI Drive to red signal - выполняет движение к закрытому станционному светофору (требуется sU)
AI Set Priority - Устанавливает приоритет поезда
AI Locomotive headlight control - Управляет поведением прожектора
AI Pantograph state control - Управляет работой токоприёмников
AI Set speed limit - Задаёт ограничение скорости, выше которого бот не может двигаться независимо от ограничения на участке пути
Манёвры на свободный путь станции:
Предоставляет возможность выполнения манёвров в парк станции с автоматическим выбором свободного пути. (требуется sU + zxPath)
RE AI Free Path Station Controller - Определяет набор путей парка станции и контролирует их занятость.
AI Shunt to free track - Выполняет манёвр на свободный путь парка станции
Депо:
Система управления автоматического движением локомотивов на пути отстоя с выбором свободной места (требуется sU + zxPath)
RE AI Depo Marker - маркер ограждающий участок пути выделенный под отстой локомотивов (путь депо)
RE AI Depo Controller - группирует пути в депо и контролирует их занятость.
AI Drive to depo - выполняет движение локомотива в депо с автоматическим выбором пути для отстоя. (Требуется, чтобы от точки начала движения можно было попасть на любой путь депо)
Система сообщений:
Предоставляет возможность обмена сообщениями между машинистами
RE AI Message Library - правило, описывающее библиотеку доступных сообщений и контролирующее обмен ими.
AI Messages - Команда выполняющая отправку или ожидание сообщения.
Библиотека очередей команд (БОК):
RE AI Command Queuing Library - Правило библиотеки очереди команд. Предоставляет возможность создания очередей.
RE AI Command Queuing Activator - Правило для создания активаторов очередей команд при наезде поезда на триггер
AI Activate command list - Команда активирующая очередь в библиотеке очередей команд
AI Wait command list - Команда ожидающая появления активированной очереди в библиотеки очередей команд с последующим её назначением на исполнение.
AI Register in activator - Регистрирует поезд а активаторе очереди команд по наезду на произвольный триггер. (Поезд может быть одновременно зарегистрирован только в одном активаторе)
Библиотека команд:
Предоставляет возможность группировать часто используемые наборы команд в готовые задания и назначать их целиком.
RE AI Command Library - Библиотека наборов команд
AI Copy commands - Выполняет копирование всего набора команд из библиотеки команд или БОК в задание бота.
Исправления:
hotfix 1 (2.1 от 19 апреля 2014 г.)
Исправлен алгоритм расчёта расстояния до объекта. Теперь нет зависимости от длины первой подвижной единицы в составе
Переделан алгоритм заезда за объект. Теперь это делается плавно
Центрирование ПС в депо на сквозных путях теперь выполняется относительно центра пути
В команде "Манёвры" добавлена группировка списка станций
Исправлена ошибка приводящая к сбою в работе активатора БОК после загрузки сохранённой сессии
БОК 2.1
Добавлена возможность настройки алгоритма выбора активированного списка из группы (по списку, по очереди активации, случайно)
Добавлена возможность мультиактивации списков (опционально для каждого списка)
Добавлена возможность активации списка при старте сессии
Добавлено правило управления активацией списка
Автор: Эрендир
Тестеры: Ant.Taranish, Tram_, NickLon
Некоторые идеи: Tram_, NickLon
Большое спасибо всем, кто внёс тот или иной вклад в развитие этой системы.
Совет
Контроллеры свободного пути станции и депо должны быть установлены в слое сессии
Совет
Новая версия по ряду причин не совместима с предыдущей, потому на старых сессиях требует повторной перенастройки.
ВНИМАНИЕ
Система Бота-машиниста будет работать только в Trainz Simulator 2012 3.7 build 58414 и выше. Задавшие вопрос о работе в более низких билдах автоматически получат бан на 3е суток. Не засоряйте не нужным форум и избавьте себя и администрацию от ненужных проблем.
Последний раз редактировалось Эрендир; 30.11.2014 в 08:18.
Помнится что как то обсуждалась команда "сцепка с составом", а именно что бот мог не рассчитать расстояние до состава, когда накатывался назад вагонами к прицепляемому составу(вагонам), происходила сцепка без остановки и соответственно ваш бот стоял и тупил, т.к команда оставалась не выполненной. После многочисленных тестов разными маневровыми локомотивами и вагонами с нормальными тяговыми характеристиками и скриптами известными вам всеми авторов, выявлено следующее, растяжка сцепок всех ваших вагонов которые используются в данном маневре не должна превышать значения 0.02 Тестировалось в 2019 SP2 Auran Standard, на различных уклонах пути, с разной массой поезда, с разной длиной вагонов в количестве до 20 штук в накатываемом составе при движении назад.
Последний раз редактировалось Avrora; 14.03.2021 в 21:55.
К качеству они стремились... Нужно думать, нужно разбираться!
Отлаживаю под создание сценариев карту "Степная Даль", но обратил внимание вот на что:
Из портала у меня выезжает товарный под, древним как мамонт, ВЛ60К, дефолт старый:
Команды у него простые - поднять второй токоприёмник, автомашинист - активировать.
Но локомотив этот почему-то выезжает из портала с обеими поднятыми пантографами, как постоянник.
Проверил несколько разных электровозов, насколько понял многое зависит от скрипта. Этот ВЛ60К, выезжает из портала сразу с одним поднятым ТП, без команд, но помнится, что встречал и такого бота, который не поедет, пока командой ТП не поднимешь.
Команды у него простые - поднять второй токоприёмник, автомашинист - активировать.
Но локомотив этот почему-то выезжает из портала с обеими поднятыми пантографами, как постоянник.
Поезда, выходящие из портала, автоматически поднимают первый пантограф.
Если ему дать еще команду "поднять второй пантограф", то будут подняты оба.
Поэтому команду пантографа лучше вообще не задавать, либо после выхода из портала давать команду "опустить оба пантографа", а потом поднять нужный.
Все зависит от того, в каком порядке пантографы прописаны в конкретном локомотиве.
Из-за того, что портал поднимает 1-ый пантограф, то целесообразно в локомотиве первым прописывать задний пантограф. Важно понимать, что слово "первый" не значит первый от машиниста, а "первый" как вообще порядковый, т.е. задний. "Второй" - значит, второй по порядку, т.е. передний. Так проще. К тому же не приходится использовать лишнюю команду. Но для тройников своя история.
Уроки по Trainz: https://www.youtube.com/c/TeamoftheTrainz
DmitryKz, к сожалению, нет, если речь идет о командах из БОК. Здесь неправильный алгоритм в скрипте. Нужно, чтобы обратная связь регулирования тяги осуществлялась по скорости локомотива, а не первого вагона.
Уроки по Trainz: https://www.youtube.com/c/TeamoftheTrainz
Вот сейчас попробовал Autodrive к маркеру — движение при осаживании прошло без рывков. А в видео использовалась zxPath ShuntTo. Спросил у Володи TRam_'а — может, прояснит что...
Принципиален ли для ботомашиниста слой, в котором будут находиться стоп-маркеры? Критично ли, зашить их сразу в карту, для удобства создания сессий самому или будущим пользователям.
Нужно, чтобы обратная связь регулирования тяги осуществлялась по скорости локомотива, а не первого вагона.
Там дело, скорее всего не в том, от какого вагона приходит обратная связь, а в том, что регулировка скорости делается так: для разгона постепенно увеличивается параметр DCCThrottle (аналог того, если вручную повернуть ручку мощности в режиме DCC) - состав разгоняется до тех пор, пока скорость не превысит лимит скорости. После того, как скорость превысила лимит, DCCThrottle сбрасывается на определенное значение, и это значение слишком большое, а в режиме DCC состав довольно резко реагирует на все изменения мощности тяги, поэтому скорость резко падает, и получается рывок. Затем, скрипт видит, что скорость упала ниже лимита, и снова начинает разгонять состав увеличивая DCCThrottle.
Я смотрел команду "Couple with train", у которой скрипт не был зашифрован - там есть отдельный файл скрипта ctdrivingwithspeed.gs - в нём прописан алгоритм движения с заданной скоростью. На сколько я понимаю - в команде, которую использует DmitryKz используется примерно тот же скрипт.
---------- Сообщение добавлено в 16:08 ---------- Предыдущее сообщение размещено в 16:01 ----------
Сообщение от Avrora
Помнится что как то обсуждалась команда "сцепка с составом", а именно что бот мог не рассчитать расстояние до состава, когда накатывался назад вагонами к прицепляемому составу(вагонам), происходила сцепка без остановки и соответственно ваш бот стоял и тупил, т.к команда оставалась не выполненной. После многочисленных тестов разными маневровыми локомотивами и вагонами с нормальными тяговыми характеристиками и скриптами известными вам всеми авторов, выявлено следующее, растяжка сцепок всех ваших вагонов которые используются в данном маневре не должна превышать значения 0.02 Тестировалось в 2019 SP2 Auran Standard, на различных уклонах пути, с разной массой поезда, с разной длиной вагонов в количестве до 20 штук в накатываемом составе при движении назад.
Как я уже писал выше - я нашёл на DLS версию команды сцепки с составом, в которой скрипты не зашифрованы, и поправил её - сделал, чтобы при приближении к составу ближе чем на 100 метров, скорость движения ограничивается до 5км/ч, и проблема въезда в состав на большой скорости решилась. Проблему сцепки без остановки тоже решил тем, что сделал, чтобы после сцепки подавалась команда остановки и скрипт ждал полной остановки состава, и только потом команда завершалась. Изначально проверка делалась по количеству вагонов в составе - команда запоминала - сколько было вагонов в составе при начале движения и постоянно проверяла - не увеличилось ли количество вагонов - если количество вагонов увеличилось - значит, произошла сцепка, и команда завершалась сразу же после увеличения количества вагонов, а нужно было сперва остановиться, и только потом завершаться.
---------- Сообщение добавлено в 16:12 ---------- Предыдущее сообщение размещено в 16:08 ----------
Вот место в файле ctdrivingwithspeed.gs, в которое я внёс правку на ограничение скорости при приближении к составу ближе, чем на 100м:
в методе Update(void) класса CTDriveToTrain изменил следующее
Код:
...
float ns = Math.Fmin(nsnsb, Math.Fmin(nsrs, nsv)); //Определяем минимальную требуемую скорость движения (эта строка была изначально)
// начало моей вставки
if(VehDist <= 100){
if(ns > 5){
//Interface.Print(train.GetActiveDriver().GetLocalisedName() + " dist to train <=100m - speed down to 5kph");
ns = 5;
}
if(me.MaxThrottle > 1)
me.MaxThrottle = 1;
}else{
// конец моей вставки
if(ns > me.ControlSpeed)
me.MaxThrottle = -1;
// начало моей вставки
}
// конец моей вставки
me.ControlSpeed = ns; //Назначаем новую скорость на контроль
float speed = train.GetVelocity();
...
---------- Сообщение добавлено в 16:20 ---------- Предыдущее сообщение размещено в 16:12 ----------
В файле ctcoupleshedulecommand.gs в методе HandleCoupleCommand() класса CTCoupleCustomCommand внёс следующие правки:
Код:
bool Coupled = false; // объявил переменную вначале функции
...
on "CTCoupleCustomCommand", "Update": {
if(!Coupled){ // обернул код, который был изначально в это условие
if(Couple)
Controller.UpdateNoBasedTrackside();
else
r = Controller.Update();
if(r == CTDriveToTrain.STATUS_TRAIN_NOT_FOUND and !TrainNorFound){
Interface.Print(driver.GetLocalisedName() + " - " + strTable.GetString("trainnotfound"));
TrainNorFound = true;
}else if(r == CTDriveToTrain.STATUS_COMPLETE and !Couple){
Controller.Stop();
train.Sleep(3);
if(Sound == ST_HORN)
train.SoundHorn();
else if(Sound == ST_WHISTLE){
train.SendMessage(train, "loco", "bell");
train.Sleep(1);
train.SendMessage(train, "loco", "bell");
}
Controller.SetMaxSpeed(1);
Couple=true;
}else if(Couple){
int cvehCount = train.GetVehicles().size();
if(vehCount != cvehCount){
//Interface.Print(driver.GetLocalisedName() + " coupled");
Coupled = true; // устанавливаю переменную в true, если сцепка была произведена (если количество вагонов в составе изменилось)
Controller.Stop(); // не помню - была ли эта строчка изначально, или нет
}
}else{
TrainNorFound = false;
}
// начало моей вставки (далее идёт полностью мой код
}else{
// ожидаем полной остановки после сцепки
if(train.IsStopped()){
//Interface.Print(driver.GetLocalisedName() + " coupling ended");
break;
}//else{
// Interface.Print(driver.GetLocalisedName() + " waiting for stop (vel = " + train.GetVelocity() + ")");
//}
}
// конец моей вставки
train.PostMessage(train, "CTCoupleCustomCommand", "Update", Controller.GetUpdatePeriod());
continue;
Последний раз редактировалось ArGrigorov; 01.05.2021 в 14:24.