Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(docker): add simulator-visualizer container #5411

Closed
wants to merge 36 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
16b24e7
Add simulator and visualizer containers
oguzkaganozt Dec 24, 2024
1e95c85
.
oguzkaganozt Dec 24, 2024
3998648
.
oguzkaganozt Dec 24, 2024
4e648d5
.
oguzkaganozt Jan 2, 2025
dd3bb62
style(pre-commit): autofix
pre-commit-ci[bot] Jan 2, 2025
8a7211d
create seperate workflow for autoware-tools
oguzkaganozt Jan 16, 2025
b735c18
style(pre-commit): autofix
pre-commit-ci[bot] Jan 16, 2025
68b433b
.
oguzkaganozt Jan 30, 2025
851b631
Add seperate workflow for testing
oguzkaganozt Jan 30, 2025
2f9d231
.
oguzkaganozt Jan 30, 2025
e278a88
.
oguzkaganozt Jan 30, 2025
bcaf694
.
oguzkaganozt Jan 30, 2025
87598f3
fix typo
oguzkaganozt Jan 30, 2025
71baa41
fix spellcheck
oguzkaganozt Jan 30, 2025
1276ddd
fix spellcheck
oguzkaganozt Jan 30, 2025
18ea4d2
.
oguzkaganozt Jan 30, 2025
79b07e8
.
oguzkaganozt Jan 30, 2025
985ed76
fix hadolint errors
oguzkaganozt Jan 30, 2025
b718346
fix hadolint errors
oguzkaganozt Jan 30, 2025
2bf66df
.
oguzkaganozt Jan 30, 2025
aab257c
.
oguzkaganozt Jan 30, 2025
38779bd
remove ngrok, remove VNC_PASSWORD ARG
oguzkaganozt Jan 31, 2025
2dc2eb8
.
oguzkaganozt Jan 31, 2025
d25f16c
style(pre-commit): autofix
pre-commit-ci[bot] Jan 31, 2025
3be0392
.
oguzkaganozt Feb 3, 2025
3825f2d
style(pre-commit): autofix
pre-commit-ci[bot] Feb 3, 2025
50e9f6a
.
oguzkaganozt Feb 3, 2025
3bdc03c
.
oguzkaganozt Feb 3, 2025
c079d73
fix rviz config
oguzkaganozt Feb 3, 2025
026d748
style(pre-commit): autofix
pre-commit-ci[bot] Feb 3, 2025
dc7d645
fix paths
oguzkaganozt Feb 3, 2025
5dce48b
remove .pcd from dockerignore
oguzkaganozt Feb 4, 2025
0f56b77
.
oguzkaganozt Feb 4, 2025
9d120e8
.
oguzkaganozt Feb 4, 2025
9236720
remove debug workflow
oguzkaganozt Feb 4, 2025
33ba71b
.
oguzkaganozt Feb 4, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@
docker
!docker/etc
!docker/scripts
!docker/tools

# Ignore a part of files under src
src/**/.*
src/**/*.asc
src/**/*.gif
src/**/*.md
src/**/*.pcd
src/**/*.svg

# Ignore generated files by colcon
Expand Down
111 changes: 111 additions & 0 deletions .github/actions/docker-build-and-push-tools/action.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
name: docker-build-and-push-tools
description: Composite action to build and push tools images to registry.

inputs:
platform:
description: Target platform.
required: true
target-image:
description: Target docker image name in the registry.
required: true
build-args:
description: Additional build args.
required: false

runs:
using: composite
steps:
- name: Install jq and vcstool
run: |
sudo apt-get -y update
sudo apt-get -y install jq python3-pip
pip install --no-cache-dir vcstool
shell: bash

- name: Run vcs import
run: |
mkdir src
vcs import src < autoware.repos
vcs import src < simulator.repos
shell: bash

- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Restore ccache
uses: actions/cache/restore@v4
with:
path: |
root-ccache
key: ccache-${{ inputs.platform }}-${{ hashFiles('src/**/*.cpp') }}
restore-keys: |
ccache-${{ inputs.platform }}-

