亚马逊AWS官方博客

AWS RoboMaker 的 CloudWatch ROS 节点提供离线支持

开发人员和机器人专家都使用多种工具来监控和诊断远程系统。Amazon CloudWatch 就是这样一种工具,它是一项监控和管理服务,可帮助用户以日志指标的形式从单个平台收集性能和运行数据。 AWS RoboMaker 的 CloudWatch 扩展是开源机器人操作系统 (ROS) 软件包,支持将日志和指标数据从远程机器人上传到云。其中许多机器人系统都在 Internet 接入不可靠或不稳定的边缘运行,从而导致与云的网络连接中断。RoboMaker CloudWatch ROS 扩展中的全新离线数据缓存功能为用户提供了恢复能力来应对网络连接问题,并提高了数据持久性。

本博文介绍 AWS RoboMaker CloudWatch Logs 和 Metrics ROS 节点(于去年在 re:Invent 2018 上推出),并展示新增的离线数据缓存功能。我们将详细介绍 ROS 节点实现、全新离线缓存的行为,以及如何在 ROS 系统上运行节点。

工作原理

RoboMaker cloudwatch_logger ROS 节点允许将 ROS 生成的日志发送到 Amazon CloudWatch Logs。该节点别出心裁,提供了订阅 /rosout_agg 主题的功能,所有日志都发布并上传到 Amazon CloudWatch Logs 服务中。可以根据日志的严重性有选择地将日志发送到 Amazon CloudWatch Logs。如果日志没有发送到 /rosout_agg,则 cloudwatch_logger 节点也可以订阅其他主题,如果获取日志时不再需要,则可以取消订阅 /rosout_agg 主题。

RoboMaker cloudwatch_metrics_collector ROS 节点可将机器人指标发布到云中,并使您能够借助自动监控和操作轻松跟踪一系列设备的运行状况。例如,对于机器人,可以跟踪机器人的指标是否显示异常。您可以轻松跟踪历史趋势和概要行为,例如资源使用情况。该节点独具创新,它提供了一个 ROS 接口来接收 ROS 监控消息并将其发布到 Amazon CloudWatch Metrics。要开始使用,您只需为您的机器人设置 AWS 凭证和权限。CloudWatch Metrics 节点可以与发布 ROS 监控消息的任何 ROS 节点一起使用;此消息可用于定义希望通过自己的节点实现发布的任何自定义数据结构。例如,AWS ROS1 运行状况指标收集器会定期衡量系统 CPU 和内存信息,并使用 ROS 监控消息将数据作为指标进行发布。

数据流:机器人或边缘设备到 Amazon CloudWatch。

离线缓存

可靠的网络连接对于确保托管在云中的服务正常运行是必不可少的。然而,对于在边缘运行的各种系统,网络连接无法得到保证。为了避免在此类事件中丢失数据,我们针对 AWS RoboMaker CloudWatch Logs 和 Metrics 扩展增加了离线数据缓存功能。如果在上传过程中发生网络中断或其他问题,系统会将传输中的数据保存到磁盘,稍后再上传(有关数据流概览,请参阅上面的图 1)。

恢复网络连接后,首先尝试上传磁盘上的最新数据。当文件中的所有缓存数据都上传完毕后,删除该文件。该功能的一个重要部分是,离线文件需要使用的磁盘空间量、它们在磁盘上的位置和单个文件的大小都是可配置参数,可以在 ROS YAML 配置文件中指定。如果已达到可配置的磁盘空间限制,则先删除最早的缓存数据。有关详细信息,请参阅项目 github README:日志和度量,以及下面的图 2。

流向 CloudWatch 的离线缓存数据流。

安装和示例

先决条件

AWS RoboMaker CloudWatch ROS 节点目前仅在 ROS Kinetic (Ubuntu 16.04) 和 Melodic (Ubuntu 18.04) 上受支持,计划未来支持 ROS2(CloudWatch-Metrics-ROS-2CloudWatch-Logs-ROS-2)。要运行这些节点,需要一个有效的 ROS 安装,您应在当前的 shell 中获取。还可以使用有效的 ROS 安装 Docker 镜像

AWS 凭证

重要提示:开始之前,必须安装配置 AWS CLI。

cloudwatch_logger 节点需要以下 AWS 账户 IAM 角色权限:

[logs:PutLogEvents, logs:DescribeLogStreams, logs:CreateLogStream, logs:CreateLogGroup]

要将策略添加到 IAM 角色权限中,请参阅以下 JSON 策略示例,将复制该策略并创建一个文件:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:PutLogEvents",
        "logs:DescribeLogStreams",
        "logs:CreateLogStream",
        "logs:CreateLogGroup"
    ],
      "Resource": [
        "arn:aws:logs:*:*:*"
    ]
  }
 ]
}

然后使用以下 AWS CLI 命令进行启用:

aws iam create-policy --policy-name cloudwatch-logs-policy —policy-document file://cloudwatch-iam-policy.json

如果成功,create-policy 命令将返回类似如下内容的 JSON 确认信息:

{
    "Policy": {
        "PolicyName": "cloudwatch-logs-policy",
        "PolicyId": "ANPAZOAGRWAWQOE6MYHEE",
        "Arn": "arn:aws:iam::648553803821:policy/cloudwatch-logs-policy",
        "Path": "/",
        "DefaultVersionId": "v1",
        "AttachmentCount": 0,
        "IsAttachable": true,
        "CreateDate": "CURRENT-TIME",
        "UpdateDate": "CURRENT-TIME"
    }
}

