애플리케이션 컨테이너 빌딩 - AWS RoboMaker

지원 종료 알림: 는 2025 AWS 년 9월 10일에 에 대한 지원을 중단합니다 AWS RoboMaker. 2025년 9월 10일 이후에는 AWS RoboMaker 콘솔 또는 AWS RoboMaker 리소스에 더 이상 액세스할 수 없습니다. 컨테이너화된 시뮬레이션 실행을 돕기 AWS Batch 위해 로 전환하는 방법에 대한 자세한 내용은 이 블로그 게시물을 참조하세요.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

애플리케이션 컨테이너 빌딩

AWS RoboMaker에서 시뮬레이션 작업을 제출하는 단계는 다음과 같습니다. 애플리케이션 컨테이너를 빌드하고, 컨테이너를 AWS RoboMaker 애플리케이션에 연결하고, 컨테이너를 사용하여 시뮬레이션 작업을 제출합니다. 이 섹션에서는 AWS RoboMaker에 대한 Docker를 사용하여 애플리케이션 컨테이너를 빌드하는 방법을 설명합니다. hello-world 샘플 애플리케이션을 사용하여 ROS 기반 예제를 위한 샘플 로봇 및 시뮬레이션 애플리케이션 컨테이너를 빌드하는 데 필요한 단계를 보여줍니다. 이 페이지에서는 컨테이너를 로컬에서 테스트하는 방법도 보여줍니다.

ROS를 사용하지 않는 경우, GPU 및 컨테이너 지원을 통해 AWS RoboMaker에서 충실도가 높은 시뮬레이션을 실행하는 방법을 설명하는 블로그 게시물을 참조하세요.

필수 조건

시작하기 전에 개발 환경에 필요한 종속성이 있는지 확인하세요. 시스템에 Docker, AWS CLI, VCS 가져오기 도구가 설치되어 있어야 합니다.

sudo pip3 install vcstool

또한 다음 권한이 포함된 IAM 역할을 가진 AWS 계정이 있어야 합니다.

  • IAM 역할 생성

  • AWS RoboMaker 리소스 생성(시뮬레이션 작업, 로봇, 시뮬레이션 애플리케이션)

  • Amazon ECR 리포지토리 생성 및 업로드

마지막으로, 계정 번호를 알아야 하고, 시뮬레이션을 실행할 리전을 선택해야 합니다. AWS RoboMaker은 AWS RoboMaker 엔드포인트 및 할당량에 나열된 다음 리전에서 지원됩니다.

ROS 작업 영역에서 애플리케이션 컨테이너 구축

AWS RoboMaker 시뮬레이션은 시뮬레이션 애플리케이션과 선택적 로봇 애플리케이션으로 구성됩니다. 각 애플리케이션은 이름과 컨테이너 이미지로 정의됩니다. 이 섹션에서는 시뮬레이션 애플리케이션과 로봇 애플리케이션 모두에 사용할 컨테이너 이미지를 빌드하는 방법을 보여줍니다. 다음 예제에서 두 애플리케이션은 모두 단일 작업 영역 내에 구축되어 있습니다. 다음 접근 방식은 모든 ROS 프로젝트에 쉽게 일반화할 수 있습니다.

시작하려면 hello world 리포지토리를 복제하고 소스를 가져오세요.

git clone https://github.com/aws-robotics/aws-robomaker-sample-application-helloworld.git helloworld cd helloworld vcs import robot_ws < robot_ws/.rosinstall vcs import simulation_ws < simulation_ws/.rosinstall

다음으로 helloworld 디렉터리에 새 파일을 생성하고 이름을 Dockerfile로 지정합니다. 다음 명령을 복사하여 붙여넣습니다.

