赞
踩
ROS工具箱提供了一个接口,将MATLAB® 和Simulink® 与机器人操作系统(ROS和ROS 2)连接起来,使您能够创建一个ROS节点网络。该工具箱包含MATLAB函数和Simulink模块,用于导入、分析和回放rosbag文件中记录的ROS数据。您也可以连接到活跃的ROS网络来访问ROS消息。
该工具箱允许您通过桌面模拟和连接到外部机器人模拟器(如Gazebo)来验证ROS节点。ROS工具箱支持c++代码生成(使用Simulink Coder™),使您能够自动生成ROS节点。
本例将介绍:
1在MATLAB中建立ROS
2获取关于ROS网络功能的信息
3获取关于ROS消息的信息
ROS网络由机器人系统的不同部分(如规划器或摄像头接口)组成,它们通过ROS进行通信。网络可以分布在多台机器上。
ROS master负责协调ROS网络的不同部分。它由主URI(Uniform Resource Identifier)标识,该URI指定主服务器运行的机器的主机名或IP地址。
一个ROS节点包含一组相关的ROS功能(例如发布者、订阅者和服务)。一个ROS网络可以有许多ROS节点。发布者、订阅者和服务是处理数据的不同类型的ROS实体。它们使用消息交换数据。
发布者将消息发送到特定的主题(如“里程数”),该主题的订阅者接收这些消息。一个主题可以与多个发布者和订阅者关联。
使用 rosinit 去初始化ROS网络。默认情况下,rosinit 在MATLAB中创建一个ROS主节点,并启动一个连接到主节点的全局节点。全局节点被其他ROS功能自动使用。
rosinit
- Launching ROS Core...
- Done in 0.77356 seconds.
- Initializing ROS master on http://172.29.207.151:57188.
- Initializing global node /matlab_global_node_12045 with NodeURI http://dcc345885glnxa64:35297/ and MasterURI http://localhost:57188.
使用 rosnode list 查看ROS网络中的所有节点。注意,唯一可用的节点是 rosinit 创建的全局节点。
rosnode list
/matlab_global_node_12045
使用 exampleHelperROSCreateSampleNetwork 给ROS网络添加三个额外节点和示例发布者与订阅者。
exampleHelperROSCreateSampleNetwork
- /matlab_global_node_12045
- /node_1
- /node_2
- /node_3
图中显示了ROS网络的当前状态。MATLAB全局节点断开连接,因为它目前没有任何发布者、订阅者或服务。
使用 rostopic list 查看ROS网络中的可用话题。有四个话题:/pose, / roout, /scan和/tf。默认的话题:rosout和tf始终存在于ROS网络中。另外两个话题是作为示例网络的一部分创建的。
rostopic list
- /pose
- /rosout
- /scan
- /tf
使用 rostopic info <topicname> 获取关于特定话题的特定信息。下面的命令显示 节点 /node_1 发布(发送消息给) /pose 话题,节点 /node_2 订阅(接收来自话题的消息) /pose 话题。
rostopic info /pose
- Type: geometry_msgs/Twist
-
- Publishers:
- * /node_1 (http://dcc345885glnxa64:42939/)
-
- Subscribers:
- * /node_2 (http://dcc345885glnxa64:42477/)
使用rosnode info <nodename> 获取特定节点的信息。例如,node_1发布到/pose、/ roout和/tf话题,订阅 /scan 话题并提供服务:/node_1/get_logger和/node_1/set_logger_level。默认的日志服务:get_loggers和set_logger_level由在ROS网络中创建的所有节点提供。
rosnode info /node_1
- Node: [/node_1]
- URI: [http://dcc345885glnxa64:42939/]
-
- Publications (3 Active Topics):
- * /pose
- * /rosout
- * /tf
-
- Subscriptions (1 Active Topics):
- * /scan
-
- Services (2 Active):
- * /node_1/get_loggers
- * /node_1/set_logger_level
ROS服务提供了一种跨ROS网络的程序调用机制。服务客户端向服务器发送请求消息,服务器处理请求中的信息并返回响应消息(参见Call and provider ROS Services)。使用rosservice list查看ROS网络中所有可用的服务器。下面的命令显示了两个服务(/add和/reply)以及所有节点的默认记录器服务。
rosservice list
- /add
- /matlab_global_node_12045/get_loggers
- /matlab_global_node_12045/set_logger_level
- /node_1/get_loggers
- /node_1/set_logger_level
- /node_2/get_loggers
- /node_2/set_logger_level
- /node_3/get_loggers
- /node_3/set_logger_level
- /reply
使用 rosservice info <servicename> 获取特定服务的信息。
rosservice info /add
- Node: /node_3
- URI: rosrpc://dcc345885glnxa64:48307
- Type: roscpp_tutorials/TwoInts
- Args: MessageType A B
发布者、订阅者和服务使用 ROS messages 交换信息。每个ROS messages 都有一个相关的消息类型,该类型定义了 messages 中信息的数据类型和布局。
使用rostopic type <topicname>查看话题使用的消息类型。下面的命令显示 /pose 话题使用类型为geometry_msgs/Twist的消息。
rostopic type /pose
geometry_msgs/Twist
使用rosmsg show <messagetype>命令查看消息类型的属性。geometric y_msgs/Twist消息类型有两个属性,Linear和Angular。每个属性都是一个类型为geometry_msgs/Vector3的消息,该消息又有三个类型为double的属性。
rosmsg show geometry_msgs/Twist
- % This expresses velocity in free space broken into its Linear and Angular parts.
- Vector3 Linear
- Vector3 Angular
rosmsg show geometry_msgs/Vector3
- % This represents a vector in free space.
- % It is only meant to represent a direction. Therefore, it does not
- % make sense to apply a translation to it (e.g., when applying a
- % generic rigid transformation to a Vector3, tf2 will only apply the
- % rotation). If you want your data to be translatable too, use the
- % geometry_msgs/Point message instead.
- double X
- double Y
- double Z
使用rosmsg list 查看MATLAB中可用的消息类型的完整列表。
使用examplehelperrosshutdownsamplennetwork从ROS网络中删除示例节点、发布者和订阅者。只有在前面使用examplehelperrosstartsamplennetwork创建示例网络时,才需要此命令。
exampleHelperROSShutDownSampleNetwork
在MATLAB中使用rosshutdown关闭ROS网络。这将关闭由rosinit启动的ROS主节点,并删除全局节点。使用ROS网络后,建议使用rosshutdown。
rosshutdown
- Shutting down global node /matlab_global_node_12045 with NodeURI http://dcc345885glnxa64:35297/ and MasterURI http://localhost:57188.
- Shutting down ROS master on http://172.29.207.151:57188.
一个ROS网络由一个ROS主节点和多个ROS节点组成。ROS主机通过跟踪所有活跃的ROS实体来促进ROS网络中的通信。每个节点都需要向ROS主机注册,以便能够与网络的其他部分通信。MATLAB®可以启动ROS master,或master可以在MATLAB之外启动(例如,在不同的计算机上)。
当使用ROS时,通常遵循以下步骤:
1.连接到ROS网络。要连接到ROS网络,可以在MATLAB中创建ROS主服务器或连接到现有的ROS主服务器。在这两种情况下,MATLAB还将创建自己的ROS节点(称为MATLAB全局节点)并向主节点注册。rosinit功能管理这个过程。
2.交换数据。一旦连接,MATLAB将通过发布者、订阅者和服务与其他ROS节点交换数据。
3.断开与ROS网络连接。调用rosshutdown函数来断开MATLAB与ROS网络的连接。
在MATLAB中创建ROS master,调用rosinit,不带任何参数。该函数还创建全局节点,MATLAB使用该节点与ROS网络中的其他节点通信。
rosinit
- Launching ROS Core...
- Done in 0.53007 seconds.
- Initializing ROS master on http://172.29.207.162:57063.
- Initializing global node /matlab_global_node_94513 with NodeURI http://dcc434238glnxa64:43127/ and MasterURI http://localhost:57063.
MATLAB外部的ROS节点现在可以加入ROS网络。它们可以使用MATLAB主机的主机名或IP地址连接到MATLAB中的ROS master。
您可以通过调用 rosshutdown 来关闭ROS主节点和全局节点。
rosshutdown
- Shutting down global node /matlab_global_node_94513 with NodeURI http://dcc434238glnxa64:43127/ and MasterURI http://localhost:57063.
- Shutting down ROS master on http://172.29.207.162:57063.
还可以使用rosinit命令连接到外部ROS主机(例如在机器人或虚拟机上运行)。可以通过两种方式指定主服务器的地址:通过IP地址或运行主服务器的计算机的主机名。
在每次调用rosinit之后,必须在使用不同的语法调用rosinit之前调用rosshutdown。为了简单起见,在这些示例中省略了对rosshutdown的这些调用。
'master_host'是一个示例主机名,'192.168.1.1'是外部ROS主机的一个示例IP地址。根据外部主机驻留在网络中的位置调整这些地址。如果在指定的地址没有找到主服务器,这些命令将失败。
- rosinit('192.168.1.1')
- rosinit('master_host')
两个对rosinit的调用都假定主机在端口11311上接受网络连接,该端口是标准的ROS主端口。如果master运行在不同的端口上,您可以将它指定为第二个参数。连接到主机名为master_host,端口为12000的ROS master,使用以下命令:
rosinit('master_host',12000)
如果你知道主节点的整个统一资源标识符(URI),你可以创建全局节点并使用以下语法连接到主节点:
rosinit('http://192.168.1.1:12000')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。