Skip to content
Merged
Show file tree
Hide file tree
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
1 change: 1 addition & 0 deletions .envrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
use flake
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
src/log/
src/build/
src/install/
*backup
.direnv
result
.config/nvim/
.config/setup-development-enviornment.sh
3 changes: 0 additions & 3 deletions .gitmodules

This file was deleted.

239 changes: 108 additions & 131 deletions Docker/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,148 +1,125 @@
###############
# BUILD IMAGE #
###############
FROM ros:humble-ros-core AS builder
SHELL ["/bin/bash", "-c"]

# Use Faster Mirrors
## INFO: Found using apt-select --country US -t 10
ARG MIRROR='http://dal.mirrors.clouvider.net'
RUN sed -r -i "s,http://(.*).ubuntu.com,${MIRROR}," /etc/apt/sources.list

# Setup Environment

## ROS2
ARG ROS_DISTRO='humble'
ARG DEBIAN_FRONTEND='noninteractive'

ENV USER='root'
ENV HOME="/${USER}"
ENV BOAT_WS='/root/roboboat_ws'

# Install some packages
RUN apt-get update && apt-get -y --no-install-recommends install \
cmake wget curl git lsb-release \
build-essential software-properties-common && \
apt-get clean && rm -rf /var/lib/apt/lists/*

## Setup Workspace
RUN mkdir -p "${BOAT_WS}/src"
WORKDIR "${BOAT_WS}/src"
ARG ROS_DISTRO="humble"

ARG USER="root"
ARG HOME="/${USER}"
ARG BOAT_WS="${HOME}/roboboat_ws"

ARG PKGS_BASE="git wget curl jq"
ARG PKGS_DEV="software-properties-common apt-utils python3-minimal python-is-python3 python3-pip python3-vcstool python3-colcon-common-extensions net-tools iputils-ping ros-dev-tools ros-${ROS_DISTRO}-velodyne ros-${ROS_DISTRO}-rmw-cyclonedds-cpp ros-${ROS_DISTRO}-point-cloud-transport ros-${ROS_DISTRO}-robot-localization libturbojpeg"
ARG PKGS_SIM="ros-${ROS_DISTRO}-ros-gz gz-harmonic"

# ZED SDK args
ARG ZED_SDK_URL="https://download.stereolabs.com/zedsdk/5.0/cu12/ubuntu22"
ARG PKGS_ZED_SDK="zstd less cmake gnupg2 build-essential python3 python3-pip python3-dev python3-setuptools python3-wheel libusb-1.0-0-dev libgeographic-dev libdraco-dev zlib1g-dev lsb-release udev build-essential libpq-dev usbutils"
ARG PKGS_PIP_ZED_SDK="cython numpy opencv-python-headless protobuf"

###########
# BUILDER #
###########
# The goal of this image is to build the following images:
# - osrf/vrx (2.4.1)
# - sterolabs/zed-ros2-wrapper
FROM ros:${ROS_DISTRO}-ros-base AS builder
ENV DEBIAN_FRONTEND=noninteractive

# Redeclare global args
ARG PKGS_BASE
ARG PKGS_SIM
ARG PKGS_ZED_SDK
ARG PKGS_PIP_ZED_SDK
ARG BOAT_WS
ARG ZED_SDK_URL
ARG ROS_DISTRO

RUN apt-get update -y && apt-get install -y --no-install-recommends \
${PKGS_BASE} && \
apt-get clean && rm -rf /var/lib/apt/lists/*

# Install the ZED SDK
# RUN echo "[INFO] ZED SDK link: $ZED_SDK_URL" && \
# if [ "$(curl -L -I "${ZED_SDK_URL}" -o /dev/null -s -w '%{http_code}\n' | head -n 1)" = "200" ]; then \
# echo "[OKAY] ZedSDK URL exists"; \
# else \
# echo "[ERROR] ZedSDK URL does not point to a .run file or the file does not exist."; \
# exit 1; \
# fi; \
# wget -q -O ZED_SDK_Linux_Ubuntu.run ${ZED_SDK_URL} && \
# chmod +x ZED_SDK_Linux_Ubuntu.run && \
# ./ZED_SDK_Linux_Ubuntu.run -- silent skip_tools skip_cuda && \
# ln -sf /lib/x86_64-linux-gnu/libusb-1.0.so.0 /usr/lib/x86_64-linux-gnu/libusb-1.0.so && \
# rm ZED_SDK_Linux_Ubuntu.run && \
# rm -rf /var/lib/apt/lists/*

# Install Gazebo Harmonic, dependency for osrf/vrx
RUN curl https://packages.osrfoundation.org/gazebo.gpg --output /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] https://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null && \
apt-get update -y && apt-get install -y --no-install-recommends ${PKGS_SIM} \
&& apt-get clean && rm -rf /var/lib/apt/lists/*

ARG VRX_REPO='osrf/vrx'
ARG VRX_BRANCH='v3.0.4'
ARG ZED_REPO='stereolabs/zed-ros2-wrapper'
ARG ZED_BRANCH='humble-v5.0.0'
RUN /bin/bash -c "mkdir -p "${BOAT_WS}/src" && cd "${BOAT_WS}/src" && \
apt-get update -y && \
ls -la /opt/ros/${ROS_DISTRO} && source /opt/ros/${ROS_DISTRO}/setup.bash && \
git clone --progress --verbose --recursive --depth 1 --branch ${VRX_BRANCH} https://github.com/${VRX_REPO}.git && \
# git clone --progress --verbose --recursive --depth 1 --branch ${ZED_BRANCH} https://github.com/${ZED_REPO}.git && \
cd ${BOAT_WS} && \
rosdep update && rosdep install --from-paths src --ignore-src -r -y && \
colcon build --parallel-workers $(nproc) --merge-install \
--event-handlers console_direct+ --base-paths src"
# These are for ZED SDK
# --cmake-args ' -DCMAKE_BUILD_TYPE=Release' \
# ' -DCMAKE_LIBRARY_PATH=/usr/local/cuda/lib64/stubs' \
# ' -DCMAKE_CXX_FLAGS=\"-Wl,--allow-shlib-undefined\"'"

#####################
# BUILD IMAGE (VRX) #
# DEVELOPMENT IMAGE #
#####################
FROM builder AS builder_vrx

## Add Gazebo Repository
RUN wget https://packages.osrfoundation.org/gazebo.gpg -O /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null && \
add-apt-repository -y universe && \
apt-get update && apt-get -y --no-install-recommends install \
python3-sdformat13 gz-garden \
ros-${ROS_DISTRO}-xacro \
ros-${ROS_DISTRO}-ros-gzgarden \
python3-colcon-common-extensions \
ros-${ROS_DISTRO}-image-transport && \
apt-get clean && rm -rf /var/lib/apt/lists/*

WORKDIR ${BOAT_WS}/src
RUN git clone --progress --verbose --recursive --depth 1 --branch 2.4.1 https://github.com/osrf/vrx.git && \
cd ${BOAT_WS} && source /opt/ros/${ROS_DISTRO}/setup.bash && \
colcon build --parallel-workers $(nproc) --base-paths src --merge-install && \
apt-get clean && rm -rf /var/lib/apt/lists/*


##############
# BASE IMAGE #
##############

FROM ros:humble-ros-core AS base
SHELL ["/bin/bash", "-c"]

# Use Faster Mirrors
ARG MIRROR='http://dal.mirrors.clouvider.net' # INFO: Found using apt-select --country US -t 10
RUN sed -r -i "s,http://(.*).ubuntu.com,${MIRROR}," /etc/apt/sources.list
FROM ros:${ROS_DISTRO}-ros-core AS development

# Setup Environment
ENV USER='root'
ENV HOME="/${USER}"
RUN sed -i 's,http://[^ ]*archive\.ubuntu\.com/ubuntu,mirror://mirrors.ubuntu.com/mirrors.txt,g' /etc/apt/sources.list

ENV BOAT_WS='/root/roboboat_ws'
# Setup Environment
ARG PKGS_BASE
ARG PKGS_SIM
ARG PKGS_DEV
ARG BOAT_WS
ARG ROS_DISTRO
ARG USER="root"
ARG HOME="/${USER}"

ENV USER=${USER}
ENV HOME=${HOME}
ENV BOAT_WS=${BOAT_WS}
RUN mkdir -p ${BOAT_WS}

## ROS2
ARG DEBIAN_FRONTEND='noninteractive'
ENV RMW_IMPLEMENTATION=rmw_cyclonedds_cpp

## .bashrc
COPY .config/.bashrc ${HOME}/.bashrc
COPY .config/.bash.d ${HOME}/.bash.d

# Install Developer Packges
RUN apt-get update && apt-get -y --no-install-recommends install \
software-properties-common apt-utils wget curl \
python3-minimal python-is-python3 python3-pip && \
apt-get clean && rm -rf /var/lib/apt/lists/*

# Setup ROS2 Humble packages
RUN apt-get update && apt-get -y --no-install-recommends install \
python3-vcstool ros-dev-tools \
python3-colcon-common-extensions \
ros-${ROS_DISTRO}-point-cloud-transport \
ros-${ROS_DISTRO}-robot-localization \
ros-${ROS_DISTRO}-velodyne \
ros-${ROS_DISTRO}-rmw-cyclonedds-cpp && \
apt-get clean && rm -rf /var/lib/apt/lists/*
RUN curl https://packages.osrfoundation.org/gazebo.gpg --output /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] https://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null && \
apt-get update -y && apt-get install -y --no-install-recommends \
${PKGS_BASE} ${PKGS_DEV} ${PKGS_SIM} \
&& apt-get clean && rm -rf /var/lib/apt/lists/*

# Set the RMW implementation to CycloneDDS
ENV RMW_IMPLEMENTATION=rmw_cyclonedds_cpp

# Copy files from the builder
COPY --from=builder ${BOAT_WS}/install ${BOAT_WS}/install
# Add ROS2-Specific configurations to `.bashrc`
RUN echo "source ${BOAT_WS}/install/setup.bash" >> ${HOME}/.bashrc && \
echo "source /opt/ros/${ROS_DISTRO}/setup.bash" >> ${HOME}/.bashrc && \
echo "source /usr/share/colcon_cd/function/colcon_cd.sh" >> ${HOME}/.bashrc && \
echo "source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash" >> ${HOME}/.bashrc && \
echo "export _colcon_cd_root=/opt/ros/${ROS_DISTRO}/" >> ${HOME}/.bashrc && \
echo "cd ${BOAT_WS}" >> ${HOME}/.bashrc
RUN /bin/bash -c "\
echo 'source /opt/ros/${ROS_DISTRO}/setup.bash' >> ${HOME}/.bashrc; \
echo 'source ${BOAT_WS}/install/setup.bash' >> ${HOME}/.bashrc; \
echo 'source /usr/share/colcon_cd/function/colcon_cd.sh' >> ${HOME}/.bashrc; \
echo 'source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash' >> ${HOME}/.bashrc; \
echo 'export _colcon_cd_root=/opt/ros/${ROS_DISTRO}/' >> ${HOME}/.bashrc; \
echo 'cd ${BOAT_WS}' >> ${HOME}/.bashrc"

# Set Entrypoint Script
COPY ./Docker/entrypoint.sh ${HOME}
RUN chmod +x ${HOME}/entrypoint.sh
ENTRYPOINT ["/root/entrypoint.sh"]

#####################
# DEVELOPMENT IMAGE #
#####################
FROM base AS development

# Copy files from the builder
COPY --from=builder_vrx ${BOAT_WS}/install ${BOAT_WS}/install

# Install Dependencies
RUN apt-get update && apt-get -y --no-install-recommends install \
net-tools iputils-ping \
libturbojpeg && \
apt-get clean && rm -rf /var/lib/apt/lists/*

# Install Gazebo Garden

## Add Gazebo Repository
RUN wget https://packages.osrfoundation.org/gazebo.gpg -O /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null
RUN apt-get update && apt-get -y --no-install-recommends install \
python3-sdformat13 gz-garden \
python3-colcon-common-extensions \
ros-${ROS_DISTRO}-xacro \
ros-${ROS_DISTRO}-ros-gzgarden \
ros-${ROS_DISTRO}-image-transport \
ros-${ROS_DISTRO}-rmw-cyclonedds-cpp && \
apt-get clean && rm -rf /var/lib/apt/lists/*

#################
# RELEASE IMAGE #
#################
FROM base AS release

WORKDIR ${BOAT_WS}/src
COPY ./src/roboboat2025_ros2 .
RUN source /opt/ros/${ROS_DISTRO}/setup.bash && \
colcon build --parallel-workers $(nproc) --merge-install --base-paths src && \
apt-get clean && rm -rf /var/lib/apt/lists/*
ENTRYPOINT "${HOME}/entrypoint.sh"
22 changes: 17 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,33 @@
# RoboBoat 2025 Codebase
# UTD RoboBoat Codebase

```bash
.
├── .config/
│   ├── .bash.d
│   ├── .bashrc
│   ├── setup-development-enviornment.sh
│   └── starship.toml
├── Docker/
│   ├── Dockerfile
│   └── entrypoint.sh
├── docker-compose.yml
├── flake.nix
├── flake.lock
├── README.md
└── src/
└── roboboat2025/
```

## Development with MacOS
The images _should_ work on MacOS, seeing as the docker images also build for `linux/arm64`. The only issue that _could_ happen is through display forwarding (i.e. graphical applications not showing on MacOS), in which `xquartz` would be required:

>[!CAUTION]
> None of these instructions were tested _at all_ by me! I just happened to find them from GitHub Gists ([Gist A](https://gist.github.com/cschiewek/246a244ba23da8b9f0e7b11a68bf3285) and [Gist B](https://gist.github.com/sorny/969fe55d85c9b0035b0109a31cbcb088))

1. Make sure you have [Homebrew](https://brew.sh/) (a package manager for MacOS) installed.
2. Install `xquartz` with `brew install --cask xquartz`.
3. Open the application and on its `preferences -> security` tab, check the box that says "**Allow connections from network clients**".
4. Relaunch the application
5. On you terminal, enter `xhost +host.docker.internal` to allow connections from Docker
6. ...you should be good to go!


## Running Development Container in a Detached State

You would normally do this whenever you are starting the container in order to attach to it in a code editor such as VSCode:
Expand Down
Loading
Loading