Erstellen von Anwendungscontainern - AWS RoboMaker

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Erstellen von Anwendungscontainern

Das Einreichen eines Simulationsjobs besteht aus drei SchrittenAWS RoboMaker: Erstellen Sie die Anwendungscontainer, verknüpfen Sie den Container mit einerAWS RoboMaker Anwendung und verwenden Sie die Container, um einen Simulationsjob einzureichen. In diesem Abschnitt erfahren Sie, wie Sie Anwendungscontainer mit Docker für erstellenAWS RoboMaker. Wir verwenden die Hello-World-Beispielanwendung, um die Schritte zu demonstrieren, die zum Bau eines Musterroboters und von Containern für Simulationsanwendungen für ein ROS-basiertes Beispiel erforderlich sind. Auf dieser Seite wird auch gezeigt, wie Sie Ihren Container lokal testen können.

Wenn Sie ROS nicht verwenden, lesen Sie den Blogbeitrag, in dem beschrieben wird, wie Sie jede High-Fidelity-SimulationAWS RoboMaker mit GPU- und Container-Unterstützung ausführen.

Voraussetzungen

Bevor Sie beginnen, stellen Sie sicher, dass Ihre Entwicklungsumgebung über die erforderlichen Abhängigkeiten verfügt. Sie müssen DockerAWS CLI, das und das VCS Import Tool auf Ihrem Computer installiert haben.

sudo pip3 install vcstool

Sie benötigen außerdem einAWS Konto mit einer IAM-Rolle, die die folgenden Berechtigungen enthält:

  • Erstellen Sie eine IAM-Rolle

  • AWS RoboMakerRessourcen erstellen (Simulationsjob, Roboter und Simulationsanwendungen)

  • Erstellen Sie Amazon-ECR-Repositorys und laden Sie sie hoch

Schließlich müssen Sie Ihre Kontonummer kennen und eine Region auswählen, in der die Simulation ausgeführt werden soll. AWS RoboMakerwird in den folgenden aufgelisteten Regionen unterstütztAWS RoboMaker Endpunkte und Kontingente

Anwendungscontainer von einem ROS-Workspace aus erstellen

AWS RoboMakerSimulationen bestehen aus einer Simulationsanwendung und einer optionalen Roboteranwendung. Jede dieser Anwendungen ist durch einen Namen und ein Container-Image definiert. In diesem Abschnitt wird gezeigt, wie das Container-Image sowohl für eine Simulationsanwendung als auch für eine Roboteranwendung erstellt wird. Im folgenden Beispiel werden beide Anwendungen in einem einzigen Workspace erstellt. Der folgende Ansatz lässt sich leicht auf jedes ROS-Projekt verallgemeinern.

Klonen Sie zunächst dashello world Repository und importieren Sie die Quelle.

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

Erstellen Sie als Nächstes eine neue Textdatei imhelloworld Verzeichnis und benennen Sie sieDockerfile. Kopieren Sie den folgenden Inhalt und fügen Sie ihn ein:

# ======== 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"]

Die Docker-Datei, die Sie gerade erstellt haben, ist ein Befehlssatz zum Erstellen von Docker-Abbildern. Lesen Sie die Kommentare in der,Dockerfile um ein Gefühl dafür zu bekommen, was gebaut wird, und passen Sie es nach Bedarf an Ihre Bedürfnisse an. Um die Entwicklung zu vereinfachen,Dockerfile basiert das auf den offiziellen ROS-Docker-Images, die von der Open Source Robotics Foundation (OSRF) verwaltet werden. Wenn Sie es jedoch in der Produktion ausführen, können Sie sich dafür entscheiden, das ROS-Basisimage mit den OSRF-Quellanweisungen zu erstellen, GitHub um Auswirkungen von Upstream-Änderungen zu vermeiden.

Erstellen Sie als Nächstes eine neue Datei namensentrypoint.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}"

EineENTRYPOINT Datei ist eine ausführbare Datei, die ausgeführt wird, wenn der Docker-Container erzeugt wird. Wir verwenden einen Einstiegspunkt, um den ROS-Workspace zu beziehen, sodass wirroslaunch Befehle problemlos ausführen könnenAWS RoboMaker. Möglicherweise möchten Sie dieserENTRYPOINT Datei Ihre eigenen Umgebungskonfigurationsschritte hinzufügen.

UnserDockerfile verwendet einen mehrstufigen Build und integriertes Caching mit Docker BuildKit. Mehrstufige Builds ermöglichen Workflows mit separaten Build-Schritten, sodass die Build-Abhängigkeiten und der Quellcode nicht in das Runtime-Image kopiert werden. Dies reduziert die Größe des Docker-Images und verbessert die Leistung. Die Caching-Operationen beschleunigen future Builds, indem zuvor erstellte Dateien gespeichert werden.

Erstellen der Roboteranwendung mit dem folgenden Befehl:

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

Nachdem die Roboteranwendung erstellt wurde, können Sie die Simulationsanwendung wie folgt erstellen:

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

Führen Sie den Befehl ausdocker images, um zu bestätigen, dass die Docker-Images erfolgreich erstellt wurden. Die Ausgabe sollte wie folgt aussehen:

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

Zu diesem Zeitpunkt haben Sie Ihre Docker-Images erfolgreich erstellt. Es ist eine gute Idee, diese lokal zu testen, bevor Sie sie zur Verwendung hochladenAWS RoboMaker. Im nächsten Abschnitt wird die entsprechende Vorgehensweise beschrieben.

Testen der Behälter

Mit den folgenden Befehlen können Sie die Anwendung in Ihrer lokalen Entwicklungsumgebung ausführen.

Starten Sie die Roboteranwendung:

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

Starten Sie die Simulationsanwendung:

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

Sobald Sie bestätigt haben, dass Ihre Container ordnungsgemäß funktionieren, können Sie Anwendungscontainer in Amazon ECR veröffentlichen und dann einen Simulationsjob einreichen.