爱折腾-创客智造实验室 - ros与matlab语言入门教程
type: channel
link: https://www.ncnynl.com/tag/ros与matlab语言入门教程
items: ROS与Matlab语言入门教程-目录
items: ROS与Matlab语言入门教程-ROS网络设置
items: ROS与Matlab语言入门教程-开始使用ROS
items: ROS与Matlab语言入门教程-连接到ROS网络
items: ROS与Matlab语言入门教程-基本ROS消息的使用
items: ROS与Matlab语言入门教程-使用发布器和订阅器交换数据
items: ROS与Matlab语言入门教程-专业ROS消息的使用
items: ROS与Matlab语言入门教程-请求和提供服务
items: ROS与Matlab语言入门教程-访问ROS参数服务器
items: ROS与Matlab语言入门教程-rosbag Logfiles的使用

ROS与Matlab语言入门教程-目录
type: item
date: 2019-09-07T05:53:00+00:00
description: 说明： ROS与Matlab语言入门教程介绍 本专栏转载《MATLAB-ROS工具箱教程》 来源地址：https://linhuican.gitbooks.io/matlab-ros/content/ 作者邮箱：huicanlin@gmail.com 获得作者授权转载至此.感谢作者提供完善专栏。 目录： ROS网络设置 开始使用ROS 连接到ROS网络 基本ROS消息的使用 使用发布器和订阅器交换数据 专业ROS消息的使用 请求和提供服务 访问ROS参数服务器 rosbag Logfiles的使用 访问ROS中的tf变换树 开始在Simulink中使用ROS 从Simulink连接到ROS使能的机器人 使能ROS机器人的反馈控制 从Simulink中创建单独的ROS节点 在Simulink中使用ROS消息 在复杂环境中进行路径规划 差动机器人的路径跟踪 从距离传感器更新占有网格地图 开始使用实际的TurtleBot 开始使用Gazebo和仿真的TurtleBot TurtleBot的通信 探索TurtleBot的基本行为 使用操纵杆控制TurtleBot 使用TurtleBot进行壁障 目标跟踪 从Gazebo读取模型和仿真性能 在Gazebo中增加、建立和移除对象 在Gazebo中应用力和力矩 在仿真中测试机器人的自主性

ROS与Matlab语言入门教程-ROS网络设置
type: item
date: 2019-09-07T05:55:00+00:00
description: 设置ROS网络使得不同的设备之间能够通信。不同的参与者或者节点通过注册到同一个ROS主控节点实现信息共享。ROS主控节点是唯一的并且每一个ROS网络只有一个主控节点。虽然一个设备能够运行多个节点，但是通常每个节点对电影一个单独的设备。当与ROS进行通信的时，MATLAB®作为参与其中的一个节点。为使ROS连接可用，所有的设备必须连接到相同的实际或虚拟网络。你可以在MATLAB当中创建一个新的ROS主控节点，或可以连接到一个在其他设备运行着的ROS主控节点。如果你想要连接到一个外部的主控节点，那么你需要知道该设备的IP地址或者主机名。通过调用rosinit能够完成ROS主控节点连接的初始化工作。有关设置和使用ROS网络的更多信息，请参阅Network Connection and Exploration.。 网络连接布局 通过使用被称为发布器、订阅器和服务的实体发送信息来实现数据的传输。发布器通过话题名称发布数据，同时订阅器在网络中通过该话题名称接收数据。服务通过客户端向服务器请求信息实现数据的传输。有关数据传输的更多信息，请参阅Publishers, Subscribers, and Services。 ROS网络连接是所有节点的集合，并且这些节点都连接到ROS主控节点。根据你的应用和设备，节点的数目可以是非常巨大的。当节点注册都主控节点之后，那么该节点与所有其它节点的通信将成为可能。为了与其他节点交换信息，每个节点注册了不懂的发布器、订阅器和服务。虽然在ROS网络中所有的节点都注册到一个主控节点，但是数据的交换可以直接在节点之间进行。（相当于在互联网中，每台机器只要按照一定的协议连接到互联网当中，那么就可以与其它设备任意通信）。下面的图1.1展示了一个具有两个节点的ROS网络。所有节点之间能够在网络中进行双向的数据共享是非常重要的。在设置的过程当中，确认这些连接是非常重要的。 每一个节点向主控节点注册自己的节点URI，每个节点有自己独有的URI。ROS网络中的其它参与者将通过该URI与该节点取得联系。此外，在ROS网络中其它每一个节点都能通过该URI与对应节点通信。调用rosinit可以在MATLAB中创建节点，如果ROS主控节点已经存在，MATLAB能够检测到它并能够恰当的设置该节点的URI。 默认情况下，每一个MATLAB实例拥有一个“全局”节点。该节点被分配给一个随机产生的独一无二的名称。所有的发布器、订阅器、服务终端和服务器都将在这个全局节点运行。

