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

Программная навигация для робота

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

Иногда надо получить относительные или абсолютные координаты робота или узнать путь, по которому он прошел, чтобы вернуть робота назад.
Я немного модифицировал стандартную библиотеку робота, теперь можно задавать/удалять/просматривать координаты робота. Нет функции сохранения координат в файл, поэтому после перезагрузки координаты сбросятся, поэтому это делать надо самостоятельно. Так же, нафигация не работает, если управлять роботом, как компонентом (т.е. в обход robot API)
 

скачать: pastebin get -f Hb32aQeR /lib/robot.lua

 
Список новых функций:
robot.getPos() - возвращает текущие координаты, если не заданы, то при первой загрузке библиотеки устанавливаются x, y, z = 0, 0, 0, а направление - север.
robot.setPos(x, y, z, side) - устанавливает заданные координаты, side задается в формате N/E/S/W (стороны света)
robot.getPath() - возвращает пройденный путь в виде строки, каждому движению соответсвует одна буква - [F]orward, [В]ack, p, [D]own, [L]eft, [R]ight. (например 'FFFULFFD' - три вперед, один вверх, один влево, два вперед, один вниз)
robot.setPath(boolean) - активация/деактивация записи маршрута, соответственно true/false

 

Можно было бы сделать в стиле navigation API с использованием sides API, но это не особо удобно.
 
Триггер записи маршрута по-умолчаию отключен, для экономии памяти, ибо каждое движение съедает один байт, по-уму надо прикрутить автоматическое сжатие.
 
Чтобы пройти по пройденному маршруту обратно, надо в начале активировать robot.setPath(true), а в конце запустить примерно такую программку:

 

local robot = require('robot')

local path = robot.getPath()

local invert = {
  ['F'] = 'back',
  ['B'] = 'forward',
  ['L'] = 'right',
  ['R'] = 'left',
  ['U'] = 'down',
  ['D'] = 'up'
}

for i = #path, 1, -1 do
  os.execute('go '..invert[string.sub(path, i, i)])
end

 


Полезно для полностью автономных программ.
Очень удобно вытаскивать робота-грифера из чужих приватов.

Утилита, через которую можно проверить и задать координаты: 
pastebin get nJ5i4qiL /bin/pos.lua
 
Программа движения сквозь блоки:
pastebin get X5G4PHnS /bin/goto.lua
Роботу необходим инструмент для разрушения блоков, для запуска надо указать координаты.

Изменено пользователем Doob

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


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

Хороший подход ,если нету навигационных точек, надеюсь, с открытием лайта администрация поможет расставить пару таких для моей навигации)

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


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

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

local robot = require('robot')

robot.setPath(true)

--ваш код

local path = robot.getPath()
 
local invert = {
  ['F'] = 'forward',
  ['B'] = 'back',
  ['L'] = 'right',
  ['R'] = 'left',
  ['U'] = 'down',
  ['D'] = 'up'
}

robot.turnAround()

for i = #path, 1, -1 do
	robot.swing(3)
  os.execute('go '..invert[string.sub(path, i, i)])
end

robot.turnAround()
Изменено пользователем HeroBrine1st

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


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

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

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

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

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

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

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

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

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


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