ROS2与Matlab入门教程-管理ROS2应用程序中的服务质量策略
说明:
- 介绍如何使用ROS2管理应用程序的服务质量 (QoS)
步骤:
启动机器人模拟器
为TurtleBot启动ROS2模拟器并配置与机器人模拟器的MATLAB连接
启动Ubuntu虚拟机
在 Ubuntu 桌面上选择Gazebo ROS2 Maze以启动为本示例构建的 Gazebo 世界
- 在 MATLAB 命令行窗口中输入这些命令,以验证机器人模拟器中的主题在 MATLAB 中是否可见
setenv( 'ROS_DOMAIN_ID' , '25' )
ros2( 'topic' , 'list' )
/camera/camera_info
/camera/image_raw
/clock
/cmd_vel
/imu
/joint_states
/ odom
/parameter_events
/rosout
/scan
/tf
设置 ROS 2 通信
创建两个 ROS 2 节点:/robotDataProcessingNode和/humanOperatorNode
接收传感器数据以/robotDataProcessingNode进行处理并发布消息以跟踪检测到的标志数量。发送速度命令以在/humanOperatorNode环境中驱动 TurtleBot,并在检测到标志时收到确认
domainID = 25;
robotDataProcessingNode = ros2node("/robotDataProcessingNode",domainID);
humanOperatorNode = ros2node("/humanOperatorNode",domainID);
- 该图总结了 MATLAB 和机器人模拟器之间的交互
创建发布者和订阅者以通过 ROS 2 网络将消息中继到机器人模拟器和从机器人模拟器中传出。
发布者和订阅者对可以具有兼容但不同的 QoS 策略,除非订阅者的任何 QoS 策略比发布者的更严格。
例如,您必须通过可靠通道将速度命令从发布者传递给订阅者。为保证兼容性,将发布者的策略"Reliability"和"Durability"QoS策略分别指定为“ reliable”和“ transientlocal”。此配置指示控制器为可靠地发送消息而提供的最高质量。
如果机器人上的接收器没有配备良好的硬件来可靠地处理消息,您可以为订阅者设置较低的 QoS 标准。因此,指定"Reliability"和"Durability"besteffort订阅者对“ ”和“ ”的QoS策略volatile分别是接收者愿意接受的最低质量。
Reliability这些 QoS 设置演示了指定“ ”和“ Durability”参数的最佳实践具有“ ”或“ ”.策略的发布者不会连接到具有“ ”或“ ”策略的订阅者。因为订阅者要求的 QoS 标准比发布者提供的更高,所以不能保证发布者消息的传递。besteffortvolatilereliabletransientlocal
velPub = ros2publisher(humanOperatorNode, "/cmd_vel" , "geometry_msgs/Twist" , "Reliability" , "reliable" , "Durability" , "transientlocal" , "Depth" ,5);
要接收以高速率发布的传感器数据的最新读数,请将“Reliability订阅者的 QoS 策略”设置为“ besteffort” ,并将Durability“策略”设置为“ volatile”,并设置较小的"Depth"值
这些设置通过减少发送和接收消息确认的开销时间来实现高速通信,并确保订阅者处理最新消息
这些设置可能导致订阅者无法在有损或高流量网络中接收消息,或者如果处理无法跟上,则不会处理收到的所有消息。将此 QoS 策略应用于相机和激光雷达传感器
imageSub =ros2subscriber(robotDataProcessingNode,"/camera/image_raw","sensor_msgs/Image","Reliability","besteffort","Durability","volatile","Depth",5);
laserSub =ros2subscriber(robotDataProcessingNode,"/scan","sensor_msgs/LaserScan","Reliability","besteffort","Durability","volatile","Depth",5);
由于里程计对于将激光雷达扫描置于上下文中至关重要,因此丢弃的里程计消息会导致误导性激光雷达读数。
为防止消息丢失,Gazebo 节点中里程计发布者的可靠性和持久性策略分别为“ reliable” 和“ transientlocal”。由于此特定算法不需要过去的消息,因此将里程计订阅者的 QoS 策略指定为“ reliable”和“ volatile”。
odomSub = ros2subscriber(robotDataProcessingNode,"/odom","nav_msgs/Odometry","Reliability","reliable","Durability","volatile","Depth",5);
在这个例子中,机器人当前阶段的信息更新频率较低,并且在订阅者收到下一条消息之前,最新收到的消息中的值都适用。创建一个发布者,该发布者可以可靠地发送消息并将其存储以供后期加入的订阅者使用。
如果“Depth"发布者”的值足够大,订阅者在加入网络时就有可能请求发布者的全部历史。配置/signCounter主题的发布者, Reliability“策略设置为” reliable“ ,” Durability“策略设置为” transientlocal", and" Depth" 值设置为100.
stagePub = ros2publisher(robotDataProcessingNode, "/signCounter" , "std_msgs/Int8" , "Reliability" , "reliable" , "Durability" , "transientlocal" , "Depth" ,100);
- 此表总结了五对发布者和订阅者的 QoS 策略
要使消息通过主题成功地从发布者传递到订阅者,它们的 QoS 策略必须兼容。表中的发布者并不总是与其对应的订阅者具有相同的 QoS 参数,但它们仍然是兼容的。
例如,在摄像头传感器、速度命令和激光扫描主题中,“ reliable” 发布者和“ besteffort” 订阅者可以连接。该连接的行为类似于“ besteffort”连接,订阅者收到消息时不进行确认。
类似地,在里程计和速度命令主题中,transientlocal“发布者”和volatile“订阅者”具有兼容的 QoS 策略。发布者保留已发布的消息,而订阅者不请求任何先前发送的消息。
运行遥控控制器移动机器人。处理传感器数据以帮助机器人在环境中进行可视化和导航。当机器人靠近一个标志时,标志检测算法会输出一条确认消息,其中包含寻找下一个标志的指令。重复此任务,直到机器人到达停止标志
[laserPlotObj,imageAxesHandle,signText,axesHandle] = ExampleHelperQoSTurtleBotSetupVisualizer(velPub);
% Wait to receive sensor messages before starting the control loop
receive(laserSub,5);
receive(odomSub,5);
receive(imageSub,5);
% Set callback functions for subscribers
imageSub.NewMessageFcn = @(msg)ExampleHelperQoSTurtleBotPlotImage(msg,imageAxesHandle);
laserSub.NewMessageFcn = @(msg)ExampleHelperQoSTurtleBotPlotScan(msg,laserPlotObj,odomSub);
r = rateControl(10);
LastStage = false;
while ~LastStage
[~,blobSize,blobX] = ExampleHelperQoSTurtleBotProcessImg(imageSub.LatestMessage); % Process image
[nextStage,LastStage,stageMsg,textHandle] = ExampleHelperQoSTurtleBotSignDetection(LastStage,signText,blobX,blobSize,stagePub,axesHandle); % Sign detection algorithm
if nextStage && ~LastStage % When the algorithm detects a sign, publish a message to keep track of it.
send(stagePub,stageMsg);
end
waitfor(r);
end
- 当传感器检测到停车标志时,在/humanOperatorNode节点中创建一个新的订阅者,以请求发布者历史中过去的消息。提取所有检测到的迹象的信息
send(stagePub,stageMsg);
stageSub = ros2subscriber(humanOperatorNode,"/signCounter","std_msgs/Int8","Reliability","reliable","Durability","transientlocal","Depth",100);
stageSub.NewMessageFcn = @(msg)ExampleHelperQoSTurtleBotSignCountUpdate(msg,textHandle);
pause(2); % Allow time for the persisting messages to be received and processed
% Clean up entities in ROS 2 to remove them from the network.
clear laserSub odomSub velPub imageSub stagePub stageSub robotDataProcessingNode humanOperatorNode
观察有损网络中服务质量策略的效果
reliable在低流量和无损网络中,和best-effort通信几乎没有区别。要可视化不同的 QoS 策略如何处理有损或高流量的网络连接,请使用流量控制实用程序来模拟具有延迟的网络。在 VM 上,打开一个新终端并输入此命令
sudo tc qdisc add dev ens33 root netem delay 0.5ms
ens33流量控制实用程序模拟网络接口上所有数据包的固定延迟量。再次运行示例,观察由于通信中的一些丢帧导致的图像流的卡顿效果"best-effort"。如果将图像订阅者更改为 " reliable",图像流会变得平滑,但由于网络延迟,会略微落后于实际机器人视点。
要进行清理,请输入此命令以消除人为网络延迟。
sudo tc qdisc delete dev ens33 root netem delay 0.5ms
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号