BLOG

AWS RoboMaker, Batch Simulation API로 시뮬레이션 작업 일괄 지원
작성일: 2020-04-02

로봇 애플리케이션 개발할 때 시뮬레이션을 사용함에 있어 많은 이점이 있습니다. 첫째, 회사는 신제품에 대한 아이디어를 가지고 있고 물리적 하드웨어에 투자하기 전에 프로토타입을 디자인하고 테스트하고 반복하기를 원할 수 있습니다. 둘째, 만약 여러분이 물리적인 로봇을 만든 상태라면, 개발자들은 이러한 값비싸고 큰 물리적인 로봇에 직접 접근하는데 한계가 있을 수 있고 이는 결국 그들의 활발한 개발 작업에 한계로 작용하게 됩니다. 셋째, 개발자들이 물리적인 로봇에 접근할 수 있다면, 팀 전체에서 이 구성을 일관되게 유지하고 코드가 마찰 없이 쉽게 통합되게 만드는 것이 어려울 수 있습니다. 일단 개발자들이 코드를 테스트할 준비가 완료되면, 로봇들이 마주치게 될 실제 시나리오와 장소를 거의 무제한으로 가질 수 있습니다. .

 

시뮬레이션이 가치를 창출하고 개발을 가속화하여 코드의 퀄리티를 향상 시킬 수 있습니다. 시뮬레이션은 개발자가 테스트를 할 수 없는 지역이나 심지어 다른 행성에서도 로봇을 구축하고 테스트 할 때 매우 유용합니다. 게다가 개발자는 로봇 애플리케이션을 10,000시간 이상 실행하고 테스트 하여 버그를 찾아낼 것입니다. 시뮬레이션을 돌리다 보면, 클록 시간을 단축하여 코드의 내구성을 보장하고 애플리케이션이 하드웨어 수명에 미치는 영향을 확인할 수 있습니다.

 

시뮬레이션은 가치를 높이고, 개발을 가속화하며, 코드 품질을 개선할 수 있는 영역입니다. 이는 특히 개발자들이 멀리 떨어진 장소, 위험한 상황 또는 물리적 테스트 환경을 이용할 수 없는 다른 행성에서 작동하는 로봇을 만들고 시험하고자 할 때 유용합니다. 예를 들어 개발자들은 코드를 테스트하고 버그를 식별하기 위해 로봇 애플리케이션을 10,000시간 동안 실행하기 원할 수 있습니다. 이 때 시뮬레이션에서 그 코드가 내구성이 있는지 확인하고 그 어플리케이션이 하드웨어 수명에 어떤 영향을 미치는지 보기 위해 클럭 시간을 단축할 수 있습니다. 시뮬레이션에서 이와 같은 테스트를 자동화하고 CI/CD 파이프라인의 일부처럼 반복/정기적으로 실행하면 도입된 버그 수를 줄이고 코드의 품질, 안전 및 준비 상태를 개선하여 소프트웨어 릴리스 라이프사이클을 크게 단축할 수 있습니다. 마지막으로, 개발자들은 기계 학습 모델을 훈련시키기 위해 배치 시뮬레이션을 사용할 수 있습니다. 이렇게 클럭 시간을 단축하고 AWS에서 수평적으로 확장 가능한 컴퓨팅과 병행하여 많은 시뮬레이션을 실행함으로써, 물리적 데이터를 캡처할 때보다 더 빠르고 합리적인 가격으로 ML 모델을 훈련시킬 수 있습니다.

 

AWS RoboMaker 는 완전히 관리되는 로봇 시뮬레이션 서비스를 제공하며, 시뮬레이션에서 ROS 및 ROS2 애플리케이션을 실행하는 데 사용할 수 있습니다. 또한 시뮬레이션의 복잡성에 따라 기반 인프라를 자동으로 확장합니다. 또한 AWS는 새로운 AWS RoboMaker Batch Simulation API를 출시해 이제는 일괄적으로 시뮬레이션 작업을 만드는 것이 그 어느 때보다 쉬워졌습니다. 이 기능으로 고객은 간단한 API 호출을 통해 대규모 배치 시뮬레이션 작업을 쉽게 만들 수 있습니다. 이에 대한 일환으로 오늘 메가존 테크블로그에서는 새로운 API와 사용법을 소개해 드리겠습니다.

 

 

 