# ======== ROS/Colcon Dockerfile ======== # This sample Dockerfile will build a Docker image for AWS RoboMaker # in any ROS workspace where all of the dependencies are managed by rosdep. # # Adapt the file below to include your additional dependencies/configuration # outside of rosdep. # ======================================= # ==== Arguments ==== # Override the below arguments to match your application configuration. # =================== # ROS Distribution (ex: melodic, foxy, etc.) ARG ROS_DISTRO=melodic # Application Name (ex: helloworld) ARG APP_NAME=robomaker_app # Path to workspace directory on the host (ex: ./robot_ws) ARG LOCAL_WS_DIR=workspace # User to create and use (default: robomaker) ARG USERNAME=robomaker # The gazebo version to use if applicable (ex: gazebo-9, gazebo-11) ARG GAZEBO_VERSION=gazebo-9 # Where to store the built application in the runtime image. ARG IMAGE_WS_DIR=/home/$USERNAME/workspace # ======== ROS Build Stages ======== # ${ROS_DISTRO}-ros-base # -> ros-robomaker-base # -> ros-robomaker-application-base # -> ros-robomaker-build-stage # -> ros-robomaker-app-runtime-image # ================================== # ==== ROS Base Image ============ # If running in production, you may choose to build the ROS base image # from the source instruction-set to prevent impact from upstream changes. # ARG UBUNTU_DISTRO=focal # FROM public.ecr.aws/lts/ubuntu:${UBUNTU_DISTRO} as ros-base # Instruction for each ROS release maintained by OSRF can be found here: # https://github.com/osrf/docker_images # ================================== # ==== Build Stage with AWS RoboMaker Dependencies ==== # This stage creates the robomaker user and installs dependencies required # to run applications in RoboMaker. # ================================== FROM public.ecr.aws/docker/library/ros:${ROS_DISTRO}-ros-base AS ros-robomaker-base ARG USERNAME ARG IMAGE_WS_DIR RUN apt-get clean RUN apt-get update && apt-get install -y \ lsb \ unzip \ wget \ curl \ xterm \ python3-colcon-common-extensions \ devilspie \ xfce4-terminal RUN groupadd $USERNAME && \ useradd -ms /bin/bash -g $USERNAME $USERNAME && \ sh -c 'echo "$USERNAME ALL=(root) NOPASSWD:ALL" >> /etc/sudoers' USER $USERNAME WORKDIR /home/$USERNAME RUN mkdir -p $IMAGE_WS_DIR # ==== ROS Application Base ==== # This section installs exec dependencies for your ROS application. # Note: Make sure you have defined 'exec' and 'build' dependencies correctly # in your package.xml files. # ======================================== FROM ros-robomaker-base as ros-robomaker-application-base ARG LOCAL_WS_DIR ARG IMAGE_WS_DIR ARG ROS_DISTRO ARG USERNAME WORKDIR $IMAGE_WS_DIR COPY --chown=$USERNAME:$USERNAME $LOCAL_WS_DIR/src $IMAGE_WS_DIR/src RUN sudo apt update && \ rosdep update && \ rosdep fix-permissions # Note: This will install all dependencies. # You could further optimize this by only defining the exec dependencies. # Then, install the build dependencies in the build image. RUN rosdep install --from-paths src --ignore-src -r -y # ==== ROS Workspace Build Stage ==== # In this stage, we will install copy source files, install build dependencies # and run a build. # =================================== FROM ros-robomaker-application-base AS ros-robomaker-build-stage LABEL build_step="${APP_NAME}Workspace_Build" ARG APP_NAME ARG LOCAL_WS_DIR ARG IMAGE_WS_DIR RUN . /opt/ros/$ROS_DISTRO/setup.sh && \ colcon build \ --install-base $IMAGE_WS_DIR/$APP_NAME # ==== ROS Robot Runtime Image ==== # In the final stage, we will copy the staged install directory to the runtime # image. # ================================= FROM ros-robomaker-application-base AS ros-robomaker-app-runtime-image ARG APP_NAME ARG USERNAME ARG GAZEBO_VERSION ENV USERNAME=$USERNAME ENV APP_NAME=$APP_NAME ENV GAZEBO_VERSION=$GAZEBO_VERSION RUN rm -rf $IMAGE_WS_DIR/src COPY --from=ros-robomaker-build-stage $IMAGE_WS_DIR/$APP_NAME $IMAGE_WS_DIR/$APP_NAME # Add the application source file to the entrypoint. WORKDIR / COPY entrypoint.sh /entrypoint.sh RUN sudo chmod +x /entrypoint.sh && \ sudo chown -R $USERNAME /entrypoint.sh && \ sudo chown -R $USERNAME $IMAGE_WS_DIR/$APP_NAME ENTRYPOINT ["/entrypoint.sh"]