ROS与Matlab语言入门教程-开始使用ROS
type: item
date: 2019-09-07T05:56:00+00:00
description: 机器人操作系统（Robot Operating System ROS）是一个能够让机器人系统的不同部分发现、传输和接收数据的通信接口。MATLAB®支持ROS是基于一个函数库，该函数库使得你在MATLAB可以和基于ROS的实际机器人或者仿真机器人如Gazebo®进行数据交换。 ROS术语 ROS网络有机器人系统的不同部分组成，比如规划器或者摄像头接口，在ROS上进行通信。网络可以分布在多个机器上。 ROS主控节点负责协调ROS网络的各个部分。通过主控URI（Uniform Resource Identifier）鉴别主控节点，URI指定了主控节点运行的计算机上的宿主名或者IP地址。 ROS节点是包含着与ROS功能有关的集合的实体，比如发布器、订阅器和服务。一个ROS网络可以包含多个ROS节点。 发布器、订阅器和服务是ROS中处理数据的不同实体，它们通过消息交换数据。 发布器将消息传送到指定的话题（比如“里程计”），订阅器通过该话题接收消息。允许多个发布器和订阅器共用一个话题。 更多信息，查阅ROS官网：Robot Operating System (ROS)和Concepts。 初始化ROS网络 使用指令“rosinit”初始化ROS。默认情况下， “rosinit” 指令在MATLAB中创建一个ROS主控节点并开始了一个“global node”节点，该节点与主控节点相连。“global node”节点能够自动的被其它ROS函数使用。代码运行示例： rosinit Initializing ROS master on http://bat5136glnxa64.mathworks.com:11311/. Initializing global node /matlab_global_node_8332 with NodeURI http://bat5136glnxa64:58596/ 使用指令“rosnode list”查看ROS网络中的所有节点，注意，这里只有由“rosinit”创建的一个全局节点。代码运行示例： rosnode list /matlab_global_node_8332 使用指令“exampleHelperROSCreateSampleNetwork”给ROS网络添加三个节点以及采样的发布器和订阅器，代码运行示例： exampleHelperROSCreateSampleNetwork 再次使用“rosnode list”指令，可以观察到新增加了三个节点（node_1，node_2和node_3），代码运行示例： rosnode list /matlab_global_node_8332 /node_1 /node_2 /node_3 当前ROS网络的视觉可视化如图2.1所示，接下来探索该例子过程中，可以结构图为参考。当前MATLAB的全局节点（/matlab_global_node）由于没有任何发布器、订阅器或服务，因此处于离线状态。 话题 使用“rostopic list”指令查看ROS网络中可获得的话题，可以观察到/pose, /rosout, and /scan三个话题。其中，rosout是默认的记录话题，它在ROS网络中总是存在的。另外两个话题作为采样网络而创建。代码运行示例： rostopic list /pose /rosout /scan 使用“rostopic info”指令获得指定话题的相关信息，下面的指令显示“/node_1”发布“/pose”话题，而“node_2”订阅该话题。代码运行示例： rostopic info /pose Type: geometry_msgs/Twist Publishers: * /node_1 (http://bat5136glnxa64:51246/) Subscribers: * /node_2 (http://bat5136glnxa64:55141/) 使用“rosnode info”指令获得指令节点的信息，下面的指令显示节点“node_1”发布数据到话题“/pose”和“/rosout”，同时订阅了话题“/scan”的数据。代码运行示例： rosnode info /node_1 Node: [/node_1] URI: [http://bat5136glnxa64:51246/] Publications (2 Active Topics): * /pose * /rosout Subscriptions (1 Active Topics): * /scan Services (0 Active): 服务 ROS服务提供了ROS网络中的“程序调用”的机制。服务客户端向服务器发送请求信息，服务器处理请求信息并返回响应信息。（查看Callin…

ROS与Matlab语言入门教程-连接到ROS网络
type: item
date: 2019-09-07T05:56:00+00:00
description: 一个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”是R…

