AWS RoboMaker를 사용해 ROS 어플리케이션 개발부터 시뮬레이션, Fleet 관리, OTA 배포까지 쭉~ 따라 해봅니다.

by Jinyong Park(박진용) / AWS, AWS RoboMaker, ROS, Robotics, Dilly, 로보메이커, 로보틱스, 딜리


로봇 개발 어떻게 해야되죠? - AWS RoboMaker 따라하기

  • 1부 : ROS 어플리케이션 개발과 시뮬레이션
  • 2부 : Fleet 관리와 OTA(over-the-air) 배포, 그리고 사용 후기 (포스팅 예정)

들어가며

작년 6월 우아한형제들은 배달의민족이 꿈꾸는 가까운 미래 배달 로봇 라이프라는 비전 영상을 공개했습니다. 그동안 로보틱스 조직이 성장하면서 시도했던 것 중에 첫 번째 기술 블로그 주제로 AWS RoboMaker를 사용해 클라우드 상에서 ROS(Robotic Operating System) 어플리케이션을 개발하는 과정을 소개해 드리려고 합니다. 이 글을 통해 ROS를 사용해 개발하셨던 로봇 전문가(Roboticists)분들께는 클라우드 기반 개발 환경인 AWS RoboMaker와 로컬 개발환경과의 차이점을 알아보고 어떻게 사용하는 것이 좋을지 결정하는 데 도움이 되었으면 하고 AWS 사용자분들께도 로봇 소프트웨어 개발을 경험해 볼 기회가 되었으면 합니다.

AWS RoboMaker는?

AWS가 지난해 11월 re:Invent에서 RoboMaker를 발표했는데요. 이 서비스는 ROS 기반의 로보틱스 어플리케이션 개발, 시뮬레이션, 테스트, 로봇 Fleet 관리, OTA(over-the-air) 배포까지 클라우드 환경에서 가능하게 해줍니다.

AWS RoboMaker Capability

[AWS RoboMaker에서 할 수 있는 것들]

이미지 출처 : https://www.slideshare.net/AmazonWebServices/announcing-aws-robomaker-a-new-cloud-robotics-service-rob201r1-aws-reinvent-2018

RoboMaker는 웹브라우저만 있으면 클릭 몇 번으로 클라우드 상에 깨끗한(?) 개발환경이 세팅되고 웹브라우저 베이스의 AWS Cloud9 IDE를 사용해 개발하고 여러 개의 시뮬레이션을 동시에 각각 다른 가상 머신 위에서 실행시킬 수 있고요. 시뮬레이션 결과도 역시 웹브라우저에서 Gazebo(가제보), rqt(알큐티), RViz(알비즈)를 띄워 확인할 수 있습니다. 그리고 완성된 어플리케이션을 AWS IoT Greengrass를 사용해 동시에 여러 대의 로봇에 배포할 수 있습니다. 이번 글에서는 이 과정을 1, 2부로 나누어 따라 해 보겠습니다.

또 ROS용 클라우드 확장(Cloud Extensions for ROS) 프로그램을 로봇에 설치해 AWS 서비스와 연동할 수 있는데 클라우드 확장 프로그램은 위에서 이야기한 RoboMaker 개발환경을 사용하지 않고 로봇에 바로 설치해서 사용할 수 있습니다. ROS 클라우드 익스텐션은 이번 글에서 다루지 않지만, 로봇에 AWS CLI 설치/설정, IAM role 수정, 클라우드 익스텐션 설치/실행 순으로 하시면 됩니다. (참고로 첫 번째 Major 버전인 v1.0.0에는 버그가 있어 제 경험으로 polly는 제대로 동작했고 kinesis는 오류가 있어 다른 브렌치를 가져다가 빌드해 해결했었습니다)

ROS 클라우드 익스텐션은 아래와 같이 6개가 있습니다.

  • Amazon Kinesis를 사용해 영상을 전송하고 Amazon Rekognition으로 비디오 분석을 추가
  • Amazon Lex와 Polly를 사용한 음성 처리
  • Amazon CloudWatch를 사용한 로봇 모니터링 및 로깅

AWS RoboMaker Overview

[AWS RoboMaker]

이미지 출처 : https://www.slideshare.net/AmazonWebServices/announcing-aws-robomaker-a-new-cloud-robotics-service-rob201r1-aws-reinvent-2018

자, 그럼 시작해볼까요? ROS 어플리케이션 개발과 시뮬레이션

AWS RoboMaker는 사용한 만큼 비용이 청구됩니다. 시작하시기 전에 RoboMaker 과금 정책을 먼저 확인하세요. 처음 AWS 가입 후 12개월동안 제공되는 AWS 프리 티어(로보메이커 25 SU-시간 무료)를 활용하거나 세미나 같은데 다니면 나눠주는 쿠폰을 활용하는 방법도 있습니다. (우아한헹제들에서는 AWS를 자유롭게 사용하고 테스트할 수 있는 놀이터라는 샌드 박스 계정을 지원합니다. 입사지원 고고~) - AWS RoboMaker 요금 확인하러 가기

