├── .gitlab-ci.yml ├── .gitlab-ci ├── .defaults.yml ├── .template.yml ├── ml-variations │ ├── .onnx-runtime.yml │ ├── .template.yml │ ├── .tf.yml │ ├── .torch.yml │ ├── .triton.yml │ ├── ros-cuda.yml │ ├── ros-ml.yml │ ├── ros-tensorrt.yml │ ├── ros-tf.yml │ ├── ros-torch.yml │ ├── ros-triton.yml │ └── ros.yml ├── os │ ├── .ubuntu22.yml │ └── .ubuntu24.yml ├── postprocessing │ ├── ros2-jazzy-desktop-full.yml │ ├── ros2-jazzy-ros-base.yml │ └── ros2-jazzy-ros-core.yml ├── ros-packages │ ├── .desktop-full.yml │ ├── .ros-base.yml │ └── .ros-core.yml ├── ros2-humble │ ├── .ros2-humble.yml │ ├── ros2-humble-desktop-full.yml │ ├── ros2-humble-ros-base.yml │ └── ros2-humble-ros-core.yml ├── ros2-jazzy-ubuntu22 │ ├── ros2-jazzy-ubuntu22-desktop-full.yml │ ├── ros2-jazzy-ubuntu22-ros-base.yml │ └── ros2-jazzy-ubuntu22-ros-core.yml ├── ros2-jazzy │ ├── .ros2-jazzy.yml │ ├── ros2-jazzy-desktop-full.yml │ ├── ros2-jazzy-ros-base.yml │ └── ros2-jazzy-ros-core.yml ├── ros2-kilted │ ├── .ros2-kilted.yml │ ├── ros2-kilted-desktop-full.yml │ ├── ros2-kilted-ros-base.yml │ └── ros2-kilted-ros-core.yml └── ros2-rolling │ ├── .ros2-rolling.yml │ ├── ros2-rolling-desktop-full.yml │ ├── ros2-rolling-ros-base.yml │ └── ros2-rolling-ros-core.yml ├── .version_information.sh ├── CITATION.cff ├── Dockerfile ├── LICENSE ├── README.md ├── entrypoint.sh └── utils ├── .gitignore ├── 0_pull_images.sh ├── 1_export_image_versions.py ├── 2_generate_version_table.py ├── README.md ├── images.txt └── requirements.txt /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | workflow: 2 | rules: 3 | - if: $CI_PIPELINE_SOURCE == "web" 4 | - if: $CI_COMMIT_TAG 5 | 6 | 7 | variables: 8 | ROS_DISTROS: 9 | value: humble,jazzy,kilted,rolling 10 | description: Comma-separated list of ROS Distributions to build [humble,jazzy,kilted,rolling] 11 | 12 | 13 | stages: 14 | - ROS 2 Humble 15 | - ROS 2 Jazzy 16 | - ROS 2 Kilted 17 | - ROS 2 Rolling 18 | - Postprocessing 19 | 20 | 21 | ros2-humble-ros-core: 22 | stage: ROS 2 Humble 23 | rules: 24 | - if: $ROS_DISTROS =~ /.*humble.*/ 25 | needs: [] 26 | trigger: 27 | include: .gitlab-ci/ros2-humble/ros2-humble-ros-core.yml 28 | strategy: depend 29 | 30 | ros2-humble-ros-base: 31 | stage: ROS 2 Humble 32 | rules: 33 | - if: $ROS_DISTROS =~ /.*humble.*/ 34 | needs: 35 | - job: ros2-humble-ros-core 36 | optional: true 37 | trigger: 38 | include: .gitlab-ci/ros2-humble/ros2-humble-ros-base.yml 39 | strategy: depend 40 | 41 | ros2-humble-desktop-full: 42 | stage: ROS 2 Humble 43 | rules: 44 | - if: $ROS_DISTROS =~ /.*humble.*/ 45 | needs: 46 | - job: ros2-humble-ros-base 47 | optional: true 48 | trigger: 49 | include: .gitlab-ci/ros2-humble/ros2-humble-desktop-full.yml 50 | strategy: depend 51 | 52 | 53 | ros2-jazzy-ros-core: 54 | stage: ROS 2 Jazzy 55 | rules: 56 | - if: $ROS_DISTROS =~ /.*jazzy.*/ 57 | needs: [] 58 | trigger: 59 | include: .gitlab-ci/ros2-jazzy/ros2-jazzy-ros-core.yml 60 | strategy: depend 61 | 62 | ros2-jazzy-ubuntu22-ros-core: 63 | stage: ROS 2 Jazzy 64 | rules: 65 | - if: $ROS_DISTROS =~ /.*jazzy.*/ 66 | needs: [] 67 | trigger: 68 | include: .gitlab-ci/ros2-jazzy-ubuntu22/ros2-jazzy-ubuntu22-ros-core.yml 69 | strategy: depend 70 | 71 | post-jazzy-ros-core: 72 | stage: Postprocessing 73 | rules: 74 | - if: $ROS_DISTROS =~ /.*jazzy.*/ && $CI_COMMIT_TAG 75 | needs: 76 | - ros2-jazzy-ros-core 77 | - ros2-jazzy-ubuntu22-ros-core 78 | trigger: 79 | include: .gitlab-ci/postprocessing/ros2-jazzy-ros-core.yml 80 | strategy: depend 81 | 82 | ros2-jazzy-ros-base: 83 | stage: ROS 2 Jazzy 84 | rules: 85 | - if: $ROS_DISTROS =~ /.*jazzy.*/ 86 | needs: 87 | - job: ros2-jazzy-ros-core 88 | optional: true 89 | trigger: 90 | include: .gitlab-ci/ros2-jazzy/ros2-jazzy-ros-base.yml 91 | strategy: depend 92 | 93 | ros2-jazzy-ubuntu22-ros-base: 94 | stage: ROS 2 Jazzy 95 | rules: 96 | - if: $ROS_DISTROS =~ /.*jazzy.*/ 97 | needs: 98 | - job: ros2-jazzy-ubuntu22-ros-core 99 | optional: true 100 | trigger: 101 | include: .gitlab-ci/ros2-jazzy-ubuntu22/ros2-jazzy-ubuntu22-ros-base.yml 102 | strategy: depend 103 | 104 | post-ros2-jazzy-ros-base: 105 | stage: Postprocessing 106 | rules: 107 | - if: $ROS_DISTROS =~ /.*jazzy.*/ && $CI_COMMIT_TAG 108 | needs: 109 | - ros2-jazzy-ros-base 110 | - ros2-jazzy-ubuntu22-ros-base 111 | trigger: 112 | include: .gitlab-ci/postprocessing/ros2-jazzy-ros-base.yml 113 | strategy: depend 114 | 115 | ros2-jazzy-desktop-full: 116 | stage: ROS 2 Jazzy 117 | rules: 118 | - if: $ROS_DISTROS =~ /.*jazzy.*/ 119 | needs: 120 | - job: ros2-jazzy-ros-base 121 | optional: true 122 | trigger: 123 | include: .gitlab-ci/ros2-jazzy/ros2-jazzy-desktop-full.yml 124 | strategy: depend 125 | 126 | ros2-jazzy-ubuntu22-desktop-full: 127 | stage: ROS 2 Jazzy 128 | rules: 129 | - if: $ROS_DISTROS =~ /.*jazzy.*/ 130 | needs: 131 | - job: ros2-jazzy-ubuntu22-ros-base 132 | optional: true 133 | trigger: 134 | include: .gitlab-ci/ros2-jazzy-ubuntu22/ros2-jazzy-ubuntu22-desktop-full.yml 135 | strategy: depend 136 | 137 | post-ros2-jazzy-desktop-full: 138 | stage: Postprocessing 139 | rules: 140 | - if: $ROS_DISTROS =~ /.*jazzy.*/ && $CI_COMMIT_TAG 141 | needs: 142 | - ros2-jazzy-desktop-full 143 | - ros2-jazzy-ubuntu22-desktop-full 144 | trigger: 145 | include: .gitlab-ci/postprocessing/ros2-jazzy-desktop-full.yml 146 | strategy: depend 147 | 148 | 149 | ros2-kilted-ros-core: 150 | stage: ROS 2 Kilted 151 | rules: 152 | - if: $ROS_DISTROS =~ /.*kilted.*/ 153 | needs: [] 154 | trigger: 155 | include: .gitlab-ci/ros2-kilted/ros2-kilted-ros-core.yml 156 | strategy: depend 157 | 158 | ros2-kilted-ros-base: 159 | stage: ROS 2 Kilted 160 | rules: 161 | - if: $ROS_DISTROS =~ /.*kilted.*/ 162 | needs: 163 | - job: ros2-kilted-ros-core 164 | optional: true 165 | trigger: 166 | include: .gitlab-ci/ros2-kilted/ros2-kilted-ros-base.yml 167 | strategy: depend 168 | 169 | ros2-kilted-desktop-full: 170 | stage: ROS 2 Kilted 171 | rules: 172 | - if: $ROS_DISTROS =~ /.*kilted.*/ 173 | needs: 174 | - job: ros2-kilted-ros-base 175 | optional: true 176 | trigger: 177 | include: .gitlab-ci/ros2-kilted/ros2-kilted-desktop-full.yml 178 | strategy: depend 179 | 180 | 181 | ros2-rolling-ros-core: 182 | stage: ROS 2 Rolling 183 | rules: 184 | - if: $ROS_DISTROS =~ /.*rolling.*/ 185 | needs: [] 186 | trigger: 187 | include: .gitlab-ci/ros2-rolling/ros2-rolling-ros-core.yml 188 | strategy: depend 189 | 190 | ros2-rolling-ros-base: 191 | stage: ROS 2 Rolling 192 | rules: 193 | - if: $ROS_DISTROS =~ /.*rolling.*/ 194 | needs: 195 | - job: ros2-rolling-ros-core 196 | optional: true 197 | trigger: 198 | include: .gitlab-ci/ros2-rolling/ros2-rolling-ros-base.yml 199 | strategy: depend 200 | 201 | ros2-rolling-desktop-full: 202 | stage: ROS 2 Rolling 203 | rules: 204 | - if: $ROS_DISTROS =~ /.*rolling.*/ 205 | needs: 206 | - job: ros2-rolling-ros-base 207 | optional: true 208 | trigger: 209 | include: .gitlab-ci/ros2-rolling/ros2-rolling-desktop-full.yml 210 | strategy: depend 211 | -------------------------------------------------------------------------------- /.gitlab-ci/.defaults.yml: -------------------------------------------------------------------------------- 1 | default: 2 | image: docker:20.10.22-git 3 | services: 4 | - docker:20.10.22-dind 5 | tags: 6 | - privileged 7 | before_script: 8 | - docker login -u "$REGISTRY_USER" -p "$REGISTRY_PASSWORD" $REGISTRY 9 | - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY 10 | 11 | 12 | variables: 13 | DOCKER_DRIVER: overlay2 14 | DOCKER_TLS_CERTDIR: /certs 15 | GIT_SUBMODULE_STRATEGY: recursive 16 | IMAGE_BASE: $REGISTRY_IMAGE 17 | IMAGE_BASE_CI: $CI_REGISTRY_IMAGE -------------------------------------------------------------------------------- /.gitlab-ci/.template.yml: -------------------------------------------------------------------------------- 1 | stages: 2 | - Image Variations 3 | 4 | 5 | plain: 6 | stage: Image Variations 7 | trigger: 8 | include: .gitlab-ci/ml-variations/ros.yml 9 | strategy: depend 10 | rules: 11 | - if: $DISABLE_PLAIN == 'true' 12 | when: never 13 | - when: on_success 14 | 15 | triton: 16 | stage: Image Variations 17 | needs: 18 | - job: plain 19 | optional: true 20 | trigger: 21 | include: .gitlab-ci/ml-variations/ros-triton.yml 22 | strategy: depend 23 | rules: 24 | - if: $DISABLE_TRITON == 'true' 25 | when: never 26 | - when: on_success 27 | 28 | cuda: 29 | stage: Image Variations 30 | trigger: 31 | include: .gitlab-ci/ml-variations/ros-cuda.yml 32 | strategy: depend 33 | rules: 34 | - if: $DISABLE_CUDA == 'true' 35 | when: never 36 | - when: on_success 37 | 38 | tensorrt: 39 | stage: Image Variations 40 | trigger: 41 | include: .gitlab-ci/ml-variations/ros-tensorrt.yml 42 | strategy: depend 43 | rules: 44 | - if: $DISABLE_TENSORRT == 'true' 45 | when: never 46 | - when: on_success 47 | 48 | torch: 49 | stage: Image Variations 50 | needs: 51 | - job: tensorrt 52 | optional: true 53 | trigger: 54 | include: .gitlab-ci/ml-variations/ros-torch.yml 55 | strategy: depend 56 | rules: 57 | - if: $DISABLE_TORCH == 'true' 58 | when: never 59 | - when: on_success 60 | 61 | tf: 62 | stage: Image Variations 63 | needs: 64 | - job: tensorrt 65 | optional: true 66 | trigger: 67 | include: .gitlab-ci/ml-variations/ros-tf.yml 68 | strategy: depend 69 | rules: 70 | - if: $DISABLE_TF == 'true' 71 | when: never 72 | - when: on_success 73 | 74 | ml: 75 | stage: Image Variations 76 | needs: 77 | - job: torch 78 | optional: true 79 | trigger: 80 | include: .gitlab-ci/ml-variations/ros-ml.yml 81 | strategy: depend 82 | rules: 83 | - if: $DISABLE_ML == 'true' 84 | when: never 85 | - when: on_success 86 | -------------------------------------------------------------------------------- /.gitlab-ci/ml-variations/.onnx-runtime.yml: -------------------------------------------------------------------------------- 1 | variables: 2 | ONNX_RUNTIME_VERSION: ${_ONNX_RUNTIME_VERSION} -------------------------------------------------------------------------------- /.gitlab-ci/ml-variations/.template.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.defaults.yml 3 | 4 | 5 | stages: 6 | - Build 7 | - Test 8 | - Push 9 | 10 | 11 | .docker-build: 12 | script: 13 | - > 14 | docker buildx build 15 | --pull 16 | --push 17 | --cache-from type=registry,ref=$IMAGE_CACHE 18 | --cache-to type=inline 19 | --platform $PLATFORM 20 | --build-arg IMAGE_VERSION=$CI_COMMIT_TAG 21 | --build-arg BASE_IMAGE_TYPE=$BASE_IMAGE_TYPE 22 | --build-arg UBUNTU_VERSION=$UBUNTU_VERSION 23 | --build-arg ROS_DISTRO=$ROS_DISTRO 24 | --build-arg ROS_PACKAGE=$ROS_PACKAGE 25 | --build-arg ROS_BUILD_FROM_SRC=$ROS_BUILD_FROM_SRC 26 | --build-arg TORCH_VERSION=$TORCH_VERSION 27 | --build-arg TF_VERSION=$TF_VERSION 28 | --build-arg ONNX_RUNTIME_VERSION=$ONNX_RUNTIME_VERSION 29 | --build-arg TRITON_VERSION=$TRITON_VERSION 30 | --tag $IMAGE . 31 | 32 | .docker-push-manifest: 33 | script: 34 | - |- 35 | if [[ "${DISABLE_AMD64}" == "true" ]] || [[ "${DISABLE_PLAIN_AMD64}" == "true" && "${IMAGE_TYPE}" == "plain" ]] || [[ "${DISABLE_CUDA_AMD64}" == "true" && "${IMAGE_TYPE}" == "cuda" ]] || [[ "${DISABLE_TENSORRT_AMD64}" == "true" && "${IMAGE_TYPE}" == "tensorrt" ]] || [[ "${DISABLE_TRITON_AMD64}" == "true" && "${IMAGE_TYPE}" == "triton" ]] || [[ "${DISABLE_TORCH_AMD64}" == "true" && "${IMAGE_TYPE}" == "torch" ]] || [[ "${DISABLE_TF_AMD64}" == "true" && "${IMAGE_TYPE}" == "tf" ]] || [[ "${DISABLE_ML_AMD64}" == "true" && "${IMAGE_TYPE}" == "ml" ]]; then 36 | AMD64_IS_DISABLED="true" 37 | fi 38 | if [[ "${DISABLE_ARM64}" == "true" ]] || [[ "${DISABLE_PLAIN_ARM64}" == "true" && "${IMAGE_TYPE}" == "plain" ]] || [[ "${DISABLE_CUDA_ARM64}" == "true" && "${IMAGE_TYPE}" == "cuda" ]] || [[ "${DISABLE_TENSORRT_ARM64}" == "true" && "${IMAGE_TYPE}" == "tensorrt" ]] || [[ "${DISABLE_TRITON_ARM64}" == "true" && "${IMAGE_TYPE}" == "triton" ]] || [[ "${DISABLE_TORCH_ARM64}" == "true" && "${IMAGE_TYPE}" == "torch" ]] || [[ "${DISABLE_TF_ARM64}" == "true" && "${IMAGE_TYPE}" == "tf" ]] || [[ "${DISABLE_ML_ARM64}" == "true" && "${IMAGE_TYPE}" == "ml" ]]; then 39 | ARM64_IS_DISABLED="true" 40 | fi 41 | if [[ "${AMD64_IS_DISABLED}" != "true" ]]; then 42 | docker pull ${IMAGE_CI}-amd64 43 | docker tag ${IMAGE_CI}-amd64 ${IMAGE}-amd64 44 | docker push ${IMAGE}-amd64 45 | fi 46 | if [[ "${ARM64_IS_DISABLED}" != "true" ]]; then 47 | docker pull ${IMAGE_CI}-arm64 48 | docker tag ${IMAGE_CI}-arm64 ${IMAGE}-arm64 49 | docker push ${IMAGE}-arm64 50 | fi 51 | if [[ "${AMD64_IS_DISABLED}" != "true" && "${ARM64_IS_DISABLED}" != "true" ]]; then 52 | docker manifest create ${IMAGE} --amend ${IMAGE}-amd64 --amend ${IMAGE}-arm64 53 | if [[ ${TAGGED_IMAGE} ]]; then docker manifest create ${TAGGED_IMAGE} --amend ${IMAGE}-amd64 --amend ${IMAGE}-arm64; fi 54 | elif [[ "${AMD64_IS_DISABLED}" != "true" ]]; then 55 | docker manifest create ${IMAGE} --amend ${IMAGE}-amd64 56 | if [[ ${TAGGED_IMAGE} ]]; then docker manifest create ${TAGGED_IMAGE} --amend ${IMAGE}-amd64; fi 57 | elif [[ "${ARM64_IS_DISABLED}" != "true" ]]; then 58 | docker manifest create ${IMAGE} --amend ${IMAGE}-arm64 59 | if [[ ${TAGGED_IMAGE} ]]; then docker manifest create ${TAGGED_IMAGE} --amend ${IMAGE}-arm64; fi 60 | fi 61 | - docker manifest push ${IMAGE} 62 | - if [[ ${TAGGED_IMAGE} ]]; then docker manifest push ${TAGGED_IMAGE}; fi 63 | 64 | 65 | build-amd64: 66 | stage: Build 67 | tags: [privileged, amd64] 68 | rules: 69 | - if: $DISABLE_AMD64 == 'true' 70 | when: never 71 | - if: $DISABLE_PLAIN_AMD64 == 'true' && $IMAGE_TYPE == 'plain' 72 | when: never 73 | - if: $DISABLE_CUDA_AMD64 == 'true' && $IMAGE_TYPE == 'cuda' 74 | when: never 75 | - if: $DISABLE_TENSORRT_AMD64 == 'true' && $IMAGE_TYPE == 'tensorrt' 76 | when: never 77 | - if: $DISABLE_TRITON_AMD64 == 'true' && $IMAGE_TYPE == 'triton' 78 | when: never 79 | - if: $DISABLE_TORCH_AMD64 == 'true' && $IMAGE_TYPE == 'torch' 80 | when: never 81 | - if: $DISABLE_TF_AMD64 == 'true' && $IMAGE_TYPE == 'tf' 82 | when: never 83 | - if: $DISABLE_ML_AMD64 == 'true' && $IMAGE_TYPE == 'ml' 84 | when: never 85 | - when: on_success 86 | script: 87 | - !reference [.docker-build, script] 88 | variables: 89 | PLATFORM: linux/amd64 90 | IMAGE: ${IMAGE_CI}-amd64 91 | IMAGE_CACHE: ${IMAGE_CI_CACHE}-amd64 92 | 93 | build-arm64: 94 | stage: Build 95 | tags: [privileged, arm64] 96 | rules: 97 | - if: $DISABLE_ARM64 == 'true' 98 | when: never 99 | - if: $DISABLE_ARM64 == 'true' 100 | when: never 101 | - if: $DISABLE_PLAIN_ARM64 == 'true' && $IMAGE_TYPE == 'plain' 102 | when: never 103 | - if: $DISABLE_CUDA_ARM64 == 'true' && $IMAGE_TYPE == 'cuda' 104 | when: never 105 | - if: $DISABLE_TENSORRT_ARM64 == 'true' && $IMAGE_TYPE == 'tensorrt' 106 | when: never 107 | - if: $DISABLE_TRITON_ARM64 == 'true' && $IMAGE_TYPE == 'triton' 108 | when: never 109 | - if: $DISABLE_TORCH_ARM64 == 'true' && $IMAGE_TYPE == 'torch' 110 | when: never 111 | - if: $DISABLE_TF_ARM64 == 'true' && $IMAGE_TYPE == 'tf' 112 | when: never 113 | - if: $DISABLE_ML_ARM64 == 'true' && $IMAGE_TYPE == 'ml' 114 | when: never 115 | - when: on_success 116 | script: 117 | - !reference [.docker-build, script] 118 | variables: 119 | PLATFORM: linux/arm64 120 | IMAGE: ${IMAGE_CI}-arm64 121 | IMAGE_CACHE: ${IMAGE_CI_CACHE}-arm64 122 | 123 | 124 | push: 125 | stage: Push 126 | rules: 127 | - if: $CI_COMMIT_TAG 128 | script: 129 | - !reference [.docker-push-manifest, script] 130 | variables: 131 | TAGGED_IMAGE: ${IMAGE}-v${CI_COMMIT_TAG} 132 | 133 | push-default-ros-package: 134 | stage: Push 135 | needs: 136 | - job: push 137 | optional: true 138 | rules: 139 | - if: $CI_COMMIT_TAG && $PUSH_AS_DEFAULT_ROS_PACKAGE == 'true' && $DISABLE_PUSH_AS_DEFAULT_ROS_PACKAGE != 'true' 140 | script: 141 | - !reference [.docker-push-manifest, script] 142 | variables: 143 | IMAGE: ${IMAGE_REPO}:${TAG_DEFAULT_ROS_PACKAGE} 144 | 145 | push-latest: 146 | stage: Push 147 | needs: 148 | - job: push 149 | optional: true 150 | rules: 151 | - if: $CI_COMMIT_TAG && $PUSH_AS_LATEST == 'true' && $DISABLE_PUSH_AS_LATEST != 'true' 152 | script: 153 | - !reference [.docker-push-manifest, script] 154 | variables: 155 | IMAGE: ${IMAGE_REPO}:latest 156 | -------------------------------------------------------------------------------- /.gitlab-ci/ml-variations/.tf.yml: -------------------------------------------------------------------------------- 1 | variables: 2 | TF_VERSION: ${_TF_VERSION} -------------------------------------------------------------------------------- /.gitlab-ci/ml-variations/.torch.yml: -------------------------------------------------------------------------------- 1 | variables: 2 | TORCH_VERSION: ${_TORCH_VERSION} -------------------------------------------------------------------------------- /.gitlab-ci/ml-variations/.triton.yml: -------------------------------------------------------------------------------- 1 | variables: 2 | TRITON_VERSION: ${_TRITON_VERSION} 3 | -------------------------------------------------------------------------------- /.gitlab-ci/ml-variations/ros-cuda.yml: -------------------------------------------------------------------------------- 1 | include: .gitlab-ci/ml-variations/ros.yml 2 | 3 | variables: 4 | IMAGE_TYPE: "cuda" 5 | BASE_IMAGE_TYPE: "-cuda" 6 | IMAGE_REPO_SUFFIX: "ros2-${IMAGE_TYPE}" 7 | IMAGE_REPO: "${IMAGE_BASE}/${IMAGE_REPO_SUFFIX}" 8 | IMAGE_REPO_CI: "${IMAGE_BASE_CI}/${IMAGE_REPO_SUFFIX}" 9 | -------------------------------------------------------------------------------- /.gitlab-ci/ml-variations/ros-ml.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/ml-variations/ros-tensorrt.yml 3 | - .gitlab-ci/ml-variations/.torch.yml 4 | - .gitlab-ci/ml-variations/.tf.yml 5 | - .gitlab-ci/ml-variations/.triton.yml 6 | - .gitlab-ci/ml-variations/.onnx-runtime.yml 7 | 8 | variables: 9 | IMAGE_TYPE: "ml" 10 | BASE_IMAGE_TYPE: "-tensorrt" 11 | IMAGE_REPO_SUFFIX: "ros2-${IMAGE_TYPE}" 12 | IMAGE_REPO: "${IMAGE_BASE}/${IMAGE_REPO_SUFFIX}" 13 | IMAGE_REPO_CI: "${IMAGE_BASE_CI}/${IMAGE_REPO_SUFFIX}" 14 | IMAGE_CI_CACHE: "${IMAGE_BASE_CI}/ros2-torch:${CI_COMMIT_REF_SLUG}_${ROS_DISTRO}-${ROS_PACKAGE}-torch${TORCH_VERSION}_ci" 15 | TAG: "${ROS_DISTRO}-${ROS_PACKAGE}-tf${TF_VERSION}-torch${TORCH_VERSION}" 16 | -------------------------------------------------------------------------------- /.gitlab-ci/ml-variations/ros-tensorrt.yml: -------------------------------------------------------------------------------- 1 | include: .gitlab-ci/ml-variations/ros.yml 2 | 3 | variables: 4 | IMAGE_TYPE: "tensorrt" 5 | BASE_IMAGE_TYPE: "-tensorrt" 6 | IMAGE_REPO_SUFFIX: "ros2-${IMAGE_TYPE}" 7 | IMAGE_REPO: "${IMAGE_BASE}/${IMAGE_REPO_SUFFIX}" 8 | IMAGE_REPO_CI: "${IMAGE_BASE_CI}/${IMAGE_REPO_SUFFIX}" 9 | -------------------------------------------------------------------------------- /.gitlab-ci/ml-variations/ros-tf.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/ml-variations/ros-tensorrt.yml 3 | - .gitlab-ci/ml-variations/.tf.yml 4 | 5 | variables: 6 | IMAGE_TYPE: "tf" 7 | BASE_IMAGE_TYPE: "-tensorrt" 8 | IMAGE_REPO_SUFFIX: "ros2-${IMAGE_TYPE}" 9 | IMAGE_REPO: "${IMAGE_BASE}/${IMAGE_REPO_SUFFIX}" 10 | IMAGE_REPO_CI: "${IMAGE_BASE_CI}/${IMAGE_REPO_SUFFIX}" 11 | TAG: "${ROS_DISTRO}-${ROS_PACKAGE}-tf${TF_VERSION}" 12 | IMAGE_CI_CACHE: "${IMAGE_BASE_CI}/ros2-tensorrt:${CI_COMMIT_REF_SLUG}_${ROS_DISTRO}-${ROS_PACKAGE}_ci" 13 | -------------------------------------------------------------------------------- /.gitlab-ci/ml-variations/ros-torch.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/ml-variations/ros-tensorrt.yml 3 | - .gitlab-ci/ml-variations/.torch.yml 4 | 5 | variables: 6 | IMAGE_TYPE: "torch" 7 | BASE_IMAGE_TYPE: "-tensorrt" 8 | IMAGE_REPO_SUFFIX: "ros2-${IMAGE_TYPE}" 9 | IMAGE_REPO: "${IMAGE_BASE}/${IMAGE_REPO_SUFFIX}" 10 | IMAGE_REPO_CI: "${IMAGE_BASE_CI}/${IMAGE_REPO_SUFFIX}" 11 | TAG: "${ROS_DISTRO}-${ROS_PACKAGE}-torch${TORCH_VERSION}" 12 | IMAGE_CI_CACHE: "${IMAGE_BASE_CI}/ros2-tensorrt:${CI_COMMIT_REF_SLUG}_${ROS_DISTRO}-${ROS_PACKAGE}_ci" 13 | -------------------------------------------------------------------------------- /.gitlab-ci/ml-variations/ros-triton.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/ml-variations/ros.yml 3 | - .gitlab-ci/ml-variations/.triton.yml 4 | 5 | variables: 6 | IMAGE_TYPE: "triton" 7 | BASE_IMAGE_TYPE: "" 8 | IMAGE_REPO_SUFFIX: "ros2-${IMAGE_TYPE}" 9 | IMAGE_REPO: "${IMAGE_BASE}/${IMAGE_REPO_SUFFIX}" 10 | IMAGE_REPO_CI: "${IMAGE_BASE_CI}/${IMAGE_REPO_SUFFIX}" 11 | IMAGE_CI_CACHE: "${IMAGE_BASE_CI}/ros2:${CI_COMMIT_REF_SLUG}_${ROS_DISTRO}-${ROS_PACKAGE}_ci" 12 | TAG: "${ROS_DISTRO}-${ROS_PACKAGE}-triton${TRITON_VERSION}" 13 | -------------------------------------------------------------------------------- /.gitlab-ci/ml-variations/ros.yml: -------------------------------------------------------------------------------- 1 | include: .gitlab-ci/ml-variations/.template.yml 2 | 3 | variables: 4 | IMAGE_TYPE: "plain" 5 | BASE_IMAGE_TYPE: "" 6 | IMAGE_REPO_SUFFIX: "ros2" 7 | IMAGE_REPO: "${IMAGE_BASE}/${IMAGE_REPO_SUFFIX}" 8 | IMAGE_REPO_CI: "${IMAGE_BASE_CI}/${IMAGE_REPO_SUFFIX}" 9 | TAG: "${ROS_DISTRO}-${ROS_PACKAGE}" 10 | IMAGE: "${IMAGE_REPO}:${TAG}" 11 | IMAGE_CI: "${IMAGE_REPO_CI}:${CI_COMMIT_REF_SLUG}_${TAG}_ci" 12 | IMAGE_CI_CACHE: "${IMAGE_CI}" 13 | -------------------------------------------------------------------------------- /.gitlab-ci/os/.ubuntu22.yml: -------------------------------------------------------------------------------- 1 | variables: 2 | UBUNTU_VERSION: "22.04" 3 | _TF_VERSION: 2.18.0 4 | _TORCH_VERSION: 2.5.0 5 | _TRITON_VERSION: 2.52.0 6 | _ONNX_RUNTIME_VERSION: 1.20.1 7 | -------------------------------------------------------------------------------- /.gitlab-ci/os/.ubuntu24.yml: -------------------------------------------------------------------------------- 1 | variables: 2 | UBUNTU_VERSION: "24.04" 3 | _TF_VERSION: 2.18.0 4 | _TORCH_VERSION: 2.5.0 5 | _TRITON_VERSION: 2.52.0 6 | _ONNX_RUNTIME_VERSION: 1.20.1 7 | DISABLE_CUDA_ARM64: "true" 8 | DISABLE_TENSORRT_ARM64: "true" 9 | DISABLE_TORCH_ARM64: "true" 10 | DISABLE_TF_ARM64: "true" 11 | DISABLE_ML_ARM64: "true" 12 | -------------------------------------------------------------------------------- /.gitlab-ci/postprocessing/ros2-jazzy-desktop-full.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.defaults.yml 3 | 4 | 5 | stages: 6 | - Postprocessing 7 | 8 | 9 | .docker-push-manifest: 10 | script: 11 | - docker pull ${IMAGE_CI_AMD64} 12 | - docker pull ${IMAGE_CI_ARM64} 13 | - docker tag ${IMAGE_CI_AMD64} ${IMAGE}-amd64 14 | - docker tag ${IMAGE_CI_ARM64} ${IMAGE}-arm64 15 | - docker push ${IMAGE}-amd64 16 | - docker push ${IMAGE}-arm64 17 | - docker manifest create ${IMAGE} --amend ${IMAGE}-amd64 --amend ${IMAGE}-arm64 18 | - docker manifest create ${TAGGED_IMAGE} --amend ${IMAGE}-amd64 --amend ${IMAGE}-arm64 19 | - docker manifest push ${IMAGE} 20 | - docker manifest push ${TAGGED_IMAGE} 21 | 22 | 23 | manifest-cuda: 24 | stage: Postprocessing 25 | rules: 26 | - if: $CI_COMMIT_TAG 27 | script: 28 | - !reference [.docker-push-manifest, script] 29 | variables: 30 | IMAGE_CI_AMD64: ${IMAGE_BASE_CI}/ros2-cuda:${CI_COMMIT_REF_SLUG}_jazzy-desktop-full_ci-amd64 31 | IMAGE_CI_ARM64: ${IMAGE_BASE_CI}/ros2-cuda:${CI_COMMIT_REF_SLUG}_jazzy-desktop-full_ci-arm64 32 | IMAGE: ${IMAGE_BASE}/ros2-cuda:jazzy-desktop-full 33 | TAGGED_IMAGE: ${IMAGE}-v${CI_COMMIT_TAG} 34 | 35 | manifest-tensorrt: 36 | stage: Postprocessing 37 | rules: 38 | - if: $CI_COMMIT_TAG 39 | script: 40 | - !reference [.docker-push-manifest, script] 41 | variables: 42 | IMAGE_CI_AMD64: ${IMAGE_BASE_CI}/ros2-tensorrt:${CI_COMMIT_REF_SLUG}_jazzy-desktop-full_ci-amd64 43 | IMAGE_CI_ARM64: ${IMAGE_BASE_CI}/ros2-tensorrt:${CI_COMMIT_REF_SLUG}_jazzy-desktop-full_ci-arm64 44 | IMAGE: ${IMAGE_BASE}/ros2-tensorrt:jazzy-desktop-full 45 | TAGGED_IMAGE: ${IMAGE}-v${CI_COMMIT_TAG} 46 | 47 | manifest-torch: 48 | stage: Postprocessing 49 | rules: 50 | - if: $CI_COMMIT_TAG 51 | script: 52 | - !reference [.docker-push-manifest, script] 53 | variables: 54 | IMAGE_CI_AMD64: ${IMAGE_BASE_CI}/ros2-torch:${CI_COMMIT_REF_SLUG}_jazzy-desktop-full-torch2.5.0_ci-amd64 55 | IMAGE_CI_ARM64: ${IMAGE_BASE_CI}/ros2-torch:${CI_COMMIT_REF_SLUG}_jazzy-desktop-full-torch2.5.0_ci-arm64 56 | IMAGE: ${IMAGE_BASE}/ros2-torch:jazzy-desktop-full-torch2.5.0 57 | TAGGED_IMAGE: ${IMAGE}-v${CI_COMMIT_TAG} 58 | 59 | manifest-tf: 60 | stage: Postprocessing 61 | rules: 62 | - if: $CI_COMMIT_TAG 63 | script: 64 | - !reference [.docker-push-manifest, script] 65 | variables: 66 | IMAGE_CI_AMD64: ${IMAGE_BASE_CI}/ros2-tf:${CI_COMMIT_REF_SLUG}_jazzy-desktop-full-tf2.18.0_ci-amd64 67 | IMAGE_CI_ARM64: ${IMAGE_BASE_CI}/ros2-tf:${CI_COMMIT_REF_SLUG}_jazzy-desktop-full-tf2.18.0_ci-arm64 68 | IMAGE: ${IMAGE_BASE}/ros2-tf:jazzy-desktop-full-tf2.18.0 69 | TAGGED_IMAGE: ${IMAGE}-v${CI_COMMIT_TAG} 70 | 71 | manifest-ml: 72 | stage: Postprocessing 73 | rules: 74 | - if: $CI_COMMIT_TAG 75 | script: 76 | - !reference [.docker-push-manifest, script] 77 | variables: 78 | IMAGE_CI_AMD64: ${IMAGE_BASE_CI}/ros2-ml:${CI_COMMIT_REF_SLUG}_jazzy-desktop-full-tf2.18.0-torch2.5.0_ci-amd64 79 | IMAGE_CI_ARM64: ${IMAGE_BASE_CI}/ros2-ml:${CI_COMMIT_REF_SLUG}_jazzy-desktop-full-tf2.18.0-torch2.5.0_ci-arm64 80 | IMAGE: ${IMAGE_BASE}/ros2-ml:jazzy-desktop-full-tf2.18.0-torch2.5.0 81 | TAGGED_IMAGE: ${IMAGE}-v${CI_COMMIT_TAG} 82 | -------------------------------------------------------------------------------- /.gitlab-ci/postprocessing/ros2-jazzy-ros-base.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.defaults.yml 3 | 4 | 5 | stages: 6 | - Postprocessing 7 | 8 | 9 | .docker-push-manifest: 10 | script: 11 | - docker pull ${IMAGE_CI_AMD64} 12 | - docker pull ${IMAGE_CI_ARM64} 13 | - docker tag ${IMAGE_CI_AMD64} ${IMAGE}-amd64 14 | - docker tag ${IMAGE_CI_ARM64} ${IMAGE}-arm64 15 | - docker push ${IMAGE}-amd64 16 | - docker push ${IMAGE}-arm64 17 | - docker manifest create ${IMAGE} --amend ${IMAGE}-amd64 --amend ${IMAGE}-arm64 18 | - docker manifest create ${TAGGED_IMAGE} --amend ${IMAGE}-amd64 --amend ${IMAGE}-arm64 19 | - docker manifest push ${IMAGE} 20 | - docker manifest push ${TAGGED_IMAGE} 21 | 22 | 23 | manifest-cuda: 24 | stage: Postprocessing 25 | rules: 26 | - if: $CI_COMMIT_TAG 27 | script: 28 | - !reference [.docker-push-manifest, script] 29 | variables: 30 | IMAGE_CI_AMD64: ${IMAGE_BASE_CI}/ros2-cuda:${CI_COMMIT_REF_SLUG}_jazzy-ros-base_ci-amd64 31 | IMAGE_CI_ARM64: ${IMAGE_BASE_CI}/ros2-cuda:${CI_COMMIT_REF_SLUG}_jazzy-ros-base_ci-arm64 32 | IMAGE: ${IMAGE_BASE}/ros2-cuda:jazzy-ros-base 33 | TAGGED_IMAGE: ${IMAGE}-v${CI_COMMIT_TAG} 34 | 35 | manifest-tensorrt: 36 | stage: Postprocessing 37 | rules: 38 | - if: $CI_COMMIT_TAG 39 | script: 40 | - !reference [.docker-push-manifest, script] 41 | variables: 42 | IMAGE_CI_AMD64: ${IMAGE_BASE_CI}/ros2-tensorrt:${CI_COMMIT_REF_SLUG}_jazzy-ros-base_ci-amd64 43 | IMAGE_CI_ARM64: ${IMAGE_BASE_CI}/ros2-tensorrt:${CI_COMMIT_REF_SLUG}_jazzy-ros-base_ci-arm64 44 | IMAGE: ${IMAGE_BASE}/ros2-tensorrt:jazzy-ros-base 45 | TAGGED_IMAGE: ${IMAGE}-v${CI_COMMIT_TAG} 46 | 47 | manifest-torch: 48 | stage: Postprocessing 49 | rules: 50 | - if: $CI_COMMIT_TAG 51 | script: 52 | - !reference [.docker-push-manifest, script] 53 | variables: 54 | IMAGE_CI_AMD64: ${IMAGE_BASE_CI}/ros2-torch:${CI_COMMIT_REF_SLUG}_jazzy-ros-base-torch2.5.0_ci-amd64 55 | IMAGE_CI_ARM64: ${IMAGE_BASE_CI}/ros2-torch:${CI_COMMIT_REF_SLUG}_jazzy-ros-base-torch2.5.0_ci-arm64 56 | IMAGE: ${IMAGE_BASE}/ros2-torch:jazzy-ros-base-torch2.5.0 57 | TAGGED_IMAGE: ${IMAGE}-v${CI_COMMIT_TAG} 58 | 59 | manifest-tf: 60 | stage: Postprocessing 61 | rules: 62 | - if: $CI_COMMIT_TAG 63 | script: 64 | - !reference [.docker-push-manifest, script] 65 | variables: 66 | IMAGE_CI_AMD64: ${IMAGE_BASE_CI}/ros2-tf:${CI_COMMIT_REF_SLUG}_jazzy-ros-base-tf2.18.0_ci-amd64 67 | IMAGE_CI_ARM64: ${IMAGE_BASE_CI}/ros2-tf:${CI_COMMIT_REF_SLUG}_jazzy-ros-base-tf2.18.0_ci-arm64 68 | IMAGE: ${IMAGE_BASE}/ros2-tf:jazzy-ros-base-tf2.18.0 69 | TAGGED_IMAGE: ${IMAGE}-v${CI_COMMIT_TAG} 70 | 71 | manifest-ml: 72 | stage: Postprocessing 73 | rules: 74 | - if: $CI_COMMIT_TAG 75 | script: 76 | - !reference [.docker-push-manifest, script] 77 | variables: 78 | IMAGE_CI_AMD64: ${IMAGE_BASE_CI}/ros2-ml:${CI_COMMIT_REF_SLUG}_jazzy-ros-base-tf2.18.0-torch2.5.0_ci-amd64 79 | IMAGE_CI_ARM64: ${IMAGE_BASE_CI}/ros2-ml:${CI_COMMIT_REF_SLUG}_jazzy-ros-base-tf2.18.0-torch2.5.0_ci-arm64 80 | IMAGE: ${IMAGE_BASE}/ros2-ml:jazzy-ros-base-tf2.18.0-torch2.5.0 81 | TAGGED_IMAGE: ${IMAGE}-v${CI_COMMIT_TAG} 82 | -------------------------------------------------------------------------------- /.gitlab-ci/postprocessing/ros2-jazzy-ros-core.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.defaults.yml 3 | 4 | 5 | stages: 6 | - Postprocessing 7 | 8 | 9 | .docker-push-manifest: 10 | script: 11 | - docker pull ${IMAGE_CI_AMD64} 12 | - docker pull ${IMAGE_CI_ARM64} 13 | - docker tag ${IMAGE_CI_AMD64} ${IMAGE}-amd64 14 | - docker tag ${IMAGE_CI_ARM64} ${IMAGE}-arm64 15 | - docker push ${IMAGE}-amd64 16 | - docker push ${IMAGE}-arm64 17 | - docker manifest create ${IMAGE} --amend ${IMAGE}-amd64 --amend ${IMAGE}-arm64 18 | - docker manifest create ${TAGGED_IMAGE} --amend ${IMAGE}-amd64 --amend ${IMAGE}-arm64 19 | - docker manifest push ${IMAGE} 20 | - docker manifest push ${TAGGED_IMAGE} 21 | 22 | 23 | manifest-cuda: 24 | stage: Postprocessing 25 | rules: 26 | - if: $CI_COMMIT_TAG 27 | script: 28 | - !reference [.docker-push-manifest, script] 29 | variables: 30 | IMAGE_CI_AMD64: ${IMAGE_BASE_CI}/ros2-cuda:${CI_COMMIT_REF_SLUG}_jazzy-ros-core_ci-amd64 31 | IMAGE_CI_ARM64: ${IMAGE_BASE_CI}/ros2-cuda:${CI_COMMIT_REF_SLUG}_jazzy-ros-core_ci-arm64 32 | IMAGE: ${IMAGE_BASE}/ros2-cuda:jazzy-ros-core 33 | TAGGED_IMAGE: ${IMAGE}-v${CI_COMMIT_TAG} 34 | 35 | manifest-tensorrt: 36 | stage: Postprocessing 37 | rules: 38 | - if: $CI_COMMIT_TAG 39 | script: 40 | - !reference [.docker-push-manifest, script] 41 | variables: 42 | IMAGE_CI_AMD64: ${IMAGE_BASE_CI}/ros2-tensorrt:${CI_COMMIT_REF_SLUG}_jazzy-ros-core_ci-amd64 43 | IMAGE_CI_ARM64: ${IMAGE_BASE_CI}/ros2-tensorrt:${CI_COMMIT_REF_SLUG}_jazzy-ros-core_ci-arm64 44 | IMAGE: ${IMAGE_BASE}/ros2-tensorrt:jazzy-ros-core 45 | TAGGED_IMAGE: ${IMAGE}-v${CI_COMMIT_TAG} 46 | 47 | manifest-torch: 48 | stage: Postprocessing 49 | rules: 50 | - if: $CI_COMMIT_TAG 51 | script: 52 | - !reference [.docker-push-manifest, script] 53 | variables: 54 | IMAGE_CI_AMD64: ${IMAGE_BASE_CI}/ros2-torch:${CI_COMMIT_REF_SLUG}_jazzy-ros-core-torch2.5.0_ci-amd64 55 | IMAGE_CI_ARM64: ${IMAGE_BASE_CI}/ros2-torch:${CI_COMMIT_REF_SLUG}_jazzy-ros-core-torch2.5.0_ci-arm64 56 | IMAGE: ${IMAGE_BASE}/ros2-torch:jazzy-ros-core-torch2.5.0 57 | TAGGED_IMAGE: ${IMAGE}-v${CI_COMMIT_TAG} 58 | 59 | manifest-tf: 60 | stage: Postprocessing 61 | rules: 62 | - if: $CI_COMMIT_TAG 63 | script: 64 | - !reference [.docker-push-manifest, script] 65 | variables: 66 | IMAGE_CI_AMD64: ${IMAGE_BASE_CI}/ros2-tf:${CI_COMMIT_REF_SLUG}_jazzy-ros-core-tf2.18.0_ci-amd64 67 | IMAGE_CI_ARM64: ${IMAGE_BASE_CI}/ros2-tf:${CI_COMMIT_REF_SLUG}_jazzy-ros-core-tf2.18.0_ci-arm64 68 | IMAGE: ${IMAGE_BASE}/ros2-tf:jazzy-ros-core-tf2.18.0 69 | TAGGED_IMAGE: ${IMAGE}-v${CI_COMMIT_TAG} 70 | 71 | manifest-ml: 72 | stage: Postprocessing 73 | rules: 74 | - if: $CI_COMMIT_TAG 75 | script: 76 | - !reference [.docker-push-manifest, script] 77 | variables: 78 | IMAGE_CI_AMD64: ${IMAGE_BASE_CI}/ros2-ml:${CI_COMMIT_REF_SLUG}_jazzy-ros-core-tf2.18.0-torch2.5.0_ci-amd64 79 | IMAGE_CI_ARM64: ${IMAGE_BASE_CI}/ros2-ml:${CI_COMMIT_REF_SLUG}_jazzy-ros-core-tf2.18.0-torch2.5.0_ci-arm64 80 | IMAGE: ${IMAGE_BASE}/ros2-ml:jazzy-ros-core-tf2.18.0-torch2.5.0 81 | TAGGED_IMAGE: ${IMAGE}-v${CI_COMMIT_TAG} 82 | -------------------------------------------------------------------------------- /.gitlab-ci/ros-packages/.desktop-full.yml: -------------------------------------------------------------------------------- 1 | variables: 2 | ROS_PACKAGE: desktop-full 3 | -------------------------------------------------------------------------------- /.gitlab-ci/ros-packages/.ros-base.yml: -------------------------------------------------------------------------------- 1 | variables: 2 | ROS_PACKAGE: ros-base 3 | PUSH_AS_DEFAULT_ROS_PACKAGE: 'true' 4 | TAG_DEFAULT_ROS_PACKAGE: ${ROS_DISTRO} 5 | -------------------------------------------------------------------------------- /.gitlab-ci/ros-packages/.ros-core.yml: -------------------------------------------------------------------------------- 1 | variables: 2 | ROS_PACKAGE: ros-core 3 | -------------------------------------------------------------------------------- /.gitlab-ci/ros2-humble/.ros2-humble.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/os/.ubuntu22.yml 3 | 4 | variables: 5 | ROS_DISTRO: humble -------------------------------------------------------------------------------- /.gitlab-ci/ros2-humble/ros2-humble-desktop-full.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.template.yml 3 | - .gitlab-ci/ros2-humble/.ros2-humble.yml 4 | - .gitlab-ci/ros-packages/.desktop-full.yml -------------------------------------------------------------------------------- /.gitlab-ci/ros2-humble/ros2-humble-ros-base.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.template.yml 3 | - .gitlab-ci/ros2-humble/.ros2-humble.yml 4 | - .gitlab-ci/ros-packages/.ros-base.yml -------------------------------------------------------------------------------- /.gitlab-ci/ros2-humble/ros2-humble-ros-core.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.template.yml 3 | - .gitlab-ci/ros2-humble/.ros2-humble.yml 4 | - .gitlab-ci/ros-packages/.ros-core.yml -------------------------------------------------------------------------------- /.gitlab-ci/ros2-jazzy-ubuntu22/ros2-jazzy-ubuntu22-desktop-full.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.template.yml 3 | 4 | variables: 5 | UBUNTU_VERSION: "22.04" 6 | _TF_VERSION: 2.18.0 7 | _TORCH_VERSION: 2.5.0 8 | _TRITON_VERSION: 2.52.0 9 | _ONNX_RUNTIME_VERSION: 1.20.1 10 | 11 | DISABLE_PLAIN: "true" 12 | DISABLE_TRITON: "true" 13 | DISABLE_CUDA_AMD64: "true" 14 | DISABLE_TENSORRT_AMD64: "true" 15 | DISABLE_TORCH_AMD64: "true" 16 | DISABLE_TF_AMD64: "true" 17 | DISABLE_ML_AMD64: "true" 18 | 19 | ROS_DISTRO: jazzy 20 | ROS_PACKAGE: desktop-full 21 | -------------------------------------------------------------------------------- /.gitlab-ci/ros2-jazzy-ubuntu22/ros2-jazzy-ubuntu22-ros-base.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.template.yml 3 | 4 | variables: 5 | UBUNTU_VERSION: "22.04" 6 | _TF_VERSION: 2.18.0 7 | _TORCH_VERSION: 2.5.0 8 | _TRITON_VERSION: 2.52.0 9 | _ONNX_RUNTIME_VERSION: 1.20.1 10 | 11 | DISABLE_PLAIN: "true" 12 | DISABLE_TRITON: "true" 13 | DISABLE_CUDA_AMD64: "true" 14 | DISABLE_TENSORRT_AMD64: "true" 15 | DISABLE_TORCH_AMD64: "true" 16 | DISABLE_TF_AMD64: "true" 17 | DISABLE_ML_AMD64: "true" 18 | 19 | ROS_DISTRO: jazzy 20 | ROS_PACKAGE: ros-base 21 | -------------------------------------------------------------------------------- /.gitlab-ci/ros2-jazzy-ubuntu22/ros2-jazzy-ubuntu22-ros-core.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.template.yml 3 | 4 | variables: 5 | UBUNTU_VERSION: "22.04" 6 | _TF_VERSION: 2.18.0 7 | _TORCH_VERSION: 2.5.0 8 | _TRITON_VERSION: 2.52.0 9 | _ONNX_RUNTIME_VERSION: 1.20.1 10 | 11 | DISABLE_PLAIN: "true" 12 | DISABLE_TRITON: "true" 13 | DISABLE_CUDA_AMD64: "true" 14 | DISABLE_TENSORRT_AMD64: "true" 15 | DISABLE_TORCH_AMD64: "true" 16 | DISABLE_TF_AMD64: "true" 17 | DISABLE_ML_AMD64: "true" 18 | 19 | ROS_DISTRO: jazzy 20 | ROS_PACKAGE: ros-core 21 | -------------------------------------------------------------------------------- /.gitlab-ci/ros2-jazzy/.ros2-jazzy.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/os/.ubuntu24.yml 3 | 4 | variables: 5 | ROS_DISTRO: jazzy 6 | -------------------------------------------------------------------------------- /.gitlab-ci/ros2-jazzy/ros2-jazzy-desktop-full.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.template.yml 3 | - .gitlab-ci/ros2-jazzy/.ros2-jazzy.yml 4 | - .gitlab-ci/ros-packages/.desktop-full.yml 5 | -------------------------------------------------------------------------------- /.gitlab-ci/ros2-jazzy/ros2-jazzy-ros-base.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.template.yml 3 | - .gitlab-ci/ros2-jazzy/.ros2-jazzy.yml 4 | - .gitlab-ci/ros-packages/.ros-base.yml 5 | 6 | variables: 7 | PUSH_AS_LATEST: 'true' 8 | -------------------------------------------------------------------------------- /.gitlab-ci/ros2-jazzy/ros2-jazzy-ros-core.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.template.yml 3 | - .gitlab-ci/ros2-jazzy/.ros2-jazzy.yml 4 | - .gitlab-ci/ros-packages/.ros-core.yml -------------------------------------------------------------------------------- /.gitlab-ci/ros2-kilted/.ros2-kilted.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/os/.ubuntu24.yml 3 | 4 | variables: 5 | ROS_DISTRO: kilted 6 | -------------------------------------------------------------------------------- /.gitlab-ci/ros2-kilted/ros2-kilted-desktop-full.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.template.yml 3 | - .gitlab-ci/ros2-kilted/.ros2-kilted.yml 4 | - .gitlab-ci/ros-packages/.desktop-full.yml 5 | -------------------------------------------------------------------------------- /.gitlab-ci/ros2-kilted/ros2-kilted-ros-base.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.template.yml 3 | - .gitlab-ci/ros2-kilted/.ros2-kilted.yml 4 | - .gitlab-ci/ros-packages/.ros-base.yml 5 | -------------------------------------------------------------------------------- /.gitlab-ci/ros2-kilted/ros2-kilted-ros-core.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.template.yml 3 | - .gitlab-ci/ros2-kilted/.ros2-kilted.yml 4 | - .gitlab-ci/ros-packages/.ros-core.yml -------------------------------------------------------------------------------- /.gitlab-ci/ros2-rolling/.ros2-rolling.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/os/.ubuntu24.yml 3 | 4 | variables: 5 | ROS_DISTRO: rolling 6 | -------------------------------------------------------------------------------- /.gitlab-ci/ros2-rolling/ros2-rolling-desktop-full.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.template.yml 3 | - .gitlab-ci/ros2-rolling/.ros2-rolling.yml 4 | - .gitlab-ci/ros-packages/.desktop-full.yml 5 | -------------------------------------------------------------------------------- /.gitlab-ci/ros2-rolling/ros2-rolling-ros-base.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.template.yml 3 | - .gitlab-ci/ros2-rolling/.ros2-rolling.yml 4 | - .gitlab-ci/ros-packages/.ros-base.yml 5 | -------------------------------------------------------------------------------- /.gitlab-ci/ros2-rolling/ros2-rolling-ros-core.yml: -------------------------------------------------------------------------------- 1 | include: 2 | - .gitlab-ci/.template.yml 3 | - .gitlab-ci/ros2-rolling/.ros2-rolling.yml 4 | - .gitlab-ci/ros-packages/.ros-core.yml 5 | -------------------------------------------------------------------------------- /.version_information.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # get container version information 4 | eval $(cat /etc/os-release | grep ^VERSION=) 5 | 6 | ARCH=$(uname -m) 7 | 8 | [[ -f /etc/nv_tegra_release ]] && JETSON_LINUX_VERSION=$(cat /etc/nv_tegra_release | head -n 1 | sed 's/ (release), REVISION: /./g' | awk '{print $2}' | grep -oE '[0-9.]+') 9 | 10 | if [[ -z "$RMW_IMPLEMENTATION" ]]; then 11 | if ros2 pkg list | grep -q "rmw_fastrtps_cpp"; then 12 | export RMW_IMPLEMENTATION=rmw_fastrtps_cpp 13 | fi 14 | fi 15 | 16 | CUDA_VERSION=$(dpkg -l 2> /dev/null | grep -E "cuda-cudart-[0-9]" | awk '{ print $3 }' | head -n 1) 17 | CUDNN_VERSION=$(dpkg -l 2> /dev/null | grep -E "libcudnn[0-9]" | awk '{ print $3 }' | head -n 1) 18 | TENSORRT_VERSION=$(dpkg -l 2> /dev/null | grep -E "libnvinfer[0-9]" | awk '{ print $3 }' | head -n 1) 19 | 20 | PYTHON_VERSION=$(python --version | awk '{print $2}') 21 | TF_PIP_VERSION=$(python -c "exec(\"try:\n import os; os.environ['TF_CPP_MIN_LOG_LEVEL'] = '1'; import tensorflow as tf; print(tf.__version__);\n\rexcept ImportError:\n pass\")") 22 | PT_PIP_VERSION=$(python -c "exec(\"try:\n import torch; print(torch.__version__);\n\rexcept ImportError:\n pass\")") 23 | ONNX_RUNTIME_VERSION=$(python -c "exec(\"try:\n import onnxruntime; print(onnxruntime.__version__);\n\rexcept ImportError:\n pass\")") 24 | 25 | CMAKE_VERSION=$(cmake --version | grep version | awk '{print $3}') 26 | if [[ $(command -v nvidia-smi) ]]; then 27 | GPU_INFOS=$(nvidia-smi --query-gpu=name,memory.total,driver_version --format=csv,noheader) 28 | NUM_GPUS=$(echo "$GPU_INFOS" | wc -l) 29 | else 30 | NUM_GPUS="0" 31 | GPU_INFOS="" 32 | fi 33 | 34 | # print information 35 | cat << EOF 36 | ╔══════════════════════════════════════════════════ CONTAINER INFORMATION ═════╗ 37 | EOF 38 | printf "║ %13s | %-60s ║\n" "Architecture" "$ARCH" 39 | printf "║ %13s | %-60s ║\n" "Ubuntu" "$VERSION" 40 | [[ -n "$JETSON_LINUX_VERSION" ]] && printf "║ %13s | %-60s ║\n" "Jetson Linux" "$JETSON_LINUX_VERSION" 41 | [[ $(getent passwd $DOCKER_USER) ]] && printf "║ %13s | %-60s ║\n" "User:PW" "$DOCKER_USER:$DOCKER_USER" 42 | [[ -n "$PYTHON_VERSION" ]] && printf "║ %13s | %-60s ║\n" "Python" "$PYTHON_VERSION" 43 | [[ -n "$ROS_DISTRO" ]] && printf "║ %13s | %-60s ║\n" "ROS" "$ROS_DISTRO" 44 | [[ -n "$RMW_IMPLEMENTATION" ]] && printf "║ %13s | %-60s ║\n" "RMW" "$RMW_IMPLEMENTATION" 45 | [[ -n "$CMAKE_VERSION" ]] && printf "║ %13s | %-60s ║\n" "CMake" "$CMAKE_VERSION" 46 | [[ -n "$CUDA_VERSION" ]] && printf "║ %13s | %-60s ║\n" "CUDA" "$CUDA_VERSION" 47 | [[ -n "$CUDNN_VERSION" ]] && printf "║ %13s | %-60s ║\n" "cuDNN" "$CUDNN_VERSION" 48 | [[ -n "$TENSORRT_VERSION" ]] && printf "║ %13s | %-60s ║\n" "TensorRT" "$TENSORRT_VERSION" 49 | [[ -n "$TRITON_VERSION" ]] && printf "║ %13s | %-60s ║\n" "Triton Client" "$TRITON_VERSION" 50 | [[ -n "$TF_PIP_VERSION" ]] && printf "║ %13s | %-60s ║\n" "TensorFlow" "$TF_PIP_VERSION" 51 | [[ -n "$PT_PIP_VERSION" ]] && printf "║ %13s | %-60s ║\n" "PyTorch" "$PT_PIP_VERSION" 52 | [[ -n "$ONNX_RUNTIME_VERSION" ]] && printf "║ %13s | %-60s ║\n" "ONNX RT" "$ONNX_RUNTIME_VERSION" 53 | [[ -n "$NUM_GPUS" ]] && printf "║ %13s | %-60s ║\n" "GPUs" "$NUM_GPUS" 54 | if [[ -n "$GPU_INFOS" ]]; then 55 | IFS=$'\n' 56 | for GPU_INFO in $GPU_INFOS; do 57 | printf "║ %13s | %-60s ║\n" "" "$GPU_INFO" 58 | done 59 | unset IFS 60 | fi 61 | 62 | cat << EOF 63 | ╚══════════════════════════════════════════════════════════════════════════════╝ 64 | 65 | EOF 66 | -------------------------------------------------------------------------------- /CITATION.cff: -------------------------------------------------------------------------------- 1 | cff-version: 1.2.0 2 | message: "We hope that our tools can help your research. If this is the case, please cite it using the following metadata." 3 | 4 | title: dorotos 5 | type: software 6 | repository-code: "https://github.com/ika-rwth-aachen/docker-ros-ml-images" 7 | date-released: 2023-05-28 8 | authors: 9 | - given-names: Jean-Pierre 10 | family-names: Busch 11 | - given-names: Lennart 12 | family-names: Reiher 13 | 14 | preferred-citation: 15 | title: "Enabling the Deployment of Any-Scale Robotic Applications in Microservice-Based Service-Oriented Architectures through Automated Containerization" 16 | type: conference-paper 17 | conference: 18 | name: "2024 IEEE International Conference on Robotics and Automation (ICRA)" 19 | year: 2024 20 | pages: "17650-17656" 21 | doi: "10.1109/ICRA57147.2024.10611586" 22 | url: "https://ieeexplore.ieee.org/document/10611586" 23 | authors: 24 | - given-names: Jean-Pierre 25 | family-names: Busch 26 | orcid: "https://orcid.org/0009-0000-1417-0463" 27 | - given-names: Lennart 28 | family-names: Reiher 29 | orcid: "https://orcid.org/0000-0002-7309-164X" 30 | - given-names: Lutz 31 | family-names: Eckstein 32 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # docker buildx build \ 2 | # --load \ 3 | # --platform $(uname)/$(uname -m) \ 4 | # --build-arg IMAGE_VERSION=$CI_COMMIT_TAG \ 5 | # --build-arg BASE_IMAGE_TYPE=$BASE_IMAGE_TYPE \ 6 | # --build-arg UBUNTU_VERSION=$UBUNTU_VERSION \ 7 | # --build-arg ROS_DISTRO=$ROS_DISTRO \ 8 | # --build-arg ROS_PACKAGE=$ROS_PACKAGE \ 9 | # --build-arg ROS_BUILD_FROM_SRC=$ROS_BUILD_FROM_SRC \ 10 | # --build-arg TORCH_VERSION=$TORCH_VERSION \ 11 | # --build-arg TF_VERSION=$TF_VERSION \ 12 | # --build-arg ONNX_RUNTIME_VERSION=$ONNX_RUNTIME_VERSION \ 13 | # --build-arg TRITON_VERSION=$TRITON_VERSION \ 14 | # --tag $IMAGE \ 15 | # . 16 | 17 | ARG BASE_IMAGE_TYPE 18 | ARG UBUNTU_VERSION="24.04" 19 | 20 | # === ubuntu base images ========================================================================== 21 | FROM --platform=amd64 ubuntu:22.04 AS base-ubuntu22.04-amd64 22 | FROM --platform=amd64 ubuntu:24.04 AS base-ubuntu24.04-amd64 23 | 24 | FROM --platform=arm64 ubuntu:22.04 AS base-ubuntu22.04-arm64 25 | FROM --platform=arm64 ubuntu:24.04 AS base-ubuntu24.04-arm64 26 | 27 | # === cuda base images ============================================================================ 28 | FROM --platform=amd64 nvcr.io/nvidia/cuda:12.6.1-runtime-ubuntu22.04 AS base-cuda-ubuntu22.04-amd64 29 | FROM --platform=amd64 nvcr.io/nvidia/cuda:12.6.1-runtime-ubuntu24.04 AS base-cuda-ubuntu24.04-amd64 30 | 31 | FROM --platform=arm64 nvcr.io/nvidia/l4t-cuda:12.6.11-runtime AS base-cuda-ubuntu22.04-arm64 32 | # no l4t-cuda image for ubuntu24 available 33 | 34 | # === tensorrt base images ======================================================================== 35 | FROM --platform=amd64 nvcr.io/nvidia/tensorrt:24.08-py3 AS base-tensorrt-ubuntu22.04-amd64 36 | FROM --platform=amd64 nvcr.io/nvidia/tensorrt:24.11-py3 AS base-tensorrt-ubuntu24.04-amd64 37 | 38 | FROM --platform=arm64 nvcr.io/nvidia/l4t-tensorrt:r10.3.0-runtime AS base-tensorrt-ubuntu22.04-arm64 39 | # no l4t-tensorrt image for ubuntu24 available 40 | 41 | # ================================================================================================ 42 | FROM "base${BASE_IMAGE_TYPE}-ubuntu${UBUNTU_VERSION}-${TARGETARCH}" 43 | 44 | ARG DEBIAN_FRONTEND=noninteractive 45 | SHELL ["/bin/bash", "-c"] 46 | 47 | USER root 48 | 49 | # set all locale settings to a sensible default, allowing to override via LC_ALL 50 | ENV LANG="C.utf8" 51 | ENV LANGUAGE="C.utf8" 52 | ENV LC_CTYPE="C.utf8" 53 | ENV LC_NUMERIC="C.utf8" 54 | ENV LC_TIME="C.utf8" 55 | ENV LC_COLLATE="C.utf8" 56 | ENV LC_MONETARY="C.utf8" 57 | ENV LC_MESSAGES="C.utf8" 58 | ENV LC_PAPER="C.utf8" 59 | ENV LC_NAME="C.utf8" 60 | ENV LC_ADDRESS="C.utf8" 61 | ENV LC_TELEPHONE="C.utf8" 62 | ENV LC_MEASUREMENT="C.utf8" 63 | ENV LC_IDENTIFICATION="C.utf8" 64 | 65 | ARG BASE_IMAGE_TYPE 66 | ARG TARGETARCH 67 | ARG UBUNTU_VERSION 68 | RUN if [[ $TARGETARCH == "arm64" && $UBUNTU_VERSION == "22.04" && $BASE_IMAGE_TYPE != "" ]]; then \ 69 | # add nvidia apt repositories for l4t base images 70 | # touch: https://forums.balena.io/t/getting-linux-for-tegra-into-a-container-on-balena-os/179421/20 71 | apt-key adv --fetch-key http://repo.download.nvidia.com/jetson/jetson-ota-public.asc && \ 72 | echo "deb https://repo.download.nvidia.com/jetson/common r36.4 main" >> /etc/apt/sources.list && \ 73 | echo "deb https://repo.download.nvidia.com/jetson/t234 r36.4 main" >> /etc/apt/sources.list && \ 74 | mkdir -p /opt/nvidia/l4t-packages/ && \ 75 | touch /opt/nvidia/l4t-packages/.nv-l4t-disable-boot-fw-update-in-preinstall; \ 76 | elif [[ $TARGETARCH == "amd64" && $BASE_IMAGE_TYPE == "-tensorrt" ]]; then \ 77 | # add cuda apt repository for tensorrt base images 78 | wget -q -O /tmp/cuda-keyring_1.1-1_all.deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu${UBUNTU_VERSION/./}/x86_64/cuda-keyring_1.1-1_all.deb && \ 79 | dpkg -i /tmp/cuda-keyring_1.1-1_all.deb && \ 80 | rm -rf /tmp/cuda-keyring_1.1-1_all.deb; \ 81 | fi 82 | 83 | # install essentials 84 | RUN apt-get update && \ 85 | apt-get install -y \ 86 | bsdmainutils \ 87 | build-essential \ 88 | bash-completion \ 89 | curl \ 90 | dirmngr \ 91 | gdb \ 92 | git \ 93 | gnupg2 \ 94 | gosu \ 95 | iputils-ping \ 96 | less \ 97 | libglvnd-dev \ 98 | libssl-dev \ 99 | nano \ 100 | python-is-python3 \ 101 | python3-pip \ 102 | sed \ 103 | software-properties-common \ 104 | tzdata \ 105 | unzip \ 106 | vim \ 107 | wget \ 108 | x11-apps \ 109 | zip \ 110 | && rm -rf /var/lib/apt/lists/* 111 | RUN if [[ $UBUNTU_VERSION == "24.04" ]]; then python -m pip config --global set global.break-system-packages true; \ 112 | else python -m pip install --upgrade pip; fi 113 | 114 | # enable bash completion 115 | RUN sed -i '/^#if \[ -f \/etc\/bash_completion \]/,/^#fi/ s/^#//' ~/.bashrc 116 | 117 | # install more essentials 118 | RUN curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash && \ 119 | apt-get update && \ 120 | apt-get install git-lfs && \ 121 | rm -rf /var/lib/apt/lists/* 122 | 123 | # --- install and setup ROS ---------------------------------------------------------------------- 124 | 125 | # set up ROS apt sources 126 | RUN ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F\" '{print $4}') && \ 127 | curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo $UBUNTU_CODENAME)_all.deb" && \ 128 | apt-get install -y /tmp/ros2-apt-source.deb 129 | 130 | # install ROS bootstrapping tools 131 | RUN apt-get update && \ 132 | apt-get install -y \ 133 | python3-rosdep \ 134 | python3-vcstool \ 135 | && rm -rf /var/lib/apt/lists/* && \ 136 | rosdep init 137 | 138 | ARG ROS_DISTRO 139 | ENV ROS_DISTRO=${ROS_DISTRO} 140 | # set up 3rd party ROS deb sources for arm64 | Ubuntu 22 | Jazzy (required due to NVIDIA base images being stuck at Ubuntu 22) 141 | RUN if [[ "$ROS_DISTRO" == "jazzy" && $UBUNTU_VERSION == "22.04" ]]; then \ 142 | add-apt-repository universe && \ 143 | wget -O /etc/apt/keyrings/ros2-tier3-pkgs-pub.gpg.key https://raw.githubusercontent.com/meetgandhi-dev/ros2_tier3_packages/main/ros2-tier3-pkgs-pub.gpg.key && \ 144 | echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/ros2-tier3-pkgs-pub.gpg.key] https://raw.githubusercontent.com/meetgandhi-dev/ros2_tier3_packages/main/debian_packages $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | tee /etc/apt/sources.list.d/ros2-tier3-pkgs.list > /dev/null && \ 145 | apt-get update && \ 146 | apt-get install -y ros-jazzy-rosdep-jammy && \ 147 | rosdep update --rosdistro ${ROS_DISTRO} && \ 148 | rm -rf /var/lib/apt/lists/* ; \ 149 | fi 150 | 151 | # install essential ROS CLI tools 152 | RUN apt-get update && \ 153 | apt-get install -y \ 154 | python3-colcon-common-extensions && \ 155 | pip install colcon-clean && \ 156 | pip install --ignore-installed ros2-pkg-create && \ 157 | rm -rf /var/lib/apt/lists/* 158 | 159 | # install ROS 160 | ARG ROS_PACKAGE=ros-core 161 | ARG ROS_BUILD_FROM_SRC=false 162 | RUN if [[ "$ROS_BUILD_FROM_SRC" == "true" ]]; then \ 163 | apt-get update && \ 164 | apt-get install -y \ 165 | python3-flake8-blind-except \ 166 | python3-flake8-class-newline \ 167 | python3-flake8-deprecated \ 168 | python3-mypy \ 169 | python3-pip \ 170 | python3-pytest \ 171 | python3-pytest-cov \ 172 | python3-pytest-mock \ 173 | python3-pytest-repeat \ 174 | python3-pytest-rerunfailures \ 175 | python3-pytest-runner \ 176 | python3-pytest-timeout \ 177 | ros-dev-tools && \ 178 | if [[ "$TARGETARCH" == "arm64" && "$UBUNTU_VERSION" == "22.04" && "$BASE_IMAGE_TYPE" != "" ]]; then \ 179 | apt-get install -y libopencv; \ 180 | fi && \ 181 | mkdir -p /ros2_${ROS_DISTRO}/src && \ 182 | cd /ros2_${ROS_DISTRO} && \ 183 | vcs import --input https://raw.githubusercontent.com/ros2/ros2/${ROS_DISTRO}/ros2.repos src && \ 184 | rosdep update --rosdistro ${ROS_DISTRO} && \ 185 | rosdep install -y --ignore-src --from-paths src --skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers" && \ 186 | mkdir -p /opt/ros/${ROS_DISTRO} && \ 187 | colcon build --parallel-workers 32 --install-base /opt/ros/${ROS_DISTRO} --merge-install --cmake-args -DCMAKE_BUILD_TYPE=Release && \ 188 | cd - && \ 189 | rm -rf /ros2_${ROS_DISTRO} && \ 190 | rm -rf /var/lib/apt/lists/*; \ 191 | else \ 192 | apt-get update && \ 193 | apt-get install -y --no-install-recommends ros-${ROS_DISTRO}-${ROS_PACKAGE} && \ 194 | rm -rf /var/lib/apt/lists/*; \ 195 | fi 196 | 197 | # source ROS 198 | RUN echo "source /opt/ros/$ROS_DISTRO/setup.bash" >> ~/.bashrc 199 | 200 | # install NVIDIA Triton Client 201 | ARG TRITON_VERSION 202 | ENV TRITON_VERSION=${TRITON_VERSION} 203 | ENV TRITON_CLIENT_DIR="/opt/tritonclient" 204 | RUN if [[ -n $TRITON_VERSION ]]; then \ 205 | if [[ "$TARGETARCH" == "amd64" ]]; then \ 206 | wget -q -O /tmp/tritonclient.tar.gz https://github.com/triton-inference-server/server/releases/download/v${TRITON_VERSION}/v${TRITON_VERSION}_ubuntu2404.clients.tar.gz; \ 207 | elif [[ "$TARGETARCH" == "arm64" ]]; then \ 208 | wget -q -O /tmp/tritonclient.tar.gz https://github.com/triton-inference-server/server/releases/download/v${TRITON_VERSION}/tritonserver${TRITON_VERSION}-igpu.tar; \ 209 | fi && \ 210 | mkdir -p ${TRITON_CLIENT_DIR} && \ 211 | tar -xzf /tmp/tritonclient.tar.gz -C ${TRITON_CLIENT_DIR} && \ 212 | rm /tmp/tritonclient.tar.gz && \ 213 | echo "export LD_LIBRARY_PATH=$TRITON_CLIENT_DIR/lib:\$LD_LIBRARY_PATH" >> ~/.bashrc ; \ 214 | fi 215 | 216 | # install libcudnn as it is not installed in nvcr.io/nvidia/l4t-tensorrt:r10.3.0-runtime 217 | RUN if [[ $BASE_IMAGE_TYPE == "-tensorrt" && $TARGETARCH == "arm64" && $UBUNTU_VERSION == "22.04" ]]; then \ 218 | apt-get update && \ 219 | apt-get install -y cudnn9-cuda-12-6 && \ 220 | rm -rf /var/lib/apt/lists/*; \ 221 | fi 222 | 223 | # install PyTorch 224 | ARG TORCH_VERSION 225 | RUN if [[ -n $TORCH_VERSION ]]; then \ 226 | if [[ "$TARGETARCH" == "amd64" ]]; then \ 227 | # --ignore-installed, because of dependency conflicts 228 | pip3 install --ignore-installed torch==${TORCH_VERSION} && \ 229 | if [[ "$TORCH_VERSION" == "2.5.0" ]]; then pip3 install torchvision==0.20.0; fi; \ 230 | elif [[ "$TARGETARCH" == "arm64" ]]; then \ 231 | # from: https://forums.developer.nvidia.com/t/pytorch-for-jetson/72048 232 | # and: https://docs.nvidia.com/deeplearning/frameworks/install-pytorch-jetson-platform/index.html#prereqs-install 233 | apt-get update && \ 234 | apt-get install -y libopenblas-base libopenmpi-dev libomp-dev && \ 235 | rm -rf /var/lib/apt/lists/* && \ 236 | wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/${TARGETARCH}/cuda-keyring_1.1-1_all.deb && \ 237 | dpkg -i cuda-keyring_1.1-1_all.deb && \ 238 | apt-get update && \ 239 | apt-get install -y libcusparselt0 libcusparselt-dev cuda-cupti-12-6 && \ 240 | rm -rf /var/lib/apt/lists/* && \ 241 | wget -q -O /tmp/torch-${TORCH_VERSION}a0+872d972e41.nv24.08.17622132-cp310-cp310-linux_aarch64.whl https://developer.download.nvidia.com/compute/redist/jp/v61/pytorch/torch-${TORCH_VERSION}a0+872d972e41.nv24.08.17622132-cp310-cp310-linux_aarch64.whl && \ 242 | wget -q -O /tmp/torchvision-0.20.0-cp310-cp310-linux_aarch64.whl http://jetson.webredirect.org/jp6/cu126/+f/5f9/67f920de3953f/torchvision-0.20.0-cp310-cp310-linux_aarch64.whl && \ 243 | python3 -m pip install numpy=="1.26.1" && \ 244 | python3 -m pip install --ignore-installed --no-cache /tmp/torch*.whl && \ 245 | rm -f /tmp/torch*.whl; \ 246 | fi; \ 247 | fi 248 | 249 | # install TensorFlow 250 | ARG TF_VERSION 251 | RUN if [[ -n $TF_VERSION ]]; then \ 252 | if [[ "$TARGETARCH" == "amd64" ]]; then \ 253 | if [[ $UBUNTU_VERSION == "22.04" ]]; then pip install opencv-python matplotlib; fi && \ 254 | pip3 install tensorflow==${TF_VERSION}; \ 255 | elif [[ "$TARGETARCH" == "arm64" ]]; then \ 256 | apt-get update && \ 257 | apt-get install -y libhdf5-dev && \ 258 | rm -rf /var/lib/apt/lists/* && \ 259 | pip3 install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v61 tensorflow==2.16.1+nv24.08; \ 260 | fi; \ 261 | fi 262 | 263 | # install ONNX Runtime 264 | ARG ONNX_RUNTIME_VERSION 265 | RUN if [[ -n $ONNX_RUNTIME_VERSION ]]; then \ 266 | if [[ "$TARGETARCH" == "amd64" ]]; then \ 267 | pip3 install onnxruntime-gpu==${ONNX_RUNTIME_VERSION}; \ 268 | fi; \ 269 | fi 270 | 271 | # --- finalization ------------------------------------------------------------------------------- 272 | 273 | # user setup 274 | ENV DOCKER_USER=dockeruser 275 | ENV DOCKER_UID= 276 | ENV DOCKER_GID= 277 | # remove user with uid 1000, if existing (standard user in ubuntu) 278 | RUN if id -u 1000 >/dev/null 2>&1; then userdel --force --remove $(getent passwd 1000 | cut -d: -f1); fi 279 | 280 | # print version information during login 281 | RUN echo "source /.version_information.sh" >> ~/.bashrc 282 | COPY .version_information.sh /.version_information.sh 283 | 284 | # container startup setup 285 | ENV WORKSPACE=/docker-ros/ws 286 | WORKDIR $WORKSPACE 287 | ENV TINI_VERSION=v0.19.0 288 | ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${TARGETARCH} /tini 289 | RUN chmod +x /tini 290 | COPY entrypoint.sh / 291 | ENTRYPOINT ["/tini", "--", "/entrypoint.sh"] 292 | CMD ["bash"] 293 | 294 | # image labels 295 | ARG IMAGE_VERSION="" 296 | LABEL maintainer="Institute for Automotive Engineering (ika), RWTH Aachen University " 297 | LABEL org.opencontainers.image.authors="Institute for Automotive Engineering (ika), RWTH Aachen University " 298 | LABEL org.opencontainers.image.licenses="MIT" 299 | LABEL org.opencontainers.image.url="https://github.com/ika-rwth-aachen/docker-ros-ml-images" 300 | LABEL org.opencontainers.image.version="$IMAGE_VERSION" 301 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Institute for Automotive Engineering (ika), RWTH Aachen University 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # *docker-ros-ml-images* – Machine Learning-Enabled ROS Docker Images 2 | 3 |

