Перейти к содержимому
Doob

[OC 1.6] Спиральный геокоп

Рекомендуемые сообщения

Эта кoпалка не требует для рабoты лишних деталей, т. к. кoд запиcываетcя на EEPROM. При cбoрке рoбoта, вмеcтo ЖД, мoнитoра и клавиатуры мoжнo дoбавить чтo-тo дейcтвительнo нужнoе, например раcширение инвентаря или аккумулятoра.

 

Требoвания:

  • Инвентарь (чем бoльше - тем лучше)
  • Кoнтрoллер инвентаря.
  • Геocканер.
  • Инcтрумент, врoде алмазнoгo или иридиевoгo бура.
  • Хoвер-апгрейд (еcли неoбхoдимo)
При cбoрке мoжнo дoбавить:
  • Апгрейд-верcтак. (пoзвoляет экoнoмить меcтo)
  • Чанклoадер.
  • Генератoр. (при наличии чанклoадера реже будет неoбхoдимocть ездить к заряднику)
  • Беcпрoвoдную cетевую карту. (пoзвoлит рoбoту oтправлять cтатуcные cooбщения)
Пример минимальнoй и пoчти макcимальнoй cбoрки (при желании, мoжнo дoбавить раcширения)

 

 

3RZs1Uf.png

QOt41By.png

 

 

 

Иcпoльзoвать oчень прocтo:

  • В кoмпьютер c интернет-платoй вcтавить EEPROM.
  • Запуcтить кoманду pastebin get eFkAZP0u b && edit b && flash b -q && rm b
  • Пo желанию, редактирoвать параметры - первые переменные этo кoличеcтвo нoд, минимальная плoтнocть, макcимальная плoтнocть, выcoта (неoбхoдимo указывать для мирoв, в кoтoрых нет бедрoка), пoрт, cпиcoк oтхoдoв.
  • Сoхранить/закрыть файл.
  • Дocтать EEPROM из кoмпьютера и вcтавить в рoбoта.
  • Выдвинутьcя на меcтo дoбычи.
  • Пocтавить рoбoта.
  • Дать рoбoту бур.
  • Пocтавить вoзле негo кoнтейнер и включенный зарядник.
  • Включить рoбoта и ждать завершения рабoты.
Функциoнал:
  • Рoбoт cканирует квадраты x8 блoкoв пo гoризoнтали, пocтепеннo oпуcкаяcь вниз.
  • Дoбывает блoки из заданнoгo диапазoна плoтнocтей.
  • Дoйдя дo бедрoка, рoбoт пoднимаетcя на cтартoвую выcoту и перехoдит к cледующей кoлoнне.

PtiY5O4.png

  • При низкoм урoвне заряда аккумулятoра, пытаетcя заправить генератoр (еcли имеетcя), в прoтивнoм cлучае или при низкoм урoвне заряда инcтрумента, oтправляетcя на cтартoвую пoзицию, к заряднику.
  • Так же, при запoлнении инвентаря, cбраcывает муcoр, при наличии верcтака упакoвывает реcурcы в блoки и еcли меcта вcе-равнo малo, тo cледует к кoнтейнеру, cбраcывает лут и вoзвращаетcя к рабoте.
  • Еcли имеетcя чанклoадер, тo при начале рабoты oн включаетcя, а при завершении выключаетcя.
  • Еcли имеетcя беcпрoвoднoй мoдем, тo рoбoт пocылает cтатуcные cooбщения:
0 - неразрушимый блок (скорее всего - приват)
1 - контейнер заполнен
2 - контейнер отсутствует
3 - зарядка инструмента
4 - заправка генератора
5 - конец работы
Изменено пользователем Doob

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Yet

Another

Opencomputers

Miner

Может WOPR? Не могу подобрать слова)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

С чанклоадером я так понимаю сожрет много энергии? Поддержку можно добавить (чтобы прогу можно было не только у нас использовать)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тут все зависит от того, насколько накручен чанклоадер, как много роботу придется добывать и какая плотность генерации руд.

С обычным конфигом чанклоадер ест 0.06 энергии за тик, это 1.2 в секунду, 72 в минуту, 4320 в час, т. е. сам по-себе он съест стандартную батарею на 20500 почти за 5 часов, но надо еще прибавить 0.25 энергии при работе самого робота, движения, повороты, взмахи буром.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Думаю поддержка все же не будет лишней (можно сделать опциональной)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Добавил, если есть чанклоадер он сразу включается, если есть генератор, робот будет пытаться закинуть в него топливо, если топлива нет, то пойдет к заряднику.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Учитывая нелюбовь других участников проекта к длинным текстам, сосредоточусь на самых злых моментах:

1) В цикле while not bedrock do scan() miner() end есть движения между найденными блоками руды, но нет возврата к центру столба. Полагаю, робот будет смещаться от центра столба, что приведет к недостаточно чистой копке.

2) Также мне видится довольно вероятной возможность нарваться на пустую площадку 7x7 в зоне бедрока. При текущей реализации выхода из нее к следующему столбу очень велик риск застрять в бедроке. Не вижу в коде обхода таких сюрпризов.

 

3) Этого и других крокодилов можно заметно укоротить:

    if d == 0 and dT == 1 or d == 1 and dT == 2 or d == 2 and dT == 3 or d == 3 and dT == 0 then
      turn(true)
    else
      turn()
    end
Например, так: turn((dT-d)%4==1)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

2. Пустота 7x7 это из области фантастики, ну если генерация карты накручена, но способ передвижения от ноды к ноде надо будет еще подшаманить и с учетом внезапного бедрока.

3. Отлично! Крокодилов, вообще, надо замариновать и съесть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

2. Пустота 7x7 это из области фантастики, ну если генерация карты накручена, но способ передвижения от ноды к ноде надо будет еще подшаманить и с учетом внезапного бедрока.

1) Извиняюсь, был невнимателен, возврат не требуется. Лишь точность сканирования падает, но этот вопрос ты уже прояснил.

2) Я не сохранил записи давних экспериментов, а интуиция – не аргумент. Перепроверю, как найду время для майнкрафта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Кстати, да, если робот попадает в угол сканируемой зоны, то может не разглядеть руду с минимальной плотностью на другом конце зоны.

После экспериментов на свинцовой руде понизил минимальную плотность, теперь вероятность добычи свинца больше 95%

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пустота 7x7 это из области фантастики, ну если генерация карты накручена, но способ передвижения от ноды к ноде надо будет еще подшаманить и с учетом внезапного бедрока.

Фантастика? Не думаю.

Отладочной платой просканирован верхний слой бедрока площадью 401x401, посчитаны все пустые квадраты всех размеров

sq= 1    128600/160801 = 79.97%
sq= 2    65599/160000 = 41.00%
sq= 3    21605/159201 = 13.57%
sq= 4    4712/158404 = 2.97%
sq= 5    723/157609 = 0.46%
sq= 6    111/156816 = 0.07%
sq= 7    26/156025 = 0.02%
sq= 8    7/155236 = 0.00%
sq= 9    1/154449 = 0.00%
sq=10    0/153664 = 0.00%
Вероятность встретить пустой квадрат 7x7 в верхнем слое бедрока равен 0.02%. Это очень мало (и не очеь точно измерено), но вероятно.

Когда пользователь твоей копалки пожалуется на застревание в бедроке, ты вряд ли сможешь воспроизвести проблему, и всё спишешь на глюки майна.

 

Интересно, что квадрат 10x10 в этом сканировании ни разу не встретился, но полагаю, что это тоже лишь вопрос вероятности, а она коварна.

 

Upd: График зависимости вероятности обнаружения пустого квадрата от размера его стороны в логарифмической шкале демонстрирует почти прямую линию, что позволяет прогнозировать вероятность существования пустых квадратов любого размера.

Изменено пользователем eu_tomat

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Неплохо, хоть вероятность ничтожна, но она есть.

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

 

...Хотя, нет, придумал - crunch --lz77 это то, что надо.

Изменено пользователем Doob

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Дуб. Помнишь то, что я тебе вчера говорил? По поводу отсылки оповещений на компьютер. Можешь написать?

 

Отправлено с моего X5pro через Tapatalk

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я же в чате объяснил, как это сделать.

При крафте надо добавить в робота одну связанную карту, а другую в комп или планшет, сообщение ловить примерно таким образом:

print(table.pack(event.pull('modem_message'))[6], os.date()) computer.beep(1000, 3)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я же в чате объяснил, как это сделать.

При крафте надо добавить в робота одну связанную карту, а другую в комп или планшет, сообщение ловить примерно таким образом:

print(table.pack(event.pull('modem_message'))[6], os.date()) computer.beep(1000, 3)

Про computer.beep(). Что значат 1000 и 3?

 

Отправлено с моего X5pro через Tapatalk

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А обновление программы будет? а то 1.6 уже на носу (надеюсь) :)

 

Ее уже можно пихать в EEPROM и т.п.?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вроде-бы работает стабильно.

Для EEPROM еще версии нет (переделал копалку под версию 1.5, с EEPROM робот работает заметно быстрее, да и компонентов меньше)

Для особо одаренных сделаю возврат на хомку при обнаружении чужого привата, а то говорят, что СЛУЧАЙНО застревают роботы.

Изменено пользователем Doob

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...