방금 생성한 Dockerfile은 도커 이미지를 빌드하는 데 사용되는 명령 세트입니다. Dockerfile에 있는 설명을 읽고 무엇이 구축되고 있는지 파악하고 필요에 따라 조정합니다. 쉽게 개발할 수 있도록 DockerfileOpen Source Robotics Foundation(OSRF)에서 관리하는 공식 ROS 도커 이미지를 기반으로 합니다. 하지만 프로덕션 환경에서 실행할 때는 업스트림 변경으로 인한 영향을 방지하기 위해 GitHub의 OSRF 소스 명령 세트를 사용하여 ROS 기본 이미지를 빌드하도록 선택할 수 있습니다.

entrypoint.sh라는 파일을 새로 생성합니다.

#!/bin/bash set -e source "/home/$USERNAME/workspace/$APP_NAME/setup.bash" if [[ -f "/usr/share/$GAZEBO_VERSION/setup.sh" ]] then source /usr/share/$GAZEBO_VERSION/setup.sh fi printenv exec "${@:1}"

ENTRYPOINT 파일은 Docker 컨테이너가 생성될 때 실행되는 실행 파일입니다. 엔트리 포인트를 사용하여 ROS 작업 공간을 소싱하므로 AWS RoboMaker에서 roslaunch 명령을 쉽게 실행할 수 있습니다. 이 ENTRYPOINT 파일에 사용자 고유의 환경 구성 단계를 추가할 수도 있습니다.

Dockerfile은 다단계 빌드와 Docker BuildKit과의 통합 캐싱을 사용합니다. 다단계 빌드는 별도의 빌드 단계가 있는 워크플로를 허용하므로 빌드 종속성과 소스 코드가 런타임 이미지에 복사되지 않습니다. 이렇게 하면 도커 이미지 크기가 줄어들고 성능이 향상됩니다. 캐싱 작업은 이전에 빌드된 파일을 저장하여 향후 빌드 속도를 높입니다.

다음 명령어를 사용하여 로봇 애플리케이션을 빌드합니다.

DOCKER_BUILDKIT=1 docker build . \ --build-arg ROS_DISTRO=melodic \ --build-arg LOCAL_WS_DIR=./robot_ws \ --build-arg APP_NAME=helloworld-robot-app \ -t robomaker-helloworld-robot-app

로봇 애플리케이션을 빌드한 후 다음과 같이 시뮬레이션 애플리케이션을 빌드할 수 있습니다.

DOCKER_BUILDKIT=1 docker build . \ --build-arg GAZEBO_VERSION=gazebo-9 \ --build-arg ROS_DISTRO=melodic \ --build-arg LOCAL_WS_DIR=./simulation_ws \ --build-arg APP_NAME=helloworld-sim-app \ -t robomaker-helloworld-sim-app

docker images 명령을 실행하여 도커 이미지가 성공적으로 빌드되었는지 확인합니다. 출력은 다음과 같을 것입니다.

Administrator:~/environment/helloworld (ros1) $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE robomaker-helloworld-sim-app latest 5cb08816b6b3 6 minutes ago 2.8GB robomaker-helloworld-robot-app latest b5f6f755feec 10 minutes ago 2.79GB

이 시점에서 도커 이미지를 성공적으로 빌드했습니다. AWS RoboMaker와 사용하기 위해 이미지를 업로드하기 전에 로컬에서 테스트하는 것이 좋습니다. 다음 단계에서는 그 방법을 설명합니다.

컨테이너 테스트

다음 명령을 사용하면 로컬 개발 환경에서 애플리케이션을 실행할 수 있습니다.

로봇 애플리케이션 실행:

docker run -it -v /tmp/.X11-unix/:/tmp/.X11-unix/ \ -u robomaker -e ROBOMAKER_GAZEBO_MASTER_URI=http://localhost:5555 \ -e ROBOMAKER_ROS_MASTER_URI=http://localhost:11311 \ robomaker-helloworld-robot-app:latest roslaunch hello_world_robot rotate.launch

시뮬레이션 애플리케이션 실행:

docker run -it -v /tmp/.X11-unix/:/tmp/.X11-unix/ \ -u robomaker -e ROBOMAKER_GAZEBO_MASTER_URI=http://localhost:5555 \ -e ROBOMAKER_ROS_MASTER_URI=http://localhost:11311 \ robomaker-helloworld-sim-app:latest roslaunch hello_world_simulation empty_world.launch

컨테이너가 제대로 작동하는지 확인했으면 애플리케이션 컨테이너를 Amazon ECR에 게시한 다음 시뮬레이션 작업 제출을 수행할 수 있습니다.