AWS RoboMaker의 배치 시뮬레이션

 

시작을 위해 먼저 작업 배치를 정의하는데 사용할 입력 JSON 파일을 살펴보겠습니다. 아래의 예에서 CloudWatch Robot Monitoring Sample Application을 사용하고 다른 환경 변수를 가진 일련의 시뮬레이션을 시작해 보겠습니다.

{

       “batchPolicy”: {

             “timeoutInSeconds”: 800,

             “maxConcurrency”: 2

       },

       “createSimulationJobRequests”: [{

                    “failureBehavior”: “Fail”,

                    “iamRole”: “string”,

                    “maxJobDurationInSeconds”: 600,

                    “outputLocation”: {

                           “s3Bucket”: “<S3_BUCKET_NAME>”,

                           “s3Prefix”: “logs”

                    },

                    “robotApplications”: [{

                           “application”: “<ROBOT_APPLICATION_ARN>”,

                           “applicationVersion”: “1”,

                           “launchConfig”: {

                                 “launchFile”: “rotate.launch”,

                                 “packageName”: “hello_world_robot”,

                                 “environmentVariables”: {

                                        “ROS_AWS_REGION”: “us-west-2”

                                 }

                           }

                    }],

                    “simulationApplications”: [{

                           “application”: “<SIMULATION_APPLICATION_ARN>”,

                           “applicationVersion”: “1”,

                           “launchConfig”: {

                                 “launchFile”: “empty_world.launch”,

                                 “packageName”: “hello_world_simulation”,

                                 “environmentVariables”: {

                                        “ROS_AWS_REGION”: “us-west-2”,

                                        “TURTLEBOT3_MODEL”: “waffle_pi”,

                                        “NAVIGATION_SUCCESS_COUNT”: “1”,

                                        “SIMULATION_WORLD”: “small_house”,

                                        “SIM_TIMEOUT_SECONDS”: “600”

                                 }

                           }

                    }],

                    “tags”: {

                           “myJobTagKey”: “myJobTagValue”

                    }

             },

             {

                    “failureBehavior”: “Fail”,

                    “iamRole”: “string”,

                    “maxJobDurationInSeconds”: 600,

                    “outputLocation”: {

                           “s3Bucket”: “<S3_BUCKET_NAME>”,

                           “s3Prefix”: “logs”

                    },

                    “robotApplications”: [{

                           “application”: “<ROBOT_APPLICATION_ARN>”,

                           “applicationVersion”: “1”,

                           “launchConfig”: {

                                 “launchFile”: “rotate.launch”,

                                 “packageName”: “hello_world_robot”,

                                 “environmentVariables”: {

                                        “ROS_AWS_REGION”: “us-west-2”

                                 }

                           }

                    }],

                    “simulationApplications”: [{

                           “application”: “<SIMULATION_APPLICATION_ARN>”,

                           “applicationVersion”: “1”,

                           “launchConfig”: {

                                 “launchFile”: “empty_world.launch”,

                                 “packageName”: “hello_world_simulation”,

                                 “environmentVariables”: {

                                        “ROS_AWS_REGION”: “us-west-2”,

                                        “TURTLEBOT3_MODEL”: “waffle_pi”,

                                        “NAVIGATION_SUCCESS_COUNT”: “1”,

                                        “SIMULATION_WORLD”: “bookstore”,

                                        “SIM_TIMEOUT_SECONDS”: “600”

                                 }

                           }

                    }],

                    “tags”: {

                           “myJobTagKey”: “myJobTagValue”

                    }

             }

       ],

       “tags”: {

             “myBatchTagKey”: “myBatchTagValue”

       }

}

 

첫 번째 블록은 batch policy입니다. 이 섹션에서 배치 작업의 매개 변수를 정의합니다. 포함되는 내용은 다음과 같습니다.

 

  • timeoutInSeconds: 모든 배치 시뮬레이션 작업을 터미널 상태로 실행할 수 있는 최대 시간
  • maxConcurrency: 시뮬레이션 작업 배치에서 병렬로 실행할 시뮬레이션 작업 수. 시뮬레이션 작업 배치에서 병렬로 실행할 시뮬레이션 작업 수입니다. AWS RoboMaker의 동시 시뮬레이션 작업의 기본 제한은 10개 입니다. 만약 10개 이상의 동시 시뮬레이션 작업을 실행해야 하는 경우 이 제한을 늘릴 수 있습니다.

 

