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

Added dockerfile for CARLA submission #94

Merged
merged 2 commits into from
Nov 28, 2023
Merged
Changes from all commits
Commits
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
189 changes: 189 additions & 0 deletions build/docker/agent/Dockerfile_Submission
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
# Based on https://github.com/ll7/paf21-1/blob/master/components/carla_ros_bridge/Dockerfile

# This is commented out because of the large image download necessary to build this image otherwise.
# If the PythonAPI/carla version changes, one can comment out the Download Carla PythonAPI line below.
# Then, uncomment this line and the COPY --from=carla line to build the image.
# FROM ghcr.io/nylser/carla:leaderboard as carla
# Use this image to enable instance segmentation cameras
# FROM carlasim/carla:0.9.14 as carla

# supply the base image with an environment supporting ROS UI via x11
FROM osrf/ros:noetic-desktop-full-focal

# COPY --from=carla /home/carla/PythonAPI /opt/carla/PythonAPI

ARG USERNAME=carla
ARG USER_UID=999
ARG USER_GID=$USER_UID
ARG DEBIAN_FRONTEND=noninteractive

# install rendering dependencies for rviz / rqt
RUN apt-get update \
&& apt-get install -y -qq --no-install-recommends \
libxext6 libx11-6 libglvnd0 libgl1 \
libglx0 libegl1 freeglut3-dev

# install dependencies for libgit2 and Carla PythonAPI
RUN apt-get install wget unzip

RUN wget https://github.com/una-auxme/paf23/releases/download/v0.0.1/PythonAPI_Leaderboard-2.0.zip -O PythonAPI.zip \
&& unzip PythonAPI.zip \
&& rm PythonAPI.zip \
&& mkdir -p /opt/carla \
&& mv PythonAPI /opt/carla/PythonAPI

# build libgit2
RUN wget https://github.com/libgit2/libgit2/archive/refs/tags/v1.5.0.tar.gz -O libgit2-1.5.0.tar.gz \
&& tar xzf libgit2-1.5.0.tar.gz \
&& cd libgit2-1.5.0/ \
&& cmake . \
&& make -j$(nproc --ignore=2) \
&& make install \
&& cd ../ \
&& rm libgit2-1.5.0.tar.gz \
&& rm -r libgit2-1.5.0/

# CUDA installation
RUN wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin \
&& mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600 \
&& wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda-repo-ubuntu2004-11-7-local_11.7.0-515.43.04-1_amd64.deb \
&& dpkg -i cuda-repo-ubuntu2004-11-7-local_11.7.0-515.43.04-1_amd64.deb \
&& cp /var/cuda-repo-ubuntu2004-11-7-local/cuda-*-keyring.gpg /usr/share/keyrings/ \
&& apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get -y install cuda-nvcc-11-7 \
&& rm cuda-repo-ubuntu2004-11-7-local_11.7.0-515.43.04-1_amd64.deb \
&& apt-get -y remove cuda-repo-ubuntu2004-11-7-local \
&& cat /etc/apt/sources.list \
&& rm /etc/apt/preferences.d/cuda-repository-pin-600 \
&& rm -rf /var/cuda-repo-ubuntu1804-11-7-local/ \
&& rm /etc/apt/sources.list.d/cuda-ubuntu2004-11-7-local.list \
&& apt-get clean

ENV CUDA_HOME=/usr/local/cuda-11.7

# override python path, carla pip package path didn't exist and was using Python 3.7 instead of 2.7
ENV PYTHONPATH=/opt/ros/noetic/lib/python3/dist-packages
ENV PYTHONPATH=$PYTHONPATH:/opt/carla/PythonAPI/carla/dist/carla-0.9.14-py3.7-linux-x86_64.egg:/opt/carla/PythonAPI/carla

# install mlocate, pip, wget, git and some ROS dependencies for building the CARLA ROS bridge
RUN apt-get update && apt-get install -y \
mlocate python3-pip wget git python-is-python3 \
ros-noetic-ackermann-msgs ros-noetic-derived-object-msgs \
ros-noetic-carla-msgs ros-noetic-pcl-conversions \
ros-noetic-rviz ros-noetic-rqt ros-noetic-pcl-ros ros-noetic-rosbridge-suite ros-noetic-rosbridge-server \
ros-noetic-robot-pose-ekf ros-noetic-ros-numpy \
ros-noetic-py-trees-ros ros-noetic-rqt-py-trees ros-noetic-rqt-reconfigure

SHELL ["/bin/bash", "-c"]

# Create and apply the non-root user
# -f parameter to work in macos (https://unix.stackexchange.com/a/465014), since gid is already in use there
RUN groupadd --gid $USER_GID $USERNAME -f \
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \
&& apt-get update \
&& apt-get install -y sudo \
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
&& chmod 0440 /etc/sudoers.d/$USERNAME
USER $USERNAME

# create a catkin workspace
WORKDIR /catkin_ws
# make sure the catkin workspace belongs to the user
RUN sudo chown $USERNAME:$USERNAME /catkin_ws && mkdir src

# install the CARLA ROS bridge
ARG ROS_BRIDGE_GITHUB_URL=https://github.com/carla-simulator/ros-bridge
RUN git clone -b leaderboard-2.0 --recurse-submodules --single-branch $ROS_BRIDGE_GITHUB_URL src/ros-bridge
# apply patch to fix the build of carla_ros_bridge
RUN cd src/ros-bridge/carla_ackermann_control && \
sed -i '24 i \ <build_depend condition="$ROS_VERSION == 1">carla_msgs</build_depend>' package.xml
RUN source /opt/ros/noetic/setup.bash && \
rosdep update && rosdep install --from-paths src --ignore-src -r && \
catkin_make install

