Перейти к публикации
Форум - ComputerCraft

Блоги

Рекомендованные записи

  • Totoro

    Запускаем дронов!

    Автор: Totoro

    Дроны - как керосин. Они есть везде. Еще года два назад это было просто еще одно интересное видео на Ютубе. Год назад они вдруг оказались в интернет магазинах. Затем просочились в рекламу на ТВ, и вот теперь - они есть и в OpenComputers! Пришла пора с ними разобраться.   1. Матчасть Дрон, в данном случае - квадрокоптер, это беспилотный летающий аппарат, приводимый в движение двумя парами горизонтальных винтов. Приостановливая вращение винтов с одного боку, дрон двигается в сторону (стрейф). Эти винты вращаются в разном направлении (два - по часовой срелке и два - против), за счет чего дрон не нуждается в стабилизирующем хвостовом пропеллере (как вертолет). За счет этого же он и разворачивается в воздухе, замедлив вращение однонаправленной пары винтов. Дрон обладает небольшой массой, для экономии энергии, которой у него не много (на 10-30 минут полета в среднем). (с) Википедия   2. Дроны и OpenComputers Приблизительное изображение дрона в OpenComputers =): В мире Майнкрафта дрон представляет из себя "сущность" (Entity). Это значит, что он обладает возможностями мобов Майнкрафта. (В то время как робот - это блок.) Его можно сдвинуть с места толкая. Он умеет пролетать сквозь двери и калитки (в отличии от робота). Он движется не последовательно, из блока в блок, а из точки в точку. Причем маршрут может лежать по диагонали.   Конечно, движется он по кратчайшей линии, и если на пути окажется стена - дрон столкнется с нею.   Программирование дрона как две капли воды похоже на программирование микроконтроллера. Вы точно так же записываете программу на EEPROM, и при необходимости меняете ее на верстаке. Только в отличии от контроллера, вам становится доступен новый компонент: drone.   Подробнее об командах дрона можно узнать здесь: OpenComputers/Дрон. (Или здесь: ocdoc.wiki (англ.))   3. План Нужна какая-нибудь несложная задача, для целей эксперимента. Используем программку send из предыдущего поста, для удаленного управления. Зальем ее на планшет. А дрон пусть... носит свиней. Будем оригинальными и непоследовательными.     1. Команда 'add X Y Z Name From'. Добавляем точку Name к маршруту, цепляя ее к точке From. Зададим дрону последовательность точек, которые образуют граф - безопасные маршруты. 2. Команда 'catch' - дрон ловит свинью. 3. Команда 'drop' - дрон выпускает свинью. 4. Команда 'to X' - дрон летит в точку Х.   Для начала не будем особо заморачиваться с графом маршрутов. Это будет простое неориентированное дерево. Примерно такое:   4. Строим полигон Построим что-нибудь подходящее для тестов. Отметим ключевые точки будущего графа красными блоками. А синий блок - будет стартовой площадкой дрона.           Поскольку я играю без модов на энергию, мой планшет и дрон будут работать вечно. И я не заморачиваюсь станцией подзарядки.   Иначе, к схеме выше было бы необходимо добавить станцию, где дрон мог бы зарядить аккумулятор.     5. Пишем программу Скрипт для удаленного управления скопипастим из прошлого поста, подправим, чтобы умела отправлять несколько переменных и зальем на планшетик, для удобства. (Для этого, соберите планшет - не забудьте клавиатуру и видеокарту! - положите его в зарядник и запустите с подключенного компа команду install. Укажите адрес винчестера планшета - и все, что было у вас на компе автоматически загрузится в планшет, включая даже ваши собственные программы.) local com = require('component')local modem = com.modemlocal args = {...}modem.broadcast(27, table.unpack(args))io.write("Message: ")print(table.unpack(args)) Далее - более сложная часть. Программа дрона. Программа предназначена для EEPROM. Значит соблюдаем те же правила: используем computer, component и API имеющихся у дрона компонентов. Включая его родной компонент drone. В нашем случае, дрон вооружен апргейдом-лассо (leash) и беспроводной сетевой картой (modem) для связи.   Стоит отметить, что процесс отладки программы (по крайней мере в текущем билде мода) достаточно неудобен. В случае ошибки дрон отказывается включиться, издав тонкий писк, и не выводя никакой информации. Получить отчет об ошибке при помощи анализатора не выйдет - ведь Shift+ПКМ просто снимает дрона. Автор обещал в скором времени это исправить. Ну а пока - помучаемся.   Отредактировать чип в стороннем редакторе, не вынимая его из дрона тоже не выйдет. В отличии от файловых систем, которые имеют удобную папку вида /saves/World/opencomputers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/, чипы EEPROM хранят свой код в NBT тегах предмета. Этим же обусловлено и ограничение размера кода в 4 килобайта.   5.1. Основная часть Это цикл который ждет указаний, а затем запускает соответствующую функцию. drone = component.proxy(component.list("drone")())modem = component.proxy(component.list("modem")())leash = component.proxy(component.list("leash")())modem.open(27)route = {}path = {}current = ""while true do name, _, sender, _, _, message, x, y, z, point, from = computer.pullSignal(1) if name == "modem_message" then if message == 'add' then add(tonumber(x), tonumber(y), tonumber(z), point, from) if current == "" then current = point end elseif message == 'to' then to(x) elseif message == 'catch' then catch() elseif message == 'drop' then drop() end end if #path > 0 and drone.getOffset() < 1 then drone.move(route[path[#path]].x-route[current].x, route[path[#path]].y-route[current].y, route[path[#path]].z-route[current].z) current = path[#path] path[#path] = nil endendmodem.close() Чтобы облегчить себе жизнь (и тестирование bios), вы можете сделать так: напишите заглушку для компонента drone (и других, если надо), вроде этой: http://pastebin.com/EVYzN5Bj Просто скопируйте в папку на компьютере, где вы пишете программу для дрона. Затем измените первые строки программы следующим образом: component = require('component')computer = require('computer')drone = require('drone')modem = component.modem-- leash = component.proxy(component.list("leash")()) Затем добавьте в цикл условие выхода по нажатию кнопки: if name == 'key_down' then break end И вы можете просто запустить вашу программу для дрона на компьютере. Разумеется полноценной эмуляцией дрона тут и не пахнет, зато очень удобно отслеживать глупые синтаксические и логические ошибки.     Как устроен код основного цикла? Переменная route - хранит таблицу "вейпоинтов" (waypoints). Это вершины графа и информация о связях между ними. Переменная path - хранит путь от текущей вершины до цели. Переменная current - отмечает текущее местоположение дрона в графе.   В цикле мы читаем получаемые сообщения и вызываем соответствующие функции. Первая переданная вершина считается дроном текущей.   Во второй части цикла происходит проверка. Если путь до цели - не пуст (это значит, что дрону надо куда-то лететь) и дрон уже долетел до текущей вершины (getOffset()), то программа берет следующую вершину из path, отправляет дрона к ней и объявляет ее текущей.   5.2. Функции-команды Теперь последовательно добавим функции для каждой команды. function add(x, y, z, name, from) route[name] = {x=x, y=y, z=z, link = {}} if from ~= nil then if route[name] == nil or route[from] == nil then drone.setStatusText("Error!") else table.insert(route[name].link, from) table.insert(route[from].link, name) end endend Тут все просто. Пишем вершину в список. Если он связана с другой вершиной (from ~= nil), то в специальную табличку link заносим две связи: из name в from, и из from в name. function search(target, point, prev) for key, name in pairs(route[point].link) do if name == target then table.insert(path, point) return true end end for key, name in pairs(route[point].link) do if name ~= prev then if search(target, name, point) then table.insert(path, point) return true end end end return falseendfunction to(name) path = {} table.insert(path, name) search(name, current)end Функция to обнуляет старый путь (на всякий случай), затем вставляет в него цель пути (name) и запускает функцию search, которая рекурсивно ищет и записывает остальные промежуточные вершины на маршруте от name до current (текущей локации). Функция search сделана достаточно примитивно (возможно вы предложите более эффективный способ?). Поскольку мы договорились, в целях упрощения использовать граф-дерево (не содержаший петель), от любой точки к другой существует один и только один маршрут, который функция и находит перебором связанных вершин. function catch() for c = 2, 5 do if leash.leash(c) then return true end end return falseendfunction drop() leash.unleash()end Тут все элементарно.   6. Подготовка Пишем программу на дрона, заряжаем планшет и выдвигаемся в зону действий. Дрона ставим на синий куб (стартовая площадка) и включаем.     После уточнения на местности, составляем карту вейпоинтов и строим на бумажке будущий граф:   Для каждого загона добавлены две точки - name и name_up. Основные "трассы" дрона лежат на высоте в 6 блоков. А в каждом загоне спускаются к земле. (Чтобы заарканить животное, выстреливая лассо вбок, дрону желательно находиться на одном уровне с жертвой).   С планшета вносим координаты в память дрона. Примерно так:     Главное - не ошибиться. Т.к. в код не была добавлена защита "от дурака" =) Алгоритм позволяет добавлять вершину "на лету". В любой момент вы можете добавить еще одну ветку к схеме.   Теперь все готово к тесту.   7. Запуск Все готово. Проверим, как он двигается. Введем send to sheeps в консоль планшета. Дрон уверенно поднимается в воздух и опускается в загоне в овцами.   Теперь введем send to pigs. Функция search снова вычислит путь и робот переместится в указанную вершину:     Функции catch и drop тоже работают штатно =)     Хотя и не лишены некоторых глюков (ведь физика веревки не просчитывается):     8. Итоги а) Дрон - любопытная штуковина. б) Полный код прошивки. использованный в этом посте - здесь: http://pastebin.com/Cy1UR6vy в) Навигация по вейпоинтам - интересный и очень распространенный способ организации сложного движения. Схему можно усложнить - опционально добавлять только одну связь в таблицу link - тогда получатся ребра с односторонним движением. Добавить петли, оптимизировать поиск кратчайшего пути. Еще можно облегчить правление дроном - хранить все команды для конкретной задачи в виде файла-скрипта, который запускать одной командой и т.д.   Enjoy!
    • 19 комментариев
    • 13 650 просмотров
  • Zer0Galaxy

    Создаем собственный сайт в сети OpenNet (часть 0x00)

    Автор: Zer0Galaxy

    И так, Вы попали в белый список, построили дом, добыли ресурсов, собрали свой первый компьютер, написали первую программу. Настало время поведать о своих успехах миру. Лучший способ сделать это - создать OpenNet-сайт с изложением всех своих достижений. Для этого Вам понадобится WEB-сервер. Это может быть обычный ОС компьютер. Желательно обеспечить его бесперебойным питанием и разместить в постоянно прогруженном чанке. В противном случае Ваш сервер может оказаться временно недоступным. Вопрос питания и прогрузки чанка я оставляю на усмотрение владельца и расскажу о требованиях к аппаратному и программному обеспечению сервера. Сервер должен содержать беспроводную сетевую плату, а это значит, что системный блок сервера должен быть не ниже 2-го уровня. Требования к остальным компонентам самые минимальные. Если же Вы собираетесь использовать этот компьютер не только как сервер, но и создавать и просматривать на нем же свои страницы, комплектация должна быть получше. Вот, что бы я рекомендовал: - Системный блок - 3-го уровня; - Процессор 2-го уровня; - Видеокарта 2-го уровня; - беспроводная сетевая карта; - две линейки ОЗУ 2-го уровня; - жесткий диск 2-го уровня; - Lua BIOS; - монитор 2-го уровня; - клавиатура.   Установку программного обеспечения начинаем с операционной системы. Надеюсь, Вы знаете как это делается. После установки OpenOS пытаемся подключиться к сети OpenNet. Для этого заходим в интерпретатор Lua, копируем в буфер обмена следующую строку: on=component.modem;e=event;on.open(1)on.broadcast(1,"","","getip")function m()r={e.pull(10,"modem_message")}end;m()ud="update"ip=r[6]function sv()on.send(r[3],1,ud,ip,ud,"getFile","client/"..p)m()filesystem.makeDirectory(filesystem.path(p))f=io.open(p,"w")f:write(r[8])f:close()end p="lib/opennet.lua"sv()p="on/update.lua"sv()loadfile(p)("install") вставляем ее в редактор Lua кнопочкой Ins и запускаем на выполнение. В результате выполнения из Сети будут скачаны все необходимые для подключения файлы и разложены по нужным папкам. Если же чудо не произошло, скорее всего Вы находитесь вне зоны покрытия OpenNet. Обратитесь ко мне и я постараюсь помочь. Если установка прошла успешно, перегружаем компьютер и создаем папку /web mkdir webcd web В этой папке будут храниться страницы нашего будущего сайта. Почему отдельная папка а не корень? Да потому, что к ней будет осуществляться удаленный доступ, причем и на чтение и возможно на запись. И если бы это был корень диска, то каждый хакер при желании смог бы почистить на нашем сервере весь диск. Имена файлов, содержащих страницы сайта могут быть любыми, но непременно должны присутствовать два файла: "index" и "404". Файл index должен содержать главную страницу сайта, а 404 - текст, который будет возвращаться при попытке открыть несуществующую страницу. Создадим файл index, содержащий текст: Главная страница моего сайта И файл 404 с текстом: Извините, запрашиваемая страница не найдена. Для начала попытаемся открыть файл index браузером прямо с сервера: onBrowser /web/index Вот что мы должны увидеть: Поскольку мы указали путь к файлу, начинающийся с косой черты, файл будет открываться браузером не по сети, а с локального компьютера. (продолжение следует)
    • 2 комментария
    • 2 037 просмотров
  • Krutoy

    Пишу браузер-арбузер

    Автор: Krutoy

    Новости! Теперь мой браузер будет называться "Арбузер", и будет выполнен в зеленоватых тонах.
    Zer0Galaxy мне помогает, и уже набросал парсинг и поиск по самым простым селекторам в CSS. Думаю, ему для полной работы с CSS нужно будет написать еще разов в 6 больше кода.
    Готовы первые наброски самого браузера без страниц. Закладки, навигация, строка пути.
    Кстати, вы можете посмотреть эмулятор экрана компьютера из OC, который можно открыть в браузере и даже посмотреть исходный код.     Ядро написано примерно на 15% пока что. В следующий раз буду отрисовывать элементы страниц, подгружая их стили.
    • 18 комментариев
    • 3 036 просмотров
  • Quant

    Аналоговый рэдстоун-передатчик файлов

    Автор: Quant

    Аналоговый передатчик
    Файлов по рэдстоуну
    Возвращение легенды)
    Некоторые помнят мою передавалку чисел по рэдстоуну...
    Но чисел мало...
    Но теперь скорость настолько большая,что можно передавать даже файлы!
    Конструкция осталась такой,какой была и раньше:

    Зато изменились протокол передачи и программа)
    Краткая характеристика:
    Поддержка юникода +
    Скорсть передачи байта от 0,1 до 0,3 секунд

    Посмотреть код:
     
    • 9 комментариев
    • 1 711 просмотров
  • NEO

    Реализация идеи от товарища Zer0Galaxy, а именно телепортация между компьютерами.

    Автор: NEO

    Вчера уважаемый форумчанин Zer0Galaxy предложил идею как можно телепортировать между компьютерами, без необходимости находится конечному телепортеру в одной сети(Как компоненты), можете смотреть видео ниже.
    https://www.youtube.com/watch?v=e530frIKUGc
    • 13 комментариев
    • 1 854 просмотра
×