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

Лидеры


Популярный контент

Показан контент с высокой репутацией 04.10.2019 в Сообщения

  1. 2 балла
  2. 1 балл
    GPS это куча оборудования, трата энергии и времени, но иногда может понадобится там, где нет встроенного акселерометра, как у робота. Попробуем разобраться, как настроить и построить сеть спутников, по которым можно вычислить свои координаты. Где-то была готовая программа, но я ее не нашел, поэтому восстановил основной функционал, по примеру КомпутерКрафта. Для начала нужен компьютер с установленной OpenOS. Скачиваем для него программатор хостов: pastebin get ZD8GysNP /bin/fgps.lua Эта программа позволяет устанавливать прошивку для спутников-микроконтроллеров, которые будут рассылать свои координаты по запросу. Далее, соберем несколько микроконтроллеров с беспроводными картами, при необходимости обеспечим их энергией. Теперь надо установить прошивку для первой партии: узнаем координаты, где будет стоять очередной хост вставляем EEPROM в компьютер запускаем программатор, с указанием координат через пробел (например: fgps 1652 64 -152) Прошитые карточки вставляем в микроконтроллеры (в сетке крафта) и расставляем в соответствии с координатами, указанными при прошивке. Самое главное - не перепутать координаты. Если навести курсор на микроконтроллер и зажать LSHIFT, то будет виден лейбл биоса, который является подсказкой для его позиции. Когда первая партия размещена и активированна, остальные хосты можно прошивать без указания координат - они определят позицию сразу при включении (если они будут в радиусе действия четырех рабочих хостов) Но лучше, конечно, чтобы каждый хост знал свои точные координаты. Ибо в случае небольшой ошибки в начале постройки, по мере расширения сети, погрешность будет увеличиваться, т. к. поправка будет производится по неверно вычисленным координатам хостов. Теперь проверим работу системы в деле. Возьмем, например, планшет с беспроводным модемом. Скачаем библиотеку GPS: pastebin get Dja9ZceV /lib/gps.lua Запустим консоль Lua. Загрузим библиотеку: local gps = require('gps') И попробуем получить координаты: gps.locate(true) (параметр DEBUG передаваемый в функцию работает как и в ComputerCraft - выводит все вспомогательные сообщения) Каждый хост, при старте устанавливает wake-up сообщение и включается только чтобы ответить на запрос координат. Такой подход экономит огромное количество энергии и позволяет добиться полной автономности хостов - встроенной солнечной панели вполне хватает для работы. Для стабильной работы надо будет добавить data-карту и реализовать протокол управления спутниками по прошитому открытому ключу, чтобы удобно было прошивать новые координаты при перемещении хоста на новое место.
  3. 1 балл
    В ожидании атомика, играю на одном проекте. Попутно развиваясь, обнаружил на сервере команду /screen Она скриншотит экран игрока, только не очень понятно, какой экран. Это мод, так как не раз встречал такое на других проектах. И тем не менее, есть вопрос: можно ли с помощью мода получить доступ к экрану игрока? Или это моя паранойя? Извиняюсь за упоминания @NEO @vx13
  4. 1 балл
    Насколько я помню, сам lightlevel=15 невозможен на стандартной детальке. Её нужно "заправить" светопылью(пкм по 3д-модельке)
  5. 1 балл
    Тут еще надо разобраться как считать. У реакторов, для теплового и энергетического баланса, подходит алгоритм решения задачи на взвешивание. Берем параметры тепловыделения. Кол-во соседей: | 0 | 1 | 2 | 3 | 4 | Кол-во стержней Выделение тепла 1 | 4 | 12 | 24 | 40 | 60 | 2 | 24 | 48 | 80 | 120 | 168 | 4 | 96 | 160 | 240 | 336 | 448 | Для самой эффективной сборки, придется задействовать отражатели. Берем температуру, которую хотим получить, делим без остатка на максимально возможную температуру. 10000 // 448 = 22 Получается, надо установить 22 счетверенных стержня, с полным переотражением нейтронов. Затем, берем остаток 10000 - ( 448 * 22 ) = 144 Самое близкое - 120, т. е. сдвоенный стержень с тремя соседями. Отнимаем, берем остаток. 144 - 120 = 24 По табличке это одиночный стержень с двумя соседями. Итого, 22 счетверенных, 1 двойной, 1 одиночный, 17 отражателей по периметру, закрывающих счетверенные стержни. Плюс 1 одиночный и вентилятор на -5 тепла, что в сумме дает -1 Получаем 9999 тепла в секунду. erp=C51pU0VBeaadQHbSd2GEnexptw7t2Uh9ghEHVD+NQuzZ2sNYgiMnA/XS+q2UJSwB
  6. 1 балл
    Кажется, решил проблему: в конфиге мода был черный список адресов
  7. 1 балл
    Всем приветы. Программа-редактор для создания моделей 3dm на платформе андроид. Принцип как в редакторе МайнОСа, но с учетом невозможность использования ПКМ и колеса прокрутки. Скачать можно по этой ссылке: https://github.com/alexexe82/3dEditor/raw/master/MineCRED3d.apk В дальнейшем планирую расположить там же руководство по использованию, пока пробуйте разобраться сами) Можно спрашивать всякие вопросы, подскажу. Несколько скринов с интерфейсом.
  8. 1 балл
    Немного переработал, починил один баг с микроконтроллерами (оказывается, у них по wake-up надо грузить прокси через assert, сильное колдунство) Добавил поддержку debug-card. Записал видосик с примером настройки. wget https://raw.githubusercontent.com/DOOBW/OC-GPS/master/usr/bin/gps.lua /bin/gps.lua && wget https://raw.githubusercontent.com/DOOBW/OC-GPS/master/usr/lib/gps.lua /lib/gps.lua
  9. 1 балл
    Как пользоваться функцией scan? Итак, в этой функции можно задать два параметра, это относительные координаты по горизонтали (относительно блока геосканера/планшета или робота с геосканером), возвращаемое значение - таблица. Таблица содержит список плотностей блоков по вертикали. Чем дальше по вертикали находится блок (относительно геосканера), тем больше помех дает геосканер. Уровень помех можно настроить в конфиге мода. Ну тут вроде-как все понятно, разберемся с вертикальными координатами. При сканировании, геосканер возвращает таблицу, которая представляет собой столб из блоков. Кроме плотности ничего узнать нельзя. Возьмем, к примеру, scan(0, 0) это будет столб, выстой 64 блока, в котором находится устройство (геосканер/робот/планшет) В стандартнои конфиге радиус действия геосканера = 32 блока, следовательно можно просканировать кубоид 65x65x64 блока. Геосканер у нас находится на уровне 33 (индекс таблицы), на этом уровне при сканировании устройстрво почти не дает шумов, т. е. по горизонтали можно легко узнать истинную плотность блока. Индексы в таблице возрастают с высотой, т. е. блок с индексом 1 это -32 блок относительно устройства, 2 это -31 ... 33 это 0 и т. д. Теперь разберемся с горизонтальными координатами. Горизонтальные координаты хоть и относительные, но они не зависят от положения устройства в пространстве, т. е. отсчет идет по сторонам света. scan(1, 0) это столб на один блок на восток от устройства, следовательно, scan(-1, 0) - на запад. scan(0, 1) это южный столб, scan(0, -1) - северный. Для примера возьмем двойной цикл, который будет сканировать столбы и заносить их в таблицу. local tbl = {} for x = -32, 32 do for y = -32, 32 do if not tbl[x] then tbl[x] = {} end tbl[x][y] = geolyzer.scan(x, y) end end Он у нас будет сканировать с северо-запада на юго-восток, т. е. будет захватывать всю доступную зону. К примеру, нам надо сканировать определенный квадрат, стоящий по-диагонали от геосканера, обозначим их вот так: NE - северо-восточный, NW - северо-западный, SE - юго-восточный, SW - юго-западный. local function scan(d, r) -- направление, дальность if d == 'NE' then x1, x2, y1, y2 = 1, r, -r, -1 elseif d == 'NW' then x1, x2, y1, y2 = -r, -1, -r, -1 elseif d == 'SE' then x1, x2, y1, y2 = 1, r, 1, r elseif d == 'SW' then x1, x2, y1, y2 = -r, -1, 1, r end for x = x1, x2 do for y = y1, y2 do geolyzer.scan(x, y) -- тут должна быть фунция обработки или сохранения результатов сканирования end end end Чтобы просканировать квадрат со стороной 20 блоков, находящийся на юго-восток от геосканера надо запустить scan('SE', 20) Вроде-бы все очевидно. Функция analyze() намного проще, она возвращает таблицу с информацией о блоке, стоящем вплотную к устройству. Индексы таблицы не числовые, например, чтобы узнать плотность блока вводим analyze(сторона).hardness Чтобы задать сторону можно использовать sides API, либо просто задать цифрой. ...Будет дополняться...
  10. 1 балл
    Недавно столкнулся с тем, что апгрейд навигации, предоставляемый модом, достаточно убог, при этом он занимает компонент-слот и относительно затратен для крафта. Был удивлен тем, что еще никто не запилил систему геопозиционирования (gps), собственно, написал ее сам. Заранее скажу, что, очевидно, ее можно улучшить, в том числе перенести работу контроллера на один из реле, но первая попытка по написанию системы, состоящей лишь из микроконтроллеров, была неудачной, возможно, из-за малого уровня компонентов, которые вмещают микроконтроллеры, но скорее всего из-за того, что я криво что-то написал (вполне вероятно, если учесть отсутствие вывода ошибок и нормального дебага). Вполне вероятно, что текущую версию можно перенести на контроллер (с минимальными модификациями для избавления от необходимости в операционной системе), и все заработает, но мне это не нужно и лень. Использование клиентом: Требуется беспроводная плата. Клиент(то, что хочет получить свои координаты через gps) броадкастит одно сообщение с содержанием "gps_request" на порт 312 (можно поменять, менять надо в коде реле), через некоторое время, если сообщение достигло всех 4 реле, он получает в ответ сообщение на порт 312 (опять же, можно поменять, на этот раз в коде контроллера), содержание сообщения: строка "gps_response", число x, число y, число z; где x,y,z - координаты клиента, x и y по горизонтали, z - высота. Использование сервером: Сервер состоит из компьютера-контроллера с установленной OpenOS и четырех микроконтроллеров, которые я буду называть (и уже называл) "реле". Реле должны иметь беспроводную и сетевую платы, а также процессор и память (я грузил 2 планки 1 уровня, но даже одной должно хватить). Помимо этого в них должен быть биос с программой(2 ссылка), соответствующей определенному реле. Программа должна быть отредактирована под соответствующее реле (4 переменных в начале, координаты, где (по крайней мере в моей системе) y полагается горизонтальной осью, и идентификационная строка реле, которая должна быть уникальна для конкретной системы (иначе не будет работать)). Предпочтительно на каждом реле по разу запустить wakesetter (программа, третья ссылка). Каждый реле должен быть подсоединен к компьютеру-контроллеру кабелем, помимо этого все 4 реле должны быть некомпланарны (расположены так, чтобы нельзя было провести одну плоскость через все 4 реле) . Компьютер-контроллер должен иметь помимо базовых составляющих, необходимых для работы, беспроводную и сетевую платы. Для запуска системы нужно лишь запустить программу gps_controller (1 ссылка), которая разбудит реле в сети с ней и начнет выполнять свою функцию. Программа является блокирующей, т.е. не позволяет пользоваться компьютером, на котором установлена, пока сама работает. Программа будет выводить print'ом пойманные сигналы от реле, выводить им же координаты, когда сигналов достаточно (когда все 4 реле поймали запрос); уведомлять о таймауте зафейлившихся запросов (когда запрос достиг не всех реле, программа выжидает 2 секунды, чтобы удостовериться в том, что сигналов от остальных реле на его счет она не получит, и удаляет его из таблицы обработки). Ну и, естественно, отвечать на запросы координат. Принцип работы: Когда реле получает запрос от клиента, оно передает свои координаты, идентификатор и расстояние до клиента контроллеру. Контроллер, набрав 4 таких различных (от реле с разными идентификаторами) запроса, вычисляет координаты клиента и отсылает их ему. Подробнее о вычислении: известны 4 точки и расстояние от пятой точки до каждой из них. Тогда мы можем построить по сфере на каждой точке с радиусом, соответствующим расстоянию до пятой, причем эти 4 сферы пересекутся, и пересекутся только в этой точке. Пересечение очевидно, ибо все они проходят через эту точку. Единственность пересечения гарантируется некомпланарностью центров(в трехмерном пространстве), доказывать ее мне лень, примите как факт. Запишем гмт пересечения сфер системой уравнений (каждое вида (X-xi)^2+(Y-yi)^2+(Z-zi)^2 = Ri^2, где Ri - i-тое расстояние, xi,yi,zi - координаты i-той точки, X,Y, Z - координаты искомой(-ых) точки(-ек)), получим 4 уравнения в системе, вычтем из первого, из второго третье, из третьего четвертое, получим систему линейных уравнений на 3 уравнения, при условии некомпланарности точек и верных входных данных она совместна и имеет единственное решение, находим его через метод Крамера. Задача решена. Код: контроллер: http://pastebin.com/QD44ZWBv реле: http://pastebin.com/eAzPst2s прога, которую желательно по разу запустить (записать на биос чип, вставить в микроконтроллер и включить его) на каждом из реле, она позволяет контроллеру их включать через сообщение на модем ("gps awake"): http://pastebin.com/XijvUbB9 Скрины: Как может выглядеть сервер: Скрин того, что он выводит во время работы: Скрин клиента (планшет) с простым кодом для проверки: Следует заметить, что планшет на самом деле на блок выше, чем координата игрока, также следует еще раз для себя заметить, что координаты идут в порядке плоскость-высота, а не как в майне. Сверху код проверщика, чуть ниже зафейленная попытка, ибо сервер gps был вырублен, чуть ниже успешная попытка уже при включенном серве.
  11. 1 балл
    После обновы OC 1.6 расширился функционал геосканера. Теперь, помимо обычного сканирования вертикальных столбов появилась возможность сканировать произвольный кубоид, содержащий не более 64х блоков (т. к. функция в любом случае возвращает таблицу из 64х элементов) scan(x, z[, y, w, d, h][, игнорировать_замещаемые]) Если задать только x, z, то геосканер будет работать в обычном режиме. А при добавлении y, необходимо указать ширину, длину и высоту кубоида, соответственно: w, d, h. Т. е. первые три значения это стартовые координаты, откуда начинать сканирование, а дальше его размеры. Четвертое значение это указатель, приравнивать ли замещаемые блоки (трава, саженцы и т. д.) к воздуху. Возвращаемые значения приходят в не очень удобном формате. Чтобы отобразить отсканированный объем в одномерной таблице, сканирование происходит в виде трех циклов, один в другом: for x(for z(for y())) Т. е. сначала идет заполнение по x, потом по z, потом по y. (Запад->Восток, Север->Юг, Низ->Верх) К примеру, надо просканировать куб x2, где какой блок будет отображен в таблице? Зададим область сканирования: scan(0, 0, 0, 2, 2, 2) - точкой старта будет блок геосканера, точка финиша в относительных координатах 1, 1, 1 Сначала у нас идет x, следовательно, первый элемент таблицы - плотность самого геосканера (0, 0, 0), второй элемент - блок на восток от сканера (1, 0, 0). Далее у нас идет второй блок по z, следовательно это южный блок (0, 1, 0), затем - юго-восток (1, 1, 0). Второй блок по оси y - (0, 0, 1) и т. д. Следовательно, таблица у нас будет выглядеть так: [1] = 0, 0, 0 [2] = 1, 0, 0 [3] = 0, 1, 0 [4] = 1, 1, 0 [5] = 0, 0, 1 [6] = 1, 0, 1 [7] = 0, 1, 1 [8] = 1, 1, 1 Остальные элементы можно отбросить, т. к. это шум. В голове это держать может быть неудобно. Поэтому, напишем функцию, через которую можно будет задать кубоид и координаты блока, а она выдаст позицию в таблице, где указана плотность этого блока. local function tblpos(x, z, y, w, d, h, tx, tz, ty) -- первые 6 значений это то, что мы задаем геосканеру, tx, ty, tz = координаты искомго блока local p = 1 -- создаем счетчик local xmax, zmax, ymax = x + w - 1, z + d - 1, y + h - 1 -- преобразуем размеры кубоида в финишные координаты for y1 = y, ymax do for z1 = z, zmax do for x1 = x, xmax do if x1 == tx and z1 == tz and y1 == ty then -- если счетчик допрыгал до искомых координат return p -- возвращаем позицию end p = p + 1 end end end end Например, зададим тот же кубоид и узнаем позицию блока, с координатами 1, 1, 1 pos = tblpos(0, 0, 0, 2, 2, 2, 1, 1, 1) pos станет равно 8 Чтобы проверить плотность этого блока, обратимся к таблице print(geolyzer.scan(0, 0, 0, 2, 2, 2)[pos]) Либо, более наглядно - print(geolyzer.scan(0, 0, 0, 2, 2, 2)[tblpos(0, 0, 0, 2, 2, 2, 1, 1, 1)]) Но, городить целую функцию для проверки блока это бред, эту функцию надо применять для обработки полученной таблицы, т. к. при каждом сканировании происходит задержка, лучше сканировать больший объем и затем, обрабатывать, используя такую функцию. Чтобы узнать плотность блока в определенных координатах, достаточно сделать так: scan(x, z, y, 1, 1, 1)[1] Т. е. задаем координаты блока, указываем размер кубоида 1x1x1 блок и сразу обращаемся к первому элементу таблицы. Стоит помнить, что при одном сканировании доступно только 64 блока, т. е. можно просканировать куб x4, либо квадрат x8, думаю, это понятно. Вот примеры: scan(-32, -32, -32, 4, 4, 4) scan(5, 5, 5, 1, 8, 8) scan(-32, 0, 0, 64, 1, 1)
  12. 1 балл
    Не уверен, что я открыл Нептун, но наверняка многие не в курсе что навигатор в ОС не ограничивается размером скрафченной карты 128 на 128 блоков относительно ее сеточной привязки и рендера. Этот вопрос только недавно вроде муссировался на форуме, что мол гемОрно перекрафчивать навигатор, если робот выходит в другую зону и прочее, нельзя ли сделать как-то побольше out of range и т.п. Я, если честно, сам не знал, хотя думал, что ваниль всю знаю. Крафтите и рендерите карту, потом кладете ее в крафтерный столик по центру и обкладываете ее 8-ю кусочками бумаги. Вуаля. Карта стала меньшего масштаба и уже имеет размер 256 на 256 Вот вырезка из Советской энциклопедии: Максимальный размер карты - 2048 на 2048. Роботу такой территории хватит на всю жизнь, там работать кататься и прочее. Не нужно теперь пересчитывать коры свои без конца типа robot.forward() x_current=x_current + 1 и прочая лабудень. Координаты относительные (центр скрафченой карты), но можете их перепривязать поправочкой стандартной один раз на реальные (высота реальная в навигаторе выдается). Так же робот гетит свое направление мордофейса. Но тоже в своих координатах API sides: Север: north - 2 Восток: east - 5 Юг: south - 3 Запад: west - 4 Вот набросал пример использования: -- ============= Получение реальных кор роботом в майне ================= local com = require('component') local nav = com.navigation -- преобразование направления в ванила-директы 1-запад, 2-север, 3-восток, 0-юг face_normalize = {0,2,0,1,3,0} --поправка на реальные координаты майна, для каждой карты (навигатора) они свои!!! --чтобы их узнать, установите их сначала в 0 и сравните реальные координаты робота, как блока по F3 с относительными. local x_shift = 1536 local z_shift = 1920 -- пример получения роботом своих реальных координат в мире!!!!! (в пределах навигатора и масштаба карты) getPos = { x = function() x,_,_,_ = nav.getPosition() if x then return math.floor(x) + x_shift else return nil end end, y = function() _,y,_,_ = nav.getPosition() if y then return math.floor(y) else return nil end end, z = function() _,_,z,_ = nav.getPosition() if z then return math.floor(z) + z_shift else return nil end end, f = function() f = face_normalize[nav.getFacing()] return f end } x_real = getPos.x() y_real = getPos.y() z_real = getPos.z() f_real = getPos.f() Выход: 1234 56 1236 0 Теперь с картой 2048 на 2048 ваш робот, по идее, может получить всегда свои реальные координаты, где бы он там не летал. Не нужно, как в древних черепашках, там считать свои коры, плюсовать что-то и писать в файл. Получил реальные, получил таргет-коры, разницу выполнил бросок, и все, вперед, поехал на них по вашей функции, например: setPos(x_target,y_target,z_target,f_target)
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...