ENV CARLA_ROS_BRIDGE_ROOT=/catkin_ws/src/ros-bridge

# avoid python warnings about missing bin directory in PATH
# (as we're not running as root, pip installs into ~/.local/bin)
ENV PATH=$PATH:/home/$USERNAME/.local/bin

# install simple_pid
RUN python -m pip install pip --upgrade \
&& python -m pip install simple_pid pygame transformations roslibpy lxml

# install the scenario runner from GitHub leaderboard-2.0 branch
ENV CARLA_ROOT=/opt/carla
ENV SCENARIO_RUNNER_ROOT=/opt/scenario_runner
RUN sudo mkdir $SCENARIO_RUNNER_ROOT && sudo chown $USERNAME:$USERNAME $SCENARIO_RUNNER_ROOT
RUN git clone -b leaderboard-2.0 --single-branch https://github.com/carla-simulator/scenario_runner.git $SCENARIO_RUNNER_ROOT
RUN echo 'pexpect' >> $SCENARIO_RUNNER_ROOT/requirements.txt && \
python -m pip install -r $SCENARIO_RUNNER_ROOT/requirements.txt

# install the leaderboard from GitHub leaderboard-2.0 branch
ENV LEADERBOARD_ROOT=/opt/leaderboard
RUN sudo mkdir $LEADERBOARD_ROOT && sudo chown $USERNAME:$USERNAME $LEADERBOARD_ROOT
RUN git clone -b leaderboard-2.0 --single-branch https://github.com/carla-simulator/leaderboard.git $LEADERBOARD_ROOT
RUN python -m pip install -r $LEADERBOARD_ROOT/requirements.txt
RUN sudo mkdir /opt/leaderboard-py3 && sudo chown $USERNAME:$USERNAME /opt/leaderboard-py3 && \
ln -s $LEADERBOARD_ROOT/leaderboard /opt/leaderboard-py3/leaderboard && \
ln -s $SCENARIO_RUNNER_ROOT/srunner /opt/leaderboard-py3/srunner

# environment variables for the leaderboard_evaluator
ENV ROUTES=$LEADERBOARD_ROOT/data/routes_devtest.xml
ENV REPETITIONS=1
ENV DEBUG_CHALLENGE=1
#ENV TEAM_AGENT=$LEADERBOARD_ROOT/leaderboard/autoagents/human_agent.py
ENV TEAM_AGENT=/workspace/code/agent/src/agent/agent.py
ENV CHECKPOINT_ENDPOINT=/workspace/code/simulation_results.json
ENV CHALLENGE_TRACK=MAP

ENV CARLA_SIM_HOST=localhost
ENV CARLA_SIM_WAIT_SECS=15
ENV SCENARIO_RUNNER_PATH=/opt/scenario_runner

# setup python path for PyCharm integration
RUN echo /catkin_ws/install/lib/python3/dist-packages >> /home/$USERNAME/.local/lib/python3.8/site-packages/carla.pth && \
echo /catkin_ws/devel/lib/python3/dist-packages >> /home/$USERNAME/.local/lib/python3.8/site-packages/carla.pth && \
echo /opt/ros/noetic/lib/python3/dist-packages >> /home/$USERNAME/.local/lib/python3.8/site-packages/carla.pth && \
echo /opt/ros/noetic/lib/python3/dist-packages >> /home/$USERNAME/.local/lib/python3.8/site-packages/carla.pth && \
echo /opt/leaderboard-py3 >> /home/$USERNAME/.local/lib/python3.8/site-packages/carla.pth && \
echo /opt/carla/PythonAPI/carla/dist/carla-0.9.14-py3.7-linux-x86_64.egg >> /home/$USERNAME/.local/lib/python3.8/site-packages/carla.pth && \
echo /opt/carla/PythonAPI/carla >> /home/$USERNAME/.local/lib/python3.8/site-packages/carla.pth

RUN sudo mkdir /workspace && sudo chown $USERNAME:$USERNAME /workspace

RUN echo "export CUDA_HOME=/usr/local/cuda-11" >> ~/.bashrc \
&& echo "export PATH=$PATH:$CUDA_HOME/bin" >> ~/.bashrc

COPY --chown=$USERNAME:$USERNAME ./code/requirements.txt /workspace/
ENV TORCH_CUDA_ARCH_LIST="5.2 6.0 6.1 7.0 7.5 8.0 8.6+PTX"
ENV IABN_FORCE_CUDA=1

RUN source ~/.bashrc && pip install torch==1.13.1 && pip install -r /workspace/requirements.txt

# Add agent code
COPY --chown=$USERNAME:$USERNAME ./code /workspace/code/
RUN rm -rf /workspace/code/perception/src/dataset_generator.py \
&& rm -rf /workspace/code/planning/global_planner/src/dev_global_route.py

# Link code into catkin workspace
RUN ln -s /workspace/code /catkin_ws/src

# re-make the catkin workspace
RUN source /opt/ros/noetic/setup.bash && catkin_make

ADD ./build/docker/agent/entrypoint.sh /entrypoint.sh

# set the default working directory to the code
WORKDIR /workspace/code

RUN echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc

ENTRYPOINT ["/entrypoint.sh"]
CMD ["bash", "-c", "sleep 10 && python3 /opt/leaderboard/leaderboard/leaderboard_evaluator.py --debug=${DEBUG_CHALLENGE} \
--repetitions=${REPETITIONS} \
--checkpoint=${CHECKPOINT_ENDPOINT} \
--track=${CHALLENGE_TRACK} \
--agent=${TEAM_AGENT} \
--routes=${ROUTES} \
--host=${CARLA_SIM_HOST}"]
Loading