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

vx13

Гуру
  • Публикации

    193
  • Зарегистрирован

  • Посещение

  • Победитель дней

    14

Сообщения, опубликованные пользователем vx13


  1. Про метадату забыл. И запятая в последней строке, не нужна (json-валидатор ругается на это). Кавычки в названии предмета стоит энкодить, так как это json-строка.

    А я, кстати, забыл расширения '.dat' добавить к файлу с кейсами.

     

    В остальном, содержимое файлов у обоих программ идентично.

    • Нравится 1

  2. Такой вариант:

    local component = require("component")
    local _,address = require("event").pull("touch")
      
    local ff=io.open("/boot/98_connectScreen.lua","w")
    ff:write([[
    local component = require("component")
    local address = "]]..address..[["
    
    if component.screen.address ~= address then
      if pcall(function() component.setPrimary("screen", address) end) then
        component.setPrimary("keyboard", component.invoke(address, 'getKeyboards')[1])
      end
    end
    ]])
    ff:close()
    
    if component.screen.address ~= address then
      require("term").clear()
      component.setPrimary("screen", address)
      component.setPrimary("keyboard", component.invoke(address, 'getKeyboards')[1])
      os.sleep(0.1)
      component.gpu.bind(component.screen.address)
      require("term").clear()
    end
    
    

    Вроде бы делает то, что нужно. (OpenOS 1.6)

    • Нравится 3

  3. В том то и дело стоит все дефолтно, но новая версия работает хотя после скана сундука пишет что не нашла его 0_о.

    https://imgur.com/a/rVUKM

    Контроллер инвентаря не может получить доступ к сундуку. Может быть проблема с приватом или настройками сервера.


  4. Запускается этот скрипт с помощью РакБота, в документации про wait ничего нет. Вот решил у вас спросить, может вы знаете как сделать задержку.

    Вызвать внешнюю команду:

     

     -- win7 (может быть и выше)
    os.execute("timeout " .. tonumber(n)) 
    
    --windows WScript
    function sleep(n)
      local vb = "test.vbs"
      local f = assert(io.open(vb,"w"))
      f:write("WScript.Sleep(" .. (tonumber(n) * 1000) .. ")\n")
      f:close()
      os.execute(vb)
    end
    
    -- Cygwin/MinGW/Windows Server Resource Kit/Linux
    function sleep(n)
      os.execute("sleep " .. tonumber(n))
    end
    
    Взял отсюда.

  5. Я как понимаю он пытается доставить бур из зарядника из OC? А я его тестирую с МФСУ... Да, конечно можно и в заряднике, но он очень долго заряжает его. Можно как-нибудь с МФСУ провернуть?

    У зардника OC и МФСУ для зарядки используется слот 1.

     

    Я не понимаю, почему у тебя не работает.

     

    Попробуй запустить код из предыдущего поста на полигоне:

     

     

    Стоит МФСУ. Рядом робот, мордой в МФСУ. В руке робота бур.

    tjU1xIniSgo.jpg

    CZoID54aJ6I.jpg

     

     


  6. Вариант с доп. проверками. Выводит сообщения об ошибках.

     

     

    local sides = require "sides"
    local robot = require "robot"
    local component = require "component"
    local inv = component.inventory_controller
    
    -- в какой стороне от робота находится зарядник (front, down, up)
    local CHARGER_SIDE = sides.front -- спереди
    -- слот в котором будет заряжаться инструмент (слот 1 подходит для зарядников OC/IC2)
    local CHARGER_SLOT = 1 
    
    function charge_tool()
      -- перемещаем инструмент из руки в инвентарь (equip() меняет местами содержимое текущего слота и руки)
      inv.equip()
      -- получаем информацию об инструменте в текущем слоте
      local tool = inv.getStackInInternalSlot(robot.select())
      if tool == nil then
        print("Нет инструмента")
        os.exit(1)
      elseif tool.maxCharge == nil then
        print("Инструмент нельзя зарядить")
        os.exit(1)
      end
      -- перемещаем инструмент в зарядник
      if not inv.dropIntoSlot(CHARGER_SIDE, CHARGER_SLOT) then
        print("Не удалось положить инструмент в зарядник")
        os.exit(1)
      end
      -- зарядка инструмента
      while true do
        local tool = inv.getStackInSlot(CHARGER_SIDE, CHARGER_SLOT)
        if not tool then
          print("В заряднике нет инструмента")
        else
          if tool.charge >= tool.maxCharge then
            break
          end
        end
        os.sleep(1)
      end
      -- забираем инструмент из зарядника
      if not inv.suckFromSlot(CHARGER_SIDE, CHARGER_SLOT) then
        print("Не удалось забрать инструмент из зарядника")
        os.exit(1)
      end
      -- перемещаем инструмент обратно в руку робота
      inv.equip()
    end
    
    -- зарядка потребуется при понижении прочности инструмента ниже этого значения
    -- для электроинструмента прочность соответствует его заряду (1 - полный заряд, 0 - разряжен)
    local TOOL_MIN_ENERGY = 0.3
    
    function check_tool_energy()
      -- проверяем нужно ли зарядить инструмент (если он есть и может терять прочность)
      local d = robot.durability()
      if d and (d < TOOL_MIN_ENERGY) then
        -- ставим зарядник или возвращаемся на базу к установленному заряднику
        -- ...
        -- заряжаем инструмент
        charge_tool()
        -- возвращаемся к прерванной работе
        -- ...
      end
    end
    
    check_tool_energy()
    
     

     

     


  7. Такая ошибка может возникнуть в строке

    while inv.getStackInSlot(CHARGER_SIDE, CHARGER_SLOT).charge < tool.maxCharge do
    

    если в слоте зарядника не будет предмета, inv.getStackInSlot(CHARGER_SIDE, CHARGER_SLOT) вернёт nil.

    Робот смог положить бур в зарядник или он остался в инвентаре? Если не смог, то зарядник стоит не с той стороны. (Можно проверить смог ли робот положить бур в зарядник - dropIntoSlot() возвращает true в случае успеха.)

    Забирать бур из зарядника во время зарядки нельзя.

     

     


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

     

     

    1TLjMvdl6sQ.jpg

     

    Робот должен повернуться в нужную сторону. Оказывается, доступны только стороны front, up, down.

  9. А так же например из робота (всё что в нём от 1 слота до N) импортируется в МЭ систему (AE2), а из неё в сундук. А когда бур кладётся в первый слот, то бур попадает в МЭ систему, а из неё в сундук.

    МЭ-система вытягивает предметы из робота сама? Лучше если робот будет сам скидывать свой инвентарь, тогда он сможет сохранить нужные ему предметы.

    Можно ли сделать, чтобы он сразу из активного слота клал в зарядник?

    equip() - это единственный способ доступа к инструменту робота.

    А да, можешь как-нибудь засунуть это в свой исходник?

        -- ...
        while true do
           check_tool_energy()
           robot.swing()
        end
    

    У меня стоит зарядник справа, я указываю в исходнике right и при запуске выдаёт 2 ошибки функции.

    Какие ошибки?

  10. Но как сделать проверку на кол-во энергии? Я не шарю

    Например, так:

    --Программа выполняет зарядку инструмента в руке робота, зарядник спереди.
    local sides = require "sides"
    local robot = require "robot"
    local component = require "component"
    local inv = component.inventory_controller
    
    -- в какой стороне от робота находится зарядник (front, left, right, down, up)
    local CHARGER_SIDE = sides.front -- спереди
    -- слот в котором будет заряжаться инструмент (слот 1 подходит для зарядников OC/IC2)
    local CHARGER_SLOT = 1 
    
    function charge_tool()
      -- перемещаем инструмент из руки в инвентарь (equip() меняет местами содержимое текущего слота и руки)
      inv.equip()
      -- получаем информацию об инструменте в текущем слоте
      local tool = inv.getStackInInternalSlot(robot.select())
      -- перемещаем инструмент в зарядник
      inv.dropIntoSlot(CHARGER_SIDE, CHARGER_SLOT)
      -- зарядка инструмента
      while inv.getStackInSlot(CHARGER_SIDE, CHARGER_SLOT).charge < tool.maxCharge do
        os.sleep(10)
      end
      -- забираем инструмент из зарядника
      inv.suckFromSlot(CHARGER_SIDE, CHARGER_SLOT)
      -- перемещаем инструмент обратно в руку робота
      inv.equip()
    end
    
    -- зарядка потребуется при понижении прочности инструмента ниже этого значения
    -- для электроинструмента прочность соответствует его заряду (1 - полный заряд, 0 - разряжен)
    local TOOL_MIN_ENERGY = 0.3
    
    function check_tool_energy()
      -- проверяем нужно ли зарядить инструмент
      if robot.durability() < TOOL_MIN_ENERGY then
        -- ставим зарядник или возвращаемся на базу к установленному заряднику
        -- ...
        -- заряжаем инструмент
        charge_tool()
        -- возвращаемся к прерванной работе
        -- ...
      end
    end
    
    check_tool_energy()
    
    Программа выполняет зарядку инструмента в руке робота, зарядник спереди.
    • Нравится 1

  11. :D Я еще недели 1.5 - 2 назад хотел сделать и практически сделал, самое интересное сия схема всеми пунктами одинаковые с моей.

     

    Мне кажется что ты взял принципы работы которые я высказал на сервере в чате. Больно уже похожи.

     

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

    Но нашёл время только в январе, на праздниках. А сейчас только причесал код и выложил.

     

    По поводу схожести принципов работы — вариантов-то не особо много:

    • Расположение деревьев через одно — самый компактный вариант.
    • Без геоанализатора — не обойтись.
    • Использование электрокраника — не ломается, не требует крафта краников. Нужен лишь источник энергии, который и так нужен.
    • Обход точек сбора с использованием поиска пути — есть готовая библиотека, и не зачем колхозить собственный алгоритм обхода.

  12. Версия 0.7.6 http://pastebin.com/bT21Huzi

    Инструкция

     

     

    Установите робота в левом верхнем углу карьера. За спиной робота — сундук. Слева — зарядник IC2(для зарядки инструмента). Сверху — зарядник OC(для зарядки робота). Можно слева можно поставить зарядник OC. Он будет заряжать и робота и инструмент. Зарядник OC должен быть включён. Для запуска копалки укажите размеры карьера:
    kopalka [опции] размер_вперёд размер_вправо [размер_вниз]
    Если размер_вниз не указан робот будет копать до бедрока. Если толщина слоя бедрока в мире не равна 5 блокам, укажите её опцией --bedrock-width=толщина_слоя_бедрока. Если бедрок плоский добавьте опцию -f (толщину в этом случае указывать не нужно).
    При сканировании робот будет искать блоки, плотность которых находится в интервале (a, b); a — определяется опцией --min-hardness, b — определяется опцией --max-hardness. Значение по умолчанию (2.05, 40).
    Для выкапывания всех блоков в указанной области(выкапывание ямы) добавьте опцию -q.
    С помощью опции --scan-radius можно изменить радиус сканирования. Добавляйте её только если вы изменили значение geolyzerNoice в конфиге OC (geolyzerNoice=2 — --scan-radius=5; geolyzerNoice=1 — --scan-radius=10).
    С помощью опции --estart задаётся уровень заряда аккумулятора необходимый для запуска робота. Если уровень заряда акк. опустится ниже --egen — будет включён генератор робота. Если уровень заряда акк. опустится ниже --ereturn — робот вернётся для подзарядки в точку старта. Уровни задаются в процентах от емкости акк. робота. Значения по умолчанию: --estart=99 --egen=50 --ereturn=20. Если емкость акк. больше или равна 1000000, то значения по умолчанию: --estart=20 --egen=10 --ereturn=2.
    Если добавить опцию --dont-drop-scrap робот не будет выбрасывать мусор. С помощью опции --test-bedrock можно протестировать высоту бедрока в точке старта.
    Блоки которые робот будет считать мусором задаются в переменной scrap (строка 16). Инструмент — в переменной  mining_tools_list (строка 39). Топливо для генератора — в переменной fuel_list (строка 31). Периодичность запуска проверки состояния робота (заряд акк., заполненность инвентаря, целостность инструмента) в действиях (действием ситается удар, перемещение, сканирование колонны блоков) — в переменной chkPeriod (строка 14). В строках 6-12 задаются дефолтные значения для опций --egen, --ereturn, --estart, --min-hardness, --max-hardness, --scan-radius.

     

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