diff --git a/lunar_pole_exploration_rover/README.md b/lunar_pole_exploration_rover/README.md index 7794f6cd..14c4271e 100644 --- a/lunar_pole_exploration_rover/README.md +++ b/lunar_pole_exploration_rover/README.md @@ -48,60 +48,48 @@ This package and associated plugins and models were developped by [Robin Baran]( ## Running the demo ### Building the docker -To build the docker image, go to your ROS2 workspace. Make a spaceros workspace if you don't already have one: -```bash -mkdir -p ~spaceros_ws/src -cd ~spaceros_ws -``` +To build the docker image, go to the docker folder and run: -Clone the demos and simulation repos. Checkout both repos to the feature branch `feat/lunar_pole_exploration_rover`: ```bash -cd ~spaceros_ws -git clone git@github.com:RBinsonB/demos.git -git checkout feat/lunar_pole_exploration_rover -cd ~spaceros_ws -git clone git@github.com:RBinsonB/simulation.git -git checkout feat/lunar_pole_exploration_rover +cd docker +./build.sh ``` -Build the image: -```bash -cd ~spaceros_ws -docker build -f demos/lunar_pole_exploration_rover/docker/Dockerfile -t lunar_rover_image . -``` +The build process will take about 30 minutes, depending on the host computer. + ### Running the docker -Run the following command before running the container: +After building the image, you can see the newly-built image by running: + ```bash -xhost +local:docker +docker image list ``` -Run the container by typing: +The output will look something like this: + +``` +REPOSITORY TAG IMAGE ID CREATED SIZE +openrobotics/moveit2 latest 6edb2edc9643 10 hours ago 15.5GB +openrobotics/lunar_pole_exploration_rover_demo latest 629b13cf7b74 12 hours ago 7.8GB +nvidia/cudagl 11.4.1-devel-ubuntu20.04 336416dfcbba 1 week ago 5.35GB +``` + +The new image is named **openrobotics/lunar_pole_exploration_rover_demo:latest**. + +There is a run.sh script provided for convenience that will run the spaceros image in a container. + ```bash -docker run --rm -it --name lunar_pole_exploration_rover \ ---network host \ --e DISPLAY \ --e TERM \ --e QT_X11_NO_MITSHM=1 \ -lunar_rover_image +./run.sh ``` -If you have gpu +To enable hardware acceleration, use run_gpu.sh (requires a docker install not from snap)* + ```bash -docker run --rm -it --name lunar_pole_exploration_rover \ ---network host \ ---privileged \ ---gpus all \ --e NVIDIA_VISIBLE_DEVICES=all \ --e NVIDIA_DRIVER_CAPABILITIES=graphics \ --e DISPLAY=$DISPLAY \ --e TERM \ --e QT_X11_NO_MITSHM=1 \ --e XAUTHORITY=$XAUTHORITY \ ---mount type=bind,source=/tmp/.X11-unix,target=/tmp/.X11-unix \ -lunar_rover_image +./run_gpu.sh ``` + + Once the container is running, launch the demo by typing the following command: ```bash ros2 launch lunar_pole_exploration_rover lunar_pole_exploration_rover.launch.py diff --git a/lunar_pole_exploration_rover/docker/Dockerfile b/lunar_pole_exploration_rover/docker/Dockerfile index 1f46b039..efd7633b 100644 --- a/lunar_pole_exploration_rover/docker/Dockerfile +++ b/lunar_pole_exploration_rover/docker/Dockerfile @@ -19,7 +19,7 @@ # VCS_REF - The git revision of the Space ROS source code (no default value). # VERSION - The version of Space ROS (default: "preview") -FROM openrobotics/moveit2:latest +FROM osrf/space-ros:latest # Define arguments used in the metadata definition ARG VCS_REF @@ -43,6 +43,7 @@ ENV GZ_VERSION=fortress # Disable prompting during package installation ARG DEBIAN_FRONTEND=noninteractive + # Get rosinstall_generator # Using Docker BuildKit cache mounts for /var/cache/apt and /var/lib/apt ensures that # the cache won't make it into the built image but will be maintained between steps. @@ -50,10 +51,68 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt,sharing=locked \ sudo apt-get update -y && sudo apt-get install -y python3-rosinstall-generator +# Disable prompting during package installation +ARG DEBIAN_FRONTEND=noninteractive + +# # Clone all space-ros sources +# RUN mkdir ${SPACEROS_DIR}/src \ +# && vcs import ${SPACEROS_DIR}/src < ${SPACEROS_DIR}/exact.repos + +# Make sure the latest versions of packages are installed +# Using Docker BuildKit cache mounts for /var/cache/apt and /var/lib/apt ensures that +# the cache won't make it into the built image but will be maintained between steps. +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + sudo apt-get update +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + sudo apt-get dist-upgrade -y +RUN rosdep update + +# Install the various build and test tools +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + sudo apt install -y \ + build-essential \ + clang-format \ + cmake \ + git \ + libbullet-dev \ + python3-colcon-common-extensions \ + python3-flake8 \ + python3-pip \ + python3-pytest-cov \ + python3-rosdep \ + python3-setuptools \ + python3-vcstool \ + wget + +# Install some pip packages needed for testing +RUN python3 -m pip install -U \ + argcomplete \ + flake8-blind-except \ + flake8-builtins \ + flake8-class-newline \ + flake8-comprehensions \ + flake8-deprecated \ + flake8-docstrings \ + flake8-import-order \ + flake8-quotes \ + pytest-repeat \ + pytest-rerunfailures \ + pytest RUN mkdir -p ${DEMO_DIR}/src WORKDIR ${DEMO_DIR} +# Update the ownership of the source files (had to use sudo above to work around +# a possible inherited 'insteadof' from the host that forces use of ssh +RUN sudo chown -R ${USERNAME}:${USERNAME} ${DEMO_DIR} + +# Get rosinstall_generator +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + sudo apt-get update -y && sudo apt-get install -y python3-rosinstall-generator # Install libmongoc for development RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ @@ -70,28 +129,34 @@ RUN cd mongo-cxx-driver-r3.6.7/build && cmake .. -DCMAKE_BUILD_TYPE=Release -DCM # Get the source for the dependencies # RUN vcs import src < /tmp/demo_generated_pkgs.repos -COPY --chown=${USERNAME}:${USERNAME} demos/lunar_pole_exploration_rover/docker/demo_manual_pkgs.repos /tmp/ +COPY --chown=${USERNAME}:${USERNAME} ./demo_manual_pkgs.repos /tmp/ RUN vcs import src < /tmp/demo_manual_pkgs.repos && /bin/bash -c 'source "${SPACEROS_DIR}/install/setup.bash"' -# Copy the "demos" and "simulation" repos into the workspace -COPY demos ./src/demos -COPY simulation ./src/simulation - RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt,sharing=locked \ sudo apt-get update -y \ && /bin/bash -c 'source "${SPACEROS_DIR}/install/setup.bash"' \ -&& /bin/bash -c 'source "${MOVEIT2_DIR}/install/setup.bash"' \ && rosdep install --from-paths src --ignore-src -r -y --rosdistro ${ROSDISTRO} # Build the demo -RUN /bin/bash -c 'source ${SPACEROS_DIR}/install/setup.bash && source ${MOVEIT2_DIR}/install/setup.bash \ +RUN /bin/bash -c 'source ${SPACEROS_DIR}/install/setup.bash \ && colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release' # Add the user to the render group so that the user can access /dev/dri/renderD128 RUN sudo usermod -aG render $USERNAME +# Add a couple sample GUI apps for testing +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + sudo apt-get install -y \ + firefox \ + glmark2 \ + libcanberra-gtk3-0 \ + libpci-dev \ + xauth \ + xterm + # Setup the entrypoint -COPY demos/lunar_pole_exploration_rover/docker/entrypoint.sh / +COPY ./entrypoint.sh / ENTRYPOINT ["/entrypoint.sh"] CMD ["bash"] diff --git a/lunar_pole_exploration_rover/docker/build.sh b/lunar_pole_exploration_rover/docker/build.sh new file mode 100755 index 00000000..809b54d9 --- /dev/null +++ b/lunar_pole_exploration_rover/docker/build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +ORG=openrobotics +IMAGE=lunar_pole_exploration_rover_demo +TAG=latest + +VCS_REF="" +VERSION=preview + +# Exit script with failure if build fails +set -eo pipefail + +echo "" +echo "##### Building Space ROS Demo Docker Image #####" +echo "" + +docker build -t $IMAGE:$TAG \ + --build-arg VCS_REF="$VCS_REF" \ + --build-arg VERSION="$VERSION" . + +echo "" +echo "##### Done! #####" + diff --git a/lunar_pole_exploration_rover/docker/demo_manual_pkgs.repos b/lunar_pole_exploration_rover/docker/demo_manual_pkgs.repos index 863ee3f0..b04db11a 100644 --- a/lunar_pole_exploration_rover/docker/demo_manual_pkgs.repos +++ b/lunar_pole_exploration_rover/docker/demo_manual_pkgs.repos @@ -3,6 +3,14 @@ repositories: type: git url: https://github.com/ros-controls/gz_ros2_control.git version: humble + demos: + type: git + url: https://github.com/RBinsonB/demos.git + version: feat/lunar_pole_exploration_rover + simulation: + type: git + url: https://github.com/RBinsonB/simulation.git + version: feat/lunar_pole_exploration_rover qt_gui_core: type: git url: https://github.com/ros-visualization/qt_gui_core.git diff --git a/lunar_pole_exploration_rover/docker/run.sh b/lunar_pole_exploration_rover/docker/run.sh new file mode 100755 index 00000000..49f694f2 --- /dev/null +++ b/lunar_pole_exploration_rover/docker/run.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +# Runs a docker container with the image created by build.bash +# Requires: +# docker +# an X server + +IMG_NAME=openrobotics/lunar_pole_exploration_rover_demo + +# Replace `/` with `_` to comply with docker container naming +# And append `_runtime` +CONTAINER_NAME="$(tr '/' '_' <<< "$IMG_NAME")" + +# Start the container +docker run --rm -it --name $CONTAINER_NAME --network host \ + -e DISPLAY -e TERM -e QT_X11_NO_MITSHM=1 $IMG_NAME diff --git a/lunar_pole_exploration_rover/docker/run_gpu.sh b/lunar_pole_exploration_rover/docker/run_gpu.sh new file mode 100755 index 00000000..007cec2b --- /dev/null +++ b/lunar_pole_exploration_rover/docker/run_gpu.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +# Runs a docker container with the image created by build.bash +# Requires: +# docker +# an X server + +IMG_NAME=openrobotics/lunar_pole_exploration_rover_demo + +xhost +local:docker + +# Replace `/` with `_` to comply with docker container naming +# And append `_runtime` +CONTAINER_NAME="$(tr '/' '_' <<< "$IMG_NAME")" + +# Start the container +docker run --rm -it --name $CONTAINER_NAME \ + --network host \ + --privileged \ + --gpus all \ + -e NVIDIA_VISIBLE_DEVICES=all \ + -e NVIDIA_DRIVER_CAPABILITIES=graphics \ + -e DISPLAY=$DISPLAY \ + -e TERM \ + -e QT_X11_NO_MITSHM=1 \ + -e XAUTHORITY=$XAUTHORITY \ + --mount type=bind,source=/tmp/.X11-unix,target=/tmp/.X11-unix \ + $IMG_NAME \ No newline at end of file