- name: Restore apt-get
uses: actions/cache/restore@v4
with:
path: |
var-cache-apt
key: apt-get-${{ inputs.platform }}-${{ hashFiles('src/**/package.xml') }}
restore-keys: |
apt-get-${{ inputs.platform }}-

- name: Inject cache into docker
uses: reproducible-containers/buildkit-cache-dance@v3.1.2
with:
cache-map: |
{
"root-ccache": "/root/.ccache",
"var-cache-apt": "/var/cache/apt"
}
skip-extraction: true

- name: Get current date
id: date
run: echo "date=$(date +'%Y%m%d')" >> $GITHUB_OUTPUT
shell: bash

- name: Docker meta for autoware:visualizer
id: meta-visualizer
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ github.repository_owner }}/${{ inputs.target-image }}
tags: |
type=raw,value=visualizer-${{ inputs.platform }}
type=raw,value=visualizer-${{ steps.date.outputs.date }}-${{ inputs.platform }}
type=ref,event=tag,prefix=visualizer-,suffix=-${{ inputs.platform }}
bake-target: docker-metadata-action-visualizer
flavor: |
latest=false

- name: Docker meta for autoware:scenario-simulator
id: meta-scenario-simulator
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ github.repository_owner }}/${{ inputs.target-image }}
tags: |
type=raw,value=scenario-simulator-${{ inputs.platform }}
type=raw,value=scenario-simulator-${{ steps.date.outputs.date }}-${{ inputs.platform }}
type=ref,event=tag,prefix=scenario-simulator-,suffix=-${{ inputs.platform }}
bake-target: docker-metadata-action-scenario-simulator
flavor: |
latest=false

- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ github.token }}

- name: Build and Push to GitHub Container Registry
uses: docker/bake-action@v5
with:
push: true
files: |
docker/docker-bake-tools.hcl
${{ steps.meta-scenario-simulator.outputs.bake-file }}
${{ steps.meta-visualizer.outputs.bake-file }}
provenance: false
set: |
${{ inputs.build-args }}
16 changes: 16 additions & 0 deletions .github/workflows/docker-build-and-push-arm64.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,22 @@ jobs:
*.cache-from=type=registry,ref=ghcr.io/${{ github.repository }}-buildcache:arm64-main
*.cache-to=type=registry,ref=ghcr.io/${{ github.repository }}-buildcache:arm64-${{ github.ref_name }},mode=max

- name: Build 'autoware-tools'
uses: ./.github/actions/docker-build-and-push-tools
with:
platform: arm64
target-image: autoware-tools
build-args: |
*.platform=linux/arm64
*.args.ROS_DISTRO=${{ needs.load-env.outputs.rosdistro }}
*.args.BASE_IMAGE=${{ needs.load-env.outputs.base_image }}
*.args.AUTOWARE_BASE_IMAGE=${{ needs.load-env.outputs.autoware_base_image }}
*.args.AUTOWARE_BASE_CUDA_IMAGE=${{ needs.load-env.outputs.autoware_base_cuda_image }}
*.args.LIB_DIR=aarch64
*.cache-from=type=registry,ref=ghcr.io/${{ github.repository }}-buildcache:arm64-${{ github.ref_name }}
*.cache-from=type=registry,ref=ghcr.io/${{ github.repository }}-buildcache:arm64-main
*.cache-to=type=registry,ref=ghcr.io/${{ github.repository }}-buildcache:arm64-${{ github.ref_name }},mode=max

- name: Show disk space
if: always()
run: |
Expand Down
16 changes: 16 additions & 0 deletions .github/workflows/docker-build-and-push.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,22 @@ jobs:
*.cache-from=type=registry,ref=ghcr.io/${{ github.repository }}-buildcache:amd64-main
*.cache-to=type=registry,ref=ghcr.io/${{ github.repository }}-buildcache:amd64-${{ github.ref_name }},mode=max