ROS与Matlab语言入门教程-基本ROS消息的使用
type: item
date: 2019-09-07T05:57:00+00:00
description: 在ROS数据交换中消息是最主要的容器，主题（通过发布器和订阅器交换数据）和服务（请求和提供服务）都是使用消息在节点之间传递数据。每个消息都有消息类型来确认数据结构，例如，激光扫描仪的传感器数据通常以“typesensor_msgs/LaserScan”的消息类型传递。每一个消息类型都确定了包含在消息中的数据元素。每个消息类型的名称都由包名、斜杠“/”和类型名组成 MATLAB支持在机器人学应用领域常见的许多ROS消息类型，在本例中，你将会在MATLAB中尝试几种创建、探索和发布ROS消息的方法。预备知识：1.2开始使用ROS和1.3连接到ROS网络。 查找消息类型 初始化ROS主控节点和全局变量。代码运行如下： rosinit Initializing ROS master onhttp://bat5136glnxa64.mathworks.com:11311/. Initializing global node /matlab_global_node_8332 with NodeURIhttp://bat5136glnxa64:33534/ 使用“exampleHelperROSCreateSampleNetwork”指令给ROS网络填充三个节点和发布器、订阅器例子。代码运行示例： exampleHelperROSCreateSampleNetwork 现在系统中有了若干不同的节点和主题以及相关的发布器和订阅器。你可以使用“rostopic list”查看所有可用的主题，“/scan”存在主题列表当中。 rostopic list /pose /rosout /scan 如果你想要进一步了解通过“/scan”主题传递的数据类型，可以使用“rostopic info/scan”指令检查。“/scan”的消息类型是“sensor_msgs/LaserScan”。代码运行示例： scandata = rosmessage('sensor_msgs/LaserScan') scandata = ROS LaserScan message with properties: MessageType: 'sensor_msgs/LaserScan' Header: [1x1 Header] AngleMin: 0 AngleMax: 0 AngleIncrement: 0 TimeIncrement: 0 ScanTime: 0 RangeMin: 0 RangeMax: 0 Ranges: [0x1 single] Intensities: [0x1 single] 创建的消息“scandata”拥有许多与激光扫描仪接收的数据相关的属性，例如，最小的传感器距离存在“RangeMin”属性，最大传感器距离存储在“RangeMax”属性。 如果你想要定义消息的类型，可以使用“rostype”指令，该指令可以方便的使用一系列消息类型。“rostype”支持tap键填充指令并能够寻找与先前的字符创匹配的消息类型。代码运行示例： scantype = rostype.sensor_msgs_LaserScan scantype = sensor_msgs/LaserScan 使用这个字符串，可以创建一个与之前的消息相同类型的空消息： scandata = rosmessage(scantype) scandata = ROS LaserScan message with properties: MessageType: 'sensor_msgs/LaserScan' Header: [1x1 Header] AngleMin: 0 AngleMax: 0 AngleIncrement: 0 TimeIncrement: 0 ScanTime: 0 RangeMin: 0 RangeMax: 0 Ranges: [0x1 single] Intensities: [0x1 single] 使用“rosmsg list”查看主题和服务所能使用的所有消息类型： rosmsg list ackermann_msgs/AckermannDrive ackermann_msgs/AckermannDriveStamped actionlib_msgs/GoalID actionlib_msgs/GoalStatus actionlib_msgs/GoalStatusArray adhoc_communication/BroadcastCMgrRobotUpdate adhoc_communication/BroadcastCMgrRobotUpdateRequest adhoc_communication/BroadcastCMgrRobotUpdateRe…

