0. 简介

Matlab作为广大学生以及算法工程师常用的软件,因其良好的可视化以及矩阵适应能力,使其得到了广泛的使用。同时ROS作为机器人、自动驾驶领域最常用的软件,其与Matlab结合在一起也是理所当然的。为此这一系列就是来带领读者熟悉并了解Matlab与ROS背后的使用关系

1. Matlab与ROS

机器人操作系统(ROS)是一种通信接口,使机器人系统的不同部分能够相互发现,并在它们之间发送和接收数据。MATLAB通过一个函数库支持ROS,使您能够与支持ROS的物理机器人或机器人模拟器(如Gazebo)交换数据。相比于之前我们讲过的Unity而言Matlab更偏向后端的运算,而不是仿真的操作。

ROS工具箱提供了一个接口,将MATLAB和Simulink与机器人操作系统(ROS和ROS 2)连接起来,使您能够创建一个ROS节点网络。工具箱包括MATLAB函数和Simulink块,用于导入、分析和回放记录在rosbag文件中的ROS数据。您还可以连接到活动的ROS网络以访问ROS消息。

该工具箱允许您通过桌面模拟和连接到外部机器人模拟器(如Gazebo)来验证ROS节点。同时ROS工具箱支持c++代码生成(使用Simulink Coder),使您能够从Simulink模型自动生成ROS节点并部署到模拟或物理硬件。对Simulink外部模式的支持使您可以在模型在硬件上运行时查看消息并更改参数。

1.1 ROS与Matlab基础使用

具体实现步骤如下:

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

使用 rosnode list 查看ROS网络中的所有节点。注意,唯一可用的节点是 rosinit 创建的全局节点。

Launching ROS Core…
Done in 0.63966 seconds.
Initializing ROS master on http://172.29.195.13:50807.
Initializing global node /matlab_global_node_10681 with NodeURI http://dcc667538glnxa64:37939/ and MasterURI http://localhost:50807.

rosnode list

/matlab_global_node_10681

使用 exampleHelperROSCreateSampleNetwork 给ROS网络添加三个额外节点和示例发布者与订阅者。

exampleHelperROSCreateSampleNetwork

/matlab_global_node_12045
/node_1
/node_2
/node_3

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

如果需要关闭MATLAB中的ROS网络。可以使用下面的指令

rosshutdown

这将关闭由rosinit启动的ROS主节点,并删除全局节点。

1.2 ROS的Topic、Service和Message

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

rostopic list

/pose
/rosout
/scan
/tf

下面的命令显示了两个服务(/add和/reply)以及所有节点的默认记录器服务。

rosservice list

/add
/matlab_global_node_10681/get_loggers
/matlab_global_node_10681/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

发布者、订阅者和服务使用 ROS messages 交换信息。每个ROS messages 都有一个相关的消息类型,该类型定义了 messages 中信息的数据类型和布局。这里使用rostopic type 查看话题使用的消息类型。下面的命令显示 /pose 话题使用类型为geometry_msgs/Twist的消息。

rostopic type /pose

geometry_msgs/Twist

2. 将ROS和Matlab链接

当使用ROS时,通常遵循以下步骤:

  1. 连接到ROS网络。要连接到ROS网络,可以在MATLAB中创建ROS主服务器或连接到现有的ROS主服务器。在这两种情况下,MATLAB还将创建自己的ROS节点(称为MATLAB全局节点)并向主节点注册。rosinit功能管理这个过程。
  2. 交换数据。一旦连接,MATLAB将通过发布者、订阅者和服务与其他ROS节点交换数据。
  3. 断开与ROS网络连接。调用rosshutdown函数来断开MATLAB与ROS网络的连接。

除了我们之前讲到的本主机连接以外,Matlab还支持连接到外部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_host和端口12000上运行的ROS主机,使用以下命令:

rosinit('master_host',12000)

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

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

如果是如下图所示的计算机可能连接到多个网络并具有多个IP地址。这幅图展示了一个例子。

左下角的计算机运行MATLAB并连接到两个不同的网络。其中一个子网的IP地址为73.195.120.50,另一个子网的IP地址为192.168.1.100。这台计算机想要连接到TurtleBot计算机上的ROS主机,IP地址为192.168.1.1。作为向主机注册的一部分,MATLAB全局节点必须指定其他ROS节点可以到达的IP地址或主机名。TurtleBot上的所有节点都将使用该地址将数据发送到MATLAB中的全局节点。

当使用主节点的IP地址调用rosinit时,它将尝试检测用于联系主节点的网络接口,并将其用作全局节点的IP地址。如果自动检测失败,您可以在rosinit调用中使用NodeHost的用户名-参数对显式指定IP地址或主机名。NodeHost的用户名-参数对可以与已经显示的任何其他语法一起使用。

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而言,其也可以通过标准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

3. ROS2与ROS1差异

3.1 节点差异

指令方面ROS2和ROS1大同小异,但是在链接方式上面有着比较大的差异,与ROS不同,ROS 2不需要在MATLAB中初始化。随着节点的创建,ROS 2网络自动启动。例如使用ros2node创建节点。

test1 = ros2node("/test1")

test1 =
ros2node with properties:
Name: ‘/test1’
ID: 0

同样关闭也很简单,即使用clear命令关闭ROS 2网络中的节点

clear test1

