2013-09-23 5 views
1

Скажем, у меня есть один или несколько черепах роботов, каждый с левым и правым колесами, кодер на левом и правом колесах. Колеса могут иметь двигатель с ПИД-регулированием. В системе, такой как ROS, можно получить доступ к системам и подсистемам через иерархическую систему именования: ie/turtle_1/lwheel/pid/kp, чтобы установить параметр Kp для ПИД-регулятора левого колеса или/turtle_3/lwheel/encoder для извлечения считывание кодера колеса. Черепахи будут узлами в локальной сети.Иерархия процессов и регистрация имен

Поскольку Erlang имеет пространство имен для регистрации процессов, как реализовать такой иерархический вид? Я предполагаю, что для каждого уровня в иерархии можно было зарегистрировать процесс, так как его имя - полное имя подсистемы, как в (/ turtle_1 для верхнего процесса,/turtle_1/lwheel для процесса, который управляет колесами,/turtle_1/lwheel_1/PID и т.д. есть некоторые лучшие практики для поддержания иерархического представления, используя глобальный модуль?

ответ

3

Самый простой способ решить эту проблему, чтобы ввести процесс маршрутизации или карту маршрутизации, которая может связать иерархии к Pid. у вас есть несколько вариантов:

  • gproc предоставляет таблицы реестра на основе хорошо ETS
  • Процесс, реализующий иерархию с возможной переадресацией по локальной сети
  • Глобальный - в качестве имени используются произвольные термины, поэтому можно было бы зарегистрировать кортеж в пространстве имен, который будет означать наличие дерева-упорядоченного пространства имен.
  • Процесс, обновляющий таблицу ETS, поэтому само решение о маршрутизации находится в отправителе сообщения.

Что лучше всего зависит от вашей потребности в консенсусе в распределенной настройке и/или от скорости, необходимой для поиска маршрута. Кроме того, по-прежнему или не можете кэшировать поиски маршрутизации.

+0

Вы предпочитаете кэшировать поиск pid при использовании gproc или fecth pid для каждого вызова gen_xxxx? – niahoo

+0

Я редко их кеширую. Обычно поиск занимает несколько микросекунд. Есть так много других вещей, которые будут иметь гораздо более высокую цену в настройке. –

+0

Спасибо. Я тоже это делаю, модуль API экспортирует функции, которые передают идентификатор, и каждая функция ищет Pid, ​​поэтому передайте gen_server: call или другие «gen calls»; но я не знал, было ли все в порядке. Кажется, что :) – niahoo

Смежные вопросы