ROS与Matlab语言入门教程-使用发布器和订阅器交换数据
type: item
date: 2019-09-07T05:57:00+00:00
description: ROS节点最基本的交换数据的方式是发送和接收消息。消息通过主题传输，在ROS网络中，每一个主题都有唯一的名称。如果一个节点想要共享数据，那么它就要使用发布器将数据发送到主题。一个节点想要接收数据，需要使用接收器监听相应的主题。除了具有唯一的名称，每个主题都具有消息类型，决定主题所能传输的消息类型。 发布器/接收器具有如下特征： 主题用于多对多通信，多个发布器可以发送消息到同样的主题，多个接收器也可以接收同样的主题的数据。 发布器和接收器与主题是解耦的不挂钩的，它们可以用任何规则创建或者销毁。在主题没有接收器的情况下，消息仍然可以发送到主题上。 主题、发布器和接收器的概念如下图所示： 这个例子展示了在ROS网络中怎样发布和订阅主题，另外还展示了： 等待直到接收新的消息。 使用后台调用的形式处理新消息。 需要的预备知识：1.2开始使用ROS，1.3连接到ROS网络。 订阅和等待消息 在MATLAB®中启动ROS主控节点，创建一个带有若干发布器和接收器的采样ROS网络。代码运行示例： rosinit exampleHelperROSCreateSampleNetwork Initializing ROS master onhttp://bat5136glnxa64.mathworks.com:11311/. Initializing global node /matlab_global_node_8332 with 使 用“rostopic list”指令查看可用的主题，假设你想要订阅的主题是“/scan”。代码运行示例：NodeURIhttp://bat5136glnxa64:35671/ rostopic list /pose /rosout /scan 使用“rostopic info”指令检查是否有节点发布数据到“/scan”主题，下面的指令显示“node_3”节点发布数据到“/scan”主题。 rostopic info /scan Type: sensor_msgs/LaserScan Publishers: /node_3 (http://bat5136glnxa64:53950/) Subscribers: /node_1 (http://bat5136glnxa64:49726/) /node_2 (http://bat5136glnxa64:59432/) 使用“rossubscriber”指令订阅“/scan”主题，如果该主题已经存在于ROS网络中（如本例），“rossubscriber”会自动的检测消息类型，你无须指定。代码运行示例： laser = rossubscriber('/scan') laser = Subscriber with properties: TopicName: '/scan' MessageType: 'sensor_msgs/LaserScan' LatestMessage: [0x1 LaserScan] BufferSize: 1 NewMessageFcn: [] 使用“receive”指令等待新消息（第二个参数是超时时间（s）），输出“scandata”包含了接收的数据。代码运行示例： scandata = receive(laser,10) scandata = ROS LaserScan message with properties: MessageType: 'sensor_msgs/LaserScan' Header: [1x1 Header] AngleMin: -0.5216 AngleMax: 0.5243 AngleIncrement: 0.0016 TimeIncrement: 0 ScanTime: 0.0330 RangeMin: 0.4500 RangeMax: 10 Ranges: [640x1 single] Intensities: [0x1 single] 一些数据类型有与之相关的方便的可视化的方式，对于LaserScan数据，“plot”指令能够绘制曲线图，其中“MaximumRange”指定了曲线的最大值范围。运行示例： plot(scandata,'MaximumRange',7) 使用回调函数订阅数据 你可以指定一个回调函数接收新的消息，而不必采用“receive”指令的方法。这种方法使得其它MATLAB代码能够在订阅器等待新消息的同时继续执行。如果想要使用多个订阅器，那么回调是必须的方法。 使用“exampleHelperROSPoseCallback”回调函数，订阅“/pose”主题。一种在主工作空间和回调函数中共享数据的方法是采用全局变量。定义两个全局变量“pos”和“orient”。代码运行示例： robotpose = …