첫 번째로 AWS 계정이 없다면 만들고 IAM(Identity and Access Management) 사용자를 만듭니다.

  1. https://aws.amazon.com에 접속해서 Create an AWS Account(AWS 계정 생성)를 선택해 AWS 계정을 만듭니다.

  2. AWS를 처음 사용하신다면 처음 만든 계정을 “루트 사용자”라고 합니다. 루트 권한으로 작업하시는 것은 좋지 않으니 IAM 사용자와 관리자 그룹을 생성해 다시 로그인하는 것이 좋습니다. IAM은 AWS 루트 사용자 안에 IAM 그룹과 사용자를 만들어 접근제어와 권한 관리를 세분화할 수 있습니다. 예를 들어, 어떤 IAM 사용자는 EC2만 관리할 수 있고, 어떤 IAM 사용자는 S3의 내용만 읽을 수 있도록 말이죠.

    • https://console.aws.amazon.com/iam/로 들어가서 왼쪽의 Users(사용자) -> Add user(사용자 추가)를 누릅니다.
    • User name(사용자 이름)Administrator 입력하고
    • AWS Management Console access(AWS Management Console 액세스) 선택
    • Custom password(사용자 지정 비밀번호)비밀번호를 입력합니다. 이 비밀번호는 나중에 Administrator 계정으로 로그인해서 새로운 비밀번호로 바꿔주어야 합니다.
    • Users must create a new password at next sign-in(사용자가 다음에 로그인할 때 새 비밀번호 생성 요청) 선택 후 [Next: Permissions(다음: 권한)] 클릭
    • 권한 설정 페이지에서 그룹에 사용자 추가(Add user to group) 선택 -> Create Group[그룹 생성] 클릭
    • Group name(그룹 이름)Administrators 입력 후 화면 아래에서 AdministratorAccess를 찾아 체크박스 선택 후 Create group[그룹 생성] 클릭
    • 이렇게 계정을 만들면 https://_account-ID-or-alias_.signin.aws.amazon.com/console과 비슷하게 생긴 주소를 다운로드 할 수 있습니다. IAM 사용자는 나중에 이 링크로 들어가 로그인해야 하니 북마크로 등록해두시면 편합니다.
    • 북마크한 링크로 들어가 위에서 만든 IAM 계정(Administrator)으로 로그인하고 비밀번호를 새로 설정합니다.