- name: Build 'autoware-tools'
uses: ./.github/actions/docker-build-and-push-tools
with:
platform: amd64
target-image: autoware-tools
build-args: |
*.platform=linux/amd64
*.args.ROS_DISTRO=${{ needs.load-env.outputs.rosdistro }}
*.args.BASE_IMAGE=${{ needs.load-env.outputs.base_image }}
*.args.AUTOWARE_BASE_IMAGE=${{ needs.load-env.outputs.autoware_base_image }}
*.args.AUTOWARE_BASE_CUDA_IMAGE=${{ needs.load-env.outputs.autoware_base_cuda_image }}
*.args.LIB_DIR=x86_64
*.cache-from=type=registry,ref=ghcr.io/${{ github.repository }}-buildcache:amd64-${{ github.ref_name }}
*.cache-from=type=registry,ref=ghcr.io/${{ github.repository }}-buildcache:amd64-main
*.cache-to=type=registry,ref=ghcr.io/${{ github.repository }}-buildcache:amd64-${{ github.ref_name }},mode=max

- name: Show disk space
if: always()
run: |
Expand Down
22 changes: 22 additions & 0 deletions docker/docker-bake-tools.hcl
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
group "default" {
targets = [
"scenario-simulator",
"visualizer"
]
}

// For docker/metadata-action
target "docker-metadata-action-scenario-simulator" {}
target "docker-metadata-action-visualizer" {}

target "scenario-simulator" {
inherits = ["docker-metadata-action-scenario-simulator"]
dockerfile = "docker/tools/scenario-simulator/Dockerfile.scenario-simulator"
target = "scenario-simulator"
}

target "visualizer" {
inherits = ["docker-metadata-action-visualizer"]
dockerfile = "docker/tools/visualizer/Dockerfile.visualizer"
target = "visualizer"
}
59 changes: 59 additions & 0 deletions docker/tools/scenario-simulator/Dockerfile.scenario-simulator
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
### Builder
FROM ghcr.io/autowarefoundation/autoware:universe-devel AS builder
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
ARG ROS_DISTRO
ARG LIB_DIR
ENV CCACHE_DIR="/root/.ccache"
WORKDIR /autoware
COPY src /autoware/src
COPY docker/scripts/resolve_rosdep_keys.sh /autoware/resolve_rosdep_keys.sh
RUN chmod +x /autoware/resolve_rosdep_keys.sh

# Install dependencies and build the scenario simulator
# hadolint ignore=SC1091
RUN --mount=type=ssh \
--mount=type=cache,target=/var/cache/apt,sharing=locked \
apt-get update \
&& rosdep update && rosdep install -y --from-paths src --ignore-src --rosdistro $ROS_DISTRO \
&& source /opt/ros/"$ROS_DISTRO"/setup.bash && source /opt/autoware/setup.bash \
&& colcon build --cmake-args \
"-Wno-dev" \
"--no-warn-unused-cli" \
--install-base /opt/autoware \
--merge-install \
--mixin release compile-commands ccache \
--base-paths /autoware/src/simulator \
&& find /opt/autoware/lib -type f -name "*.py" -exec chmod +x {} \; \
&& find /opt/autoware/share -type f -name "*.py" -exec chmod +x {} \; \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* "$HOME"/.cache

# Extract rosdep dependencies for simulator
RUN /autoware/resolve_rosdep_keys.sh /autoware/src/simulator ${ROS_DISTRO} \
> /rosdep-simulator-depend-packages.txt \
&& cat /rosdep-simulator-depend-packages.txt

### Scenario Simulator
FROM ghcr.io/autowarefoundation/autoware:universe-visualization AS scenario-simulator
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
ARG ROS_DISTRO
ARG LIB_DIR
WORKDIR /autoware
COPY --from=builder /opt/autoware /opt/autoware
COPY --from=builder /rosdep-simulator-depend-packages.txt /tmp/rosdep-simulator-depend-packages.txt

