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

Робот, изучающий лабиринты

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

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

Работает предельно просто: запускаешь прогу №2 на компе, ставишь робота в лабиринт и запускаешь на нем прогу №1.

Прога №1: 

https://pastebin.com/dpTQbgtK

pastebin run dpTQbgtK

Прога №2: 

https://pastebin.com/qPsZctqh

pastebin run qPsZctqh

Требования:

Связанная карта в роботе и в компе

Принцип работы:

Рекурсивный dfs-подобный алгоритм. Робот в каждое обследованной клетке крутится по сторонам и смотрит есть ли блок перед ним. Если нет то переходит вперед и рекурсивно обследует дальше.

progress.png

result.png

 

Изменено пользователем Avevad
перенос описания

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


Ссылка на сообщение
Поделиться на других сайтах
  1.   local _, _, _, _, _, cmd = ev.pull("modem_message")
  2.   local _, _, _, _, _, cmdX = ev.pull("modem_message")
  3.   local _, _, _, _, _, cmdY = ev.pull("modem_message")
Медленно!

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


Ссылка на сообщение
Поделиться на других сайтах
7 минут назад, NEO сказал:
  1.   local _, _, _, _, _, cmd = ev.pull("modem_message")
  2.   local _, _, _, _, _, cmdX = ev.pull("modem_message")
  3.   local _, _, _, _, _, cmdY = ev.pull("modem_message")
Медленно!

А робот типа быстрый??

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


Ссылка на сообщение
Поделиться на других сайтах
10 минут назад, Avevad сказал:

А робот типа быстрый??

Конечно, тратится 3 тика на передачу данных.

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


Ссылка на сообщение
Поделиться на других сайтах
В 27.09.2018 в 18:02, NEO сказал:

Конечно, тратится 3 тика на передачу данных.

Я имею ввиду что нету смысла ускорять прогу если робот все равно медленно двигается

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

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


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

На самом деле я не знаю как распарсить строку по пробелам))

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


Ссылка на сообщение
Поделиться на других сайтах
14 минут назад, Avevad сказал:

На самом деле я не знаю как распарсить строку по пробелам))

А можно и не парсить вовсе, модемы позволяют отсылать/принимать сетевые пакеты с множеством аргументов:

-- Отправка
modem.broadcast(port, cmd, cmdX, cmdY)

-- Прием
local localAddress, remoteAddress, port, distance, cmd, cmdX, cmdY = event.pull("modem_message")

Если надо "парсить по пробелам", то уот так уот:

local message = "meow 12 -249"
for part in message:gmatch("[^%s]+") do
	print("Кусочек: ", part)
end

>> Кусочек: meow
>> Кусочек: 12
>> Кусочек: -249

 

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


Ссылка на сообщение
Поделиться на других сайтах
В 27.09.2018 в 18:26, ECS сказал:

А можно и не парсить вовсе, модемы позволяют отсылать/принимать сетевые пакеты с множеством аргументов:


-- Отправка
modem.broadcast(port, cmd, cmdX, cmdY)

-- Прием
local localAddress, remoteAddress, port, distance, cmd, cmdX, cmdY = event.pull("modem_message")

Если надо "парсить по пробелам", то уот так уот:


local message = "meow 12 -249"
for part in message:gmatch("[^%s]+") do
	print("Кусочек: ", part)
end

>> Кусочек: meow
>> Кусочек: 12
>> Кусочек: -249

 

Спасибо, понял

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

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


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

Мне бы хеловорлды писать на опенось а я уже в роботов суюсь)

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


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Avevad сказал:

Мне бы хеловорлды писать на опенось а я уже в роботов суюсь)

Это и есть твой "хелоуворлд". 😃

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


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

Скриншоты бы не помешали.. А то 

2 часа назад, Avevad сказал:

передаваться красивая картинка лабиринта.

Не совсем наглядно

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


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, Avevad сказал:

Я имею ввиду что нету смысла ускорять прогу если робот все равно медленно двигается

Нет, как бы робот не двигался медленно математика везде работает и время на передачу сегмента за 3 тика никуда не исчезает, на 100 разведанных блоков программа будет тратить 15 секунд на передачу данных с 3 сообщениями за сегмент данных и 5 секунд при 1 сообщении за сегмент из cmd cmdX cmdY

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


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

Да, именно. Любители кучу текста осиливать могут и "Войну и мир" перечитать. А на форуме если хочется обсуждения и лайков побольше, то надо к осмысленному, логически корректному и интересному тексту добавить изображений — также осмысленных, корректных в контексте и интересных.

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


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