3.2 QOS质量评估

服务质量(QoS)策略选项更改发布者和订阅者处理和交换消息的方式。

  1. 使用History和Depth QoS策略根据要在处理队列中放置消息的方式确定通信对象的行为。指定历史记录作为这些选项之一。

    • “ keepplast “ -删除消息,只保留最新的信息。
    • “keepall” -将接收到的所有消息保存在队列中,直到它们被处理。
  1. 使用Reliability QoS策略确保将消息传递到订阅者。将可靠性指定为这些选项之一。

    • “reliable” -确保发布者不断向订阅者发送消息,直到订阅者确认收到消息为止。
      • “ besteeffort “ -允许发布者只发送一次消息。
  2. 使用带有深度输入的持久性QoS策略来控制晚加入连接的消息的持久性。指定持久性作为这些选项之一。

    • “transientlocal”——如果订阅者在发布者最初发送消息后加入网络,则发布者将持久消息发送给订阅者。
    • “volatile” -发布者在发送消息后不持久化消息。订阅者不向发布者请求持久消息。

3.3 DDS和RMW实现

当您在MATLAB®和Simulink®中使用ROS 2时,可以在RMW实现之间切换以使用数据分发服务(DDS)。要配置所需的RMW实现,请遵循以下步骤。

  1. 在MATLAB工具条的环境部分的Home选项卡下,打开Preferences。

  2. 在“ROS工具箱首选项”对话框中配置Python环境,并从“ROS中间件(RMW)实现”下拉列表中选择实现。默认实现是rmw_fastrtps_cpp。
    在这里插入图片描述\469c7e468d484a45a99f3dfee045d362.png)

  3. 通过单击Configure和Switch to custom RMW implementation切换到自定义RMW实现,这将启动ROS Middleware Configuration对话框。

  4. 安装并构建自定义RMW实现包,以验证使用所选自定义RMW实现创建的ROS 2节点。

4. 不同域中创建ROS 2节点

要在非默认域中创建节点,需要显式地将域ID指定为ros2node的第二个输入参数。下面的newDomainNode是在ID为25的指定域中创建的

newDomainNode = ros2node("/new_domain_node",25)

newDomainNode =
ros2node with properties:
Name: ‘/new_domain_node’
ID: 25

要查看特定域上的网络信息,请将ID作为参数提供给ros2函数。下面的命令显示域ID为25的所有节点。

ros2("node","list","DomainID",25)

/new_domain_node

如果域ID没有显式地提供给节点或ros2命令,它们默认使用ROS_DOMAIN_ID环境变量的值。使用getenv查看当前值。如果该环境变量未设置或未设置为有效值,则将使用默认的域ID 0

getenv("ROS_DOMAIN_ID")

ans =
0x0 empty char array

可以使用setenv命令设置ROS_DOMAIN_ID

setenv("ROS_DOMAIN_ID","25")
envDomainNode = ros2node("/env_domain_node")

envDomainNode =
ros2node with properties:
Name: ‘/env_domain_node’
ID: 25

ros2函数提供由该环境变量指定的网络信息。通过ros2节点列表查看domain ID为25的节点。

ros2 node list

/env_domain_node
/new_domain_node

将ROS_DOMAIN_ID重置为默认值的方法就是

setenv("ROS_DOMAIN_ID","")


ROS 2节点可以与同一子网内的其他节点通信。为了检测子网外的节点,创建一个DEFAULT_FASTRTPS_PROFILE.xml文件来配置MATLAB使用的特定DDS实现。添加子网外系统的IP地址列表,用于在地址元素内通信。注意,对于两个系统进行通信,它们都必须在各自的DEFAULT_FASTRTPS_PROFILE.xml文件中指定对方系统的地址。将domainId元素设置为用于通信的网络的适当值。将此文件保存在MATLAB当前工作目录中。在MATLAB外部使用ROS 2的系统应将此文件放置在运行ROS 2应用程序的同一目录中。下面是一个DEFAULT_FASTRTPS_PROFILES.xml文件示例。

<?xml version="1.0" encoding="UTF-8" ?>
<profiles>
    <participant profile_name="participant_win" is_default_profile="true">
        <rtps>
            <builtin>
                <domainId>0</domainId>
                 <initialPeersList>
                     <locator>
                         <kind>UDPv4</kind>
                         <address>192.34.17.36</address>
                     </locator>
                     <locator>
                         <kind>UDPv4</kind>
                         <address>182.30.45.12</address>
                     </locator>
                     <locator>
                         <kind>UDPv4</kind>
                         <address>194.158.78.29</address>
                     </locator>
                 </initialPeersList>
             </builtin>
         </rtps>
     </participant>
</profiles>

ROS 2通过DEFAULT_FASTRTPS_PROFILES.xml中列出的IP地址向系统中的节点发布信息。如果DEFAULT_FASTRTPS_PROFILES.xml不存在或不包含正确的IP地址,则子网外的其他机器上的节点将不会接收到任何信息。

5. 参考链接

https://ww2.mathworks.cn/help/ros/ug/get-started-with-ros-2.html

https://ww2.mathworks.cn/help/ros/index.html?s_tid=CRUX_lftnav

https://blog.csdn.net/m0_63285685/article/details/126661793

https://zhuanlan.zhihu.com/p/403239735?utm_id=0