ROS 容器常见问题 - AWS RoboMaker

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

ROS 容器常见问题

本页列出了与将基于 ROS 的机器人和模拟应用程序迁移到适合在 AWS RoboMaker 运行的 Docker 容器相关的常见问题和答案。

我们的工作流程使用colcon 捆绑的机器人和模拟应用程序提交模拟作业。我是否需要迁移?

是的,您必须迁移。迁移步骤见 将 ROS 应用程序迁移到容器

我不确定我的机器人和模拟应用程序是否需要迁移。我怎么能分辨出来?

您可以通过 AWS 控制台或 AWS CLI 查看。有关说明,请选择以下适用的选项卡。

Using the console
  1. 登录到 AWS RoboMaker 控制台

  2. 在左侧导航窗格中选择 Development (开发),然后选择 Simulation applications (模拟应用程序)

  3. 选择模拟应用程序的 名称 以查看其详情。

    如果您看到常规模拟运行时系统,则无需迁移。如果您看到任何 ROS 或 Gazebo 的特定值,则必须迁移。

Using the AWS CLI

下面是一个示例 AWS CLI 命令,它执行与基于控制台的步骤等效的操作。

aws robomaker describe-simulation-application --application YOUR-SIM-APP-ARN

此命令返回指示simulationSoftwareSuiterobotSoftwareSuite(如果适用)和 environment URI 的输出。如果您将模拟运行时系统视为simulationSoftwareSuite,将常规视为robotSoftwareSuite,并且您的 environment URI 已设置,则您的模拟应用程序不需要迁移。

机器人和模拟应用程序容器如何相互通信?

这与基于 ROS 的应用程序通常使用 ROS 中间件相互通信的方式没有什么不同。但是,您必须在模拟作业请求的启动配置对象中设置一些特定于 ROS 的环境变量。

以下是您必须为机器人应用程序 launchConfig 使用的设置的示例片段。

"robotApplications": [ { "application": "YOUR-ROBOT-APP-ARN", "applicationVersion": "$LATEST", "launchConfig": { "environmentVariables": { "ROS_IP": "ROBOMAKER_ROBOT_APP_IP", "ROS_MASTER_URI": "http://ROBOMAKER_ROBOT_APP_IP:11311", "GAZEBO_MASTER_URI": "http://ROBOMAKER_SIM_APP_IP:11345" }, ... # Removed extra data for clarity } ]

以下是您必须为模拟应用程序 launchConfig 使用的设置的示例片段。

"simulationApplications": [ { "application": "YOUR-SIM-APP-ARN", "applicationVersion": "$LATEST", "launchConfig": { "environmentVariables": { "ROS_IP": "ROBOMAKER_SIM_APP_IP", "ROS_MASTER_URI": "http://ROBOMAKER_ROBOT_APP_IP:11311", "GAZEBO_MASTER_URI": "http://ROBOMAKER_SIM_APP_IP:11345" }, ... # Removed extra data for clarity } ]

如果您使用提供的 ROBOMAKER_* 字符串和端口号来设置 ROS_IPROS_MASTER_URIGAZEBO_MASTER_URI,则容器会按预期相互通信。

有关更多信息,请参阅运行模拟

我的实时因子 (RTF) 指标去了哪里? 我怎样才能恢复它?

AWS RoboMaker 不再自动发布此指标。如果您想将此指标发布到 CloudWatch,则必须将AWS RoboMaker CloudWatch Publisher包导入您的模拟应用程序,并按照 README.md 文件中提供的说明修改您的模拟启动文件。

如何取消和标记我的模拟作业?

您可以使用通用 AWS API 通过 VPC 配置自行标记或自行取消 AWS RoboMaker 模拟作业。要使用以下方法,容器必须在 VPC 中运行,并具有通过 NATIGW 到达 AWS API 的公共路由。最简单的方法是在默认 VPC 中使用公有子网连接 AWS API。如果您想在私有子网中运行模拟,也可以设置 NAT 或设置接口 VPC 端点。有关更多信息,请参阅AWS RoboMaker 和接口 VPC 端点 (AWS PrivateLink)

注意

如果您使用的是 IGW,请确保按照以下文档中的说明设置 assignPublicIp=True。如果您使用的是公共 IP,请确保您的安全组已被充分锁定。

您必须在请求参数中添加以下代码块。

vpcConfig={ 'subnets': [ 'string', ], 'securityGroups': [ 'string', ], 'assignPublicIp': True|False },

此外,AWS RoboMaker 模拟作业必须具有 IAM 角色,该角色具有标记和取消模拟作业的权限。

在模拟作业中,您可以使用 AWS CLI 或 boto3 Python 库调用公共 AWS RoboMaker API。您必须先在容器中预先安装 AWS CLI 和 boto3 库,然后才能在 AWS RoboMaker 模拟作业中使用它们。以下 Python 示例代码展示了如何取消模拟作业。

class RoboMakerUtils: def __init__(self): self.job_arn = os.getenv('AWS_ROBOMAKER_SIMULATION_JOB_ARN') self.client = boto3.client('robomaker', region_name=os.getenv('AWS_ROBOMAKER_REGION', 'us-east-1')) def tag_robomaker_sim_job(self, key, value): self.client.tag_resource( resourceArn=self.job_arn, tags={ key: str(value) } ) def cancel_robomaker_sim_job(self): self.tag_robomaker_sim_job("END_TIME", time.time()) response = self.client.cancel_simulation_job( job=self.job_arn )

如何将 Simulation WorldForge 世界导入模拟作业中?

如果您需要将 Simulation WorldForge 资源导入模拟作业,请使用 DataSource API。这允许您从世界导出作业的 Amazon S3 输出目录中将世界资产导入到模拟作业容器中您选择的目的地。

有关更多信息,请参阅在模拟中使用导出的世界

我的应用程序的日志文件未创建。发生了什么?

请确保您已在 Dockerfile 中创建了调试相关构件依赖的所有输出目录。例如,您可以将以下行添加至 Dockerfile。

RUN mkdir -p $YOUR_LOG_DIR

有关更多信息,请参阅添加自定义上传配置

我的模拟应用程序失败,原因是“参数服务器上的 run_id 与声明的 run_id 不匹配”。我应该怎么办?

如果您同时使用机器人应用程序和模拟应用程序启动 ROS 模拟作业,则应在 roslaunch 命令中添加 --wait