cloudwatch_metrics_collector 节点需要 cloudwatch:PutMetricData AWS 账户 IAM 角色权限。

通过 apt 安装 CLoudwatch ROS 节点

sudo apt-get update
sudo apt-get install -y ros-$ROS_DISTRO-cloudwatch-logger
sudo apt-get install -y ros-$ROS_DISTRO-cloudwatch-metrics-collector

注意:您还可以从源构建

运行 CloudWatch ROS 节点

日志记录节点说明

如果使用启动文件,请使用 .yaml 格式的参数(软件包源和存储库中提供了示例):

roslaunch cloudwatch_logger sample_application.launch --screen

如果不使用启动文件,则使用默认值:

rosrun cloudwatch_logger cloudwatch_logger

发送测试日志消息:

rostopic pub -1 /rosout rosgraph_msgs/Log '{header: auto, level: 2, name: test_log, msg: test_cloudwatch_logger, function: test_logs, line: 1}'

验证测试日志消息是否成功发送到 CloudWatch Logs:

  • 转到 AWS 账户。
  • 找到 CloudWatch 并单击进入。
  • 在右上角,如果使用启动文件启动节点,请将区域更改为俄勒冈 (region: "us-west-2");如果不使用启动文件启动节点,则将区域更改为弗吉尼亚北部。
  • 从左侧菜单中选择“日志”。
  • 使用启动文件:日志组的名称应为 robot_application_name 且日志流的名称应为设备名称(下面提供了使用启动文件时的示例)。
  • 不使用启动文件:日志组的名称应为 ros_log_group 且日志流的名称应为 ros_log_stream

通过命令行发送一些日志之后,CloudWatch Logs 控制台将与以下内容类似:

CloudWatch Logs 控制台示例。

注意:要了解配置参数,请参阅参数说明示例配置文件

从您自己的节点发送日志

只要您的节点发布到 /rosout_agg,系统就会自动选取日志。

下面是一个使用 turtlesim 节点的示例:

按上文示例指导启动 cloudwatch_logger 节点后,在单独的终端中运行下面的 turtlesim 节点。

rosrun turtlesim turtlesim_node

rosrun turtlesim turtle_teleop_key

TurtleSim CloudWatch 测试示例。

注意:如果您具有发布类型为 rosgraph_msgs::Log 的消息的主题,也可以通过将主题添加到 sample_configuration.yaml 上的 topics 行,将其上传到 CloudWatch。

指标节点说明

如果使用启动文件,请使用 .yaml 格式的参数(软件包源和存储库中提供了示例):

roslaunch cloudwatch_metrics_collector sample_application.launch --screen

发送测试指标:

rostopic pub /metrics ros_monitoring_msgs/MetricList '[{header: auto, metric_name: "ExampleMetric", unit: "sec", value: 42, time_stamp: now, dimensions: []}, {header: auto, metric_name: "ExampleMetric2", unit: "count", value: 22, time_stamp: now, dimensions: [{name: "ExampleDimension", value: "1"}]}]'

注意:请参阅 GitHub 存储库,了解配置文件和参数。

您还可以使用下面的 bash 脚本发送指标消息流:

./metrics-script.sh metric_script_pub_demo 1 24

使用下面的 bash 脚本发布 24 个示例指标后,AWS 指标控制台将如下所示:

CloudWatch 指标控制台示例。

用于发布多个指标消息的示例 shell 脚本:

#!/bin/bash
# Simple script to publish metrics

if [ $# -eq 0 ] || [ "$1" == "h" ] || [ "$1" == "--help" ]; then 
    echo "This script will publish a ros_monitoring_msgs/MetricList to /metrics." 
    echo "Please provide the metric name, metric value lower bound, and metric value upper bound."
    echo "Example: ./metric_publisher my_demo_metric 1 42"
    exit 0
fi

if [ "$1" == "" ]; then 
    echo "Please provide the metric name"
    exit 1
fi

if [ "$2" == "" ]; then 
    echo "Please provide the metric value lower bound"
    exit 1
fi

if [ "$3" == "" ]; then 
    echo "Please provide the metric value upper bound"
    exit 1
fi

echo "Publishing metrics with metric_name=$1, value start=$2, value end=$3"

for i in $(seq "$2" "$3")
do
  echo "Publishing metric $1 $i"
  rostopic pub -1 /metrics ros_monitoring_msgs/MetricList "[{header: auto, metric_name: '$1', unit: 'sec', value: $i, time_stamp: now, dimensions: [{name: 'Example-Script-Pub-Dimension', value: '$i'}]}]"
done

小结

在本博文中,我们讨论了如何将日志和指标数据从 ROS 节点发布到 AWS CloudWatch,以及全新离线缓存功能的工作原理,并给出了如何使用这些节点的亲身体验示例。这是一套丰富的功能,开发人员和机器人团队管理人员都可以使用这些功能记录、检查和试验机器人生成的指标和日志。我们希望本博文对您有用;如有任何改进或功能请求,请随时向我们的日志指标存储库提交支持票证,或者如果您愿意参与讨论,请提交 pull 请求,我们将会进行审核!