Я посчитал по такой формуле, - 3 * 100 / 20

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


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, NEO сказал:

Нет, как бы робот не двигался медленно математика везде работает и время на передачу сегмента за 3 тика никуда не исчезает, на 100 разведанных блоков программа будет тратить 15 секунд на передачу данных с 3 сообщениями за сегмент данных и 5 секунд при 1 сообщении за сегмент из cmd cmdX cmdY

Не очень вас понял, но ускорю способом от ECS

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


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

Нормальная программа, ради такого даже майн запущу и построю лабиринт. Не хватает скриншотов, хотя-бы одного, чтобы было видно как все это добро выглядит. Добавьте развернутое описание чтобы заинтересовать. Опишите принцип работы, а то надо лезть в код чтобы понять, робот тыкается во все стены или же пробирается в центр лабиринта и геосканером получает сразу всю карту. Дальше, а где собственно рекомендации по конфигурации робота и компьютера, ладно я разбираюсь немного в этом вопросе и пойму, что за портянку с ошибками мне робот выдал, а другой посмотрит, забъет на это дело и отправит программу в утиль. Укажи что нужна связанная карта. Об кривом приеме/передаче уже сказали, но повторюсь, можно передавать сразу все данные в 1 пакете. Это и энергоэффективнее, и выглядит не так страшно. Еще совет, используйте локальные функции, так данные которые вы считаете не вырвутся за пределы функции и не нанесут никакого вреда дальнейшим расчетам. Ну и локальные функции работают в разы быстрее чем глобальные. Для обработки событий рекомендую использовать массив, так удобнее находить данные, а не сидеть высчитывать сколько надо поставить заглушек "_, _, _ ...".

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

os.sleep(2) while true do a={event.pull()} for i=1,#a do print(a[i]) end print('----------') end

--и подробный разбор программы с отступами
os.sleep(2) --пауза на 2 секунды чтобы не ловил нажатия клавиши enter
while true do --основной цикл программы. вечный
  a={event.pull()} --слушатель сигналов
  for i=1,#a do --прогон всех сигналов, что поймал слушатель
    print(a[i]) --вывод на экран этих сигналов
  end 
  print('----------') --разделитель
end

 

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


Ссылка на сообщение
Поделиться на других сайтах
12 часов назад, Asior сказал:

Ну и вот тебе в помощь небольшой скриптик,

Так вроде ж стандартная прога есть, dmesg называется, кажется.

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


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Zer0Galaxy сказал:

Так вроде ж стандартная прога есть, dmesg называется, кажется.

Именно!

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

Если себя узнали по описанию, то, как только дойдёте до опенкомпа, пропишите, ради кода, ls /bin. И поизучайте содержимое.

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


Ссылка на сообщение
Поделиться на других сайтах
27.09.2018 в 15:44, NEO сказал:
  1.   local _, _, _, _, _, cmd = ev.pull("modem_message")
  2.   local _, _, _, _, _, cmdX = ev.pull("modem_message")
  3.   local _, _, _, _, _, cmdY = ev.pull("modem_message")
Медленно!

Перезалил с поправками от ECS

Скрытый текст

 

progress.png

result.png

 

 

Изменено пользователем eu_tomat
перенос описания

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


Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, Avevad сказал:

Рекурсивны dfs-подобный алгоритм. Робот в каждое обследованной клетке крутится по сторонам и смотрит есть ли блок перед ним. Если нет то переходит вперед и рекурсивно обследует дальше.

Ну я даже незнаю, не слишком ли все сложно? Не проще было прогнать через геосканер, обработать и отрисовать? Можно было бы и не столь агрессивный интерфейс сделать, ну там выводить на экран информацию по проверке на наличие у оборудования связанной карты, информацию типа "Ожидайте, идет построение карты", можно добавить возможность сохранения карты в файлик. Короче есть куда еще улучшать свою программу.

 

8 часов назад, Fingercomp сказал:

Если себя узнали по описанию, то, как только дойдёте до опенкомпа, пропишите, ради кода, ls /bin. И поизучайте содержимое.

Лень. И да, я уже очень давно не заходил туда. Жду гайда с обзором всех программ в той директории. И еще, когда постоянно через lua идет тестирование того или иного компонента, постоянно выходить и заходить обратно в lua - как то не очень удобно, поэтому пусть люди пользуются проверенными костылями (или не пользуются и собирают свой велосипед).

P.S. Модераторы, поредактируйте данную тему, а то пока чую у автора нет возможности произвести изменение однажды написанного текста.

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


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

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

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

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

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

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

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

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

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


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