0. 简介

对于ROS1而言,其在Matlab当中相较于ROS2还有一些比较高级的用法,比如说我们接下来要说的Action和Gazebo仿真。

1. ROS Action

ROS的Action行为模式当中也存在有一个客户端到服务器的通信关系。Action行为模式使用ROS主题将目标消息从客户机发送到服务器。在接收到目标后,服务器对其进行处理并将信息返回给客户端。这些信息包括服务器的状态、当前目标的状态、操作期间对目标的反馈,以及目标完成时的结果消息。


使用sendGoal函数将目标发送到服务器。发送目标并使用sendGoalAndWait等待它完成。这个函数使您能够返回结果消息、目标的最终状态和服务器的状态。当服务器执行一个目标时,会调用回调函数FeedbackFcn来提供与该目标相关的数据(参见SimpleActionClient函数)。使用cancelGoal取消当前目标或使用cancelAllGoals取消服务器上的所有目标。

在目标执行期间,使用sendFeedback函数向客户端发送反馈消息。在目标执行期间,服务器调用ExecuteGoalFcn回调。您可以在回调函数中使用isPreemeptRequested 来检查客户端是否取消了目标或发送了一个新的目标来执行。

上面图片为Matlab中ROS Action的执行步骤,下面具体来看一下大致的流程。

要设置ROS操作服务器,需要使用rosactionserver。在MATLAB命令窗口中输入rosaction list,检查ROS网络上可用的操作。

使用rosactionclient创建动作客户端并将它们连接到服务器。指定ROS网络上当前可用的操作类型。使用waitForServer等待操作客户端连接到服务器。

使用sendGoal发送一个目标。定义一个对应于动作类型的goalMsg。当您使用rosactionclient创建一个动作客户端时,将返回一个空白的goalMsg。您可以使用所需的参数修改此消息。

当目标状态变为’active’时,目标开始执行,并调用ActivationFcn回调函数。有关修改此回调函数的更多信息,请参见SimpleActionClient

当目标状态保持“active”时,服务器继续执行目标。每当收到新的反馈消息时,反馈回调函数就会定期处理关于此目标执行的信息。使用FeedbackFcn访问或处理从ROS服务器发送的消息数据。

当目标实现时,服务器返回结果消息和状态。使用ResultFcn回调访问或处理结果消息和状态。

cb = @fibonacciExecution; 
server = rosactionserver("/fibonacci","actionlib_tutorials/Fibonacci",ExecuteGoalFcn=cb,DataFormat="struct")


function [result,success] = fibonacciExecution(src,goal,defaultFeedback,defaultResult)

    % Initialize variables
    success = true;
    result = defaultResult;
    feedback = defaultFeedback;
    feedback.Sequence = int32([0 1]);

    for k = 1:goal.Order
        % Check that the client has not canceled or sent a new goal
        if isPreemptRequested(src)
            success = false;
            break
        end

        % Send feedback to the client periodically
        feedback.Sequence(end+1) = feedback.Sequence(end-1) + feedback.Sequence(end);
        sendFeedback(src,feedback)

        % Pause to allow time to complete other callbacks (like client feedback)
        pause(0.2)
    end

    if success
        result.Sequence = feedback.Sequence;
    end

end


client = rosactionclient("/fibonacci","actionlib_tutorials/Fibonacci",DataFormat="struct");
goal = rosmessage(client);
goal.Order = int32(10);
result = sendGoalAndWait(client,goal);
result.Sequence

2. ROS Gazebo

Gazebo是一个模拟器,允许在测试和实验环境中来完成现实物理场景的仿真。Gazebo在机器人技术中是一个有用的工具,因为它允许您使用带有物理属性的真实场景和良好的图形快速创建和运行实验。MATLAB通过ROS接口连接到Gazebo。

2.1 下载虚拟机

您可以下载已经安装了ROS和Gazebo的虚拟机映像。此虚拟机基于UbuntuLinux,并已预先配置为支持ROS Toolbox™中的示例。

  1. 下载并安装ROS虚拟机

  2. 启动虚拟机。

  3. 在Ubuntu桌面上,你可以看到多个Gazebo世界启动脚本,以及其他实用工具的快捷方式。对于TurtleBot®示例,使用Gazebo Empty, Gazebo House, Gazebo Office, 或者 Gazebo Sign Follower 的ROS图标。

  4. 点击Gazebo House

    注意:如果屏幕完全是黑色的,请通过最小化然后最大化来刷新图像。

  5. 在Ubuntu虚拟机中打开一个新终端。

  6. 输入ifconfig并返回以查看虚拟机的网络信息。

  7. 在eth0下面,inet addr显示虚拟机的IP地址。


为了建立网络,必须设置两个ROS环境变量ROS_MASTER_URI和ROS_IP。如果您正在使用Linux®虚拟机桌面中的演示,这些变量通常在启动时自动设置。

如果您正在使用自己的虚拟机,请在终端中执行以下命令设置变量。将IP_OF_VM替换为通过ifconfig获取的IP地址:

echo export ROS_MASTER_URI=http://IP_OF_VM:11311 >> ~/.bashrc
echo export ROS_IP=IP_OF_VM >> ~/.bashrc

使用echo $ENV_VAR检查环境变量(用适当的环境变量替换ENV_VAR)。您可以关闭并重新打开终端以使其生效。

演示了正确的环境变量分配(使用假IP地址)

2. ROS Gazebo与ROS Action

上两小节介绍了ROS Action和ROS Gazebo。启动虚拟机后,使用桌面快捷方式启动Gazebo Empty world,打开终端窗口。为了运行Turtlebot ROS动作服务器,请在ROS分发终端上使用此命令。

~/start-turtlebot-move-action-server.sh


连接ROS网络。必须在此网络上设置ROS操作服务器。将ipaddress修改为您的ROS网络地址。

ipaddress = "192.168.178.133";
rosinit(ipaddress,11311);

使用NodeURI http://192.168.178.1:57929/初始化全局节点/matlab_global_node_88888

查看网络上可用的ROSAction行为。您应该看到/turtlebot_move可用

rosaction list

/turtlebot_move

创建一个简单的操作客户端以连接到操作服务器。指定动作名称。goalMsg是用于指定目标参数的目标消息。为了提高效率,使用struct消息格式。

[client,goalMsg] = rosactionclient("/turtlebot_move","turtlebot_actions/TurtlebotMove","DataFormat","struct");
waitForServer(client);

为目标设定参数。goalMsg包含前进距离和转弯距离的属性。指定你想让机器人转向的方向和角度。这个例子将机器人向前移动2米。

goalMsg.ForwardDistance = single(2);
goalMsg.TurnDistance = single(0);

将反馈函数设置为空,以便在目标执行期间没有任何输出。保留FeedbackFcn作为默认值,以打印目标执行的反馈信息。

client.FeedbackFcn = [];

将目标消息发送到服务器。等待它执行并获得结果消息。

[resultMsg,~,~] = sendGoalAndWait(client,goalMsg)

resultMsg = struct with fields:
MessageType: ‘turtlebot_actions/TurtlebotMoveResult’
TurnDistance: 0
ForwardDistance: 2.0078

4. 参考链接

https://ww2.mathworks.cn/help/ros/ug/ros-actions.html

https://ww2.mathworks.cn/help/ros/ug/move-a-turtlebot-robot-using-ros-actions.html