ROS与Matlab语言入门教程-专业ROS消息的使用
type: item
date: 2019-09-07T05:57:00+00:00
description: 一些常见的ROS消息存储的格式，后期在使用之前需要进行转换。MATLAB能够帮助你转换常见的ROS消息格式，有利于简化应用。在本例，你可以探索激光扫描仪的消息类型，有关解压和压缩图片以及点云方面的处理工作。 预备知识：基本ROS消息的使用。 载入消息实例 首先，载入本例将使用的消息样例，这些消息来自多种机器人传感器。调用“exampleHelperROSLoadMessages”载入消息： exampleHelperROSLoadMessages 激光扫描仪消息 在机器人学领域，激光扫描仪是常见的传感器，通过创建合适类型的空消息，你可以看到ROS中激光扫描仪的标准消息格式。 使用“rosmessage”创建消息： emptyscan = rosmessage(rostype.sensor_msgs_LaserScan) emptyscan = ROS LaserScan message with properties: MessageType: 'sensor_msgs/LaserScan' Header: [1x1 Header] AngleMin: 0 AngleMax: 0 AngleIncrement: 0 TimeIncrement: 0 ScanTime: 0 RangeMin: 0 RangeMax: 0 Ranges: [0x1 single] Intensities: [0x1 single] 由于你创建的是空消息，因此“emptyscan”没有包含任何有意义的数据。方便起见，“exampleHelperROSLoadMessages”函数载入了激光扫描仪的消息，该消息已经填充好数据并存储在“scan”变量中。检测“scan”变量，消息中最主要的数据时“Ranges”字段，“Ranges”中的数据时一个640*1的以很小的角度增量存储障碍距离阵列。 scan scan = ROS LaserScan message with properties: MessageType: 'sensor_msgs/LaserScan' Header: [1x1 Header] AngleMin: -0.5467 AngleMax: 0.5467 AngleIncrement: 0.0017 TimeIncrement: 0 ScanTime: 0.0330 RangeMin: 0.4500 RangeMax: 10 Ranges: [640x1 single] Intensities: [0x1 single] 使用“readCartesian”函数，使用者可以获得笛卡尔坐标系下的测量点。 xy = readCartesian(scan) xy = 0.7886 -0.3803 0.7887 -0.3786 0.7907 -0.3780 0.7908 -0.3763 0.7909 -0.3747 0.7929 -0.3740 0.7924 -0.3721 0.7924 -0.3705 0.7945 -0.3698 0.7945 -0.3682 0.7966 -0.3675 0.7966 -0.3659 0.7967 -0.3642 0.7977 -0.3631 0.7978 -0.3615 0.7978 -0.3598 0.7979 -0.3582 0.7999 -0.3575 0.7974 -0.3547 0.7975 -0.3531 0.7995 -0.3524 0.7995 -0.3508 0.8036 -0.3509 0.8016 -0.3484 0.8017 -0.3468 0.5188 -0.2234 0.5168 -0.2215 ... 该函数返回一系列在有效测量范围计算的[x,y]坐标。 用户可以使用“plot”函数可视化扫描消息。 plot(scan,'MaximumRange',5) 图像消息 MATLAB为图像消息提供了支持，消息格式总是“sensor_msgs/Image”。 使用“rosmessage”指令创建一个空消息，查看标准的ROS图像消息格式。 emptyimg = rosmessage(rostype.sensor_msgs_Image) emptyimg = ROS Image message with properties: MessageType: 'sensor_msgs/Image' Header: [1x1 Header] Height: 0 Width: 0 Encoding: '' IsBigendian: 0 Step: 0 Data: [0x1 uint8] 简化起见，“exampleHelperROSLoadMessages”函数载入了图像消息，该消息已经填有数据并…

ROS与Matlab语言入门教程-请求和提供服务
type: item
date: 2019-09-07T05:59:00+00:00
description: ROS支持两种主要的通信机制：话题和服务。话题拥有发布器和订阅器，用于发送和接收消息（参阅使用发布器和订阅器交换数据）。另一方面，服务通过允许请求和应答通信实现紧耦合。服务终端发送请求到服务器，并等待响应。服务器根据请求里的数据构建响应消息并回传给终端。每个服务都有一个类型用于决定请求和响应消息的结构。服务还拥有ROS网络中独一无二的名称。 服务通信具有如下特征： ①服务请求用于一对一通信。单独的节点发起请求，也只有一个节点接收请求并发送回去相应。 ②当服务请求执行的时候，服务终端和服务器紧密地联系在一起。当服务请求发送的时候必须要有服务器存在，一旦请求发送出去，服务终端将会阻塞直到接收到相应。 服务的概念阐述如下图： 图7.1 预备知识：开始使用ROS，连接到ROS网络，使用发布器和订阅器交换数据。 创建服务器 在查看服务的概念之前，在MATLAB中启动ROS节点管理器和ROS网络实例。“exampleHelperROSCreateSampleNetwork”将创建一些服务器以仿真真实的ROS网络。 rosinit exampleHelperROSCreateSampleNetwork Initializing ROS master on http://bat5136glnxa64.mathworks.com:11311/. Initializing global node /matlab_global_node_8332 with NodeURI http://bat5136glnxa64:40154/ 在创建服务器之前，查看可用的服务类型： rostype.getServiceList ans = 'adhoc_communication/BroadcastCMgrRobotUpdate' 'adhoc_communication/BroadcastString' 'adhoc_communication/ChangeMCMembership' 'adhoc_communication/GetGroupState' 'adhoc_communication/GetNeighbors' 'adhoc_communication/SendCMgrRobotUpdate' 'adhoc_communication/SendExpAuction' 'adhoc_communication/SendExpCluster' 'adhoc_communication/SendExpFrontier' 'adhoc_communication/SendMmControl' 'adhoc_communication/SendMmMapUpdate' 'adhoc_communication/SendMmPoint' 'adhoc_communication/SendMmRobotPosition' 'adhoc_communication/SendOccupancyGrid' 'adhoc_communication/SendQuaternion' 'adhoc_communication/SendString' 'adhoc_communication/SendTwist' 'adhoc_communication/ShutDown' 'app_manager/GetAppDetails' 'app_manager/GetInstallationState' 'app_manager/InstallApp' 'app_manager/ListApps' 'app_manager/StartApp' 'app_manager/StopApp' 'app_manager/UninstallApp' 'arbotix_msgs/Enable' 'arbotix_msgs/Relax' ... 假设你想要在创建一个简单的服务器，当你请求服务的时候显示“A service client is calling”。使用“rossvcserver”指令创建服务，指定服务的名称和服务消息的类型。同时定义回调函数“exampleHelperROSEmptyCallback”。服务器的回调函数有非常明确的签名。详细信息，查阅文档rossvcserver。 testserver = rossvcserver('/test', rostype.std_srvs_Empty, @exampleHelperROSEmptyCallback) testserver = ServiceServer with properties: ServiceName: '/test' ServiceType: 'std_srvs/Empty' NewRequestFcn: @exa…