두 번째 블록에는 일련의 작업 요청이 포함되어 있습니다. 여기서 실행할 시뮬레이션 작업을 정의합니다. 그 후 어레이(array)의 각 항목은 개별 시뮬레이션 작업을 시작하게 됩니다. 형식은 단일 CreateSimulationJob 요청에 대한 입력 파라미터와 동일한 구조로 다음의 항목들이 포함됩니다.

 

  • maxJobDurationTimeout: 단일 시뮬레이션 작업이 종료되기 전 실행되는 시간
  • iamRole: 시뮬레이션 작업이 가정할 수 있는 IAM 역할. 시뮬레이션 작업이 S3, CloudWatch 등 AWS 리소스에 액세스 하는 경우 이 역할에 적절한 IAM 정책을 첨부해야 합니다.
  • failureBehaviour: 애플리케이션 또는 기본 시스템에 오류 발생 시, 작업을 즉시 종료하거나 계속 실행하여 문제 해결을 수행하도록 선택할 수 있습니다.
  • robotApplications: 해당 시뮬레이션 작업에서 실행할 로봇 애플리케이션 세트. 이러한 애플리케이션은 일반적으로 시뮬레이션 자산을 포함하지 않으며 로봇에서 실행되도록 의도된 코드베이스를 포함합니다.
    • application: 시뮬레이션에 사용할 로봇 애플리케이션 Amazon Resource Name(ARN). 새로운 로봇 애플리케이션을 생성할 때, 코드 아티팩트가 S3에 저장되는 위치와 사용할ROS/ROS2는 릴리즈를 정의합니다.
    • launchConfig: 시뮬레이션 작업이 시작될 때 호출할 시작 파일 및 패키지 이름.
    • packageName: 애플리케이션의 ROS 패키지 이름.
    • launchFile: 애플리케이션을 시작하는데 사용할 ROS 시작파일입니다.
    • environmentVariables: 애플리케이션에서 사용할 환경 변수. 이것은 다른 시나리오에 대한 시뮬레이션을 매개변수화하기 좋은 방법입니다.
    • portForwardingConfig: 일부 애플리케이션은 다른 시뮬레이션 작업 또는 AWS RoboMaker 시뮬레이션 외부에서 실행되는 back-end 시스템과의 통신을 위해 기본 호스트에서 포트를 열도록 요구합니다.
    • tags: 개별 시뮬레이션 작업을 식별하고 주석을 추가하는데 사용할 수 있는 키 값의 모음입니다.
  • SimulationApplications: 해당 시뮬레이션 작업에서 실행할 시뮬레이션 애플리케이션 세트입니다. 이 애플리케이션에는 시뮬레이션 자산(예: URDF 파일 및 Gazebo 월드 파일과 같은 3D 모델 자산)과 시뮬레이션에서 실행하려는 시나리오 및 테스트 애플리케이션이 모두 포함될 수 있습니다. 위의 로봇 애플리케이션과 동일한 매개 변수를 필요로 합니다.

 

최종 tags 블록을 사용하면 시뮬레이션 작업 배치 리소스에 사용할 별도의 키-값 쌍 집합을 정의할 수 있습니다.

 

 

 

시뮬레이션 작업 배치 실행

 

