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

Свисток для дрона

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

Топорный алгоритм возвращения дрона по пингу. (как-нибудь по-красивей сделаю на 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 будет выглядеть опрятней и дрон будет шнырять по-прямой, без лишних движений.

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


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

При помощи gps api будет выглядеть опрятней и дрон будет шнырять по-прямой, без лишних движений.

Если игрок неподвижен, можно и без GPS в четыре движения вернуться. А если подвижен, можно за несколько циклов по 4 движения приближаться, тоже быстрее получится, чем по одному шагу случайных метаний. Изменено пользователем eu_tomat

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


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

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

 

Интересно... Триангуляция? Я пробовал - дрон делает круг, находит примерный вектор и летит к источнику сигнала... и промахивается даже при неподвижном источнике.

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


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

Интересно... Триангуляция? Я пробовал - дрон делает круг, находит примерный вектор и летит к источнику сигнала... и промахивается даже при неподвижном источнике.

Конечно, триангуляция. Со времен станций 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). Оставшиеся две координаты вычисляются аналогично, тут главное аккуратно посчитать все суммарные перемещения, которые мы выполнили для замера сигнала, иначе заблудимся.

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


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

Это трилатерация, т.е. GPS API, а я использовал триангуляцию - брал угол из xz, брал угол из zy и переводил в расстояние, затем определял среднее арифметическое расстояния.

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


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

Ты прав, это трилатерация, т. к. изначально с помощью модема мы измеряем расстояние до источника, а не углы. Но обрати внимание на разницу в наших подходах:

 

Я не владею геодезической терминологией, но помню школьную тригонометрию. Составляю простые уравнения и за минимальное количество перемещений нахожу координаты источника. А про различия триангуляции и трилатерации я узнал только сейчас.

 

Ты же хорошо отличаешь триангуляцию от трилатерации, но почему-то все равно выбираешь метод, который приводит тебя к неверному решению. Я уверен, что дело не в методе, т. к. на плоскости все они сводятся к несложной тригонометрии, и результат будет одинаков. Но выбрав неправильный метод, ты сам себя запутываешь, сначала вычисляя из расстояний углы, а затем снова переводя их в расстояния.

 

Не проще ли было бы пойти от задачи, а не от метода?

 

Я, наверное, буду повторять это часто:

1) Усложнение решения без необходимости приводит к снижению его эффективности и затрудняет его восприятие.

2) При решении инженерных задач наиболее эффективен проблемно ориентированный подход.

 

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

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


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

Угу, только своими кривыми руками я GPS портировать не мог, а что есть уже готовое решение не знал, поэтому использовал то, что мне понятней. На бумаге мне легче начертить пару треугольников, чем сфер, решал задачу на бумаге, на реальных примерах.

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


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

А что за готовое решение? Я тоже не знал. И GPS я не пытался портировать, и код его никогда не видел. Как увидел твою тему, сразу она мне понравилась, и я тоже взял карандаш и тетрадь, написал изначальные уравнения и получил простые формулы для нахождения координат.

 

Ты хотя бы сначала на бумаге рисуешь. Это гораздо лучше бездумного спонтанного кодинга.

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


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

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

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

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

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

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

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

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

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


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