ROS与Matlab语言入门教程-访问ROS参数服务器
type: item
date: 2019-09-07T05:59:00+00:00
description: 本例程将探索如何在ROS参数服务器上增加和恢复参数，参数服务器和ROS管理节点运行在相同的设备上。参数通常在ROS网络中全局都是可用的，并且可以存储静态数据例如配置参数。支持的数据类型包括字符串、整型数、双精度、逻辑和单元阵列。 预备知识：1.2开始使用ROS和1.3连接到ROS网络。 创建参数树 在MATLAB中启动ROS管理节点和参数服务器。 rosinit Initializing ROS master on http://bat5136glnxa64.mathworks.com:11311/. Initializing global node /matlab_global_node_8332 with NodeURI http://bat5136glnxa64:60770/ 创建参数树对象与参数服务器进行交互，参数树可让用户与参数服务器进行交互，并提供函数，例如“set”，“get”，“del”，“has”和“search”。由于我们在本例中启动一个新的参数服务器，因此目前没有存储任何参数。 ptree = rosparam ptree = ParameterTree with properties: AvailableParameters: {} 增加新参数 使用参数名“ROBOT_IP”设定机器人的IP地址参数值。使用“has”函数，检查是否存在相同名称的参数。 has(ptree,'ROBOT_IP') ans = 0 “has”返回0（false）作为输出，这说明当前在参数服务器中没有名称为“ROBOT_IP”的参数。 使用“set”函数，增加指定机器人IP地址的参数到参数服务器。 set(ptree,'ROBOT_IP','192.168.1.1'); set(ptree, '/myrobot/ROBOT_IP','192.168.1.100'); 现在，所有连接到当前ROS管理节点的节点，都能够使用“ROBOT_IP”参数，用户还可以为参数指定命名空间，例如此处的“/myrobot/ROBOT_IP”参数的命名空间是“/myrobot”。 设定参数的不同数据类型： set(ptree,'MAX_SPEED',1.5); 在“set”函数中使用单元阵列，为机器人设定全局坐标参数{x,y,z}： set(ptree, '/myrobot/ROBOT_NAME','TURTLE'); set(ptree, '/myrobot/MAX_SPEED',1.5); set(ptree, '/newrobot/ROBOT_NAME','NEW_TURTLE'); 获得参数值 当用户想用连接到机器人时，可以从“ROBUT_IP”参数获得机器人的IP地址，用于连接到该机器人。总共有两个名称为“ROBOT_IP”的参数，用户仅需要“myrobot”下的地址。用户可用“get”函数，获得该参数值： robotIP = get(ptree, '/myrobot/ROBOT_IP') robotIP = 192.168.1.100 获得所有参数列表 检查“AvailableParameters”的属性，可以获得存储在参数服务器上的所有参数列表，该列表包含了用户在上述章节增加的参数： plist = ptree.AvailableParameters plist = '/MAX_SPEED' '/ROBOT_IP' '/goal' '/myrobot/MAX_SPEED' '/myrobot/ROBOT_IP' '/myrobot/ROBOT_NAME' '/newrobot/ROBOT_NAME' 修改已有参数 用户还可用“set“函数修改参数值。注意，参数的修改是不可逆的，因为参数服务器会用新的值覆盖参数。用户可以使用“has”函数验证参数是否已经存在。 修改“MAX_SPEED”参数： set(ptree, 'MAX_SPEED', 1.0); 对参数进行修改的数值可以与之前分配的数据类型不同，例如，“MAX_SPEED”的数据类型是双精度，现在可以设置“MAX_SPEED”参数为字符串。 set(ptree, 'MAX_SPEED', 'none'); 删除参数 用户可以使用“del”函数从参数服务器中删除参数。 删除“goal”参数： del(ptree, 'goal'); 使用“has”函数检查“goal”参数是否已经成功删除： has(ptree, 'goal') ans = 0 返回0（false），意味着“goal”参数已经从参数服务器中删除。 搜索参数 使用“search”指令所有包含“myrobot”的参数： results = search(ptree, 'myrobot') results = '/myrob…

