Add devcontainer
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
<!-- ~/.ros2/dds/cyclonedds.xml -->
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<CycloneDDS xmlns="https://cdds.io/config"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="https://cdds.io/config
|
||||
https://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/master/etc/cyclonedds.xsd">
|
||||
<Domain Id="any">
|
||||
<Discovery>
|
||||
<ParticipantIndex>auto</ParticipantIndex>
|
||||
<MaxAutoParticipantIndex>1000</MaxAutoParticipantIndex>
|
||||
</Discovery>
|
||||
</Domain>
|
||||
</CycloneDDS>
|
||||
@@ -0,0 +1,76 @@
|
||||
FROM osrf/ros:jazzy-desktop-full
|
||||
ARG USERNAME=USERNAME
|
||||
ARG USER_UID=1000
|
||||
ARG USER_GID=$USER_UID
|
||||
|
||||
# Delete user if it exists in container (e.g Ubuntu Noble: ubuntu)
|
||||
RUN if id -u $USER_UID ; then userdel `id -un $USER_UID` ; fi
|
||||
|
||||
# Create the user
|
||||
RUN groupadd --gid $USER_GID $USERNAME \
|
||||
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \
|
||||
#
|
||||
# [Optional] Add sudo support. Omit if you don't need to install software after connecting.
|
||||
&& apt-get update \
|
||||
&& apt-get install -y --no-install-recommends sudo \
|
||||
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
|
||||
&& chmod 0440 /etc/sudoers.d/$USERNAME \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Make sure the base image is completely up to date
|
||||
RUN apt-get update \
|
||||
&& apt-get upgrade -y \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
|
||||
# C++ development tools
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
build-essential \
|
||||
cmake \
|
||||
gdb \
|
||||
clang \
|
||||
clang-format \
|
||||
clang-tidy \
|
||||
libboost-all-dev \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Python development tools
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
python3-pip \
|
||||
python3-dev \
|
||||
python3-argcomplete \
|
||||
python3-colcon-common-extensions \
|
||||
python3-colcon-mixin \
|
||||
python3-rosdep \
|
||||
python3-vcstool \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Optional: pre-install apt dependencies resolved from rosdep on a previous run.
|
||||
COPY .devcontainer/jazzy/ /tmp/devcontainer-jazzy/
|
||||
|
||||
RUN apt-get update \
|
||||
&& if [ -f /tmp/devcontainer-jazzy/rosdep-apt-packages.txt ]; then \
|
||||
grep -Ev '^\s*($|#)' /tmp/devcontainer-jazzy/rosdep-apt-packages.txt | xargs -r apt-get install -y --no-install-recommends; \
|
||||
fi \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
ros-${ROS_DISTRO}-rmw-cyclonedds-cpp \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# ROS 2 ament build tools
|
||||
# RUN apt-get install -y \
|
||||
# ros-${ROS_DISTRO}-ament-cmake \
|
||||
# ros-${ROS_DISTRO}-ament-cmake-auto \
|
||||
# ros-${ROS_DISTRO}-ament-python \
|
||||
# ros-${ROS_DISTRO}-ament-lint-auto \
|
||||
# ros-${ROS_DISTRO}-ament-lint-common
|
||||
|
||||
ENV SHELL=/bin/bash
|
||||
|
||||
# [Optional] Set the default user. Omit if you want to keep the default as root.
|
||||
USER $USERNAME
|
||||
CMD ["/bin/bash"]
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"name": "ROS 2 Jazzy",
|
||||
"privileged": true,
|
||||
"remoteUser": "${localEnv:USER}",
|
||||
"build": {
|
||||
"context": "../..",
|
||||
"dockerfile": "Dockerfile.jazzy",
|
||||
"args": {
|
||||
"USERNAME": "${localEnv:USER}"
|
||||
}
|
||||
},
|
||||
"workspaceFolder": "/workspaces/agv_pro_ros2",
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": [
|
||||
"ms-python.python",
|
||||
"anthropic.claude-code"
|
||||
]
|
||||
}
|
||||
},
|
||||
"containerEnv": {
|
||||
"DISPLAY": ":0",
|
||||
"ROS_AUTOMATIC_DISCOVERY_RANGE": "SUBNET",
|
||||
"ROS_DOMAIN_ID": "0",
|
||||
"RMW_IMPLEMENTATION": "rmw_cyclonedds_cpp",
|
||||
"CYCLONEDDS_URI": "/workspaces/agv_pro_ros2/.devcontainer/cyclonedds.xml"
|
||||
},
|
||||
"runArgs": [
|
||||
"--network=robot-sim",
|
||||
"--pid=host",
|
||||
"--ipc=host",
|
||||
"-e",
|
||||
"DISPLAY=${env:DISPLAY}"
|
||||
],
|
||||
"mounts": [
|
||||
"source=/tmp/.X11-unix,target=/tmp/.X11-unix,type=bind,consistency=cached",
|
||||
"source=/dev/dri,target=/dev/dri,type=bind,consistency=cached",
|
||||
"source=/usr/local/share/ca-certificates,target=/usr/local/share/host-certificates,type=bind,consistency=cached",
|
||||
"source=${localEnv:HOME}/.ssh,target=/home/${localEnv:USER}/.ssh,type=bind,consistency=cached"
|
||||
],
|
||||
"postCreateCommand": "bash .devcontainer/post-create.sh"
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
ROSDEP_APT_LIST_FILE="${ROOT_DIR}/.devcontainer/${ROS_DISTRO}/rosdep-apt-packages.txt"
|
||||
|
||||
|
||||
if [[ -f /usr/local/share/host-certificates/AMD_CA.crt ]]; then
|
||||
sudo cp /usr/local/share/host-certificates/AMD_CA.crt /usr/local/share/ca-certificates/
|
||||
sudo update-ca-certificates
|
||||
fi
|
||||
|
||||
if [[ ! -f "${ROSDEP_APT_LIST_FILE}" ]]; then
|
||||
echo "Missing ${ROSDEP_APT_LIST_FILE}."
|
||||
echo "Run .devcontainer/refresh-rosdep-cache.sh and rebuild the devcontainer."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
tmp_packages="$(mktemp)"
|
||||
cleanup() {
|
||||
rm -f "${tmp_packages}"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
sudo apt-get update -qq
|
||||
|
||||
rosdep keys --from-paths src --ignore-src 2>/dev/null \
|
||||
| xargs -r rosdep resolve --rosdistro "${ROS_DISTRO}" --filter-for-installers=apt 2>/dev/null \
|
||||
| sed -e '/^#/d' -e '/^$/d' \
|
||||
| LC_ALL=C sort -u > "${tmp_packages}"
|
||||
|
||||
if ! diff -u <(grep -Ev '^\s*($|#)' "${ROSDEP_APT_LIST_FILE}") "${tmp_packages}" >/dev/null; then
|
||||
echo "rosdep-resolved apt packages differ from ${ROSDEP_APT_LIST_FILE}."
|
||||
echo "Run .devcontainer/refresh-rosdep-cache.sh and rebuild the devcontainer."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "rosdep apt cache is current; no post-create package installation needed."
|
||||
|
||||
if compgen -G "${ROOT_DIR}/src/robotnik/robotnik_simulation/debs/ros-jazzy-*.deb" > /dev/null; then
|
||||
sudo apt-get install -y "${ROOT_DIR}"/src/robotnik/robotnik_simulation/debs/ros-jazzy-*.deb
|
||||
fi
|
||||
Executable
+38
@@ -0,0 +1,38 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
ROS_DISTRO="${ROS_DISTRO:-jazzy}"
|
||||
CACHE_DIR="${ROOT_DIR}/.devcontainer/${ROS_DISTRO}"
|
||||
APT_LIST_FILE="${CACHE_DIR}/rosdep-apt-packages.txt"
|
||||
|
||||
cd "${ROOT_DIR}"
|
||||
|
||||
mkdir -p "${CACHE_DIR}"
|
||||
|
||||
if [[ ! -f /etc/ros/rosdep/sources.list.d/20-default.list ]]; then
|
||||
sudo rosdep init
|
||||
fi
|
||||
|
||||
rosdep update
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
sudo apt-get update -qq
|
||||
|
||||
tmp_packages="$(mktemp)"
|
||||
cleanup() {
|
||||
rm -f "${tmp_packages}"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
rosdep keys --from-paths src --ignore-src 2>/dev/null \
|
||||
| xargs -r rosdep resolve --rosdistro "${ROS_DISTRO}" --filter-for-installers=apt 2>/dev/null \
|
||||
| sed -e '/^#/d' -e '/^$/d' \
|
||||
| LC_ALL=C sort -u > "${tmp_packages}"
|
||||
|
||||
{
|
||||
echo "# Generated by .devcontainer/refresh-rosdep-cache.sh"
|
||||
echo "# apt packages resolved from rosdep keys in src"
|
||||
cat "${tmp_packages}"
|
||||
} > "${APT_LIST_FILE}"
|
||||
|
||||
echo "Updated ${APT_LIST_FILE}"
|
||||
Reference in New Issue
Block a user