두 번째 - Hello World 샘플 어플리케이션 실행

  1. https://console.aws.amazon.com/robomaker/로 들어갑니다.
  2. 화면 오른쪽 위에서 US West (Oregon)/미국 서부 (오레곤)을 선택합니다. 방금 선택한 것은 Region(리전)이라고 불리는데 AWS 서비스가 위치하고 있는 물리적인 장소를 가리킵니다. 리전은 세계 주요지역에 있고 리전 안에는 Avaliability Zone(AZ, 가용영역)이 있습니다. RoboMaker는 아직 서울 리전에 들어와 있지 않으니 우선 오레곤을 선택합니다. (리전과 가용영역에 대해 더 궁금하시면 여기로)
  3. 화면 왼쪽에서 Sample applications(샘플 어플리케이션)를 선택합니다. 메뉴가 안보인 다면 왼쪽의 세줄 그어진 아이콘을 클릭하면 메뉴가 확장됩니다.
  4. Try AWS RoboMaker sample applications(AWS RoboMaker 샘플 애플리케이션 사용해 보기) 페이지에서 Hello World!를 선택한 다음 Launch simulation job(시뮬레이션 작업 시작) 버튼을 클릭합니다. 샘플 선택
  5. 5분 정도 기다리면 상태실행으로 바뀝니다. 화면의 Gazebo 이미지를 클릭하면 웹브라우저의 새 창이 뜨면서 터틀봇이 시계 반대 방향으로 돌고 있는 걸 확인할 수 있습니다. rqtrviz도 차례로 확인해 봅니다. 터틀봇은 ROS의 표준 플랫폼으로 현재 시리즈3까지 나와 있으며 윌로우 게러지, 유진 로봇, 로보티즈가 차례로 개발했습니다. (국내 기업이 2개나!!) Gazebo 클릭 Gazebo
    • Gazebo는 중력과 같은 물리법칙이 적용된 3차원 시뮬레이터입니다. 예를 들어 Gazebo에서 로봇을 허공에 가져다 놓으면 바닥으로 떨어지고 물체끼리 부딪치기도 합니다.
    • RViz는 ROS Visualizer의 약자로 라이다, 카메라, 초음파센서, IMU와 같은 다양한 센서 데이터를 시각화해주고 센서 데이터를 bag 파일로 저장해 나중에 재사용할 수 있게 해줍니다. RViz는 Gazebo와는 달리 시뮬레이션 도구가 아니고 시각화 도구이기 때문에 물리 엔진이 없습니다. 따라서 충돌이나 역학(dynamics)이 존재하지 않습니다. 결론적으로 RViz는 Gazebo의 대체 툴이 아니고 상호보완적인 관계라고 이해하시면 됩니다.
      • 왼쪽의 Add 버튼을 클릭하고 RobotModel을 선택 OK 버튼을 누릅니다. Rviz RobotModel
      • DisplaysFixed Frame에서 base_footprint를 선택하면 터틀봇이 나타납니다. Rviz base_footprint
      • 왼쪽의 Add 버튼을 다시 클릭하고 LaserScan을 선택하고 OK 버튼을 누릅니다.
      • LaserScanTopic에서 /scan을 선택해 라이다센서 데이터를 시각화합니다. 라이다 센서는 터틀봇 맨 위에 빙글빙글 돌며 레이저를 쏘아 벽이나 장애물에 비추어 거리를 측정하는 센서입니다. 아직 터틀봇 주위에 아무런 물체가 없어서 rivz 화면에도 아무것도 나오지 않습니다. Rviz LaserScan
    • 다시 Gazebo로 돌아와서 왼쪽의 ‘Insert’ 탭에서 마음에 드는 물건(저는 맥주!!)을 터틀봇 근처에 끌어다 놓으면 rviz에서 터틀봇 주위에 빨간 점으로 라이다 센서 데이터를 눈으로 확인할 수 있습니다. 빨간 점들은 포인트 클라우드라 부르고 이 데이터를 사용해 SLAM(Simultaneous localization and mapping, 동시적 위치추정 및 지도작성), 장애물 회피를 하거나 PCL(Point Cloud Library)에 구현된 알고리즘을 사용해 다양한 작업을 할 수 있습니다. Rviz & Gazebo
    • rqt는 ROS GUI 개발 툴입니다. 이름에서 알 수 있듯이 Qt를 사용해 개발했습니다. ROS의 노드(node, ROS에서 최소 단위의 실행 프로세스)들은 특정 토픽(topic)에 펍섭(pub/sub) 패턴으로 메세지를 주고받는데 이를 rqt를 사용해 그래프로 나타내 보겠습니다.
      • Plugins -> Introspection -> Node Graph 선택 왼쪽 위에서 Nodes/Topics (active) 선택 rqt

시뮬레이션 작업 시작 버튼을 눌렀을 때 AWS가 어떤 작업을 했는지는 Services에서 CloudFormation을 선택하고 Stack Name에서 AWSRoboMakerHelloWorld-######을 클릭하면 자세히 볼 수 있습니다. 어플리케이션과 시뮬레이션 번들(tar.gz 파일들)을 저장할 S3 버킷(awsrobomakerhelloworld-######-bundlesbucket-######)을 만들고 IAM role 추가, 람다 함수를 생성하고 로봇 어플리케이션(hello-world-robot.tar.gz)과 시뮬레이션 번들(hello-world-simulation.tar.gz) 파일들을 S3에 저장, 그리고 마지막에 시뮬레이션 작업이 생성되는 과정을 자세히 볼 수 있습니다. 작업이 다 끝나고 S3나 EC2 사용으로 인한 과금을 피하려면 이 스택을 삭제해줘야 합니다. 삭제를 제대로 해주지 않으면 다음 달에 생각지 못한 카드값이 나갈 수 있으니 주의하세요. CloudFormation

세 번째 - 개발 환경 구성과 ROS 어플리케이션 빌드

Cloud9 개발 환경을 만들어 보겠습니다.

  1. https://console.aws.amazon.com/robomaker/로 들어갑니다.
  2. 화면 오른쪽 위에서 US West (Oregon)/미국 서부 (오레곤)이 선택되었는지 확인합니다.
  3. 왼쪽 메뉴에서 Development environments(개발 환경) 선택하고 Create environment(환경 생성) 버튼을 누릅니다.
  4. Name(이름)HelloWorld 입력
  5. Instance type은 기본 m4.large 선택
  6. VPC와 Subnet(서브넷)을 선택 Cloud9
  7. Create(생성) 버튼을 누릅니다. 참고로 생성 버튼을 누르면 EC2 시큐리티 그룹과 인스턴스가 만들어집니다.
  8. Open environment(환경 열기)를 클릭해 Cloud9 IDE를 띄웁니다.

AWS RoboMaker Development Environment

[AWS RoboMaker 개발 환경 : 개발->빌드->번들->시뮬레이션 순으로 진행]

