Doob 2 749 Опубликовано: 9 июля, 2015 Топорный алгоритм возвращения дрона по пингу. (как-нибудь по-красивей сделаю на gps api) В качестве примера прошивка дрона: local drone = component.proxy(component.list('drone')()) local port = 43 local modem = component.proxy(component.list('modem')()) modem.open(port) local distance = 0 local d1 = 0 local function ping() while true do e, _, _, _, d, msg=computer.pullSignal(1) if e=='modem_message' and msg == 'PING' then distance = d return true end end end local function mv(dir) d1 = distance if dir == 1 then drone.move(1, 0, 0) ping() if d1 > distance then drone.move(1, 0, 0) else drone.move(-2, 0, 0) end elseif dir == 2 then drone.move(0, 1, 0) ping() if d1 > distance then drone.move(0, 1, 0) else drone.move(0, -2, 0) end elseif dir == 3 then drone.move(0, 0, 1) ping() if d1 > distance then drone.move(0, 0, 1) else drone.move(0, 0, -2) end end end ping() while distance > 3 do for i = 1, 3 do mv(i) end end Это запускаем в интерпретаторе планшета/компьютера, с которого управляем дроном: while true do component.modem.broadcast(43, 'PING') os.sleep(0.5) end Хм.. Забыл добавить 'PONG', чтобы не приходилось alt+ctrl+c, но я привычный))Дрону нужно много пространства для маневра (примерно 4x4 блока по всему пути движения), но зато он может корректировать курс, если игрок с планшетом движется. При помощи gps api будет выглядеть опрятней и дрон будет шнырять по-прямой, без лишних движений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 9 июля, 2015 (изменено) При помощи gps api будет выглядеть опрятней и дрон будет шнырять по-прямой, без лишних движений.Если игрок неподвижен, можно и без GPS в четыре движения вернуться. А если подвижен, можно за несколько циклов по 4 движения приближаться, тоже быстрее получится, чем по одному шагу случайных метаний. Изменено 9 июля, 2015 пользователем eu_tomat Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob Автор темы 2 749 Опубликовано: 11 июля, 2015 Если игрок неподвижен, можно и без GPS в четыре движения вернуться. А если подвижен, можно за несколько циклов по 4 движения приближаться, тоже быстрее получится, чем по одному шагу случайных метаний. Интересно... Триангуляция? Я пробовал - дрон делает круг, находит примерный вектор и летит к источнику сигнала... и промахивается даже при неподвижном источнике. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 11 июля, 2015 Интересно... Триангуляция? Я пробовал - дрон делает круг, находит примерный вектор и летит к источнику сигнала... и промахивается даже при неподвижном источнике. Конечно, триангуляция. Со времен станций GPS на ComputerCraft ничего не изменилось. Разница только в том, что тогда у нас стояли четыре неподвижных компьютера, а черепашка, определив расстояние до них, могла вычислить свои координаты. А сейчас дрон, слегка изменяя свои координаты и определяя в этих точках расстояние до неподвижного источника сигнала, точно так же способен вычислить свои координаты. Не буду приводить всю систему уравнений, она слишком легко выводится. Рассмотрим на примере одной из координат. Например, есть у нас начальная точка с неизвестными координатами x,y,z, и известным расстоянием r0 до источника сигнала Теперь смещаем дрона на +1 по оси x и по радиосигналу определяем новое расстояние. Назовем его rx. Этого достаточно, чтобы с некоторой точностью определить координату x. Я не знаю, в каком формате модем получает расстояние, и сейчас проверять не буду, т. к. мой текущий компьютер не тянет игру в сигнле, а на сервере у меня дрона нет. Короче говоря, если расстояние определяется как целое число или округленное до некоторого числа знаков, потребуется смещение не на единицу, а на большее значение, но тоже не сильно большое, тут надо подробнее считать. И проще сначала экспериментально проверить точность. Почему твой дрон промахивается? Либо играет роль предыдущий пункт, либо с уравнениями что-то не то. Попробуем решить наши уравнения: r0^2 = x^2+y^2+z^2 rx^2 = (x+1)^2+y^2+z^2 Раскрываем скобки во втором: rx^2 = x^2+2x+1+y^2+z^2 И переписываем его так, чтобы было похоже не первое: r0^2 = x^2+y^2+z^2 rx^2 = x^2+y^2+z^2 + 2x+1 Далее выносим (x^2+y^2+z^2) по одну сторону знака равенства. x^2+y^2+z^2 = r0^2 x^2+y^2+z^2 = rx^2 - 2x-1 Получаем новое уравнение: r0^2 = rx^2 - 2x-1 И тут становится несложно вывести, что x = (rx^2 - r0^2 - 1) / 2 При этом следует помнить, что мы вычислили координату в начальной точке. А сейчас мы находимся в (x+1,y,z). Оставшиеся две координаты вычисляются аналогично, тут главное аккуратно посчитать все суммарные перемещения, которые мы выполнили для замера сигнала, иначе заблудимся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob Автор темы 2 749 Опубликовано: 11 июля, 2015 Это трилатерация, т.е. GPS API, а я использовал триангуляцию - брал угол из xz, брал угол из zy и переводил в расстояние, затем определял среднее арифметическое расстояния. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 11 июля, 2015 Ты прав, это трилатерация, т. к. изначально с помощью модема мы измеряем расстояние до источника, а не углы. Но обрати внимание на разницу в наших подходах: Я не владею геодезической терминологией, но помню школьную тригонометрию. Составляю простые уравнения и за минимальное количество перемещений нахожу координаты источника. А про различия триангуляции и трилатерации я узнал только сейчас. Ты же хорошо отличаешь триангуляцию от трилатерации, но почему-то все равно выбираешь метод, который приводит тебя к неверному решению. Я уверен, что дело не в методе, т. к. на плоскости все они сводятся к несложной тригонометрии, и результат будет одинаков. Но выбрав неправильный метод, ты сам себя запутываешь, сначала вычисляя из расстояний углы, а затем снова переводя их в расстояния. Не проще ли было бы пойти от задачи, а не от метода? Я, наверное, буду повторять это часто: 1) Усложнение решения без необходимости приводит к снижению его эффективности и затрудняет его восприятие. 2) При решении инженерных задач наиболее эффективен проблемно ориентированный подход. Попытка прикрутить к решению задачи любимый тобою, или случайно выбранный метод приводит к костылевелосипедостроению в худщих его проявлениях. Пишу это здесь не только для тебя, т.к. форум изобилует подобными решениями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob Автор темы 2 749 Опубликовано: 11 июля, 2015 Угу, только своими кривыми руками я GPS портировать не мог, а что есть уже готовое решение не знал, поэтому использовал то, что мне понятней. На бумаге мне легче начертить пару треугольников, чем сфер, решал задачу на бумаге, на реальных примерах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 11 июля, 2015 А что за готовое решение? Я тоже не знал. И GPS я не пытался портировать, и код его никогда не видел. Как увидел твою тему, сразу она мне понравилась, и я тоже взял карандаш и тетрадь, написал изначальные уравнения и получил простые формулы для нахождения координат. Ты хотя бы сначала на бумаге рисуешь. Это гораздо лучше бездумного спонтанного кодинга. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob Автор темы 2 749 Опубликовано: 11 июля, 2015 А что за готовое решение? oppm install libgps Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах