From 174ec3ed638bbeab8a6378a7425fb238978d054b Mon Sep 17 00:00:00 2001
From: Andres Montano <andres.montano@tecnalia.com>
Date: Mon, 7 Oct 2024 18:03:02 +0200
Subject: [PATCH] Kinova twist controller

---
 dockerfiles/devenv.Dockerfile                 | 112 +++++++++---------
 .../humble_requirements.txt                   |  18 +++
 .../melodic_requirements.txt                  |   0
 .../noetic_requirements.txt                   |  10 +-
 dockerfiles/extra_libs/common_libs.txt        |   2 +-
 .../scripts/generate_package_list.bash        |  33 ++++++
 .../ws_dependencies/humble_requirements.txt   |  57 ---------
 dockerfiles/ws_dependencies/mairon_humble.txt |  90 ++++++++++++++
 .../ws_dependencies/neurondones_humble.txt    |  45 +++++++
 .../noetic_configuration_scripts.txt          |   0
 others/trash                                  |  56 +++++++++
 11 files changed, 308 insertions(+), 115 deletions(-)
 create mode 100644 dockerfiles/distro_dependencies/humble_requirements.txt
 rename dockerfiles/{ws_dependencies => distro_dependencies}/melodic_requirements.txt (100%)
 rename dockerfiles/{ws_dependencies => distro_dependencies}/noetic_requirements.txt (89%)
 create mode 100644 dockerfiles/scripts/generate_package_list.bash
 delete mode 100644 dockerfiles/ws_dependencies/humble_requirements.txt
 create mode 100644 dockerfiles/ws_dependencies/mairon_humble.txt
 create mode 100644 dockerfiles/ws_dependencies/neurondones_humble.txt
 rename {dockerfiles/ws_dependencies => others}/noetic_configuration_scripts.txt (100%)
 create mode 100644 others/trash

diff --git a/dockerfiles/devenv.Dockerfile b/dockerfiles/devenv.Dockerfile
index d957e00..ecc2a31 100644
--- a/dockerfiles/devenv.Dockerfile
+++ b/dockerfiles/devenv.Dockerfile
@@ -22,7 +22,7 @@ ENV LANG en_US.UTF-8
 ENV LANGUAGE en_US:en
 ENV LC_ALL en_US.UTF-8
 
-# Configure apt and install ubuntu-base packages
+# Configure apt and install base packages
 RUN apt-get update && \
     apt-get -y install --no-install-recommends \
     apt-transport-https \
@@ -35,44 +35,31 @@ RUN apt-get update && \
     checkinstall \
     # clang
     clang-format clang-tidy clang-tools clang \
-    libc++-dev libc++1 libc++abi-dev \
-    libc++abi1 libclang-dev libclang1  \
-    libomp-dev libomp5 lld lldb \
-    llvm-dev llvm-runtime llvm \
     # ccmake
     cmake-curses-gui \
-    direnv \
     gawk \
     gdb \
+    git-core \
     git \
     git-lfs \
     less \
     nano \
     net-tools \
     openssh-client \
+    python3-pip \
     trash-cli \
+    iputils-ping \
     valgrind \
     wget \
     xterm
 
-# Install pip3 and packages
-RUN apt-get install -y \
-    python3-pip
-
-RUN if [ "$ROS_DISTRO" = "noetic" ]; \
-    then \
-        conan config set general.revisions_enabled=1 \
-        && conan profile new default --detect > /dev/null \
-        && conan profile update settings.compiler=gcc default; \
-    fi
-
 # Install zsh if requested
 RUN if [ "$EXT_SHELL" = "zsh" ]; \
     then \
-        apt-get -y install zsh; \
+    apt-get -y install zsh; \
     fi
 
-# Configure system to look for debian packages in the Artifactory repository
+# Configure system to look for debian packages in the Tecnalia's artifactory repository
 COPY auth.conf /etc/apt/auth.conf.d/tecnalia.conf
 RUN curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | apt-key add -
 
@@ -80,32 +67,43 @@ RUN curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | apt
 RUN sh -c "echo 'yaml https://git.code.tecnalia.com/tecnalia_robotics-public/gitlab_templates/raw/master/rosdistro/rosdep_tecnalia.yaml' \
     >> /etc/ros/rosdep/sources.list.d/20-default.list"
 