# hadolint ignore=SC2002
RUN --mount=type=ssh \
--mount=type=cache,target=/var/cache/apt,sharing=locked \
apt-get update && apt-get install -y curl unzip \
&& source /opt/ros/"$ROS_DISTRO"/setup.bash && source /opt/autoware/setup.bash \
&& rosdep update \
# Remove xmlschema and yamale from rosdep packages since we install via pip
&& sed -i '/\(xmlschema\|yamale\)/d' /tmp/rosdep-simulator-depend-packages.txt \
&& pip install --no-cache-dir yamale xmlschema \
&& cat /tmp/rosdep-simulator-depend-packages.txt | xargs apt-get install -y --no-install-recommends \
&& /autoware/cleanup_system.sh $LIB_DIR $ROS_DISTRO

COPY docker/tools/scenario-simulator/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
57 changes: 57 additions & 0 deletions docker/tools/scenario-simulator/entrypoint.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#!/usr/bin/env bash
# cspell:ignore
# shellcheck disable=SC1090,SC1091

run_scenario_simulator() {
echo -e "\e[32mRunning scenario simulator...\e[0m"

# Set default values if not provided
ARCHITECTURE_TYPE=${ARCHITECTURE_TYPE:-awf/universe/20240605}
SENSOR_MODEL=${SENSOR_MODEL:-sample_sensor_kit}
VEHICLE_MODEL=${VEHICLE_MODEL:-sample_vehicle}
INITIALIZE_DURATION=${INITIALIZE_DURATION:-90}
GLOBAL_FRAME_RATE=${GLOBAL_FRAME_RATE:-20}
OUTPUT_DIRECTORY=${OUTPUT_DIRECTORY:-/autoware/scenario-sim/output}
SCENARIO=${SCENARIO:-$(ros2 pkg prefix --share scenario_test_runner)/scenario/sample.yaml}
GLOBAL_TIMEOUT=${GLOBAL_TIMEOUT:-120}
RECORD=${RECORD:-false}
USE_SIM_TIME=${USE_SIM_TIME:-false}

# Print all variables
echo "ARCHITECTURE_TYPE: $ARCHITECTURE_TYPE"
echo "SENSOR_MODEL: $SENSOR_MODEL"
echo "VEHICLE_MODEL: $VEHICLE_MODEL"
echo "INITIALIZE_DURATION: $INITIALIZE_DURATION"
echo "GLOBAL_FRAME_RATE: $GLOBAL_FRAME_RATE"
echo "OUTPUT_DIRECTORY: $OUTPUT_DIRECTORY"
echo "SCENARIO: $SCENARIO"
echo "GLOBAL_TIMEOUT: $GLOBAL_TIMEOUT"
echo "RECORD: $RECORD"
echo "USE_SIM_TIME: $USE_SIM_TIME"

# Launch scenario test runner
ros2 launch scenario_test_runner scenario_test_runner.launch.py \
launch_autoware:=false \
launch_rviz:=false \
architecture_type:="$ARCHITECTURE_TYPE" \
sensor_model:="$SENSOR_MODEL" \
vehicle_model:="$VEHICLE_MODEL" \
initialize_duration:="$INITIALIZE_DURATION" \
global_frame_rate:="$GLOBAL_FRAME_RATE" \
output_directory:="$OUTPUT_DIRECTORY" \
scenario:="$SCENARIO" \
global_timeout:="$GLOBAL_TIMEOUT" \
record:="$RECORD" \
use_sim_time:="$USE_SIM_TIME"
}

# Source ROS and Autoware setup files
source "/opt/ros/$ROS_DISTRO/setup.bash"
source "/opt/autoware/setup.bash"

