Сеть ROS состоит из одного ведущего устройства ROS и нескольких узлов ROS. Ведущее устройство ROS упрощает коммуникацию в сети ROS путем отслеживания все активные сущности ROS. Каждый узел должен указать с ведущим устройством ROS, чтобы смочь связаться с остальной частью сети. MATLAB® может запустить ведущее устройство ROS, или ведущее устройство может быть запущено за пределами MATLAB (например, на различном компьютере).
Когда вы работаете с 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
Launching ROS Core... Done in 0.78866 seconds. Initializing ROS master on http://192.168.0.10:59769. Initializing global node /matlab_global_node_09912 with NodeURI http://bat1071901glnxa64:42855/
Узлы ROS, которые являются внешними к MATLAB, могут теперь соединить сеть ROS. Они могут соединиться с ведущим устройством ROS в MATLAB при помощи имени узла или IP-адреса хоста - компьютера MATLAB.
Можно закрыть ведущее устройство ROS и глобальный узел путем вызова rosshutdown
.
rosshutdown
Shutting down global node /matlab_global_node_09912 with NodeURI http://bat1071901glnxa64:42855/ Shutting down ROS master on http://192.168.0.10:59769.
Можно также использовать 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
вызвать. 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
<nodename>
. Вы видите имена всех зарегистрированных узлов путем вызова 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.