ROS与Matlab语言入门教程-rosbag Logfiles的使用
type: item
date: 2019-09-07T06:00:00+00:00
description: “rosbag”或“bag”是ROS中存储消息数据的文件格式，这些包通常是通过订阅一个或多个ROS话题创建的，并用一种高效的文件结构存储接收到的消息数据。MATLAB可以读取rosbag文件，并有助于过滤和提取消息数据。本例，用户将会载入rosbag文件并学习如何选择并恢复包含的消息。 预备知识：1.5 基本ROS消息的使用。 载入rosbag 使用“rosbag”指令载入示例文件，采取绝对路径或者相对路径的方式指定记录文件的路径： filepath = fullfile(fileparts(which('ROSWorkingWithRosbagsExample')), 'data', 'ex_multiple_topics.bag'); bag = rosbag(filepath) bag = BagSelection with properties: FilePath: '/mathworks/devel/bat/BR2015ad/build/matlab/toolbox/r...' StartTime: 201.3400 EndTime: 321.3400 NumMessages: 36963 AvailableTopics: [4x3 table] MessageList: [36963x4 table] 调用“rosbag”返回的对象是“BagSelection”，“rosbag”文件中的所有信息都在该对象里。 对象的属性显示了文件包含多少消息（NumMessages）、记录第一个（StartTime）和最后一个（EndTime）消息的时间等详细信息。 获取“AvailableTopics”属性值，查看记录文件中有关话题和消息类型的更多消息。 bag.AvailableTopics ans = NumMessages MessageType MessageDefinition ___________ ______________________ _________________ /clock 12001 rosgraph_msgs/Clock [1x185 char] /gazebo/link_states 11999 gazebo_msgs/LinkStates [1x1247 char] /odom 11998 nav_msgs/Odometry [1x2918 char] /scan 965 sensor_msgs/LaserScan [1x2123 char] “AvailableTopics”属性将包含在“rosbag”文件中的话题做成列表，该列表存储了消息的数量、消息的类型和为话题定义的消息。初始化“rosbag”文件仅仅是MATLAB建立了索引，并没有读取任何实际的消息。 在消息载入MATLAB内存之前，用户可能想要基于索引尽可能的滤除和筛选需要的消息。 选择消息 在恢复任何消息之前，用户必须基于时间戳、话题名称或消息类型选择一系列的消息。 用户可以查看当前选择的所有消息： bag.MessageList ans = Time Topic MessageType FileOffset ______ ___________________ ______________________ __________ 201.34 /clock rosgraph_msgs/Clock 4524 201.34 /odom nav_msgs/Odometry 7666 201.34 /gazebo/link_states gazebo_msgs/LinkStates 9866 201.35 /clock rosgraph_msgs/Clock 10962 201.35 /clock rosgraph_msgs/Clock 12876 201.35 /odom nav_msgs/Odometry 12112 201.35 /gazebo/link_states gazebo_msgs/LinkStates 11016 201.36 /odom nav_msgs/Odometry 14026 201.36 /gazebo/link_states gazebo_msgs/LinkStates 12930 201.37 /clock rosgraph_msgs/Clock 14790 201.37 /odom nav_msgs/Odometry 14844 201.37 /gazebo/link_states gazebo_msgs/LinkStates 15608 201.38 /clock rosgraph_msgs/Clock 16704 201.38 /odom nav_msgs/Odometry 17854 201.…