# Execute passed command if provided, otherwise run scenario simulator
if [ $# -gt 0 ]; then
exec "$@"
else
run_scenario_simulator
fi
81 changes: 81 additions & 0 deletions docker/tools/visualizer/Dockerfile.visualizer
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# cspell:ignore openbox, VNC, tigervnc, novnc, websockify, newkey, xstartup, keyout

### Builder
FROM ghcr.io/autowarefoundation/autoware:universe-visualization-devel AS builder
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
ENV CCACHE_DIR="/root/.ccache"
ARG ROS_DISTRO
WORKDIR /autoware
COPY src/simulator /autoware/src/simulator
COPY docker/scripts/resolve_rosdep_keys.sh /autoware/resolve_rosdep_keys.sh
RUN chmod +x /autoware/resolve_rosdep_keys.sh

# Build simulator messages and rviz plugins ONLY
# hadolint ignore=SC1091
RUN --mount=type=ssh \
--mount=type=cache,target=/var/cache/apt,sharing=locked \
apt-get update \
&& source /opt/ros/"$ROS_DISTRO"/setup.bash && source /opt/autoware/setup.bash \
&& rosdep update && rosdep install -y --from-paths src --ignore-src --rosdistro $ROS_DISTRO \
&& colcon build --cmake-args \
"-Wno-dev" \
"--no-warn-unused-cli" \
--install-base /opt/autoware \
--merge-install \
--mixin release compile-commands ccache \
--base-paths /autoware/src \
--packages-up-to-regex ".*_msgs$" ".*rviz_plugin$" \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* "$HOME"/.cache

# Extract rosdep dependencies for visualizer
# hadolint ignore=SC1091
RUN source /opt/ros/"$ROS_DISTRO"/setup.bash && source /opt/autoware/setup.bash \
&& /autoware/resolve_rosdep_keys.sh /autoware/src ${ROS_DISTRO} \
> /rosdep-visualizer-depend-packages.txt \
&& cat /rosdep-visualizer-depend-packages.txt

### visualizer
FROM ghcr.io/autowarefoundation/autoware:universe-visualization AS visualizer
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
ARG ROS_DISTRO
ARG LIB_DIR
WORKDIR /autoware

# Get simulator messages, rviz plugins and dependencies
COPY --from=builder /opt/autoware /opt/autoware
COPY --from=builder /rosdep-visualizer-depend-packages.txt /tmp/rosdep-visualizer-depend-packages.txt

# Install openbox, VNC, and simulator dependencies
# hadolint ignore=SC2002
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
curl unzip openbox tigervnc-standalone-server tigervnc-common \
novnc websockify python3-numpy python3-xdg \
# Remove xmlschema and yamale from rosdep packages since we install via pip
&& sed -i '/\(xmlschema\|yamale\)/d' /tmp/rosdep-visualizer-depend-packages.txt \
&& pip install --no-cache-dir yamale xmlschema \
&& cat /tmp/rosdep-visualizer-depend-packages.txt | xargs apt-get install -y --no-install-recommends \
&& /autoware/cleanup_system.sh $LIB_DIR $ROS_DISTRO

# Create SSL certificate for NoVNC
RUN openssl req -x509 -nodes -newkey rsa:2048 \
-keyout /etc/ssl/private/novnc.key \
-out /etc/ssl/certs/novnc.crt \
-days 365 \
-subj "/O=Autoware-OpenADKit/CN=localhost"

# Need to expose VNC and NoVNC ports when running the container
EXPOSE 5900 6080

# Add source commands to bash startup
RUN echo "source /opt/ros/$ROS_DISTRO/setup.bash" >> /root/.bashrc && \
echo "source /opt/autoware/setup.bash" >> /root/.bashrc

# Copy default rviz config
COPY docker/tools/visualizer/etc/autoware.rviz /autoware/autoware.rviz

# Copy startup scripts
COPY docker/tools/visualizer/etc/xstartup /root/.vnc/xstartup
COPY docker/tools/visualizer/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh && chmod +x /root/.vnc/xstartup
ENTRYPOINT ["/entrypoint.sh"]
Loading
Loading