4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 |

13 | 14 | *docker-ros-ml-images* provides multi-arch machine learning-enabled ROS Docker images. 15 | 16 | > [!IMPORTANT] 17 | > This repository is open-sourced and maintained by the [**Institute for Automotive Engineering (ika) at RWTH Aachen University**](https://www.ika.rwth-aachen.de/). 18 | > **DevOps, Containerization and Orchestration of Software-Defined Vehicles** are some of many research topics within our [*Vehicle Intelligence & Automated Driving*](https://www.ika.rwth-aachen.de/en/competences/fields-of-research/vehicle-intelligence-automated-driving.html) domain. 19 | > If you would like to learn more about how we can support your advanced driver assistance and automated driving efforts, feel free to reach out to us! 20 | > :email: ***opensource@ika.rwth-aachen.de*** 21 | 22 | We recommend to use *docker-ros-ml-images* in combination with our other tools for Docker and ROS. 23 | - [*docker-ros*](https://github.com/ika-rwth-aachen/docker-ros) automatically builds minimal container images of ROS applications 24 | - [*docker-run*](https://github.com/ika-rwth-aachen/docker-run) is a CLI tool for simplified interaction with Docker images 25 | 26 | 27 | ## Quick Links to Available Images 28 | 29 | [`ros2`](#rwthikaros2-ros-2) | [`ros2-cuda`](#rwthikaros2-cuda-ros-2-nvidia-cuda) | [`ros2-tensorrt`](#rwthikaros2-tensorrt-ros-2-nvidia-cuda-nvidia-tensorrt) | [`ros2-triton`](#rwthikaros2-triton-ros-2-nvidia-cuda-nvidia-triton-client) | [`ros2-torch`](#rwthikaros2-torch-ros-2-nvidia-cuda-nvidia-tensorrt-pytorch) | [`ros2-tf`](#rwthikaros2-tf-ros-2-nvidia-cuda-nvidia-tensorrt-tensorflow) | [`ros2-ml`](#rwthikaros2-ml-ros-2-nvidia-cuda-nvidia-tensorrt-pytorch-tensorflow) 30 | 31 | 32 | ## Quick Start 33 | 34 | ```bash 35 | docker run --rm rwthika/ros2-ml:humble \ 36 | python -c 'import os; import tensorflow as tf; import torch; e="ROS_DISTRO"; print(f"Hello from ROS {os.environ[e]}, PyTorch {torch.__version__}, and TensorFlow {tf.__version__}!")' 37 | ``` 38 | 39 | 40 | ## Variations 41 | 42 | With *docker-ros-ml-images*, we provide a variety of lightweight multi-arch machine learning-enabled ROS Docker images. Starting with plain ROS images, we offer successively larger ROS base images that also come with [*NVIDIA CUDA*](https://developer.nvidia.com/cuda-toolkit), [*NVIDIA TensorRT*](https://developer.nvidia.com/tensorrt), [*NVIDIA Triton Client*](https://developer.nvidia.com/triton-inference-server), [*PyTorch*](https://pytorch.org/) and/or [*TensorFlow*](https://www.tensorflow.org/) installations. Combining the components listed in the table below, we have built more than 100 multi-arch images and make them publicly available on [DockerHub](https://hub.docker.com/u/rwthika). In addition to the provided images, we also publish the [generic Dockerfile](./Dockerfile) used to flexibly build images combining the different components. 43 | 44 | | Component | Variations | 45 | | ------------------ | ------------------------------------------------------------------------------------- | 46 | | ROS 2 Distribution | humble, jazzy, kilted, rolling | 47 | | ROS 2 Components | core, base, desktop-full | 48 | | ML Framework | NVIDIA CUDA, NVIDIA TensorRT, NVIDIA Triton Client, PyTorch, TensorFlow, ONNX Runtime | 49 | | Architecture | amd64, arm64 | 50 | 51 | > [!NOTE] 52 | > All images are targeted at NVIDIA GPUs and therefore base off of official [NVIDIA base images](https://catalog.ngc.nvidia.com/containers). The arm64 images, in particular, target NVIDIA Jetson SoCs and are based off of [NVIDIA L4T base images](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-base). Ubuntu 22 images are provided with JetPack 6, Ubuntu 20 images with JetPack 5. 53 | 54 | > [!NOTE] 55 | > Since robotic applications are often implemented in C++ instead of Python for performance reasons, previous releases of our images also shipped with the C++ APIs of PyTorch and TensorFlow. Installing the C++ libraries often involves cumbersome building from source, so we have decided to drop PyTorch/TensorFlow C++ support for more frequent releases. You may still find those images with ML C++ support under the [23.08 release](https://hub.docker.com/r/rwthika/ros2-ml/tags?page=&page_size=&ordering=&name=-v23.08). 56 | 57 | 58 | ## Image Configuration 59 | 60 | ### User Setup 61 | 62 | Containers of the provided images start with `root` user by default. If the two environment variables `DOCKER_UID` and `DOCKER_GID` are passed, a new user with the corresponding UID/GID is created on the fly. Most importantly, this features allows to mount and edit files of the host user in the container without having to deal with permission issues. 63 | 64 | ```bash 65 | docker run --rm -it -e DOCKER_UID=$(id -u) -e DOCKER_GID=$(id -g) -e DOCKER_USER=$(id -un) rwthika/ros2:latest 66 | ``` 67 | 68 | The password of the custom user is set to its username (`dockeruser:dockeruser` by default). 69 | 70 | 71 | ## Available Images 72 | 73 | ### ROS 2 74 | 75 | #### [`rwthika/ros2`](https://hub.docker.com/r/rwthika/ros2) (ROS 2) 76 | 77 |
78 | 79 | 80 | 81 |
Click to expand 82 | 83 | | Tag | Arch | Ubuntu | Jetson Linux | Python | ROS | ROS Package | CMake | CUDA | cuDNN | TensorRT | Triton | PyTorch | TensorFlow | ONNX RT | 84 | | :---------------------------------- | :------------: | :-----: | :----------: | :-----: | :-----: | :----------: | :----: | :---: | :---: | :------: | :----: | :-----: | :--------: | :-----: | 85 | | `humble-ros-core` | amd64
arm64 | 22.04.5 | - | 3.10.12 | humble | ros-core | 3.22.1 | - | - | - | - | - | - | - | 86 | | `humble`, `humble-ros-base` | amd64
arm64 | 22.04.5 | - | 3.10.12 | humble | ros-base | 3.22.1 | - | - | - | - | - | - | - | 87 | | `humble-desktop-full` | amd64
arm64 | 22.04.5 | - | 3.10.12 | humble | desktop-full | 3.22.1 | - | - | - | - | - | - | - | 88 | | `jazzy-ros-core` | amd64
arm64 | 24.04.2 | - | 3.12.3 | jazzy | ros-core | 3.28.3 | - | - | - | - | - | - | - | 89 | | `latest`, `jazzy`, `jazzy-ros-base` | amd64
arm64 | 24.04.2 | - | 3.12.3 | jazzy | ros-base | 3.28.3 | - | - | - | - | - | - | - | 90 | | `jazzy-desktop-full` | amd64
arm64 | 24.04.2 | - | 3.12.3 | jazzy | desktop-full | 3.28.3 | - | - | - | - | - | - | - | 91 | | `kilted-ros-core` | amd64
arm64 | 24.04.2 | - | 3.12.3 | kilted | ros-core | 3.28.3 | - | - | - | - | - | - | - | 92 | | `kilted`, `kilted-ros-base` | amd64
arm64 | 24.04.2 | - | 3.12.3 | kilted | ros-base | 3.28.3 | - | - | - | - | - | - | - | 93 | | `kilted-desktop-full` | amd64
arm64 | 24.04.2 | - | 3.12.3 | kilted | desktop-full | 3.28.3 | - | - | - | - | - | - | - | 94 | | `rolling-ros-core` | amd64
arm64 | 24.04.2 | - | 3.12.3 | rolling | ros-core | 3.28.3 | - | - | - | - | - | - | - | 95 | | `rolling`, `rolling-ros-base` | amd64
arm64 | 24.04.2 | - | 3.12.3 | rolling | ros-base | 3.28.3 | - | - | - | - | - | - | - | 96 | | `rolling-desktop-full` | amd64
arm64 | 24.04.2 | - | 3.12.3 | rolling | desktop-full | 3.28.3 | - | - | - | - | - | - | - | 97 | 98 |
99 |
100 | 101 | #### [`rwthika/ros2-cuda`](https://hub.docker.com/r/rwthika/ros2-cuda) (ROS 2, NVIDIA CUDA) 102 | 103 |
104 | 105 | 106 | 107 |
Click to expand 108 | 109 | | Tag | Arch | Ubuntu | Jetson Linux | Python | ROS | ROS Package | CMake | CUDA | cuDNN | TensorRT | Triton | PyTorch | TensorFlow | ONNX RT | 110 | | :---------------------------------- | :------------: | :----------------: | :----------: | :---------------: | :-----: | :----------: | :--------------: | :-----: | :---: | :------: | :----: | :-----: | :--------: | :-----: | 111 | | `humble-ros-core` | amd64
arm64 | 22.04.4
22.04.3 | -
36.4.3 | 3.10.12 | humble | ros-core | 3.22.1 | 12.6.68 | - | - | - | - | - | - | 112 | | `humble`, `humble-ros-base` | amd64
arm64 | 22.04.4
22.04.3 | -
36.4.3 | 3.10.12 | humble | ros-base | 3.22.1 | 12.6.68 | - | - | - | - | - | - | 113 | | `humble-desktop-full` | amd64
arm64 | 22.04.4
22.04.3 | -
36.4.3 | 3.10.12 | humble | desktop-full | 3.22.1 | 12.6.68 | - | - | - | - | - | - | 114 | | `jazzy-ros-core` | amd64
arm64 | 24.04
22.04.3 | -
36.4.3 | 3.12.3
3.10.12 | jazzy | ros-core | 3.28.3
3.22.1 | 12.6.68 | - | - | - | - | - | - | 115 | | `latest`, `jazzy`, `jazzy-ros-base` | amd64
arm64 | 24.04
22.04.3 | -
36.4.3 | 3.12.3
3.10.12 | jazzy | ros-base | 3.28.3
3.22.1 | 12.6.68 | - | - | - | - | - | - | 116 | | `jazzy-desktop-full` | amd64
arm64 | 24.04
22.04.3 | -
36.4.3 | 3.12.3
3.10.12 | jazzy | desktop-full | 3.28.3
3.22.1 | 12.6.68 | - | - | - | - | - | - | 117 | | `kilted-ros-core` | amd64 | 24.04 | - | 3.12.3 | kilted | ros-core | 3.28.3 | 12.6.68 | - | - | - | - | - | - | 118 | | `kilted`, `kilted-ros-base` | amd64 | 24.04 | - | 3.12.3 | kilted | ros-base | 3.28.3 | 12.6.68 | - | - | - | - | - | - | 119 | | `kilted-desktop-full` | amd64 | 24.04 | - | 3.12.3 | kilted | desktop-full | 3.28.3 | 12.6.68 | - | - | - | - | - | - | 120 | | `rolling-ros-core` | amd64 | 24.04 | - | 3.12.3 | rolling | ros-core | 3.28.3 | 12.6.68 | - | - | - | - | - | - | 121 | | `rolling`, `rolling-ros-base` | amd64 | 24.04 | - | 3.12.3 | rolling | ros-base | 3.28.3 | 12.6.68 | - | - | - | - | - | - | 122 | | `rolling-desktop-full` | amd64 | 24.04 | - | 3.12.3 | rolling | desktop-full | 3.28.3 | 12.6.68 | - | - | - | - | - | - | 123 | 124 |
125 |
126 | 127 | #### [`rwthika/ros2-tensorrt`](https://hub.docker.com/r/rwthika/ros2-tensorrt) (ROS 2, NVIDIA CUDA, NVIDIA TensorRT) 128 | 129 |
130 | 131 | 132 | 133 |
Click to expand 134 | 135 | | Tag | Arch | Ubuntu | Jetson Linux | Python | ROS | ROS Package | CMake | CUDA | cuDNN | TensorRT | Triton | PyTorch | TensorFlow | ONNX RT | 136 | | :---------------------------------- | :------------: | :----------------: | :----------: | :---------------: | :-----: | :----------: | :--------------: | :----------------: | :------------------: | :--------------------: | :----: | :-----: | :--------: | :-----: | 137 | | `humble-ros-core` | amd64
arm64 | 22.04.4 | -
36.4.3 | 3.10.12 | humble | ros-core | 3.24.0
3.22.1 | 12.6.37
12.6.68 | 9.3.0.75 | 10.3.0.26 | - | - | - | - | 138 | | `humble`, `humble-ros-base` | amd64
arm64 | 22.04.4 | -
36.4.3 | 3.10.12 | humble | ros-base | 3.24.0
3.22.1 | 12.6.37
12.6.68 | 9.3.0.75 | 10.3.0.26 | - | - | - | - | 139 | | `humble-desktop-full` | amd64
arm64 | 22.04.4 | -
36.4.3 | 3.10.12 | humble | desktop-full | 3.24.0
3.22.1 | 12.6.37
12.6.68 | 9.3.0.75 | 10.3.0.26 | - | - | - | - | 140 | | `jazzy-ros-core` | amd64
arm64 | 24.04.1
22.04.4 | -
36.4.3 | 3.12.3
3.10.12 | jazzy | ros-core | 3.24.0
3.22.1 | 12.6.77
12.6.68 | 9.5.1.17
9.3.0.75 | 10.6.0.26
10.3.0.26 | - | - | - | - | 141 | | `latest`, `jazzy`, `jazzy-ros-base` | amd64
arm64 | 24.04.1
22.04.4 | -
36.4.3 | 3.12.3
3.10.12 | jazzy | ros-base | 3.24.0
3.22.1 | 12.6.77
12.6.68 | 9.5.1.17
9.3.0.75 | 10.6.0.26
10.3.0.26 | - | - | - | - | 142 | | `jazzy-desktop-full` | amd64
arm64 | 24.04.1
22.04.4 | -
36.4.3 | 3.12.3
3.10.12 | jazzy | desktop-full | 3.24.0
3.22.1 | 12.6.77
12.6.68 | 9.5.1.17
9.3.0.75 | 10.6.0.26
10.3.0.26 | - | - | - | - | 143 | | `kilted-ros-core` | amd64 | 24.04.1 | - | 3.12.3 | kilted | ros-core | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | - | - | - | - | 144 | | `kilted`, `kilted-ros-base` | amd64 | 24.04.1 | - | 3.12.3 | kilted | ros-base | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | - | - | - | - | 145 | | `kilted-desktop-full` | amd64 | 24.04.1 | - | 3.12.3 | kilted | desktop-full | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | - | - | - | - | 146 | | `rolling-ros-core` | amd64 | 24.04.1 | - | 3.12.3 | rolling | ros-core | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | - | - | - | - | 147 | | `rolling`, `rolling-ros-base` | amd64 | 24.04.1 | - | 3.12.3 | rolling | ros-base | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | - | - | - | - | 148 | | `rolling-desktop-full` | amd64 | 24.04.1 | - | 3.12.3 | rolling | desktop-full | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | - | - | - | - | 149 | 150 |
151 |
152 | 153 | #### [`rwthika/ros2-triton`](https://hub.docker.com/r/rwthika/ros2-triton) (ROS 2, NVIDIA CUDA, NVIDIA Triton Client) 154 | 155 |
156 | 157 | 158 | 159 |
Click to expand 160 | 161 | | Tag | Arch | Ubuntu | Jetson Linux | Python | ROS | ROS Package | CMake | CUDA | cuDNN | TensorRT | Triton | PyTorch | TensorFlow | ONNX RT | 162 | | :----------------------------------------------- | :------------: | :-----: | :----------: | :-----: | :-----: | :----------: | :----: | :---: | :---: | :------: | :----: | :-----: | :--------: | :-----: | 163 | | `humble-ros-core-triton2.52.0` | amd64
arm64 | 22.04.5 | - | 3.10.12 | humble | ros-core | 3.22.1 | - | - | - | 2.52.0 | - | - | - | 164 | | `humble`, `humble-ros-base-triton2.52.0` | amd64
arm64 | 22.04.5 | - | 3.10.12 | humble | ros-base | 3.22.1 | - | - | - | 2.52.0 | - | - | - | 165 | | `humble-desktop-full-triton2.52.0` | amd64
arm64 | 22.04.5 | - | 3.10.12 | humble | desktop-full | 3.22.1 | - | - | - | 2.52.0 | - | - | - | 166 | | `jazzy-ros-core-triton2.52.0` | amd64
arm64 | 24.04.2 | - | 3.12.3 | jazzy | ros-core | 3.28.3 | - | - | - | 2.52.0 | - | - | - | 167 | | `latest`, `jazzy`, `jazzy-ros-base-triton2.52.0` | amd64
arm64 | 24.04.2 | - | 3.12.3 | jazzy | ros-base | 3.28.3 | - | - | - | 2.52.0 | - | - | - | 168 | | `jazzy-desktop-full-triton2.52.0` | amd64
arm64 | 24.04.2 | - | 3.12.3 | jazzy | desktop-full | 3.28.3 | - | - | - | 2.52.0 | - | - | - | 169 | | `kilted-ros-core-triton2.52.0` | amd64
arm64 | 24.04.2 | - | 3.12.3 | kilted | ros-core | 3.28.3 | - | - | - | 2.52.0 | - | - | - | 170 | | `kilted`, `kilted-ros-base-triton2.52.0` | amd64
arm64 | 24.04.2 | - | 3.12.3 | kilted | ros-base | 3.28.3 | - | - | - | 2.52.0 | - | - | - | 171 | | `kilted-desktop-full-triton2.52.0` | amd64
arm64 | 24.04.2 | - | 3.12.3 | kilted | desktop-full | 3.28.3 | - | - | - | 2.52.0 | - | - | - | 172 | | `rolling-ros-core-triton2.52.0` | amd64
arm64 | 24.04.2 | - | 3.12.3 | rolling | ros-core | 3.28.3 | - | - | - | 2.52.0 | - | - | - | 173 | | `rolling`, `rolling-ros-base-triton2.52.0` | amd64
arm64 | 24.04.2 | - | 3.12.3 | rolling | ros-base | 3.28.3 | - | - | - | 2.52.0 | - | - | - | 174 | | `rolling-desktop-full-triton2.52.0` | amd64
arm64 | 24.04.2 | - | 3.12.3 | rolling | desktop-full | 3.28.3 | - | - | - | 2.52.0 | - | - | - | 175 | 176 |
177 |
178 | 179 | #### [`rwthika/ros2-torch`](https://hub.docker.com/r/rwthika/ros2-torch) (ROS 2, NVIDIA CUDA, NVIDIA TensorRT, PyTorch) 180 | 181 |
182 | 183 | 184 | 185 |
Click to expand 186 | 187 | | Tag | Arch | Ubuntu | Jetson Linux | Python | ROS | ROS Package | CMake | CUDA | cuDNN | TensorRT | Triton | PyTorch | TensorFlow | ONNX RT | 188 | | :--------------------------------------------- | :------------: | :----------------: | :----------: | :---------------: | :-----: | :----------: | :--------------: | :----------------: | :------------------: | :--------------------: | :----: | :-----: | :--------: | :-----: | 189 | | `humble-ros-core-torch2.5.0` | amd64
arm64 | 22.04.4 | -
36.4.3 | 3.10.12 | humble | ros-core | 3.24.0
3.22.1 | 12.6.37
12.6.68 | 9.3.0.75 | 10.3.0.26 | - | 2.5.0 | - | - | 190 | | `humble`, `humble-ros-base-torch2.5.0` | amd64
arm64 | 22.04.4 | -
36.4.3 | 3.10.12 | humble | ros-base | 3.24.0
3.22.1 | 12.6.37
12.6.68 | 9.3.0.75 | 10.3.0.26 | - | 2.5.0 | - | - | 191 | | `humble-desktop-full-torch2.5.0` | amd64
arm64 | 22.04.4 | -
36.4.3 | 3.10.12 | humble | desktop-full | 3.24.0
3.22.1 | 12.6.37
12.6.68 | 9.3.0.75 | 10.3.0.26 | - | 2.5.0 | - | - | 192 | | `jazzy-ros-core-torch2.5.0` | amd64
arm64 | 24.04.1
22.04.4 | -
36.4.3 | 3.12.3
3.10.12 | jazzy | ros-core | 3.24.0
3.22.1 | 12.6.77
12.6.68 | 9.5.1.17
9.3.0.75 | 10.6.0.26
10.3.0.26 | - | 2.5.0 | - | - | 193 | | `latest`, `jazzy`, `jazzy-ros-base-torch2.5.0` | amd64
arm64 | 24.04.1
22.04.4 | -
36.4.3 | 3.12.3
3.10.12 | jazzy | ros-base | 3.24.0
3.22.1 | 12.6.77
12.6.68 | 9.5.1.17
9.3.0.75 | 10.6.0.26
10.3.0.26 | - | 2.5.0 | - | - | 194 | | `jazzy-desktop-full-torch2.5.0` | amd64
arm64 | 24.04.1
22.04.4 | -
36.4.3 | 3.12.3
3.10.12 | jazzy | desktop-full | 3.24.0
3.22.1 | 12.6.77
12.6.68 | 9.5.1.17
9.3.0.75 | 10.6.0.26
10.3.0.26 | - | 2.5.0 | - | - | 195 | | `kilted-ros-core-torch2.5.0` | amd64 | 24.04.1 | - | 3.12.3 | kilted | ros-core | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | - | 2.5.0 | - | - | 196 | | `kilted`, `kilted-ros-base-torch2.5.0` | amd64 | 24.04.1 | - | 3.12.3 | kilted | ros-base | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | - | 2.5.0 | - | - | 197 | | `kilted-desktop-full-torch2.5.0` | amd64 | 24.04.1 | - | 3.12.3 | kilted | desktop-full | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | - | 2.5.0 | - | - | 198 | | `rolling-ros-core-torch2.5.0` | amd64 | 24.04.1 | - | 3.12.3 | rolling | ros-core | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | - | 2.5.0 | - | - | 199 | | `rolling`, `rolling-ros-base-torch2.5.0` | amd64 | 24.04.1 | - | 3.12.3 | rolling | ros-base | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | - | 2.5.0 | - | - | 200 | | `rolling-desktop-full-torch2.5.0` | amd64 | 24.04.1 | - | 3.12.3 | rolling | desktop-full | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | - | 2.5.0 | - | - | 201 | 202 |
203 |
204 | 205 | #### [`rwthika/ros2-tf`](https://hub.docker.com/r/rwthika/ros2-tf) (ROS 2, NVIDIA CUDA, NVIDIA TensorRT, TensorFlow) 206 | 207 |
208 | 209 | 210 | 211 |
Click to expand 212 | 213 | | Tag | Arch | Ubuntu | Jetson Linux | Python | ROS | ROS Package | CMake | CUDA | cuDNN | TensorRT | Triton | PyTorch | TensorFlow | ONNX RT | 214 | | :------------------------------------------- | :------------: | :----------------: | :----------: | :---------------: | :-----: | :----------: | :--------------: | :----------------: | :------------------: | :--------------------: | :----: | :-----: | :--------------: | :-----: | 215 | | `humble-ros-core-tf2.18.0` | amd64
arm64 | 22.04.4 | -
36.4.3 | 3.10.12 | humble | ros-core | 3.24.0
3.22.1 | 12.6.37
12.6.68 | 9.3.0.75 | 10.3.0.26 | - | - | 2.18.0
2.16.1 | - | 216 | | `humble`, `humble-ros-base-tf2.18.0` | amd64
arm64 | 22.04.4 | -
36.4.3 | 3.10.12 | humble | ros-base | 3.24.0
3.22.1 | 12.6.37
12.6.68 | 9.3.0.75 | 10.3.0.26 | - | - | 2.18.0
2.16.1 | - | 217 | | `humble-desktop-full-tf2.18.0` | amd64
arm64 | 22.04.4 | -
36.4.3 | 3.10.12 | humble | desktop-full | 3.24.0
3.22.1 | 12.6.37
12.6.68 | 9.3.0.75 | 10.3.0.26 | - | - | 2.18.0
2.16.1 | - | 218 | | `jazzy-ros-core-tf2.18.0` | amd64
arm64 | 24.04.1
22.04.4 | -
36.4.3 | 3.12.3
3.10.12 | jazzy | ros-core | 3.24.0
3.22.1 | 12.6.77
12.6.68 | 9.5.1.17
9.3.0.75 | 10.6.0.26
10.3.0.26 | - | - | 2.18.0
2.16.1 | - | 219 | | `latest`, `jazzy`, `jazzy-ros-base-tf2.18.0` | amd64
arm64 | 24.04.1
22.04.4 | -
36.4.3 | 3.12.3
3.10.12 | jazzy | ros-base | 3.24.0
3.22.1 | 12.6.77
12.6.68 | 9.5.1.17
9.3.0.75 | 10.6.0.26
10.3.0.26 | - | - | 2.18.0
2.16.1 | - | 220 | | `jazzy-desktop-full-tf2.18.0` | amd64
arm64 | 24.04.1
22.04.4 | -
36.4.3 | 3.12.3
3.10.12 | jazzy | desktop-full | 3.24.0
3.22.1 | 12.6.77
12.6.68 | 9.5.1.17
9.3.0.75 | 10.6.0.26
10.3.0.26 | - | - | 2.18.0
2.16.1 | - | 221 | | `kilted-ros-core-tf2.18.0` | amd64 | 24.04.1 | - | 3.12.3 | kilted | ros-core | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | - | - | 2.18.0 | - | 222 | | `kilted`, `kilted-ros-base-tf2.18.0` | amd64 | 24.04.1 | - | 3.12.3 | kilted | ros-base | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | - | - | 2.18.0 | - | 223 | | `kilted-desktop-full-tf2.18.0` | amd64 | 24.04.1 | - | 3.12.3 | kilted | desktop-full | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | - | - | 2.18.0 | - | 224 | | `rolling-ros-core-tf2.18.0` | amd64 | 24.04.1 | - | 3.12.3 | rolling | ros-core | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | - | - | 2.18.0 | - | 225 | | `rolling`, `rolling-ros-base-tf2.18.0` | amd64 | 24.04.1 | - | 3.12.3 | rolling | ros-base | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | - | - | 2.18.0 | - | 226 | | `rolling-desktop-full-tf2.18.0` | amd64 | 24.04.1 | - | 3.12.3 | rolling | desktop-full | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | - | - | 2.18.0 | - | 227 | 228 |
229 |
230 | 231 | #### [`rwthika/ros2-ml`](https://hub.docker.com/r/rwthika/ros2-ml) (ROS 2, NVIDIA CUDA, NVIDIA TensorRT, PyTorch, TensorFlow) 232 | 233 |
234 | 235 | 236 | 237 |
Click to expand 238 | 239 | | Tag | Arch | Ubuntu | Jetson Linux | Python | ROS | ROS Package | CMake | CUDA | cuDNN | TensorRT | Triton | PyTorch | TensorFlow | ONNX RT | 240 | | :------------------------------------------------------ | :------------: | :----------------: | :----------: | :---------------: | :-----: | :----------: | :--------------: | :----------------: | :------------------: | :--------------------: | :----: | :-----: | :---------: | :---------: | 241 | | `humble-ros-core-tf2.18.0-torch2.5.0` | amd64
arm64 | 22.04.4 | -
36.4.3 | 3.10.12 | humble | ros-core | 3.24.0
3.22.1 | 12.6.37
12.6.68 | 9.3.0.75 | 10.3.0.26 | 2.52.0 | 2.5.0 | 2.18.0
- | 1.20.1
- | 242 | | `humble`, `humble-ros-base-tf2.18.0-torch2.5.0` | amd64
arm64 | 22.04.4 | -
36.4.3 | 3.10.12 | humble | ros-base | 3.24.0
3.22.1 | 12.6.37
12.6.68 | 9.3.0.75 | 10.3.0.26 | 2.52.0 | 2.5.0 | 2.18.0
- | 1.20.1
- | 243 | | `humble-desktop-full-tf2.18.0-torch2.5.0` | amd64
arm64 | 22.04.4 | -
36.4.3 | 3.10.12 | humble | desktop-full | 3.24.0
3.22.1 | 12.6.37
12.6.68 | 9.3.0.75 | 10.3.0.26 | 2.52.0 | 2.5.0 | 2.18.0
- | 1.20.1
- | 244 | | `jazzy-ros-core-tf2.18.0-torch2.5.0` | amd64
arm64 | 24.04.1
22.04.4 | -
36.4.3 | 3.12.3
3.10.12 | jazzy | ros-core | 3.24.0
3.22.1 | 12.6.77
12.6.68 | 9.5.1.17
9.3.0.75 | 10.6.0.26
10.3.0.26 | 2.52.0 | 2.5.0 | 2.18.0
- | 1.20.1
- | 245 | | `latest`, `jazzy`, `jazzy-ros-base-tf2.18.0-torch2.5.0` | amd64
arm64 | 24.04.1
22.04.4 | -
36.4.3 | 3.12.3
3.10.12 | jazzy | ros-base | 3.24.0
3.22.1 | 12.6.77
12.6.68 | 9.5.1.17
9.3.0.75 | 10.6.0.26
10.3.0.26 | 2.52.0 | 2.5.0 | 2.18.0
- | 1.20.1
- | 246 | | `jazzy-desktop-full-tf2.18.0-torch2.5.0` | amd64
arm64 | 24.04.1
22.04.4 | -
36.4.3 | 3.12.3
3.10.12 | jazzy | desktop-full | 3.24.0
3.22.1 | 12.6.77
12.6.68 | 9.5.1.17
9.3.0.75 | 10.6.0.26
10.3.0.26 | 2.52.0 | 2.5.0 | 2.18.0
- | 1.20.1
- | 247 | | `kilted-ros-core-tf2.18.0-torch2.5.0` | amd64 | 24.04.1 | - | 3.12.3 | kilted | ros-core | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | 2.52.0 | 2.5.0 | 2.18.0 | 1.20.1 | 248 | | `kilted`, `kilted-ros-base-tf2.18.0-torch2.5.0` | amd64 | 24.04.1 | - | 3.12.3 | kilted | ros-base | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | 2.52.0 | 2.5.0 | 2.18.0 | 1.20.1 | 249 | | `kilted-desktop-full-tf2.18.0-torch2.5.0` | amd64 | 24.04.1 | - | 3.12.3 | kilted | desktop-full | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | 2.52.0 | 2.5.0 | 2.18.0 | 1.20.1 | 250 | | `rolling-ros-core-tf2.18.0-torch2.5.0` | amd64 | 24.04.1 | - | 3.12.3 | rolling | ros-core | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | 2.52.0 | 2.5.0 | 2.18.0 | 1.20.1 | 251 | | `rolling`, `rolling-ros-base-tf2.18.0-torch2.5.0` | amd64 | 24.04.1 | - | 3.12.3 | rolling | ros-base | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | 2.52.0 | 2.5.0 | 2.18.0 | 1.20.1 | 252 | | `rolling-desktop-full-tf2.18.0-torch2.5.0` | amd64 | 24.04.1 | - | 3.12.3 | rolling | desktop-full | 3.24.0 | 12.6.77 | 9.5.1.17 | 10.6.0.26 | 2.52.0 | 2.5.0 | 2.18.0 | 1.20.1 | 253 | 254 |
255 |
256 | 257 | ### ROS 258 | 259 | > [!NOTE] 260 | > As of May 2025, [ROS (1) has gone end-of-life](http://wiki.ros.org/Distributions). The last release of *docker-ros-ml-images* to include ROS Noetic images is [release 25.02](https://github.com/ika-rwth-aachen/docker-ros-ml-images/tree/25.02). These images will remain available. 261 | 262 | 263 | ## Manual Build 264 | 265 | ``` 266 | docker buildx build \ 267 | --pull \ 268 | --platform $PLATFORM \ 269 | --build-arg IMAGE_VERSION=$CI_COMMIT_TAG \ 270 | --build-arg BASE_IMAGE_TYPE=$BASE_IMAGE_TYPE \ 271 | --build-arg UBUNTU_VERSION=$UBUNTU_VERSION \ 272 | --build-arg ROS_DISTRO=$ROS_DISTRO \ 273 | --build-arg ROS_PACKAGE=$ROS_PACKAGE \ 274 | --build-arg ROS_BUILD_FROM_SRC=$ROS_BUILD_FROM_SRC \ 275 | --build-arg TORCH_VERSION=$TORCH_VERSION \ 276 | --build-arg TF_VERSION=$TF_VERSION \ 277 | --build-arg ONNX_RUNTIME_VERSION=$ONNX_RUNTIME_VERSION \ 278 | --build-arg TRITON_VERSION=$TRITON_VERSION \ 279 | --tag $IMAGE . 280 | ``` 281 | -------------------------------------------------------------------------------- /entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | # source ROS workspace 5 | source /opt/ros/$ROS_DISTRO/setup.bash 6 | [[ -f $WORKSPACE/devel/setup.bash ]] && source $WORKSPACE/devel/setup.bash 7 | [[ -f $WORKSPACE/install/setup.bash ]] && source $WORKSPACE/install/setup.bash 8 | 9 | # exec as dockeruser with configured UID/GID 10 | if [[ $DOCKER_UID && $DOCKER_GID ]]; then 11 | if ! getent group $DOCKER_GID > /dev/null 2>&1; then 12 | groupadd -g $DOCKER_GID $DOCKER_USER 13 | else 14 | echo -e "\e[33mWARNING | Cannot create group '$DOCKER_USER' with GID $DOCKER_GID, another group '$(getent group $DOCKER_GID | cut -d: -f1)' with same GID is already existing\e[0m" 15 | fi 16 | if ! getent passwd $DOCKER_UID > /dev/null 2>&1; then 17 | useradd -s /bin/bash \ 18 | -u $DOCKER_UID \ 19 | -g $DOCKER_GID \ 20 | --create-home \ 21 | --home-dir /home/$DOCKER_USER \ 22 | --groups sudo,video \ 23 | --password "$(openssl passwd -1 $DOCKER_USER)" \ 24 | $DOCKER_USER && \ 25 | touch /home/$DOCKER_USER/.sudo_as_admin_successful 26 | cp /root/.bashrc /home/$DOCKER_USER 27 | ln -s $WORKSPACE /home/$DOCKER_USER/ws 28 | chown -h $DOCKER_UID:$DOCKER_GID $WORKSPACE /home/$DOCKER_USER/ws /home/$DOCKER_USER/.sudo_as_admin_successful 29 | if [[ -d $WORKSPACE/src ]]; then 30 | chown -R $DOCKER_UID:$DOCKER_GID $WORKSPACE/src 31 | fi 32 | else 33 | echo -e "\e[33mWARNING | Cannot create user '$DOCKER_USER' with UID $DOCKER_UID, another user '$(getent passwd $DOCKER_UID | cut -d: -f1)' with same UID is already existing\e[0m" 34 | fi 35 | [[ $(pwd) == "$WORKSPACE" ]] && cd /home/$DOCKER_USER/ws 36 | exec gosu $DOCKER_USER "$@" 37 | else 38 | exec "$@" 39 | fi -------------------------------------------------------------------------------- /utils/.gitignore: -------------------------------------------------------------------------------- 1 | *.csv 2 | *.txt 3 | !images.txt 4 | -------------------------------------------------------------------------------- /utils/0_pull_images.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -euo pipefail 3 | 4 | if [ -z "$1" ]; then 5 | echo "Usage: $0 " 6 | exit 1 7 | fi 8 | 9 | # build ci image names 10 | arch=$(dpkg --print-architecture 2>/dev/null) 11 | git_branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null) 12 | export_filename="${1%.*}.${arch}.txt" 13 | prefix="${git_branch}_" 14 | postfix="_ci-${arch}" 15 | 16 | # pull images and echo image names to file 17 | failed_images=() 18 | rm -f "${export_filename}" 19 | while IFS= read -r image || [ -n "$image" ]; do 20 | repo="${image%:*}" 21 | tag="${image##*:}" 22 | image="${repo}:${prefix}${tag}${postfix}" 23 | if docker pull "${image}"; then 24 | echo "${image}" >> "${export_filename}" 25 | else 26 | echo "===================== Failed to pull image: ${image}" >&2 27 | failed_images+=("${image}") 28 | fi 29 | done < "$1" 30 | 31 | # remove trailing newline 32 | if [ -f "${export_filename}" ]; then 33 | sed -z -i 's/\n\+$//' "${export_filename}" 34 | fi 35 | 36 | # echo failed images 37 | if [ "${#failed_images[@]}" -ne 0 ]; then 38 | echo "" 39 | for img in "${failed_images[@]}"; do 40 | echo "[fail] ${img}" 41 | done 42 | fi 43 | -------------------------------------------------------------------------------- /utils/1_export_image_versions.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import argparse 4 | import csv 5 | import os 6 | import subprocess 7 | 8 | import tqdm 9 | 10 | 11 | VERSION_GETTER_COMMANDS = { 12 | "Arch": "dpkg --print-architecture", 13 | "Ubuntu": "lsb_release -d | awk '{print \\$3}'", 14 | "Jetson Linux": "if [[ -f /etc/nv_tegra_release ]]; then cat /etc/nv_tegra_release | head -n 1 | sed 's/ (release), REVISION: /./g' | awk '{ print \\$2 }' | grep -oE '[0-9.]+'; fi", 15 | "Python": "python --version | awk '{print \\$2}'", 16 | "ROS": "echo \\$ROS_DISTRO", 17 | "ROS Package": "(dpkg -l | grep ros-\\$ROS_DISTRO-desktop-full || dpkg -l | grep ros-\\$ROS_DISTRO-ros-base || dpkg -l | grep ros-\\$ROS_DISTRO-ros-core) | awk '{print \\$2}' | cut -d- -f3-", 18 | "CMake": "cmake --version | grep version | awk '{print \\$3}'", 19 | "CUDA": "dpkg -l 2> /dev/null | grep -E 'cuda-cudart-[0-9]' | awk '{ print \\$3 }' | head -n 1 | cut -d+ -f1 | cut -d- -f1", 20 | "cuDNN": "dpkg -l 2> /dev/null | grep -E 'libcudnn[0-9]' | awk '{ print \\$3 }' | head -n 1 | cut -d+ -f1 | cut -d- -f1", 21 | "TensorRT": "dpkg -l 2> /dev/null | grep -E 'libnvinfer[0-9]' | awk '{ print \\$3 }' | head -n 1 | cut -d+ -f1 | cut -d- -f1", 22 | "Triton": "echo \\$TRITON_VERSION", 23 | "PyTorch": "python -c 'exec(\\\"try:\\n import torch; print(torch.__version__);\\n\\rexcept ImportError:\\n pass\\\")' | cut -d+ -f1 | cut -d- -f1 | sed 's/a0//g'", 24 | "TensorFlow": "export TF_CPP_MIN_LOG_LEVEL='1' && python -c 'exec(\\\"try:\\n import os; import tensorflow as tf; print(tf.__version__);\\n\\rexcept ImportError:\\n pass\\\")' | cut -d+ -f1 | cut -d- -f1", 25 | "ONNX RT": "python -c 'exec(\\\"try:\\n import onnxruntime; print(onnxruntime.__version__);\\n\\rexcept ImportError:\\n pass\\\")'", 26 | } 27 | 28 | SCRIPT_PATH = os.path.dirname(os.path.abspath(__file__)) 29 | 30 | 31 | def parse_arguments(): 32 | parser = argparse.ArgumentParser(description="Prints tool versions for docker-ros-ml-images") 33 | parser.add_argument("images", help="File listing Docker images") 34 | parser.add_argument("--arch", help="Architecture to filter images", choices=["amd64", "arm64"], required=True) 35 | return parser.parse_args() 36 | 37 | def get_image_list(file_path, arch): 38 | with open(file_path, "r") as file: 39 | return [line.strip() for line in file] 40 | 41 | def get_tool_versions(image_name, arch): 42 | result = {} 43 | for tool, command in VERSION_GETTER_COMMANDS.items(): 44 | try: 45 | gpu_flag = "--runtime nvidia" if arch == "arm64" else "" 46 | output = subprocess.check_output( 47 | f"docker run --rm {gpu_flag} {image_name} bash -c \"{command}\"", 48 | shell=True, 49 | stderr=subprocess.STDOUT 50 | ) 51 | single_line_output = "\\n".join(output.decode("utf-8").strip().splitlines()) 52 | if single_line_output: 53 | result[tool] = single_line_output 54 | except subprocess.CalledProcessError as e: 55 | result[tool] = f"Error: {e.output.decode('utf-8').strip()}" 56 | return result 57 | 58 | def export_to_csv(data, file_path, arch): 59 | with open(file_path, 'w') as csvfile: 60 | field_names = ["Tag"] + list(VERSION_GETTER_COMMANDS.keys()) 61 | writer = csv.DictWriter(csvfile, fieldnames = field_names) 62 | writer.writeheader() 63 | for image in data: 64 | image_tag = "`" + image.split("/")[-1].replace(f"-{arch}", "") + "`" 65 | writer.writerow({"Tag": image_tag, **data[image]}) 66 | 67 | def main(): 68 | args = parse_arguments() 69 | image_list_file = args.images 70 | if not os.path.exists(image_list_file): 71 | print(f"Error: File {image_list_file} not found.") 72 | return 73 | images = get_image_list(image_list_file, args.arch) 74 | all_versions = {} 75 | with tqdm.tqdm(images, desc="Getting info") as pbar: 76 | for image in pbar: 77 | pbar.set_postfix(image=image) 78 | all_versions[image] = get_tool_versions(image, args.arch) 79 | export_to_csv(all_versions, os.path.join(SCRIPT_PATH, f"image_versions-{args.arch}.csv"), args.arch) 80 | 81 | if __name__ == "__main__": 82 | main() 83 | -------------------------------------------------------------------------------- /utils/2_generate_version_table.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import argparse 4 | import os 5 | from typing import Dict 6 | 7 | import pandas as pd 8 | 9 | SCRIPT_PATH = os.path.dirname(os.path.abspath(__file__)) 10 | 11 | def parse_arguments(): 12 | parser = argparse.ArgumentParser(description="Prints tool versions for docker-ros-ml-images") 13 | parser.add_argument("version_tables", nargs='+', help="List of csv files with version tables") 14 | return parser.parse_args() 15 | 16 | def merge_tables(tables) -> Dict[str, pd.DataFrame]: 17 | all_tables = [] 18 | for table in tables: 19 | if not os.path.exists(table): 20 | print(f"Error: File {table} not found.") 21 | return 22 | all_tables.append(pd.read_csv(table)) 23 | merged_table = pd.concat(all_tables, sort=False) # concat tables 24 | merged_table = merged_table.fillna("-") # replace nan by - 25 | merged_table = merged_table.groupby("Tag").agg(lambda x: "
".join([str(e) for e in x]) if len(set(x)) > 1 else str(x.iloc[0])).reset_index() # group by tag, keep unique values joined by
26 | merged_table["Repo"] = merged_table["Tag"].str.split(":").str[0].str.replace("`", "") # extract repo name 27 | merged_table["Tag"] = "`" + merged_table["Tag"].str.split(":").str[1] # remove repo name from tag 28 | repo_tables = merged_table.groupby("Repo") 29 | table_by_repo = {repo: table.drop(columns=["Repo"]) for repo, table in repo_tables} 30 | return table_by_repo 31 | 32 | def print_markdown_table(data: pd.DataFrame): 33 | headers = list(data.columns) 34 | header_line = "| " + " | ".join(headers) + " |" 35 | separator_line = "| " + ":---" + " | " + " | ".join([":---:"] * (len(headers)-1)) + " |" 36 | print(header_line) 37 | print(separator_line) 38 | for index, row in data.iterrows(): 39 | print("| ", end="") 40 | print(" | ".join(row.values.astype(str)), end="") 41 | print(" |") 42 | 43 | def main(): 44 | args = parse_arguments() 45 | table_by_repo = merge_tables(args.version_tables) 46 | for repo, table in table_by_repo.items(): 47 | print(f"### {repo}") 48 | print("") 49 | print_markdown_table(table) 50 | print("") 51 | 52 | 53 | if __name__ == "__main__": 54 | main() 55 | -------------------------------------------------------------------------------- /utils/README.md: -------------------------------------------------------------------------------- 1 | ```bash 2 | # separately on amd64/arm64 3 | ./0_pull_images.sh images.txt 4 | ./1_export_image_versions.py --arch $(dpkg --print-architecture) images.$(dpkg --print-architecture).txt 5 | 6 | # one-time joining of amd64/arm64 information 7 | ./2_generate_version_table.py image_versions-amd64.csv image_versions-arm64.csv 8 | ``` 9 | -------------------------------------------------------------------------------- /utils/images.txt: -------------------------------------------------------------------------------- 1 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2:humble-ros-core 2 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2:humble-ros-base 3 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2:humble-desktop-full 4 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2:jazzy-ros-core 5 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2:jazzy-ros-base 6 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2:jazzy-desktop-full 7 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2:kilted-ros-core 8 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2:kilted-ros-base 9 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2:kilted-desktop-full 10 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2:rolling-ros-core 11 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2:rolling-ros-base 12 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2:rolling-desktop-full 13 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-cuda:humble-ros-core 14 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-cuda:humble-ros-base 15 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-cuda:humble-desktop-full 16 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-cuda:jazzy-ros-core 17 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-cuda:jazzy-ros-base 18 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-cuda:jazzy-desktop-full 19 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-cuda:kilted-ros-core 20 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-cuda:kilted-ros-base 21 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-cuda:kilted-desktop-full 22 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-cuda:rolling-ros-core 23 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-cuda:rolling-ros-base 24 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-cuda:rolling-desktop-full 25 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tensorrt:humble-ros-core 26 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tensorrt:humble-ros-base 27 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tensorrt:humble-desktop-full 28 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tensorrt:jazzy-ros-core 29 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tensorrt:jazzy-ros-base 30 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tensorrt:jazzy-desktop-full 31 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tensorrt:kilted-ros-core 32 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tensorrt:kilted-ros-base 33 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tensorrt:kilted-desktop-full 34 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tensorrt:rolling-ros-core 35 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tensorrt:rolling-ros-base 36 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tensorrt:rolling-desktop-full 37 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-triton:humble-ros-core-triton2.52.0 38 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-triton:humble-ros-base-triton2.52.0 39 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-triton:humble-desktop-full-triton2.52.0 40 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-triton:jazzy-ros-core-triton2.52.0 41 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-triton:jazzy-ros-base-triton2.52.0 42 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-triton:jazzy-desktop-full-triton2.52.0 43 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-triton:kilted-ros-core-triton2.52.0 44 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-triton:kilted-ros-base-triton2.52.0 45 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-triton:kilted-desktop-full-triton2.52.0 46 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-triton:rolling-ros-core-triton2.52.0 47 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-triton:rolling-ros-base-triton2.52.0 48 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-triton:rolling-desktop-full-triton2.52.0 49 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-torch:humble-ros-core-torch2.5.0 50 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-torch:humble-ros-base-torch2.5.0 51 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-torch:humble-desktop-full-torch2.5.0 52 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-torch:jazzy-ros-core-torch2.5.0 53 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-torch:jazzy-ros-base-torch2.5.0 54 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-torch:jazzy-desktop-full-torch2.5.0 55 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-torch:kilted-ros-core-torch2.5.0 56 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-torch:kilted-ros-base-torch2.5.0 57 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-torch:kilted-desktop-full-torch2.5.0 58 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-torch:rolling-ros-core-torch2.5.0 59 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-torch:rolling-ros-base-torch2.5.0 60 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-torch:rolling-desktop-full-torch2.5.0 61 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tf:humble-ros-core-tf2.18.0 62 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tf:humble-ros-base-tf2.18.0 63 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tf:humble-desktop-full-tf2.18.0 64 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tf:jazzy-ros-core-tf2.18.0 65 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tf:jazzy-ros-base-tf2.18.0 66 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tf:jazzy-desktop-full-tf2.18.0 67 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tf:kilted-ros-core-tf2.18.0 68 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tf:kilted-ros-base-tf2.18.0 69 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tf:kilted-desktop-full-tf2.18.0 70 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tf:rolling-ros-core-tf2.18.0 71 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tf:rolling-ros-base-tf2.18.0 72 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-tf:rolling-desktop-full-tf2.18.0 73 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-ml:humble-ros-core-tf2.18.0-torch2.5.0 74 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-ml:humble-ros-base-tf2.18.0-torch2.5.0 75 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-ml:humble-desktop-full-tf2.18.0-torch2.5.0 76 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-ml:jazzy-ros-core-tf2.18.0-torch2.5.0 77 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-ml:jazzy-ros-base-tf2.18.0-torch2.5.0 78 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-ml:jazzy-desktop-full-tf2.18.0-torch2.5.0 79 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-ml:kilted-ros-core-tf2.18.0-torch2.5.0 80 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-ml:kilted-ros-base-tf2.18.0-torch2.5.0 81 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-ml:kilted-desktop-full-tf2.18.0-torch2.5.0 82 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-ml:rolling-ros-core-tf2.18.0-torch2.5.0 83 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-ml:rolling-ros-base-tf2.18.0-torch2.5.0 84 | gitlab.ika.rwth-aachen.de:5050/fb-fi/ops/docker-ros-ml-images/ros2-ml:rolling-desktop-full-tf2.18.0-torch2.5.0 -------------------------------------------------------------------------------- /utils/requirements.txt: -------------------------------------------------------------------------------- 1 | pandas 2 | tqdm --------------------------------------------------------------------------------