시뮬레이션 작업을 일괄적으로 시작하려면 AWS CLI 또는 AWS SDK를 사용하십시오. 먼저 위의 JSON을 복사하여 “batchSimulationLaunch.json”으로 저장하십시오. 아래를 시작하기 전에 AWS CLI가 설치되어 있고 IAM 사용자 자격 증명이 RoboMaker 시뮬레이션을 생성할 수 있는지 확인하십시오. 다음으로는 샘플 로봇과 시뮬레이션 애플리케이션을 쉽게 만들기 위해 로봇 모니터링 샘플 애플리케이션을 시작하고 AWS RoboMaker Console을 사용하여 리소스를 생성해 보겠습니다.

 

    1. AWS Console을 열고 AWS RoboMaker를 여십시오.
    2. Resources 탭에서 Sample Applications을 클릭하십시오.
    3. Robot Monitoring의 라디오 박스를 클릭하십시오. 그리고는 Launch simulation job을 클릭하십시오. 이제 자산을 지원하는 로봇과 시뮬레이션 애플리케이션이 만들어지고 단일 시뮬레이션 작업이 시작될 것입니다. 이 과정에선 다음의 사항들을 참고해 주시기 바랍니다.
      • 필요한 AWS 인프라가 생성되어 애플리케이션 액세스가 CloudWatch 와 다른 AWS 서비스에 게시되도록 허용합니다.
      • ROS1 샘플 애플리케이션은 이미 colcon(ROS 애플리케이션용 빌드 및 번들 도구)을 사용하여 사용자 대신 구축되어 번들을 제공합니다. GitHub에서 애플리케이션 코드를 보시려면 여기를 클릭해 주십시오. Colcon을 사용하여 AWS RoboMaker용 애플리케이션 구축하는 방법이 궁금하시다면 여기를 클릭하십시오.
      • 번들 파일은 AWS S3(부속성과 빌드 ROS 패키지가 모두 포함된 타르 파일)로 복사되어 S3 버킷으로 스테이징됩니다.
      • 로봇과 시뮬레이션 애플리케이션은 AWS 로보메이커에서 위에서 S3 버킷에 있는 타르 파일을 참조하여 생성됩니다.
    4. 앞의 작업이 완료되면 AWS RoboMaker 콘솔로 돌아가 Development에서 Robot Application을 클릭하십시오. 위의 프로세스에서 만든 로봇 애플리케이션을 찾아 여십시오. ARN을 복사하고, 위의 템플릿에서 생성한 json파일의 각 섹션에서 <ROBOT_APPLICATION_ARN>을 교체하십시오.
    5. 시뮬레이션 어플리케이션에 대해서도 동일한 과정을 진행하는데 이번엔json 파일의 각 시뮬레이션 어플리케이션 섹션에 있는 <SIMULATION_APPLICATION_ARN> 을 교체합니다.
    6. json파일을 저장하십시오.
    7. 아래의 CLI 명령어를 실행하십시오:

        aws robomaker start-simulation-job-batch –cli-input-json file://batchSimulationLaunch.json

    1. AWS RoboMaker 콘솔로 돌아와 Simulations 아래의 Simulation job batches를 클릭합니다. 실행을 준비중인 시뮬레이션 작업 배치들의 상황을 봐야 합니다.
    2. 실패, 보류, 생성 중인 요청을 포함하여 현재의 배치 작업 상태를 확인하려면 생성된 배치 작업의 ARN을 사용하여 다음 CLI 설명 명령을 실행하십시오.

        aws robomaker describe-simulation-job-batch –batch <YOUR_BATCH_JOB_ARN>

 

 

 

시뮬레이션 작업 배치 취소

 

시뮬레이션 작업 배치가 실행되고 나면, 다음의 단계를 통해 작업을 쉽게 취소할 수 있습니다.

  1. 왼쪽 탐색기 창에서 Simulations을 선택하고 Simulation job batches를 선택하십시오.
  2. 취소하고자 하는 시뮬레이션 작업 배치 ID를 선택하십시오.
  3. Simulation job batch detail 페이지에서 Batch actions 아래에 있는 Cancel batch를 선택하십시오.
  4. Cancel simulation job batch에서 Cancel을 선택하십시오.

프로그래밍 방식으로 또는 AWS CLI를 통해 작업을 취소하려면 다음 명령을 실행하십시오..

aws robomaker cancel-simulation-job-batch –batch <YOUR_SIMULATION_JOB_BATCH_ARN>

위의 접근방법 외에도 AWS RoboMaker 시뮬레이션 용 로컬 ROS 서비스 프록시를 사용하여 애플리케이션 내에서 개별 작업을 취소하고 태그를 지정할 수 있습니다.

import rospy

import rostest

import time

import os

import unittest

from robomaker_simulation_msgs.msg import Tag

from robomaker_simulation_msgs.srv import Cancel, AddTags

