go2py devcontainer is added
This commit is contained in:
parent
21ed5848a5
commit
9017024707
|
@ -1,31 +0,0 @@
|
|||
FROM ros:humble
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
SHELL ["/bin/bash", "-c"]
|
||||
RUN apt-get update && apt-get install -y -qq --no-install-recommends \
|
||||
libglvnd-dev \
|
||||
libgl1-mesa-dev \
|
||||
libegl1-mesa-dev \
|
||||
libgles2-mesa-dev \
|
||||
libxext6 \
|
||||
libx11-6 \
|
||||
freeglut3-dev \
|
||||
git \
|
||||
python3-pip \
|
||||
ros-humble-rmw-cyclonedds-cpp ros-humble-rosidl-generator-dds-idl \
|
||||
libyaml-cpp-dev \
|
||||
ros-humble-xacro \
|
||||
libboost-all-dev\
|
||||
build-essential \
|
||||
cmake \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
|
||||
RUN pip3 install mujoco pin matplotlib
|
||||
|
||||
RUN cd / && git clone https://github.com/unitreerobotics/unitree_ros2 && cd /unitree_ros2/cyclonedds_ws/src && \
|
||||
git clone https://github.com/ros2/rmw_cyclonedds -b humble && git clone https://github.com/eclipse-cyclonedds/cyclonedds -b releases/0.10.x &&\
|
||||
cd .. && colcon build --packages-select cyclonedds && source /opt/ros/humble/setup.bash && colcon build
|
||||
|
||||
# Env vars for the nvidia-container-runtime.
|
||||
ENV NVIDIA_VISIBLE_DEVICES all
|
||||
ENV NVIDIA_DRIVER_CAPABILITIES graphics,utility,compute
|
|
@ -1,13 +1,65 @@
|
|||
// https://containers.dev/implementors/json_reference/
|
||||
{
|
||||
"name": "go2py",
|
||||
"dockerComposeFile": "docker-compose.yaml",
|
||||
"workspaceFolder": "/home/Go2Py",
|
||||
"service": "go2py-dev",
|
||||
"remoteUser": "root",
|
||||
"name": "go2-devcontainer",
|
||||
"build": {
|
||||
"context": "..",
|
||||
"dockerfile": "../docker/build.sh"
|
||||
},
|
||||
"containerEnv": {
|
||||
"DISPLAY": "unix:0",
|
||||
"ROS_LOCALHOST_ONLY": "0",
|
||||
"ROS_AUTOMATIC_DISCOVERY_RANGE": "SUBNET",
|
||||
"ROS_DOMAIN_ID": "0",
|
||||
"SHELL": "/bin/bash"
|
||||
},
|
||||
"runArgs": [
|
||||
"--privileged",
|
||||
"--gpus",
|
||||
"all",
|
||||
"-v",
|
||||
"/dev:/dev",
|
||||
"--net=host",
|
||||
"-e",
|
||||
"DISPLAY=${env:DISPLAY}",
|
||||
"--ulimit=core=-1"
|
||||
],
|
||||
"mounts": [
|
||||
"source=/tmp/.X11-unix,target=/tmp/.X11-unix,type=bind,consistency=cached",
|
||||
"source=/dev/dri,target=/dev/dri,type=bind,consistency=cached",
|
||||
"source=${localEnv:HOME}/go2-devcontainer/logging/,target=/workspace/logging,type=bind,consistency=cached",
|
||||
"source=${localEnv:HOME}/go2-devcontainer/.bash_history,target=/home/dev/.bash_history,type=bind,consistency=cached",
|
||||
],
|
||||
"workspaceMount": "source=${localWorkspaceFolder},target=/workspace/go2-devcontainer/src/go2-devcontainer,type=bind",
|
||||
"workspaceFolder": "/workspace/go2-devcontainer/src",
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": ["dbaeumer.vscode-eslint"]
|
||||
"settings": {
|
||||
"extensions.verifySignature": false
|
||||
},
|
||||
"extensions": [
|
||||
"cheshirekow.cmake-format",
|
||||
"llvm-vs-code-extensions.vscode-clangd",
|
||||
"ms-azuretools.vscode-docker",
|
||||
"ms-iot.vscode-ros",
|
||||
"ms-python.black-formatter",
|
||||
"ms-python.flake8",
|
||||
"ms-python.isort",
|
||||
"ms-python.pylint",
|
||||
"ms-python.python",
|
||||
"ms-toolsai.jupyter",
|
||||
"ms-vscode.cmake-tools",
|
||||
"mutantdino.resourcemonitor",
|
||||
"vadimcn.vscode-lldb",
|
||||
"xaver.clang-format"
|
||||
]
|
||||
}
|
||||
},
|
||||
"forwardPorts": [
|
||||
3000
|
||||
],
|
||||
"portsAttributes": {
|
||||
"3000": {
|
||||
"label": "Application",
|
||||
"onAutoForward": "notify"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
version: "3.9"
|
||||
services:
|
||||
go2py-dev:
|
||||
build: .
|
||||
container_name: go2py-dev
|
||||
network_mode: host
|
||||
privileged: true
|
||||
command: bash
|
||||
volumes:
|
||||
- /tmp/.X11-unix:/tmp/.X11-unix
|
||||
- ..:/home/Go2Py
|
||||
environment:
|
||||
- DISPLAY=${DISPLAY}
|
||||
- QT_X11_NO_MITSHM=1
|
||||
runtime: nvidia
|
||||
stdin_open: true
|
||||
tty: true
|
|
@ -0,0 +1,10 @@
|
|||
*.dae filter=lfs diff=lfs merge=lfs -text
|
||||
*.jpeg filter=lfs diff=lfs merge=lfs -text
|
||||
*.jpg filter=lfs diff=lfs merge=lfs -text
|
||||
*.obj filter=lfs diff=lfs merge=lfs -text
|
||||
*.pcd filter=lfs diff=lfs merge=lfs -text
|
||||
*.png filter=lfs diff=lfs merge=lfs -text
|
||||
*.so filter=lfs diff=lfs merge=lfs -text
|
||||
*.so.* filter=lfs diff=lfs merge=lfs -text
|
||||
*.stl filter=lfs diff=lfs merge=lfs -text
|
||||
*.STL filter=lfs diff=lfs merge=lfs -text
|
|
@ -0,0 +1,6 @@
|
|||
# Container Provisioning
|
||||
|
||||
Container provisioning contains scripts to set up a PC ready for deployment.
|
||||
|
||||
- System environemnt setup
|
||||
- Logging directory creation
|
|
@ -0,0 +1,23 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
REQUIRED_DIRS=(
|
||||
"$HOME/go2-devcontainer/logging/coredump"
|
||||
"$HOME/go2-devcontainer/logging/logs"
|
||||
"$HOME/go2-devcontainer/logging/data"
|
||||
"$HOME/go2-devcontainer/logging/plan/data/scene"
|
||||
"$HOME/go2-devcontainer/logging/plan/data/plan_results"
|
||||
"$HOME/go2-devcontainer/models/yolov8"
|
||||
)
|
||||
|
||||
for dir in "${REQUIRED_DIRS[@]}"; do
|
||||
if [ ! -d "$dir" ]; then
|
||||
echo "Creating directory $dir"
|
||||
mkdir -p $dir
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ! -f "$HOME/go2-devcontainer/.bash_history" ]; then
|
||||
echo "Creating file $HOME/go2-devcontainer/.bash_history"
|
||||
touch $HOME/go2-devcontainer/.bash_history
|
||||
fi
|
|
@ -0,0 +1,48 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
if ! [ -x "$(command -v curl)" ]; then
|
||||
sudo apt-get install curl
|
||||
fi
|
||||
|
||||
# If docker is not installed, install it
|
||||
if ! [ -x "$(command -v docker)" ]; then
|
||||
echo "Docker is not installed. Installing Docker"
|
||||
curl -fsSL https://get.docker.com -o get-docker.sh
|
||||
sudo sh get-docker.sh
|
||||
|
||||
# Post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
|
||||
if ! [ $(getent group docker) ]; then
|
||||
sudo groupadd docker
|
||||
fi
|
||||
sudo usermod -aG docker $USER
|
||||
|
||||
echo "=============================================="
|
||||
echo "Docker installed. Please restart your computer."
|
||||
echo "=============================================="
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if docker is running
|
||||
if ! systemctl is-active --quiet docker; then
|
||||
echo "Docker is not running. Please start Docker and run this script again."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# If nvidia-container-toolkit is not installed, install it
|
||||
# Follow https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installing-with-apt
|
||||
if ! [ -x "$(command -v nvidia-container-toolkit)" ]; then
|
||||
# Install nvidia-container-toolkit
|
||||
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
|
||||
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
|
||||
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
|
||||
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y nvidia-container-toolkit
|
||||
# Configure nvidia-container-toolkit
|
||||
sudo nvidia-ctk runtime configure --runtime=docker
|
||||
sudo systemctl restart docker
|
||||
nvidia-ctk runtime configure --runtime=docker --config=$HOME/.config/docker/daemon.json
|
||||
systemctl --user restart docker
|
||||
sudo nvidia-ctk config --set nvidia-container-cli.no-cgroups --in-place
|
||||
fi
|
|
@ -0,0 +1,24 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
if ! command -v nvidia-smi &> /dev/null
|
||||
then
|
||||
echo "Installing NVIDIA driver"
|
||||
else
|
||||
echo "NVIDIA driver is already installed"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Prompt user to confirm to install NVIDIA driver 535
|
||||
NVIDIA_DRIVER_VERSION=535
|
||||
while true; do
|
||||
read -p "Do you want to install NVIDIA driver ${NVIDIA_DRIVER_VERSION}? (y/n)" yn
|
||||
case $yn in
|
||||
[Yy]* ) break;;
|
||||
[Nn]* ) echo "Please install NVIDIA driver manually!"; exit 1;;
|
||||
* ) echo "Please answer yes or no.";;
|
||||
esac
|
||||
done
|
||||
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y nvidia-driver-${NVIDIA_DRIVER_VERSION}
|
|
@ -0,0 +1,34 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
if ! command -v git-lfs &> /dev/null
|
||||
then
|
||||
echo "Installing git-lfs"
|
||||
sudo apt-get update
|
||||
sudo apt-get install \
|
||||
git-lfs
|
||||
echo "=============================================="
|
||||
echo "git-lfs is installed. Please remove cloned go2-devcontainer and re-clone it."
|
||||
echo "=============================================="
|
||||
exit 1
|
||||
else
|
||||
echo "git-lfs is already installed"
|
||||
fi
|
||||
|
||||
# # If foxglove-studio is not installed, install it
|
||||
# if ! command -v foxglove-studio &> /dev/null
|
||||
# then
|
||||
# echo "Installing foxglove-studio"
|
||||
# sudo snap install foxglove-studio
|
||||
# else
|
||||
# echo "foxglove-studio is already installed"
|
||||
# fi
|
||||
|
||||
# If VSCode is not installed, install it
|
||||
if ! command -v code &> /dev/null
|
||||
then
|
||||
echo "Installing VSCode"
|
||||
sudo snap install code --classic
|
||||
else
|
||||
echo "VSCode is already installed"
|
||||
fi
|
|
@ -0,0 +1,8 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
||||
${SCRIPT_DIR}/scripts/install-tools.sh
|
||||
${SCRIPT_DIR}/scripts/install-nvidia-driver.sh
|
||||
${SCRIPT_DIR}/scripts/install-docker.sh
|
||||
${SCRIPT_DIR}/scripts/init-directory.sh
|
|
@ -0,0 +1,65 @@
|
|||
FROM nvidia/cuda:12.1.1-devel-ubuntu22.04
|
||||
|
||||
SHELL ["/bin/bash", "-c"]
|
||||
|
||||
# Install dependencies
|
||||
RUN --mount=type=cache,target=/var/cache/apt \
|
||||
--mount=type=bind,source=docker/scripts/install-tools.sh,target=/tmp/install-tools.sh \
|
||||
bash /tmp/install-tools.sh
|
||||
RUN --mount=type=cache,target=/var/cache/apt \
|
||||
--mount=type=bind,source=docker/scripts/install-ros2.sh,target=/tmp/install-ros2.sh \
|
||||
bash /tmp/install-ros2.sh
|
||||
RUN --mount=type=cache,target=/var/cache/apt \
|
||||
--mount=type=bind,source=docker/scripts/install-clang.sh,target=/tmp/install-clang.sh \
|
||||
bash /tmp/install-clang.sh
|
||||
RUN --mount=type=cache,target=/root/.cache/pip \
|
||||
--mount=type=bind,source=docker/scripts/install-python-requirements.sh,target=/tmp/install-python-requirements.sh \
|
||||
bash /tmp/install-python-requirements.sh
|
||||
RUN --mount=type=cache,target=/var/cache/apt \
|
||||
--mount=type=bind,source=docker/scripts/install-3rdparty.sh,target=/tmp/install-3rdparty.sh \
|
||||
bash /tmp/install-3rdparty.sh
|
||||
|
||||
# Last installation layer as we update ROS dependencies often
|
||||
RUN --mount=type=cache,target=/var/cache/apt \
|
||||
--mount=type=bind,source=.,target=/tmp/ros_ws \
|
||||
/tmp/ros_ws/docker/scripts/install-rosdep.sh
|
||||
|
||||
# Clean cache
|
||||
RUN apt-get autoremove -y \
|
||||
&& apt-get clean \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Create a non-root user
|
||||
ARG USERNAME=dev
|
||||
ARG USER_UID=1000
|
||||
ARG USER_GID=$USER_UID
|
||||
RUN groupadd --gid $USER_GID $USERNAME \
|
||||
&& 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 \
|
||||
&& apt-get autoremove -y \
|
||||
&& apt-get clean \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Create a workspace directory
|
||||
RUN mkdir -p /workspace/go2-devcontainer/src/go2-devcontainer \
|
||||
&& cd /workspace/go2-devcontainer \
|
||||
&& chown -R $USERNAME:$USERNAME /workspace/go2-devcontainer/
|
||||
|
||||
RUN --mount=type=bind,source=docker/config/docker.bashrc,target=/tmp/docker.bashrc \
|
||||
cat /tmp/docker.bashrc >> /home/$USERNAME/.bashrc
|
||||
|
||||
# Clone unitree_ros2
|
||||
RUN --mount=type=cache,target=/var/cache/apt \
|
||||
--mount=type=bind,source=docker/scripts/install-unitree-ros2.sh,target=/tmp/install-unitree-ros2.sh \
|
||||
bash /tmp/install-unitree-ros2.sh
|
||||
|
||||
# NVIDIA-related environment variables
|
||||
ENV NVIDIA_VISIBLE_DEVICES \
|
||||
${NVIDIA_VISIBLE_DEVICES:-all}
|
||||
ENV NVIDIA_DRIVER_CAPABILITIES \
|
||||
${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics
|
||||
|
||||
USER $USERNAME
|
|
@ -0,0 +1,12 @@
|
|||
#!/bin/bash
|
||||
ARCH=$(uname -m)
|
||||
if [ "$ARCH" = "x86_64" ]; then
|
||||
DOCKERFILE_PATH="docker/Dockerfile.x86"
|
||||
elif [ "$ARCH" = "aarch64" ]; then
|
||||
DOCKERFILE_PATH="docker/Dockerfile.arm64"
|
||||
else
|
||||
echo "Unsupported architecture: $ARCH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
docker build --file $DOCKERFILE_PATH --tag go2py-container .
|
|
@ -0,0 +1,149 @@
|
|||
##############################################
|
||||
## Bash Script
|
||||
##############################################
|
||||
|
||||
PROMPT_COMMAND='history -a'
|
||||
HISTFILE=/home/dev/.bash_history
|
||||
LOG_WORKSPACE=/workspace/logging
|
||||
ROS_WORKSPACE=/workspace/go2-devcontainer
|
||||
|
||||
export CC=clang
|
||||
export CXX=clang++
|
||||
export MAKEFLAGS="-j 8"
|
||||
|
||||
export RCUTILS_COLORIZED_OUTPUT=1
|
||||
export ROS_LOG_DIR=/workspace/logging/logs
|
||||
export ROS_DATA_DIR=/workspace/logging/data
|
||||
export ROS_BAG_MAX_SIZE=1073741824
|
||||
export RCUTILS_CONSOLE_OUTPUT_FORMAT="[{severity}] [{time}] [{name}:{line_number}]: {message}"
|
||||
|
||||
# unitree_ros2
|
||||
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
export CYCLONEDDS_URI='<CycloneDDS><Domain><General><Interfaces>
|
||||
<NetworkInterface name="enp118s0" priority="default" multicast="default" />
|
||||
</Interfaces></General></Domain></CycloneDDS>'
|
||||
|
||||
# https://github.com/ament/ament_cmake/issues/382
|
||||
PYTHONWARNINGS="ignore:easy_install command is deprecated,ignore:setup.py install is deprecated"
|
||||
export PYTHONWARNINGS
|
||||
|
||||
echo '/workspace/logging/coredump/core.%e.%p.%h.%t' | sudo tee /proc/sys/kernel/core_pattern >/dev/null
|
||||
|
||||
_show_workspace_logging_usage() {
|
||||
# For each dir under logging workspace, show disk usages.
|
||||
echo "==================================================="
|
||||
echo "Disk usage for each directory under $LOG_WORKSPACE:"
|
||||
for dir in $(find $LOG_WORKSPACE -maxdepth 1 -mindepth 1 -type d); do
|
||||
du -sh $dir
|
||||
done
|
||||
echo "Make sure to clean up old logs to save disk space."
|
||||
echo "==================================================="
|
||||
}
|
||||
|
||||
_update_dependencies() {
|
||||
source /opt/ros/humble/setup.bash
|
||||
sudo apt-get update
|
||||
cd $ROS_WORKSPACE \
|
||||
&& rosdep update \
|
||||
&& rosdep install --from-paths src --ignore-src -y
|
||||
}
|
||||
|
||||
_ensure_not_in_workspace_src() {
|
||||
# If current dir ends with "src", prompt user to switch to workspace dir.
|
||||
# colcon build will stupidly build inside src folder.
|
||||
if [[ "$(basename "$(pwd)")" == "src" ]]; then
|
||||
echo "It looks like you're in a 'src' directory. Please switch to ${ROS_WORKSPACE}."
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
COMMON_CMAKE_ARGS="\
|
||||
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
|
||||
-GNinja \
|
||||
-DCMAKE_EXE_LINKER_FLAGS=-fuse-ld=lld \
|
||||
-DCMAKE_MODULE_LINKER_FLAGS=-fuse-ld=lld \
|
||||
-DCMAKE_SHARED_LINKER_FLAGS=-fuse-ld=lld
|
||||
"
|
||||
COMMON_COLCON_ARGS="--symlink-install --event-handlers console_cohesion+"
|
||||
RELEASE_CMAKE_ARGS="$COMMON_CMAKE_ARGS -DCMAKE_BUILD_TYPE=RelWithDebInfo"
|
||||
DEBUG_CMAKE_ARGS="$COMMON_CMAKE_ARGS -DCMAKE_BUILD_TYPE=Debug"
|
||||
|
||||
_colcon_release_build() {
|
||||
_ensure_not_in_workspace_src || return 1
|
||||
|
||||
# Run 'colcon build' with passed arguments
|
||||
colcon build \
|
||||
${COMMON_COLCON_ARGS} \
|
||||
--cmake-args $RELEASE_CMAKE_ARGS \
|
||||
"$@"
|
||||
}
|
||||
|
||||
_colcon_debug_build() {
|
||||
_ensure_not_in_workspace_src || return 1
|
||||
|
||||
# Run 'colcon build' with passed arguments
|
||||
colcon build \
|
||||
${COMMON_COLCON_ARGS} \
|
||||
--cmake-args $DEBUG_CMAKE_ARGS \
|
||||
"$@"
|
||||
}
|
||||
|
||||
_colcon_test() {
|
||||
_ensure_not_in_workspace_src || return 1
|
||||
|
||||
# Run 'colcon test' with passed arguments
|
||||
colcon test --event-handlers console_cohesion+ "$@"
|
||||
}
|
||||
|
||||
_remove_directories() {
|
||||
if [ -d "build" ]; then
|
||||
rm -r build
|
||||
fi
|
||||
if [ -d "install" ]; then
|
||||
rm -r install
|
||||
fi
|
||||
if [ -d "log" ]; then
|
||||
rm -r log
|
||||
fi
|
||||
}
|
||||
|
||||
colcon_clean() {
|
||||
_ensure_not_in_workspace_src || return 1
|
||||
|
||||
if [ -d "build" ] || [ -d "install" ] || [ -d "log" ]; then
|
||||
while true; do
|
||||
read -p "Do you wish to remove build, install, and log directories? [y/n] " yn
|
||||
case $yn in
|
||||
[Yy]* ) _remove_directories; break;;
|
||||
[Nn]* ) break;;
|
||||
* ) echo "Please answer yes or no.";;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
# Colcon build aliases
|
||||
alias update_dep=_update_dependencies
|
||||
alias source_ws='source install/setup.bash'
|
||||
alias colcon_build='_colcon_release_build'
|
||||
alias colcon_debug_build='_colcon_debug_build'
|
||||
alias colcon_build_package='_colcon_release_build --packages-select'
|
||||
alias colcon_debug_build_package='_colcon_debug_build --packages-select'
|
||||
alias colcon_build_up_to='_colcon_release_build --packages-up-to'
|
||||
alias colcon_debug_build_up_to='_colcon_debug_build --packages-up-to'
|
||||
alias colcon_test='_colcon_test'
|
||||
alias colcon_test_package='_colcon_test --packages-select'
|
||||
alias colcon_test_up_to='_colcon_test --packages-up-to'
|
||||
|
||||
source /opt/ros/humble/setup.bash
|
||||
# Source ROS workspace if it exists
|
||||
if [ -f "/workspace/go2-devcontainer/install/setup.bash" ]; then
|
||||
source /workspace/go2-devcontainer/install/setup.bash
|
||||
fi
|
||||
|
||||
# colcon_cd
|
||||
source /usr/share/colcon_cd/function/colcon_cd.sh
|
||||
export _colcon_cd_root=/opt/ros/humble/
|
||||
|
||||
_show_workspace_logging_usage
|
|
@ -0,0 +1,188 @@
|
|||
#!/bin/bash
|
||||
# Builds the Intel Realsense library librealsense on a Jetson Nano Development Kit
|
||||
# Copyright (c) 2016-21 Jetsonhacks
|
||||
# MIT License
|
||||
|
||||
LIBREALSENSE_DIRECTORY=${HOME}/librealsense
|
||||
INSTALL_DIR=$PWD
|
||||
NVCC_PATH=/usr/local/cuda/bin/nvcc
|
||||
|
||||
USE_CUDA=true
|
||||
|
||||
function usage ()
|
||||
{
|
||||
echo "Usage: ./build-librealsense.sh [-n | -no_cuda] [-v | -version <version>] [-j | --jobs <number of jobs>] [-h | --help] "
|
||||
echo "-n | --no_cuda Build with no CUDA (Defaults to with CUDA)"
|
||||
echo "-v | --version Version of librealsense to build
|
||||
(defaults to latest release)"
|
||||
echo "-j | --jobs Number of concurrent jobs (Default 1 on <= 4GB RAM
|
||||
#of cores-1 otherwise)"
|
||||
echo "-h | --help This message"
|
||||
exit 2
|
||||
}
|
||||
|
||||
PARSED_ARGUMENTS=$(getopt -a -n build-librealsense.sh -o nv:j:h --longoptions version:,no_cuda,jobs:,help -- "$@" )
|
||||
VALID_ARGUMENTS=$?
|
||||
|
||||
if [ "$VALID_ARGUMENTS" != "0" ]; then
|
||||
echo ""
|
||||
usage
|
||||
fi
|
||||
|
||||
eval set -- "$PARSED_ARGUMENTS"
|
||||
|
||||
LIBREALSENSE_VERSION=""
|
||||
USE_CUDA=true
|
||||
NUM_PROCS=""
|
||||
|
||||
while :
|
||||
do
|
||||
case "$1" in
|
||||
-n | --build_no_cuda) USE_CUDA=false ; shift ;;
|
||||
-v | --version ) LIBREALSENSE_VERSION="$2" ; shift 2 ;;
|
||||
-j | --jobs) NUM_PROCS="$2" ;
|
||||
shift 2 ;
|
||||
re_isanum='^[0-9]+$'
|
||||
if ! [[ $NUM_PROCS =~ $re_isanum ]] ; then
|
||||
echo "Number of jobs must be a positive, whole number"
|
||||
usage
|
||||
else
|
||||
if [ $NUM_PROCS -eq "0" ]; then
|
||||
echo "Number of jobs must be a positive, whole number"
|
||||
fi
|
||||
fi ;
|
||||
;;
|
||||
-h | --help ) usage ; shift ;;
|
||||
# -- means the end of arguments
|
||||
--) shift; break ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# From lukechilds gist discussion: https://gist.github.com/lukechilds/a83e1d7127b78fef38c2914c4ececc3c
|
||||
# We use wget instead of curl here
|
||||
# Sample usage:
|
||||
# VERSION_STRINGS=$(get_latest_release IntelRealSense/librealsense)
|
||||
|
||||
function get_latest_release () {
|
||||
# redirect wget to standard out and grep out the tag_name
|
||||
wget -qO- https://api.github.com/repos/$1/releases/latest |
|
||||
grep -Po '"tag_name": "\K.*?(?=")'
|
||||
}
|
||||
|
||||
if [[ $LIBREALSENSE_VERSION == "" ]] ; then
|
||||
echo "Getting latest librealsense version number"
|
||||
LIBREALSENSE_VERSION=$(get_latest_release IntelRealSense/librealsense)
|
||||
fi
|
||||
|
||||
echo "Build with CUDA: "$USE_CUDA
|
||||
echo "Librealsense Version: $LIBREALSENSE_VERSION"
|
||||
|
||||
red=`tput setaf 1`
|
||||
green=`tput setaf 2`
|
||||
reset=`tput sgr0`
|
||||
# e.g. echo "${red}The red tail hawk ${green}loves the green grass${reset}"
|
||||
|
||||
if [ ! -d "$LIBREALSENSE_DIRECTORY" ] ; then
|
||||
# clone librealsense
|
||||
cd ${HOME}
|
||||
echo "${green}Cloning librealsense${reset}"
|
||||
git clone https://github.com/IntelRealSense/librealsense.git
|
||||
fi
|
||||
|
||||
# Is the version of librealsense current enough?
|
||||
cd $LIBREALSENSE_DIRECTORY
|
||||
VERSION_TAG=$(git tag -l $LIBREALSENSE_VERSION)
|
||||
if [ ! $VERSION_TAG ] ; then
|
||||
echo ""
|
||||
tput setaf 1
|
||||
echo "==== librealsense Version Mismatch! ============="
|
||||
tput sgr0
|
||||
echo ""
|
||||
echo "The installed version of librealsense is not current enough for these scripts."
|
||||
echo "This script needs librealsense tag version: "$LIBREALSENSE_VERSION "but it is not available."
|
||||
echo "Please upgrade librealsense or remove the librealsense folder before attempting to install again."
|
||||
echo ""
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Checkout version the last tested version of librealsense
|
||||
git checkout $LIBREALSENSE_VERSION
|
||||
|
||||
# Install the dependencies
|
||||
cd $INSTALL_DIR
|
||||
|
||||
cd $LIBREALSENSE_DIRECTORY
|
||||
git checkout $LIBREALSENSE_VERSION
|
||||
|
||||
# Now compile librealsense and install
|
||||
mkdir build
|
||||
cd build
|
||||
# Build examples, including graphical ones
|
||||
echo "${green}Configuring Make system${reset}"
|
||||
# Build with CUDA (default), the CUDA flag is USE_CUDA, ie -DUSE_CUDA=true
|
||||
export CUDACXX=$NVCC_PATH
|
||||
export PATH=${PATH}:/usr/local/cuda/bin
|
||||
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda/lib64
|
||||
|
||||
/usr/bin/cmake ../ -DBUILD_EXAMPLES=true -DFORCE_RSUSB_BACKEND=true -DBUILD_WITH_CUDA="$USE_CUDA" -DCMAKE_BUILD_TYPE=release -DBUILD_PYTHON_BINDINGS=bool:true
|
||||
|
||||
# The library will be installed in /usr/local/lib, header files in /usr/local/include
|
||||
# The demos, tutorials and tests will located in /usr/local/bin.
|
||||
echo "${green}Building librealsense, headers, tools and demos${reset}"
|
||||
|
||||
# If user didn't set # of jobs and we have > 4GB memory then
|
||||
# set # of jobs to # of cores-1, otherwise 1
|
||||
if [[ $NUM_PROCS == "" ]] ; then
|
||||
TOTAL_MEMORY=$(free | awk '/Mem\:/ { print $2 }')
|
||||
if [ $TOTAL_MEMORY -gt 4051048 ] ; then
|
||||
NUM_CPU=$(nproc)
|
||||
NUM_PROCS=$(($NUM_CPU - 1))
|
||||
else
|
||||
NUM_PROCS=1
|
||||
fi
|
||||
fi
|
||||
|
||||
time make -j$NUM_PROCS
|
||||
if [ $? -eq 0 ] ; then
|
||||
echo "librealsense make successful"
|
||||
else
|
||||
# Try to make again; Sometimes there are issues with the build
|
||||
# because of lack of resources or concurrency issues
|
||||
echo "librealsense did not build " >&2
|
||||
echo "Retrying ... "
|
||||
# Single thread this time
|
||||
time make
|
||||
if [ $? -eq 0 ] ; then
|
||||
echo "librealsense make successful"
|
||||
else
|
||||
# Try to make again
|
||||
echo "librealsense did not successfully build" >&2
|
||||
echo "Please fix issues and retry build"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
echo "${green}Installing librealsense, headers, tools and demos${reset}"
|
||||
sudo make install
|
||||
|
||||
if grep -Fxq 'export PYTHONPATH=$PYTHONPATH:/usr/local/lib' ~/.bashrc ; then
|
||||
echo "PYTHONPATH already exists in .bashrc file"
|
||||
else
|
||||
echo 'export PYTHONPATH=$PYTHONPATH:/usr/local/lib' >> ~/.bashrc
|
||||
echo "PYTHONPATH added to ~/.bashrc. Pyhon wrapper is now available for importing pyrealsense2"
|
||||
fi
|
||||
|
||||
cd $LIBREALSENSE_DIRECTORY
|
||||
echo "${green}Applying udev rules${reset}"
|
||||
# Copy over the udev rules so that camera can be run from user space
|
||||
sudo cp config/99-realsense-libusb.rules /etc/udev/rules.d/
|
||||
sudo udevadm control --reload-rules && udevadm trigger
|
||||
|
||||
echo "${green}Library Installed${reset}"
|
||||
echo " "
|
||||
echo " -----------------------------------------"
|
||||
echo "The library is installed in /usr/local/lib"
|
||||
echo "The header files are in /usr/local/include"
|
||||
echo "The demos and tools are located in /usr/local/bin"
|
||||
echo " "
|
||||
echo " -----------------------------------------"
|
||||
echo " "
|
|
@ -0,0 +1,79 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
#
|
||||
# NVIDIA CORPORATION and its licensors retain all intellectual property
|
||||
# and proprietary rights in and to this software, related documentation
|
||||
# and any modifications thereto. Any use, reproduction, disclosure or
|
||||
# distribution of this software and related documentation without an express
|
||||
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
||||
|
||||
|
||||
# This script is triggered when a corresponding udev rule is matched with action
|
||||
function usage() {
|
||||
echo "Usage: hotplug-realsense.sh -a <action=add/remove> -d <dev_path> [options]"
|
||||
echo "-a | --action Action determines whether the device has been added or removed. Valid values are 'add' or 'remove'."
|
||||
echo "-d | --dev-path Device path that will be used to mount the device."
|
||||
echo "-M | --major-version The kernel major number for the device. This will be used when action=add."
|
||||
echo "-m | --minor-version The kernel minor number for the device. This will be used when action=add."
|
||||
echo "-p | --parent-path Parent node path of the device pointed by the -d flag."
|
||||
echo "-h | --help Display this message."
|
||||
}
|
||||
|
||||
function check_mandatory_param() {
|
||||
VAR=$1
|
||||
MSG=$2
|
||||
if [[ -z ${VAR} ]] ; then
|
||||
echo "${MSG}"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
function timestamp() {
|
||||
echo [$EPOCHREALTIME] [$(date)]
|
||||
}
|
||||
|
||||
ARGUMENTS=$(getopt -n hotplug-realsense.sh -o a:d:M:m:p:h -l action:,dev-path:,major-version:,minor-version:,parent-path:,help -- "$@" )
|
||||
|
||||
if [[ $? -ne 0 ]]; then
|
||||
usage
|
||||
fi
|
||||
|
||||
eval set -- "$ARGUMENTS"
|
||||
|
||||
while [ : ]; do
|
||||
case "$1" in
|
||||
-a | --action)
|
||||
ACTION=$2 ; shift 2 ;;
|
||||
-d | --dev-path)
|
||||
DEV_PATH=$2 ; shift 2 ;;
|
||||
-M | --major-version)
|
||||
MAJOR_VERSION=$2 ; shift 2 ;;
|
||||
-m | --minor-version)
|
||||
MINOR_VERSION=$2 ; shift 2 ;;
|
||||
-p | --parent-path)
|
||||
PARENT_PATH=/dev/$2 ; shift 2 ;;
|
||||
-h | --help)
|
||||
usage ; shift ;;
|
||||
--) shift; break ;;
|
||||
esac
|
||||
done
|
||||
|
||||
check_mandatory_param ${ACTION:-""} "Please provide valid value for action"
|
||||
check_mandatory_param ${DEV_PATH:-""} "Please provide valid value for device path"
|
||||
|
||||
if [[ "${ACTION}" == "add" ]]; then
|
||||
check_mandatory_param ${MAJOR_VERSION:-""} "Please provide valid value for major number"
|
||||
check_mandatory_param ${MINOR_VERSION:-""} "Please provide valid value for minor number"
|
||||
sudo mknod -m a=rw ${DEV_PATH} c ${MAJOR_VERSION} ${MINOR_VERSION}
|
||||
sudo chown root:plugdev ${DEV_PATH}
|
||||
echo $(timestamp) "Added ${DEV_PATH} with major version: ${MAJOR_VERSION} and minor version: ${MINOR_VERSION} to docker" >> /tmp/docker_usb.log
|
||||
elif [[ "$ACTION" == "remove" ]]; then
|
||||
sudo rm ${DEV_PATH} ${PARENT_PATH}
|
||||
echo $(timestamp) "Removed ${DEV_PATH} ${PARENT_PATH} from docker" >> /tmp/docker_usb.log
|
||||
else
|
||||
echo "Cannot recognize action=${ACTION}"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
|
@ -0,0 +1,74 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# Install thirdparty libraries that CANNOT be installed using rosdep
|
||||
# Perfer to use rosdep to install thirdparty libraries if possible
|
||||
|
||||
mkdir -p /workspace/thirdparty
|
||||
cd /workspace/thirdparty
|
||||
|
||||
export CC=clang
|
||||
export CXX=clang++
|
||||
apt-get update
|
||||
|
||||
# ============================================
|
||||
# Install magic_enum v0.9.5
|
||||
# For some reason, ros-humble-magic-enum doesn't work
|
||||
cd /workspace/thirdparty
|
||||
git clone https://github.com/Neargye/magic_enum.git
|
||||
cd magic_enum && git checkout v0.9.5
|
||||
mkdir build && cd build
|
||||
cmake \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DMAGIC_ENUM_OPT_BUILD_TESTS=OFF \
|
||||
-DMAGIC_ENUM_OPT_BUILD_EXAMPLES=OFF \
|
||||
..
|
||||
make -j$(nproc)
|
||||
make install
|
||||
cd /workspace/thirdparty && rm -rf magic_enum
|
||||
|
||||
# ============================================
|
||||
# Install Open3D v.0.18.0
|
||||
# The libopen3d-dev package is too old (0.14.0).
|
||||
# cd /workspace/thirdparty
|
||||
# git clone https://github.com/isl-org/Open3D.git
|
||||
# cd Open3D && git checkout v0.18.0
|
||||
# apt-get install -y libc++-dev libc++abi-dev
|
||||
# mkdir build && cd build
|
||||
# cmake \
|
||||
# -DCMAKE_BUILD_TYPE=Release \
|
||||
# -DBUILD_SHARED_LIBS=ON \
|
||||
# -DBUILD_EXAMPLES=OFF \
|
||||
# -DBUILD_PYTHON_MODULE=OFF \
|
||||
# ..
|
||||
# make -j$(nproc)
|
||||
# make install
|
||||
# cd /workspace/thirdparty && rm -rf Open3D
|
||||
|
||||
|
||||
# ============================================
|
||||
# Install google-glog v.0.7.0
|
||||
# Some packages depend on it and we can't use libgoogle-glog-dev due to
|
||||
# https://github.com/isl-org/Open3D/discussions/6515
|
||||
cd /workspace/thirdparty
|
||||
git clone https://github.com/google/glog.git
|
||||
cd glog && git checkout v0.7.0
|
||||
cmake -S . -B build -G "Unix Makefiles"
|
||||
cmake --build build
|
||||
cmake --build build --target install
|
||||
cd /workspace/thirdparty && rm -rf glog
|
||||
|
||||
# ============================================
|
||||
# Install librealsense2
|
||||
apt-get install -y --no-install-recommends \
|
||||
ros-humble-librealsense2* \
|
||||
ros-humble-realsense2-*
|
||||
|
||||
# ============================================
|
||||
# Install unitree_sdk2
|
||||
cd /workspace/thirdparty
|
||||
git clone https://github.com/unitreerobotics/unitree_sdk2.git
|
||||
cd unitree_sdk2
|
||||
./install.sh
|
||||
cd /workspace/thirdparty && rm -rf unitree_sdk2
|
|
@ -0,0 +1,23 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# Install LLVM family: compiler, formatter, debugger, etc
|
||||
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends \
|
||||
clangd-15 \
|
||||
clang-15 \
|
||||
clang-format-15 \
|
||||
lld-15 \
|
||||
lldb-15
|
||||
update-alternatives --install /usr/bin/clang clang /usr/bin/clang-15 100
|
||||
update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-15 100
|
||||
update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-15 100
|
||||
update-alternatives --install /usr/bin/clang-format clang-format /usr/bin/clang-format-15 100
|
||||
update-alternatives --install /usr/bin/lld lld /usr/bin/lld-15 100
|
||||
update-alternatives --install /usr/bin/lldb lldb /usr/bin/lldb-15 100
|
||||
update-alternatives --install /usr/bin/lldb-server lldb-server /usr/bin/lldb-server-15 100
|
||||
|
||||
# Fix https://github.com/llvm/llvm-project/issues/55575
|
||||
ln -s /usr/lib/llvm-15/lib/python3.10/dist-packages/lldb/* /usr/lib/python3/dist-packages/lldb/
|
|
@ -0,0 +1,12 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
pip install \
|
||||
"torch==2.2.1" \
|
||||
"torchvision==0.17.1" \
|
||||
"numpy>=1.26.4" \
|
||||
"pybullet>=3.2.6" \
|
||||
"proxsuite==0.6.3" \
|
||||
"ipykernel==6.29.3" \
|
||||
"open3d==0.18.0"
|
|
@ -0,0 +1,24 @@
|
|||
#!/bin/bash
|
||||
# install-realsense-dependencies.sh
|
||||
# Install dependencies for the Intel Realsense library librealsense2 on a Jetson Nano Developer Kit
|
||||
# Copyright (c) 2016-19 Jetsonhacks
|
||||
# MIT License
|
||||
|
||||
red=`tput setaf 1`
|
||||
green=`tput setaf 2`
|
||||
reset=`tput sgr0`
|
||||
# e.g. echo "${red}red text ${green}green text${reset}"
|
||||
echo "${green}Adding Universe repository and updating${reset}"
|
||||
apt-add-repository universe
|
||||
apt-get update
|
||||
echo "${green}Adding dependencies, graphics libraries and tools${reset}"
|
||||
apt-get install libssl-dev libusb-1.0-0-dev pkg-config -y
|
||||
|
||||
# Graphics libraries - for SDK's OpenGL-enabled examples
|
||||
apt-get install libgtk-3-dev libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev -y
|
||||
|
||||
# QtCreator for development; not required for librealsense core library
|
||||
apt-get install qtcreator -y
|
||||
|
||||
# Add Python 3 support
|
||||
apt-get install -y python3 python3-dev
|
|
@ -0,0 +1,32 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
apt-get update && apt-get install -y locales
|
||||
locale-gen en_US en_US.UTF-8
|
||||
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
|
||||
export LANG=en_US.UTF-8
|
||||
|
||||
curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
|
||||
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu jammy main" | tee /etc/apt/sources.list.d/ros2.list > /dev/null
|
||||
|
||||
apt-get update && apt-get install -y --no-install-recommends \
|
||||
ros-humble-desktop \
|
||||
ros-dev-tools \
|
||||
python3-colcon-common-extensions \
|
||||
python3-flake8-docstrings \
|
||||
python3-pip \
|
||||
python3-pytest-cov \
|
||||
ros-dev-tools \
|
||||
python3-flake8-blind-except \
|
||||
python3-flake8-builtins \
|
||||
python3-flake8-class-newline \
|
||||
python3-flake8-comprehensions \
|
||||
python3-flake8-deprecated \
|
||||
python3-flake8-import-order \
|
||||
python3-flake8-quotes \
|
||||
python3-pytest-repeat \
|
||||
python3-pytest-rerunfailures \
|
||||
ros-humble-rmw-cyclonedds-cpp \
|
||||
ros-humble-rosidl-generator-dds-idl
|
|
@ -0,0 +1,10 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# Make sure workspace is mounted in /tmp/ros_ws
|
||||
source /opt/ros/humble/setup.bash
|
||||
apt-get update
|
||||
rosdep init
|
||||
rosdep update
|
||||
rosdep install --from-paths /tmp/ros_ws --ignore-src -y
|
|
@ -0,0 +1,23 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# Install tools, utilities, and etc.
|
||||
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends \
|
||||
curl \
|
||||
git-lfs \
|
||||
ninja-build \
|
||||
psmisc \
|
||||
python3-pip \
|
||||
software-properties-common \
|
||||
unzip \
|
||||
usbutils \
|
||||
vim \
|
||||
wget \
|
||||
net-tools \
|
||||
iputils-ping
|
||||
|
||||
pip3 install \
|
||||
cmakelang==0.6.13
|
|
@ -0,0 +1,16 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# clone unitree_ros2
|
||||
cd /workspace/go2-devcontainer/src
|
||||
git clone https://github.com/unitreerobotics/unitree_ros2
|
||||
|
||||
# clone cyclonedds related packaged
|
||||
cd /workspace/go2-devcontainer/src/unitree_ros2/cyclonedds_ws/src
|
||||
git clone https://github.com/ros2/rmw_cyclonedds -b humble
|
||||
git clone https://github.com/eclipse-cyclonedds/cyclonedds -b releases/0.10.x
|
||||
|
||||
# build cyclonedds
|
||||
cd /workspace/go2-devcontainer/src/unitree_ros2/cyclonedds_ws
|
||||
colcon build --packages-select cyclonedds
|
|
@ -0,0 +1,21 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved.
|
||||
#
|
||||
# NVIDIA CORPORATION and its licensors retain all intellectual property
|
||||
# and proprietary rights in and to this software, related documentation
|
||||
# and any modifications thereto. Any use, reproduction, disclosure or
|
||||
# distribution of this software and related documentation without an express
|
||||
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
||||
|
||||
# Build ROS dependency
|
||||
echo "source /opt/ros/${ROS_DISTRO}/setup.bash" >> ~/.bashrc
|
||||
source /opt/ros/${ROS_DISTRO}/setup.bash
|
||||
|
||||
sudo apt-get update
|
||||
rosdep update
|
||||
|
||||
# Restart udev daemon
|
||||
sudo service udev restart
|
||||
|
||||
$@
|
Binary file not shown.
|
@ -0,0 +1,11 @@
|
|||
##Version=0.1##
|
||||
# Device rules for Intel RealSense devices (D435 D435i D455)
|
||||
# For D435
|
||||
ACTION=="add" SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b07", MODE:="0666", GROUP:="plugdev", RUN+="/opt/realsense/hotplug-realsense.sh -a add -d '%N' -M '%M' -m '%m'"
|
||||
ACTION=="remove" SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b07", MODE:="0666", GROUP:="plugdev", RUN+="/opt/realsense/hotplug-realsense.sh -a remove -d '%N' -p '%P'"
|
||||
# For D435i
|
||||
ACTION=="add" SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b3a", MODE:="0666", GROUP:="plugdev", RUN+="/opt/realsense/hotplug-realsense.sh -a add -d '%N' -M '%M' -m '%m'"
|
||||
ACTION=="remove" SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b3a", MODE:="0666", GROUP:="plugdev", RUN+="/opt/realsense/hotplug-realsense.sh -a remove -d '%N' -p '%P'"
|
||||
# For D455
|
||||
ACTION=="add" SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b5c", MODE:="0666", GROUP:="plugdev", RUN+="/opt/realsense/hotplug-realsense.sh -a add -d '%N' -M '%M' -m '%m'"
|
||||
ACTION=="remove" SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b5c", MODE:="0666", GROUP:="plugdev", RUN+="/opt/realsense/hotplug-realsense.sh -a remove -d '%N' -p '%P'"
|
Loading…
Reference in New Issue