当前位置:   article > 正文

学习使用ROS Toolbox的一些记录

ros toolbox

开始使用ROS工具箱

ROS工具箱提供了一个接口,将MATLAB® 和Simulink® 与机器人操作系统(ROS和ROS 2)连接起来,使您能够创建一个ROS节点网络。该工具箱包含MATLAB函数和Simulink模块,用于导入、分析和回放rosbag文件中记录的ROS数据。您也可以连接到活跃的ROS网络来访问ROS消息。
该工具箱允许您通过桌面模拟和连接到外部机器人模拟器(如Gazebo)来验证ROS节点。ROS工具箱支持c++代码生成(使用Simulink Coder™),使您能够自动生成ROS节点。

1.从ROS开始

本例将介绍:
1在MATLAB中建立ROS
2获取关于ROS网络功能的信息
3获取关于ROS消息的信息

1.1 ROS术语

ROS网络由机器人系统的不同部分(如规划器或摄像头接口)组成,它们通过ROS进行通信。网络可以分布在多台机器上。
ROS master负责协调ROS网络的不同部分。它由主URI(Uniform Resource Identifier)标识,该URI指定主服务器运行的机器的主机名或IP地址。
一个ROS节点包含一组相关的ROS功能(例如发布者、订阅者和服务)。一个ROS网络可以有许多ROS节点。发布者、订阅者和服务是处理数据的不同类型的ROS实体。它们使用消息交换数据。
发布者将消息发送到特定的主题(如“里程数”),该主题的订阅者接收这些消息。一个主题可以与多个发布者和订阅者关联。

1.2初始化ROS网络

使用 rosinit 去初始化ROS网络。默认情况下,rosinit 在MATLAB中创建一个ROS主节点,并启动一个连接到主节点的全局节点。全局节点被其他ROS功能自动使用。

rosinit
  1. Launching ROS Core...
  2. Done in 0.77356 seconds.
  3. Initializing ROS master on http://172.29.207.151:57188.
  4. 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
  1. /matlab_global_node_12045
  2. /node_1
  3. /node_2
  4. /node_3

图中显示了ROS网络的当前状态。MATLAB全局节点断开连接,因为它目前没有任何发布者、订阅者或服务。

1.3 话题

使用 rostopic list 查看ROS网络中的可用话题。有四个话题:/pose, / roout, /scan和/tf。默认的话题:rosout和tf始终存在于ROS网络中。另外两个话题是作为示例网络的一部分创建的。

rostopic list
  1. /pose
  2. /rosout
  3. /scan
  4. /tf

使用 rostopic info <topicname> 获取关于特定话题的特定信息。下面的命令显示 节点 /node_1 发布(发送消息给) /pose 话题,节点 /node_2 订阅(接收来自话题的消息) /pose 话题。

rostopic info /pose
  1. Type: geometry_msgs/Twist
  2. Publishers:
  3. * /node_1 (http://dcc345885glnxa64:42939/)
  4. Subscribers:
  5. * /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
  1. Node: [/node_1]
  2. URI: [http://dcc345885glnxa64:42939/]
  3. Publications (3 Active Topics):
  4. * /pose
  5. * /rosout
  6. * /tf
  7. Subscriptions (1 Active Topics):
  8. * /scan
  9. Services (2 Active):
  10. * /node_1/get_loggers
  11. * /node_1/set_logger_level

1.4 服务

ROS服务提供了一种跨ROS网络的程序调用机制。服务客户端向服务器发送请求消息,服务器处理请求中的信息并返回响应消息(参见Call and provider ROS Services)。使用rosservice list查看ROS网络中所有可用的服务器。下面的命令显示了两个服务(/add和/reply)以及所有节点的默认记录器服务。

rosservice list
  1. /add
  2. /matlab_global_node_12045/get_loggers
  3. /matlab_global_node_12045/set_logger_level
  4. /node_1/get_loggers
  5. /node_1/set_logger_level
  6. /node_2/get_loggers
  7. /node_2/set_logger_level
  8. /node_3/get_loggers
  9. /node_3/set_logger_level
  10. /reply

使用 rosservice info <servicename> 获取特定服务的信息。

rosservice info /add
  1. Node: /node_3
  2. URI: rosrpc://dcc345885glnxa64:48307
  3. Type: roscpp_tutorials/TwoInts
  4. Args: MessageType A B

1.5消息

发布者、订阅者和服务使用 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
  1. % This expresses velocity in free space broken into its Linear and Angular parts.
  2. Vector3 Linear
  3. Vector3 Angular
rosmsg show geometry_msgs/Vector3
  1. % This represents a vector in free space.
  2. % It is only meant to represent a direction. Therefore, it does not
  3. % make sense to apply a translation to it (e.g., when applying a
  4. % generic rigid transformation to a Vector3, tf2 will only apply the
  5. % rotation). If you want your data to be translatable too, use the
  6. % geometry_msgs/Point message instead.
  7. double X
  8. double Y
  9. double Z

使用rosmsg list 查看MATLAB中可用的消息类型的完整列表。

1.6 关闭ROS网络

使用examplehelperrosshutdownsamplennetwork从ROS网络中删除示例节点、发布者和订阅者。只有在前面使用examplehelperrosstartsamplennetwork创建示例网络时,才需要此命令。

exampleHelperROSShutDownSampleNetwork

在MATLAB中使用rosshutdown关闭ROS网络。这将关闭由rosinit启动的ROS主节点,并删除全局节点。使用ROS网络后,建议使用rosshutdown。

rosshutdown
  1. Shutting down global node /matlab_global_node_12045 with NodeURI http://dcc345885glnxa64:35297/ and MasterURI http://localhost:57188.
  2. Shutting down ROS master on http://172.29.207.151:57188.

2. 连接到ROS网络

一个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网络的连接。

2.1 在MATLAB中创建一个ROS Master

在MATLAB中创建ROS master,调用rosinit,不带任何参数。该函数还创建全局节点,MATLAB使用该节点与ROS网络中的其他节点通信。

rosinit
  1. Launching ROS Core...
  2. Done in 0.53007 seconds.
  3. Initializing ROS master on http://172.29.207.162:57063.
  4. 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
  1. Shutting down global node /matlab_global_node_94513 with NodeURI http://dcc434238glnxa64:43127/ and MasterURI http://localhost:57063.
  2. Shutting down ROS master on http://172.29.207.162:57063.

2.2 连接到外部ROS Master

还可以使用rosinit命令连接到外部ROS主机(例如在机器人或虚拟机上运行)。可以通过两种方式指定主服务器的地址:通过IP地址或运行主服务器的计算机的主机名。
在每次调用rosinit之后,必须在使用不同的语法调用rosinit之前调用rosshutdown。为了简单起见,在这些示例中省略了对rosshutdown的这些调用。

'master_host'是一个示例主机名,'192.168.1.1'是外部ROS主机的一个示例IP地址。根据外部主机驻留在网络中的位置调整这些地址。如果在指定的地址没有找到主服务器,这些命令将失败。

  1. rosinit('192.168.1.1')
  2. rosinit('master_host')

两个对rosinit的调用都假定主机在端口11311上接受网络连接,该端口是标准的ROS主端口。如果master运行在不同的端口上,您可以将它指定为第二个参数。连接到主机名为master_host,端口为12000的ROS master,使用以下命令:

rosinit('master_host',12000)

如果你知道主节点的整个统一资源标识符(URI),你可以创建全局节点并使用以下语法连接到主节点:

rosinit('http://192.168.1.1:12000')

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/665973
推荐阅读
相关标签
  

闽ICP备14008679号