class SimulationUtils():

    “””

    A set of utilities to use in AWS RoboMaker simulation.

    “””

    def cancel_job(self):

        rospy.wait_for_service(“/robomaker/job/cancel”)

        requestCancel = rospy.ServiceProxy(“/robomaker/job/cancel”, Cancel)

        response = requestCancel()

        if response.success:

            self.is_cancelled = True

            rospy.loginfo(“Successfully requested cancel job”)

            self.set_tag(name=self.test_name + “_Time_Elapsed_End”, value= str(time.time()).split(“.”, 1)[0])

        else:

            rospy.logerr(“Cancel request failed: %s”, response.message)

    def set_tag(self, name, value):

        rospy.wait_for_service(“/robomaker/job/add_tags”)

        requestAddTags = rospy.ServiceProxy(“/robomaker/job/add_tags”, AddTags)

        tags = ([Tag(key=name, value=value)])

        response = requestAddTags(tags)

    if response.success:

        rospy.loginfo(“Successfully added tags: %s”, tags)

    else:

        rospy.logerr(“Add tags request failed for tags (%s): %s”, tags, response.message)

 

 

 

시뮬레이션 작업 배치 복제

 

CreateSimulationJobBatch API를 사용하여 시뮬레이션 작업 배치를 구성하고 실행 한 후에는 나중에 이를 다시 사용할 수 있도록 배치 작업을 복제할 수 있습니다. 위의 JSON파일에서 정의한 로봇 및 시뮬레이션 애플리케이션 ARN은 S3에 저장된 최신 코드를 참조합니다. CI/CD 워크플로우의 일부로 배치 시뮬레이션을 사용하는 경우 새 코드가 작성되고 번들로 채워질 때 이전 배치 작업을 편하게 복제하여 회귀 테스트를 실행할 수 있습니다. 두 번째로, 단일 시나리오가 테스트에서 실패 한 경우, 모든 시뮬레이션 작업을 다시 실행하는 대신 테스트가 실패한 단일 시뮬레이션 작업을 복제하여 실행할 수 있습니다. 마지막으로 배치 시뮬레이션을 사용하여 ML 교육 작업을 실행 하고자 하는 경우, 이전 배치를 복제함으로 새로운 훈련 작업을 실행할 수 있습니다. 시뮬레이션 작업 배치를 복제하는 방법은 다음과 같습니다:

 

  1. 왼쪽 탐색 창에서 Simulations을 선택한 뒤 Simulation job batches를 선택하십시오.
  2. 복제하려는 작업 배치의 ID를 선택하십시오.
  3. 전체 배치를 복제하려면 Simulation job batch detail 페이지에서 Batch action 아래 Clone batch를 선택하십시오.
  4. 배치에서 특정 시뮬레이션 작업 요청을 복제하려면 Simulation job requests아래에서 복제하고자 하는 시뮬레이션 작업 요청을 확인하고, Request actions을 클릭한 뒤 Clone request를 선택하십시오.
  5. Clone simulation job batch페이지에서 Submit를 선택하십시오.

 

 

 

글을 마치며…

 

오늘은 시뮬레이션을 통해 로봇 애플리케이션 개발자가 어떻게 버그의 수를 줄이고 출시된 생산 준비 기능의 속도와 수를 증가시킬 수 있는지를 다루어 보았습니다. 그 중에서도 특히 AWS RoboMaker를 위한 Batch Simulation API라는 신규 기능을 집중적으로 다루어 봤습니다. 이는 배치 시뮬레이션 작업을 보다 쉽게 시작하고 많은 시나리오를 테스트하여 여러 가지 교육 작업을 병렬로 실행할 수 있게 합니다. 이 새로운 기능을 적극적으로 활용하여 여러분의 개발 팀이 테스트 범위를 개선하고, 소프트웨어 출시 주기를 단축하며, 새롭고 흥미로운 서비스를 보다 쉽게 소비자에게 제공하길 바라겠습니다.

 

 

원문 URL: https://aws.amazon.com/ko/blogs/robotics/introducing-batch-simulation-api-for-aws-robomaker/

** 메가존클라우드 TechBlog는 AWS BLOG 영문 게재 글 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 개제하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달 드리도록 하겠습니다.