Сеть ROS состоит из одного ведущего устройства ROS и нескольких узлов ROS. Ведущее устройство ROS упрощает коммуникацию в сети ROS путем отслеживания все активные сущности ROS. Каждый узел должен указать с ведущим устройством ROS, чтобы смочь связаться с остальной частью сети. MATLAB® может запустить ведущее устройство ROS, или ведущее устройство может быть запущено за пределами MATLAB (например, на различном компьютере). Все узлы ROS указывают с ведущим устройством и объявляют сетевой адрес, где они могут быть достигнуты.
Когда вы будете работать с ROS, вы будете обычно выполнять эти шаги:
Соединитесь с сетью ROS. Чтобы соединиться с сетью ROS, можно создать ведущее устройство ROS в MATLAB или соединиться с существующим ведущим устройством ROS. В обоих случаях MATLAB также создаст и укажет свой собственный узел ROS (названный MATLAB "глобальный узел") с ведущим устройством. Функция
rosinit
справляется с этим процессом.
Обменивайтесь Данными. После того, как соединенный, MATLAB обменивается данными с другими узлами ROS через издателей, подписчиков и сервисы.
Отключитесь от сети ROS. Вызов функции
rosshutdown
отключает MATLAB от сети ROS.
Этот пример показывает вам как:
Создайте ведущее устройство ROS в MATLAB
Соединитесь с внешним ведущим устройством ROS
Предпосылки: Запуск с ROS
Чтобы создать ведущее устройство ROS в MATLAB, вызовите rosinit
без любых аргументов. Это также создаст "глобальный узел", который MATLAB будет использовать, чтобы связаться с другими узлами в сети ROS.
rosinit
Initializing ROS master on http://bat6230glnxa64:45251/. Initializing global node /matlab_global_node_56181 with NodeURI http://bat6230glnxa64:40419/
Узлы ROS, которые являются внешними к MATLAB, могут теперь соединить сеть ROS. Они могут соединиться с ведущим устройством ROS в MATLAB при помощи имени узла или IP-адреса хоста - компьютера MATLAB.
Можно закрыть ведущее устройство ROS и глобальный узел путем вызова rosshutdown
.
rosshutdown
Shutting down global node /matlab_global_node_56181 with NodeURI http://bat6230glnxa64:40419/ Shutting down ROS master on http://bat6230glnxa64:45251/.
Можно также использовать rosinit
команду, чтобы соединиться с внешним ведущим устройством ROS (например, работа робота или виртуальной машины). Можно задать адрес ведущего устройства двумя способами: IP-адресом или именем хоста компьютера, который запускает ведущее устройство.
После каждого вызова rosinit
необходимо вызвать rosshutdown
прежде, чем вызвать rosinit
с различным синтаксисом. Для краткости эти вызовы rosshutdown
не использованы в следующих разделах.
В этом примере используйте master_host
в качестве имени хоста в качестве примера и 192.168.1.1
как IP-адрес в качестве примера внешнего ведущего устройства ROS. Настройте эти адреса в зависимости от того, где внешнее ведущее устройство находится в вашей сети. Обратите внимание на то, что следующие команды перестанут работать, если никакое ведущее устройство не будет найдено в заданных адресах.
rosinit('192.168.1.1') rosinit('master_host')
Оба вызова rosinit
принимают, что ведущее устройство примет сетевые подключения на порте 11311, который является стандартным ведущим портом ROS.
Если ведущее устройство работает на различном порте, можно задать его в качестве второго аргумента. Чтобы соединить с ведущим устройством ROS, работающим на имени хоста master_host
и порт 12000, используйте следующую команду:
rosinit('master_host', 12000)
Если вы знаете целый URI (Унифицированный идентификатор ресурса) ведущего устройства, можно создать глобальный узел и подключение к этому ведущему устройству, использующему следующий синтаксис:
rosinit('http://192.168.1.1:12000')
В некоторых случаях ваш компьютер может быть соединен с несколькими сетями и иметь несколько IP-адресов. См. следующий рисунок как пример.
Компьютер на левой нижней части запускает MATLAB и соединяется с двумя различными сетями. В одной подсети ее IP-адресом является 73.195.120.50
и в другом, ее IP является 192.168.1.100
. Этот компьютер хочет соединить с ведущим устройством ROS на компьютере TurtleBot® в IP-адресе 192.168.1.1
. Как часть регистрации с ведущим устройством, глобальный узел MATLAB должен задать IP-адрес или имя хоста, где другие узлы ROS могут достигнуть его. Все узлы на TurtleBot будут использовать этот адрес, чтобы отправить данные в глобальный узел в MATLAB.
То, когда rosinit
будет вызван с IP-адресом ведущего устройства, он попытается обнаружить сетевой интерфейс, раньше связывалось с ведущим устройством и использовало это в качестве IP-адреса для глобального узла.
Если это автоматическое обнаружение перестало работать, можно явным образом задать IP-адрес или имя хоста при помощи пары "имя-значение" NodeHost
в вызове
rosinit
. Все предыдущие методы для вызова rosinit
все еще допустимы со сложением NodeHost
пары "имя-значение".
Для следующих команд примите, что вы хотите рекламировать IP-адрес своего компьютера к сети ROS как 192.168.1.100
.
rosinit('192.168.1.1', 'NodeHost', '192.168.1.100') rosinit('http://192.168.1.1:11311', 'NodeHost', '192.168.1.100') rosinit('master_host', 'NodeHost', '192.168.1.100')
Если узел указан в сети ROS, вы видите адрес, что это рекламирует при помощи команды rosnode
info NODE
. УЗЕЛ является именем узла в сети ROS. Вы видите имена всех зарегистрированных узлов путем вызова rosnode
list
.
В усовершенствованных вариантах использования вы можете хотеть задать адрес ведущего устройства ROS и ваш рекламируемый адрес узла через стандартные переменные окружения ROS. Синтаксисы вызова, которые были объяснены в предыдущих разделах, должны быть достаточными для большинства ваших вариантов использования.
Если никакие аргументы не будут предоставлены rosinit
, функция будет также проверять значения стандартных переменных окружения ROS. Эти переменные являются ROS_MASTER_URI
, ROS_HOSTNAME
, и ROS_IP
. Вы видите, что их текущие значения используют getenv
команду:
getenv('ROS_MASTER_URI') getenv('ROS_HOSTNAME') getenv('ROS_IP')
Можно установить эти переменные с помощью setenv
команды. После установки переменных окружения вызовите rosinit
без аргументов. Адрес ведущего устройства ROS задан ROS_MASTER_URI
, и рекламируемый адрес глобального узла дан ROS_IP
или ROS_HOSTNAME
. Если вы зададите дополнительные аргументы к rosinit
, они заменят значения в переменных окружения.
setenv('ROS_MASTER_URI','http://192.168.1.1:11311') setenv('ROS_IP','192.168.1.100') rosinit
Вы не должны устанавливать и ROS_HOSTNAME
и ROS_IP
. Если оба установлены, ROS_HOSTNAME
более приоритетен.
Для вашей связи ROS, чтобы работать правильно, необходимо гарантировать, что все узлы могут связаться с ведущим устройством и друг с другом. Отдельные узлы должны связаться с ведущим устройством, чтобы указать подписчиков, издателей и сервисы. Они должны также смочь связаться друг с другом, чтобы отправить и получить данные.
Поскольку коммуникация работает таким образом, возможно смочь отправить данные и не могущий получить его (или наоборот), если ваша сеть ROS не настраивается правильно.
Вот схема коммуникационной структуры в сети ROS. Существует одно ведущее устройство ROS и два различных узла, которые указывают себя с ведущим устройством. Каждый узел свяжется с ведущим устройством, чтобы найти рекламируемый адрес другого узла в сети ROS. Если каждый узел знает адрес другого узла, обмен данными может быть установлен без участия ведущего устройства.
Смотрите обмениваются Данными с Издателями ROS и Подписчиками, чтобы исследовать издателей и подписчиков в ROS.