이미지 출처 : https://www.slideshare.net/AmazonWebServices/announcing-aws-robomaker-a-new-cloud-robotics-service-rob201r1-aws-reinvent-2018

이제 Hello World 어플리케이션을 다운 받아 코드를 수정하고 빌드해보겠습니다.

  1. Cloud9 화면 오른쪽 위에 RoboMaker Resources -> Download Samples -> 1. Hello World를 클릭해 코드를 다운 받습니다. Cloud9 Download Sample
  2. 왼쪽 Environment 탭에서 HelloWorld/HelloWorld/robot_ws/src/nodes 디렉토리를 차례대로 확장하고 rotate 파일을 더블 클릭해 편집기에서 엽니다.
  3. rotate 파일 32번째 줄의 self.twist.angular.z 값을 0.1에서 -0.1로 수정해 터틀봇을 시계방향으로 회전하게 만듭니다.
     r = rospy.Rate(10)
     while not rospy.is_shutdown():
         self.twist.angular.z = -0.1 # 시계방향으로 회전
         self._cmd_pub.publish(self.twist)
         rospy.loginfo("Rotating robot: %s", self.twist)
         r.sleep()
    
  4. 파일을 저장하고 Cloud9 Build
  5. RoboMaker Run -> Build -> HelloWorld Robot를 클릭해 빌드를 시작합니다.
  6. RoboMaker Run -> Build -> HelloWorld Simulation을 클릭해 시뮬레이션을 빌드합니다.

네번째 - 시뮬레이션 실행

  1. RoboMaker Run -> Bundle -> HelloWorld Robot를 클릭해 번들링을 시작합니다.
  2. RoboMaker Run -> Bundle -> HelloWorld Simulation을 클릭해 시뮬레이션을 번들링합니다.

Simulation

[AWS RoboMaker 시뮬레이션]

이미지 출처 : https://www.slideshare.net/AmazonWebServices/announcing-aws-robomaker-a-new-cloud-robotics-service-rob201r1-aws-reinvent-2018

Hello World 시뮬레이션 다시 시작

  1. RoboMaker Simulation (none) -> Connect
  2. 시뮬레이션 선택 -> Ok를 클릭합니다. 만약 실행 중인 시뮬레이션이 없다면 Simulation jobs(시뮬레이션 작업)에서 Action(작업) -> Clone(복제) 를 선택해 시뮬레이션을 다시 시작하고 Cloud9으로 돌아와서 시뮬레이션을 선택합니다. Cloud9 Simulation Connect
  3. RoboMaker Simulation (Running) -> Restart With New Bundles 클릭
  4. Robot app bundle path/HelloWorld/robot_ws/bundle/output.tar.gz 를, Simulation app bundle path/HelloWorld/simulation_ws/bundle/output.tar.gz를 입력하고 확인을 클릭합니다. 시뮬레이션이 시작되기까지 몇분 정도 소요됩니다. Cloud9 Build
  5. Simulation jobs에서 터틀봇이 이전과는 반대로 시계방향으로 회전하는 것을 확인할 수 있습니다.
  6. Simulation job output destination(시뮬레이션 작업 출력 대상) 링크를 클릭하면 S3 버킷에 시뮬레이션 작업으로 생성된 파일들을 확인할 수 있고 Simulation job data(시뮬레이션 작업 데이터)에서 로그와 Metrics(지표)를 확인할 수 있습니다. Simulation Data

마지막으로 Clean up

작업한 데이터들을 삭제해 추가 비용이 나가지 않도록 합니다. 다음 글을 보고 배포까지 해보실 분들은 나중에 지워주세요.

  1. https://console.aws.amazon.com/robomaker/로 들어 RoboMaker 콘솔을 엽니다. 시뮬레이션 작업이 아직 진행 중이면 시뮬레이션 작업을 선택합니다. Action(작업) -> Cancel(취소)을 선택합니다.
  2. https://console.aws.amazon.com/cloudformation/로 가서 AWS CloudFormation 콘솔을 열고 HelloWorld가 포함된 스택을 삭제합니다. 여러 개가 있다면 시간순으로 선택해 주세요.
  3. https://console.aws.amazon.com/iam/ IAM 콘솔을 열고 IAM 역할을 삭제해주세요.
  4. https://console.aws.amazon.com/cloud9/에서 AWS Cloud9 콘솔을 열고 HelloWorld 환경을 삭제합니다.




지금까지 AWS RoboMaker로 개발, 시뮬레이션까지 해봤습니다. 여러분들의 로보메이커에 대한 생각도 궁금한데요. 댓글로 의견 부탁드립니다. 그럼 조만간 Fleet 관리와 OTA(over-the-air) 배포하는 과정과 함께 RoboMaker사용 후기도 함께 포스팅하겠습니다. (To be continued…)