You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
6.2 KiB
127 lines
6.2 KiB
FROM nvgear/ros-2:latest
|
|
|
|
# Accept build argument for username
|
|
ARG USERNAME
|
|
ARG USERID
|
|
ARG HOME_DIR
|
|
ARG WORKTREE_NAME
|
|
|
|
# Create user with the same name as host
|
|
RUN if [ "$USERID" != "0" ]; then \
|
|
useradd -m -u ${USERID} -s /bin/bash ${USERNAME} && \
|
|
echo "${USERNAME} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
|
|
# Add user to video and render groups for GPU access
|
|
usermod -a -G video,render ${USERNAME} || true; \
|
|
fi
|
|
|
|
# Copy .bashrc with color settings before switching user
|
|
COPY --chown=${USERNAME}:${USERNAME} docker/.bashrc ${HOME_DIR}/.bashrc
|
|
|
|
# Install Manus udev rules
|
|
COPY --chown=${USERNAME}:${USERNAME} docker/70-manus-hid.rules /etc/udev/rules.d/70-manus-hid.rules
|
|
|
|
# Copy tmux configuration
|
|
COPY --chown=${USERNAME}:${USERNAME} docker/.tmux.conf ${HOME_DIR}/.tmux.conf
|
|
|
|
# Switch to user
|
|
USER ${USERNAME}
|
|
|
|
# Install tmux plugin manager and uv in parallel
|
|
RUN git clone https://github.com/tmux-plugins/tpm ${HOME_DIR}/.tmux/plugins/tpm & \
|
|
curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR=${HOME_DIR}/.cargo/bin sh & \
|
|
wait
|
|
|
|
# Install tmux plugins automatically
|
|
RUN ${HOME_DIR}/.tmux/plugins/tpm/bin/install_plugins || true
|
|
|
|
# Add uv to PATH
|
|
ENV PATH="${HOME_DIR}/.cargo/bin:$PATH"
|
|
ENV UV_PYTHON=${HOME_DIR}/venv/bin/python
|
|
|
|
# Create venv
|
|
RUN uv venv --python 3.10 ${HOME_DIR}/venv
|
|
|
|
# Install hardware-specific packages (x86 only - not available on ARM64/Orin)
|
|
USER root
|
|
COPY --chown=${USERNAME}:${USERNAME} gr00t_wbc/control/teleop/device/pico/XRoboToolkit_PC_Service_1.0.0_ubuntu_22.04_amd64.deb ${HOME_DIR}/XRoboToolkit_PC_Service_1.0.0_ubuntu_22.04_amd64.deb
|
|
COPY --chown=${USERNAME}:${USERNAME} gr00t_wbc/control/teleop/device/pico/roboticsservice_1.0.0.0_arm64.deb ${HOME_DIR}/roboticsservice_1.0.0.0_arm64.deb
|
|
|
|
RUN if [ "$(dpkg --print-architecture)" = "amd64" ]; then \
|
|
# Ultra Leap setup
|
|
wget -qO - https://repo.ultraleap.com/keys/apt/gpg | gpg --dearmor | tee /etc/apt/trusted.gpg.d/ultraleap.gpg && \
|
|
echo 'deb [arch=amd64] https://repo.ultraleap.com/apt stable main' | tee /etc/apt/sources.list.d/ultraleap.list && \
|
|
apt-get update && \
|
|
echo "yes" | DEBIAN_FRONTEND=noninteractive apt-get install -y ultraleap-hand-tracking libhidapi-dev && \
|
|
# Space Mouse udev rules
|
|
echo 'KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="plugdev"' > /etc/udev/rules.d/99-hidraw-permissions.rules && \
|
|
usermod -aG plugdev ${USERNAME}; \
|
|
# Pico setup
|
|
apt-get install -y xdg-utils && \
|
|
dpkg -i ${HOME_DIR}/XRoboToolkit_PC_Service_1.0.0_ubuntu_22.04_amd64.deb; \
|
|
else \
|
|
echo "Skipping x86-only hardware packages on $(dpkg --print-architecture)"; \
|
|
fi
|
|
|
|
USER ${USERNAME}
|
|
# Install hardware Python packages (x86 only) with caching
|
|
RUN --mount=type=cache,target=${HOME_DIR}/.cache/uv,uid=${USERID},gid=${USERID} \
|
|
if [ "$(dpkg --print-architecture)" = "amd64" ]; then \
|
|
# Ultra Leap Python bindings
|
|
git clone https://github.com/ultraleap/leapc-python-bindings ${HOME_DIR}/leapc-python-bindings && \
|
|
cd ${HOME_DIR}/leapc-python-bindings && \
|
|
UV_CONCURRENT_DOWNLOADS=8 uv pip install -r requirements.txt && \
|
|
MAKEFLAGS="-j$(nproc)" ${HOME_DIR}/venv/bin/python -m build leapc-cffi && \
|
|
uv pip install leapc-cffi/dist/leapc_cffi-0.0.1.tar.gz && \
|
|
uv pip install -e leapc-python-api && \
|
|
# Space Mouse Python package
|
|
uv pip install pyspacemouse && \
|
|
# Pico Python bindings
|
|
git clone https://github.com/XR-Robotics/XRoboToolkit-PC-Service-Pybind.git ${HOME_DIR}/XRoboToolkit-PC-Service-Pybind && \
|
|
cd ${HOME_DIR}/XRoboToolkit-PC-Service-Pybind && \
|
|
uv pip install setuptools pybind11 && \
|
|
sed -i "s|pip install|uv pip install|g" setup_ubuntu.sh && \
|
|
sed -i "s|pip uninstall|uv pip uninstall|g" setup_ubuntu.sh && \
|
|
sed -i "s|python setup.py install|${HOME_DIR}/venv/bin/python setup.py install|g" setup_ubuntu.sh && \
|
|
bash setup_ubuntu.sh; \
|
|
fi
|
|
|
|
# Install Python dependencies using uv with caching
|
|
RUN --mount=type=cache,target=${HOME_DIR}/.cache/uv,uid=${USERID},gid=${USERID} \
|
|
UV_CONCURRENT_DOWNLOADS=8 uv pip install --upgrade pip ipython jupyter notebook debugpy
|
|
|
|
|
|
# Copy entire project to the workspace directory where it will be mounted at runtime
|
|
# NOTE: The build context must be the project root for this to work
|
|
# Use dynamic worktree name to match runtime mount path
|
|
COPY --chown=${USERNAME}:${USERNAME} . ${HOME_DIR}/Projects/${WORKTREE_NAME}
|
|
|
|
# Install Python dependencies inside the venv with caching - split into separate commands
|
|
RUN --mount=type=cache,target=${HOME_DIR}/.cache/uv,uid=${USERID},gid=${USERID} \
|
|
UV_CONCURRENT_DOWNLOADS=8 uv pip install \
|
|
-e ${HOME_DIR}/Projects/${WORKTREE_NAME}/external_dependencies/unitree_sdk2_python
|
|
|
|
# Unlike pip, uv downloads LFS files by default. There's a bug in uv that causes LFS files
|
|
# to fail to download (https://github.com/astral-sh/uv/issues/3312). So we need to set
|
|
# UV_GIT_LFS=1 to prevent uv from downloading LFS files.
|
|
# Install project dependencies (VLA extras only on x86) with caching
|
|
RUN --mount=type=cache,target=${HOME_DIR}/.cache/uv,uid=${USERID},gid=${USERID} \
|
|
GIT_LFS_SKIP_SMUDGE=1 UV_CONCURRENT_DOWNLOADS=8 uv pip install -e "${HOME_DIR}/Projects/${WORKTREE_NAME}[dev]"
|
|
|
|
# Clone and install robosuite with specific branch
|
|
RUN --mount=type=cache,target=${HOME_DIR}/.cache/uv,uid=${USERID},gid=${USERID} \
|
|
git clone https://github.com/xieleo5/robosuite.git ${HOME_DIR}/robosuite && \
|
|
cd ${HOME_DIR}/robosuite && \
|
|
git checkout leo/support_g1_locomanip && \
|
|
UV_CONCURRENT_DOWNLOADS=8 uv pip install -e .
|
|
|
|
# Install gr00trobocasa
|
|
RUN --mount=type=cache,target=${HOME_DIR}/.cache/uv,uid=${USERID},gid=${USERID} \
|
|
UV_CONCURRENT_DOWNLOADS=8 uv pip install -e ${HOME_DIR}/Projects/${WORKTREE_NAME}/gr00t_wbc/dexmg/gr00trobocasa
|
|
|
|
# Configure bash environment with virtual environment and ROS2 setup
|
|
RUN echo "source ${HOME_DIR}/venv/bin/activate" >> ${HOME_DIR}/.bashrc && \
|
|
echo "source /opt/ros/humble/setup.bash" >> ${HOME_DIR}/.bashrc && \
|
|
echo "export ROS_LOCALHOST_ONLY=1" >> ${HOME_DIR}/.bashrc
|
|
|
|
# Default command (can be overridden at runtime)
|
|
CMD ["/bin/bash"]
|