ROS与Matlab语言入门教程-连接到ROS网络
一个ROS网络包含一个ROS主控节点和多个ROS节点,ROS主控节点通过与所有活动的ROS实体保持联系使得ROS网络能够通信。为能够与网络中的其它节点通信,每个节点都需要向ROS主控节点注册。MATLAB®可以启动ROS主控节点或者由MATLAB之外如其它计算机来启动主控节点。所有的节点都向主控节点注册并确认该节点在网络中的地址。
当你使用ROS时,通常需要如下步骤:
- 连接到ROS网络。为连接到ROS网络,你可以在MATLAB中创建ROS主控节点或者连接到已存在的ROS主控节点。这两种情况,MATLAB都需要创建自己的ROS节点(称作MATLAB“global node”)并注册到ROS主控节点。
- 交换数据。一旦连接到ROS网络,MATLAB通过发布器、订阅器和服务与其它ROS节点进行数据交换。
- 断开与ROS网络的连接。调用“rosshutdown”指令断开MATLAB与ROS网络的连接。
- 在MATLAB中创建ROS主控节点。
- 连接到外部的ROS主控节点。
在MATLAB中创建ROS主控节点
在MATLAB中创建ROS主控节点,调用“rosinit”指令,不需要任何参数。这也会创建“global node”节点,该节点用于与ROS网络中的其它节点进行通信。
此时,MATLAB外部的ROS节点可以连接到ROS网络中,外部节点可以通过使用运行MATLAB的计算机的宿主名或者IP地址连接到MATLAB上的ROS主控节点。
你可以通过调用“rosshutdown”指令关闭ROS主控节点和全局节点。
连接到外部的ROS主控节点
你还可以使用“rosinit”命令连接到外部的ROS主控节点(如运行在机器人上或者虚拟设备上)。两种指定主控节点地址的方法:运行主控节点的计算机的IP地址或者宿主名。
当运行过“rosinit”指令之后,再重新运行“rosinit”指令之前,需要先调用“rosshutdown”指令。简洁起见,下文将省略调用“rosshutdown”指令的步骤。
在这个例程中,以“master_host”作为外部主控节点的宿主名称,以“192.168.1.1”作为外部主控节点的IP地址。使用的时候需要根据外部主控节点的实际情况调整宿主名或者IP地址。注意,下面的指令可能运行失败,因为在指定的地址无法找到主控节点。
rosinit('192.168.1.1')
rosinit('master_host')
两种方式调用“rosinit”都假定主控节点通过端口11311连接到网络,该端口是标准的ROS主控节点端口。
如果一个主控节点运行在不同的端口,那么你可以采用第二个参数的形式指定端口。例如,为了连接到一个运行在宿主名为“master_node”端口为12000的主控节点,使用下面的指令:
rosinit('master_host', 12000)
如果你了解主控节点的完整URI(Uniform Resource Identifier),你可以使用如下的指令创建全局节点并连接到该主控节点:
rosinit('http://192.168.1.1:12000')
节点主机详述
在一些情况下,你的计算机可能连接到多个网络,拥有多个IP地址。看下图所示的例子。
左下角运行MATLAB的计算机连接了两个网络,在一个子网络中,它的IP地址是73.195.120.50,另一个子网络中它的IP地址是192.168.1.100。这个计算机连接到ROS主控节点上,该节点运行在IP地址为192.168.1.1的TurtleBot ®计算机上。作为注册到主控节点的一部分,MATLAB的全局节点需要指定自己的宿主名或者IP地址,这样其它ROS节点才能够与MATLAB上的节点进行数据交换。
以主控节点IP地址为参数调用“rosinit”指令,系统将会尝试检测与主控节点连接的网络接口,并作为MATLAB的全局节点的IP地址。
如果自动检测失败,你需要通过“rosinit”指令的“NodeHost”名称值明确地指定IP地址或者宿主名。所有的优先的调用“rosinit”的方法,在增加“NodeHost”名称值对的情况下仍然可用。
如下的指令,假定你想要将自己计算机的IP通知给IP地址为168.1.100的ROS网络:
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”指令查看地址。指令中的“NODE”是ROS网络中的节点名称。你可以通过“rosnode list”指令查看所有注册节点的名称。
ROS环境变量
在高级应用中,你可能想要通过标准的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连接能够正确工作,你必须确保所有的节点能够与主控节点通信,并且节点之间能够有效通信。所有独立节点必须能够与主控节点通信,才能够注册订阅器、发布器和服务,它们还必须能够彼此通信,才能够发送和接收数据。如果ROS网络没有正确设置,那么节点之间的通信可能只能发送不能接收或者只能接收不能发送。
下图是ROS网络通信的示意图。图中有一个主控节点和两个不同的节点注册到主控节点,每一个节点都能连接主控节点,进而发现ROS网络中发布的其它节点的地址。节点之间互相知道对方的地址,数据交换可以在主控节点不参与的情况下进行。
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号