-# Install docker-ce
-# RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
-# RUN add-apt-repository \
-#     "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
-# RUN apt-get update && apt-get -y install \
-#     docker-ce \
-#     docker-ce-cli \
-#     containerd.io \
-#     docker-compose-plugin
+# Create a virtual environment
+# RUN apt-get install -y python3-venv
+# ENV VIRTUAL_ENV=/opt/venv
+# RUN python3 -m venv $VIRTUAL_ENV
+# ENV PATH="$VIRTUAL_ENV/bin:$PATH"
 
 # Copy the requirements.txt file into the container
 WORKDIR /tmp/dependencies/
-COPY /ws_dependencies/* ./
+COPY /distro_dependencies/* ./
 
 # Install the packages listed in ${ROS_DISTRO}_requirements.txt
 RUN if [ -f "${ROS_DISTRO}_requirements.txt" ]; \
     then \
-        apt-get update && \
-        awk '/^# APT-GET PACKAGES/,/^# PIP PACKAGES/' ${ROS_DISTRO}_requirements.txt | grep -v '^#' | xargs apt-get install -y && \
-        apt-get clean; \
+    apt-get update && \
+    # Install apt-get packages
+    awk '/^# APT-GET PACKAGES/,/^# PIP PACKAGES/' ${ROS_DISTRO}_requirements.txt | grep -v '^#' | xargs apt-get install -y && \
+    # Install pip packages
+    awk '/^# PIP PACKAGES/,0' ${ROS_DISTRO}_requirements.txt | grep -v '^#' | xargs -r -n1 pip install ;\
+    apt-get clean; \
     fi
 
-# Install pip packages
-RUN if [ -f "${ROS_DISTRO}_requirements.txt" ]; \
+RUN rm -rf *
+
+# Install extra packages ws_dependencies
+ARG PACKAGES=none
+COPY /ws_dependencies/* ./
+RUN if [ "$PACKAGES" != "none" ]; \
     then \
-        awk '/^# PIP PACKAGES/,0' ${ROS_DISTRO}_requirements.txt | grep -v '^#' | xargs -r -n1 pip install ;\
+    if [ -f "${PACKAGES}.txt" ]; \
+    then \
+    # Install apt-get packages
+    apt-get update && \
+    awk '/^# APT-GET PACKAGES/,/^# PIP PACKAGES/' ${PACKAGES}.txt | grep -v '^#' | xargs apt-get install -y && \
+    # Install pip packages
+    awk '/^# PIP PACKAGES/,0' ${PACKAGES}.txt | grep -v '^#' | xargs -r -n1 pip install ;\
+    apt-get clean; \
+    fi \
     fi
 
 RUN rm -rf *
@@ -117,33 +115,31 @@ COPY /extra_libs/* ./
 # Enviroment tools based on ubuntu version
 RUN if [ -f "common_libs.txt" ]; \
     then \
-        grep -v '^#' common_libs.txt | xargs wget \
-        && dpkg -i *.deb; \
+    grep -v '^#' common_libs.txt | xargs wget \
+    && dpkg -i *.deb; \
     fi
 
-# Workaround for Azure Kinect
-RUN if [ "$ROS_DISTRO" = "noetic" ]; \
-    then \
-        echo 'libk4a1.4 libk4a1.4/accepted-eula-hash string 0f5d5c5de396e4fee4c0753a21fee0c1ed726cf0316204edda484f08cb266d76' | debconf-set-selections \
-        && echo 'libk4abt1.0	libk4abt1.0/accepted-eula-hash	string	03a13b63730639eeb6626d24fd45cf25131ee8e8e0df3f1b63f552269b176e38' | debconf-set-selections \
-        && wget https://raw.githubusercontent.com/microsoft/Azure-Kinect-Sensor-SDK/develop/scripts/99-k4a.rules \
-        && mkdir -p udev/rules.d \
-        && mv 99-k4a.rules udev/rules.d/ \
-        && cp --parents udev/rules.d/99-k4a.rules /etc; \
-    fi
+RUN rm -rf *
+
+RUN apt-get --reinstall install -y libnotify-bin notify-osd
 
-# Extra libs, e.g. vtk-7.1_20221201-1_amd64.deb
-RUN if [ -f "${ROS_DISTRO}_libs.txt" ]; \
+ARG PEAK_DRIVER=install
+RUN if [ "$PEAK_DRIVER" = "install" ]; \
     then \
-        grep -v '^#' ${ROS_DISTRO}_libs.txt | xargs wget \
-        && dpkg -i *.deb;\
+    apt-get update && apt-get install -y udev libpopt-dev linux-headers-$(uname -r) \
+    && wget https://www.peak-system.com/fileadmin/media/linux/files/peak-linux-driver-8.18.0.tar.gz \
+    && wget https://www.peak-system.com/quick/BasicLinux -O PCAN-Basic_Linux.tar.gz \
+    && tar -xvf peak-linux-driver-8.18.0.tar.gz \
+    && cd peak-linux-driver-8.18.0 \
+    && make clean && make install || echo 'make failed but move forward'\
+    && cd .. \
+    && tar -xvf PCAN-Basic_Linux.tar.gz \
+    && cd PCAN-Basic_Linux-4.8.0.5/libpcanbasic \
+    && make clean && make install || echo 'make failed but move forward';\
     fi
 
-RUN rm -rf *
-RUN apt-get --reinstall install -y libnotify-bin notify-osd
-
 # Update this date to re-run the image final update
-LABEL image.date=05-03-2024
+LABEL image.date=26-08-2024
 
 # Update final image
 RUN apt-get update \
@@ -163,8 +159,12 @@ ENV RUNNING_IN_DOCKER true
 # Switch back to dialog for any ad-hoc use of apt-get
 ENV DEBIAN_FRONTEND=
 
+# Enable localhost only ROS2
+ENV ROS_LOCALHOST_ONLY=1
+ENV RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
+
 ARG SHELL
-ENV SHELL "${SHELL}"
+ENV SHELL="${SHELL}"
 
 ENTRYPOINT ["/ros_entrypoint.sh"]
 CMD $EXT_SHELL
diff --git a/dockerfiles/distro_dependencies/humble_requirements.txt b/dockerfiles/distro_dependencies/humble_requirements.txt
new file mode 100644
index 0000000..a0769fa
--- /dev/null
+++ b/dockerfiles/distro_dependencies/humble_requirements.txt
@@ -0,0 +1,18 @@
+# APT-GET PACKAGES
+# Base
+python3-colcon-common-extensions
+python3-vcstool
+python3-pip
+python3-venv
+# ROS tools
+ros-humble-rqt-controller-manager
+ros-humble-rqt-joint-trajectory-controller
+python3-bloom
+python3-rosdep
+fakeroot
+debhelper
+dh-python
+# PIP PACKAGES
+wheel
+Cython
+# EOF
diff --git a/dockerfiles/ws_dependencies/melodic_requirements.txt b/dockerfiles/distro_dependencies/melodic_requirements.txt
similarity index 100%
rename from dockerfiles/ws_dependencies/melodic_requirements.txt
rename to dockerfiles/distro_dependencies/melodic_requirements.txt
diff --git a/dockerfiles/ws_dependencies/noetic_requirements.txt b/dockerfiles/distro_dependencies/noetic_requirements.txt
similarity index 89%
rename from dockerfiles/ws_dependencies/noetic_requirements.txt
rename to dockerfiles/distro_dependencies/noetic_requirements.txt
index cb8def3..4ca7a64 100644
--- a/dockerfiles/ws_dependencies/noetic_requirements.txt
+++ b/dockerfiles/distro_dependencies/noetic_requirements.txt
@@ -64,12 +64,20 @@ lcov
 iwyu
 cppcheck
 ros-noetic-rviz-visual-tools
+libignition-math-dev
 # ros control boilerplate
 libgflags-dev
 libsoundio1
 ros-noetic-aruco-ros
+# SPOT
+ros-noetic-twist-mux
+ros-noetic-interactive-marker-twist-server
+ros-noetic-teleop-twist-joy
+ros-noetic-velodyne-pointcloud
+ros-noetic-rgbd-launch
+ros-noetic-velodyne-description
 # PIP PACKAGES
 sqlite_utils
 transform3d
 conan==1.59
-# EOF
\ No newline at end of file
+# EOF
diff --git a/dockerfiles/extra_libs/common_libs.txt b/dockerfiles/extra_libs/common_libs.txt
index 966b911..e3ce168 100644
--- a/dockerfiles/extra_libs/common_libs.txt
+++ b/dockerfiles/extra_libs/common_libs.txt
@@ -2,6 +2,6 @@
 # bat-musl
 https://github.com/sharkdp/bat/releases/download/v0.24.0/bat-musl_0.24.0_amd64.deb
 # lsd-musl
-https://github.com/lsd-rs/lsd/releases/download/v1.0.0/lsd-musl_1.0.0_amd64.deb
+https://github.com/lsd-rs/lsd/releases/download/v1.1.2/lsd-musl_1.1.2_amd64.deb
 # ripgrep
 https://github.com/BurntSushi/ripgrep/releases/download/14.1.0/ripgrep_14.1.0-1_amd64.deb
\ No newline at end of file
diff --git a/dockerfiles/scripts/generate_package_list.bash b/dockerfiles/scripts/generate_package_list.bash
new file mode 100644
index 0000000..06d6f0a
--- /dev/null
+++ b/dockerfiles/scripts/generate_package_list.bash
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+# This script assumes it is being run in a flexbotics-base-devel container, and that
+# a volume is shared in /root/src with a .rosinstall.fat_image file available
+
+# cd $(find . -type d -name flexbotics-fat-devel) && docker run -it -v $(pwd):/root/src/$(basename $(pwd)) tecnalia-robotics-docker.artifact.tecnalia.com/flexbotics-base-devel:kinetic bash -c "$(cat generate_package_list.bash)"
+
+if [ -z "${ROS_DISTRO}" ]; then
+    echo "ROS_DISTRO not defined, fallback to detect installed ROS version"
+    if ! rosversion -d; then
+        echo "rosversion not available"
+        ROS_DISTRO=$(find /opt/ros/ -mindepth 1 -maxdepth 1 -type d -exec basename {} \;)
+    else
+        if ! [[ $(rosversion -d) = *unknown* ]]; then
+            ROS_DISTRO=$(rosversion -d)
+        else
+            echo "rosversion reports unknown"
+            ROS_DISTRO=$(find /opt/ros/ -mindepth 1 -maxdepth 1 -type d -exec basename {} \;)
+        fi
+    fi
+fi
+
+if [ -z "${ROS_DISTRO}" ]; then
+    echo "ROS could not be detected"
+    exit 1
+fi
+
+mkdir -p /root/ws/src
+cd /root/ws || exit
+ln -sf /root/src/* src
+apt-get update
+rosdep update
+rosdep install --from-paths src --ignore-src --rosdistro "${ROS_DISTRO}" -r -y -s | grep 'apt-get install\|pip install' > /root/src/flexbotics-fat-devel/updated_bulk_install.sh
diff --git a/dockerfiles/ws_dependencies/humble_requirements.txt b/dockerfiles/ws_dependencies/humble_requirements.txt
deleted file mode 100644
index 18d4456..0000000
--- a/dockerfiles/ws_dependencies/humble_requirements.txt
+++ /dev/null
@@ -1,57 +0,0 @@
-# APT-GET PACKAGES
-# Base
-python3-colcon-common-extensions
-# Nav2 fix
-libunwind-dev
-# Mairon
-ros-humble-aws-robomaker-small-warehouse-world
-ros-humble-joint-state-publisher
-ros-humble-gazebo-ros
-ros-humble-ur-description
-ros-humble-moveit-kinematics
-ros-humble-moveit-planners-ompl
-ros-humble-moveit-ros-move-group
-ros-humble-moveit-ros-visualization
-ros-humble-moveit-servo
-ros-humble-moveit-simple-controller-manager
-ros-humble-warehouse-ros-sqlite
-ros-humble-controller-interface
-ros-humble-joint-trajectory-controller
-ros-humble-realtime-tools
-ros-humble-ur-msgs
-ros-humble-ur-client-library
-ros-humble-controller-manager
-ros-humble-force-torque-sensor-broadcaster
-ros-humble-joint-state-broadcaster
-ros-humble-position-controllers
-ros-humble-ros2-controllers-test-nodes
-ros-humble-velocity-controllers
-ros-humble-rclpy-message-converter
-python3-websocket
-ros-humble-twist-stamper
-gazebo
-ros-humble-gazebo-ros-pkgs
-ros-humble-robot-localization
-docker.io
-ros-humble-controller-manager-msgs
-ros-humble-hardware-interface
-socat
-ros-humble-moveit-planners
-ros-humble-joint-state-publisher-gui
-ros-humble-moveit-configs-utils
-ros-humble-moveit-ros-warehouse
-ros-humble-moveit-setup-assistant
-ros-humble-navigation2
-ros-humble-slam-toolbox
-ros-humble-moveit-core
-ros-humble-gazebo-ros2-control
-ros-humble-tf-transformations
-ros-humble-rosbridge-server
-ros-humble-rosbridge-suite
-python3-tk
-ros-humble-ur-moveit-config
-ros-humble-ur-robot-driver
-# PIP PACKAGES
-sqlite_utils
-transform3d
-# EOF
diff --git a/dockerfiles/ws_dependencies/mairon_humble.txt b/dockerfiles/ws_dependencies/mairon_humble.txt
new file mode 100644
index 0000000..44f91f5
--- /dev/null
+++ b/dockerfiles/ws_dependencies/mairon_humble.txt
@@ -0,0 +1,90 @@
+# Generated by 'rosdep install --reinstall --simulate --from-path src --ignore-src' command
+# APT-GET PACKAGES
+cython3
+gazebo
+graphviz
+libeigen3-dev
+libgtk-3-dev
+liblapack-dev
+libpyside2-dev
+libshiboken2-dev
+pyqt5-dev
+python3-argcomplete
+python3-gi
+python3-gi-cairo
+python3-importlib-metadata
+python3-lxml
+python3-mock
+python3-netifaces
+python3-nose
+python3-numpy
+python3-opencv
+python3-packaging
+python3-pkg-resources
+python3-pykdl
+python3-pyqt5
+python3-pyqt5.qtsvg
+python3-pyside2.qtsvg
+python3-pytest
+python3-rospkg
+python3-rospkg-modules
+python3-sip-dev
+python3-sklearn
+python3-transforms3d
+python3-websocket
+python3-wxgtk4.0
+python3-yaml
+ros-humble-ament-cmake-nose
+ros-humble-control-msgs
+ros-humble-controller-manager
+ros-humble-gazebo-dev
+ros-humble-gazebo-msgs
+ros-humble-gazebo-plugins
+ros-humble-gazebo-ros
+ros-humble-gazebo-ros-pkgs
+ros-humble-gazebo-ros2-control
+ros-humble-joint-state-broadcaster
+ros-humble-joint-state-publisher
+ros-humble-joint-state-publisher-gui
+ros-humble-joint-trajectory-controller
+ros-humble-librealsense2
+ros-humble-moveit
+ros-humble-moveit-configs-utils
+ros-humble-moveit-core
+ros-humble-moveit-kinematics
+ros-humble-moveit-msgs
+ros-humble-moveit-planners
+ros-humble-moveit-planners-chomp
+ros-humble-moveit-ros-move-group
+ros-humble-moveit-ros-planning-interface
+ros-humble-moveit-ros-visualization
+ros-humble-moveit-ros-warehouse
+ros-humble-moveit-setup-assistant
+ros-humble-moveit-simple-controller-manager
+ros-humble-moveit-visual-tools
+ros-humble-navigation2
+ros-humble-rclpy-message-converter
+ros-humble-realsense2-camera
+ros-humble-robot-localization
+ros-humble-ros2-control
+ros-humble-ros2-controllers
+ros-humble-rviz-visual-tools
+ros-humble-slam-toolbox
+ros-humble-tf-transformations
+ros-humble-ur-controllers
+ros-humble-ur-description
+ros-humble-ur-moveit-config
+ros-humble-ur-robot-driver
+shiboken2
+xdot
+xterm
+# PIP PACKAGES
+open3d
+pyads
+sqlite-utils
+torch
+torchvision
+transforms3d
+typeguard
+ultralytics
+# EOF
diff --git a/dockerfiles/ws_dependencies/neurondones_humble.txt b/dockerfiles/ws_dependencies/neurondones_humble.txt
new file mode 100644
index 0000000..d481942
--- /dev/null
+++ b/dockerfiles/ws_dependencies/neurondones_humble.txt
@@ -0,0 +1,45 @@
+# APT-GET PACKAGES
+# Allegro hand
+cmake
+libeigen3-dev
+libyaml-cpp-dev
+libboost-filesystem-dev
+libboost-system-dev
+liburdf-dev
+liborocos-kdl-dev
+joint-state-publisher-gui
+ros-humble-control-msgs
+# Bringup
+# ros-humble-kortex-bringup
+ros-humble-moveit-ros-move-group
+ros-humble-moveit-kinematics
+ros-humble-moveit-planners
+ros-humble-moveit-simple-controller-manager
+ros-humble-joint-state-publisher
+ros-humble-joint-state-publisher-gui
+ros-humble-controller-manager
+ros-humble-moveit-configs-utils
+ros-humble-moveit-ros-visualization
+ros-humble-moveit-ros-warehouse
+ros-humble-moveit-setup-assistant
+ros-humble-picknik-reset-fault-controller
+ros-humble-picknik-twist-controller
+ros-humble-hardware-interface
+ros-humble-joint-trajectory-controller
+ros-humble-robotiq-description
+ros-humble-gazebo-ros2-control
+ros-humble-gripper-controllers
+ros-humble-joint-state-broadcaster
+ros-humble-kinova-gen3-7dof-robotiq-2f-85-moveit-config
+ros-humble-rmw-cyclonedds-cpp
+ros-humble-ign-ros2-control
+ros-humble-spacenav
+ros-humble-ros2-control
+ros-humble-ros2-controllers
+ros-humble-controller-interface
+ros-humble-controller-manager
+ros-humble-generate-parameter-library
+ros-humble-hardware-interface
+# PIP PACKAGES
+# transform3d
+# EOF
\ No newline at end of file
diff --git a/dockerfiles/ws_dependencies/noetic_configuration_scripts.txt b/others/noetic_configuration_scripts.txt
similarity index 100%
rename from dockerfiles/ws_dependencies/noetic_configuration_scripts.txt
rename to others/noetic_configuration_scripts.txt
diff --git a/others/trash b/others/trash
new file mode 100644
index 0000000..cfb592a
--- /dev/null
+++ b/others/trash
@@ -0,0 +1,56 @@
+# # Workaround for Azure Kinect
+# RUN if [ "$ROS_DISTRO" = "noetic" ]; \
+#     then \
+#         echo 'libk4a1.4 libk4a1.4/accepted-eula-hash string 0f5d5c5de396e4fee4c0753a21fee0c1ed726cf0316204edda484f08cb266d76' | debconf-set-selections \
+#         && echo 'libk4abt1.0	libk4abt1.0/accepted-eula-hash	string	03a13b63730639eeb6626d24fd45cf25131ee8e8e0df3f1b63f552269b176e38' | debconf-set-selections \
+#         && wget https://raw.githubusercontent.com/microsoft/Azure-Kinect-Sensor-SDK/develop/scripts/99-k4a.rules \
+#         && mkdir -p udev/rules.d \
+#         && mv 99-k4a.rules udev/rules.d/ \
+#         && cp --parents udev/rules.d/99-k4a.rules /etc; \
+#     fi
+
+# # Extra libs, e.g. vtk-7.1_20221201-1_amd64.deb
+# RUN if [ -f "${ROS_DISTRO}_libs.txt" ]; \
+#     then \
+#         grep -v '^#' ${ROS_DISTRO}_libs.txt | xargs wget \
+#         && dpkg -i *.deb;\
+#     fi
+
+# # LABEL image.version=0.1.1
+# ARG INSTALL_RUST="rust"
+# RUN echo "BUILDING DOCKER IMAGE USING RUST = ${INSTALL_RUST}"
+
+# ENV CARGO_HOME="/opt/cargo"
+# ENV RUSTUP_HOME="/opt/rustup"
+
+# RUN if [ "${INSTALL_RUST}" = "rust" ]; \
+#     then \
+#         echo "Installing Rust"; \
+#         curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y; \
+#     else \
+#         echo "Not installing Rust"; \
+#     fi
+# # Add .cargo/bin to PATH
+# ENV PATH="/opt/cargo/bin:${PATH}"
+
+# Install nodejs
+RUN mkdir -p /etc/apt/keyrings && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
+RUN NODE_MAJOR=20 && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list
+RUN apt-get update && \
+    apt-get -y install nodejs
+
+# clang
+clang-format clang-tidy clang-tools clang \
+libc++-dev libc++1 libc++abi-dev \
+libc++abi1 libclang-dev libclang1  \
+libomp-dev libomp5 lld lldb \
+llvm-dev llvm-runtime llvm \
+
+# Use rosdep to install ros packages
+ARG ROSDEP=none
+RUN if [ "$ROSDEP" != "none" ]; \
+    then \
+        git clone ${ROSDEP};\
+        && rosdep update; \
+        && rosdep install -iy --from-paths . --ignore-src --rosdistro ${ROS_DISTRO}; \
+    fi
-- 
GitLab