Updated Dockerfile for ROS-SLAM

I have modified lines 57, 75, 77, and 64-72.
 avatar
unknown
dockerfile
3 years ago
9.8 kB
67
Indexable
#
# ROS2 with ORBSLAM2, RTABMap, ZED, and Realsense2
#
ARG BASE_IMAGE=dustynv/ros:foxy-ros-base-pytorch-l4t-r32.5.0
FROM ${BASE_IMAGE}

SHELL ["/bin/bash", "-c"] 
ENV SHELL /bin/bash

ENV DEBIAN_FRONTEND=noninteractive
ARG MAKEFLAGS=-j$(nproc)
ENV LANG=en_US.UTF-8 
ENV PYTHONIOENCODING=utf-8
RUN locale-gen en_US en_US.UTF-8 && update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8

ENV PYTORCH_PATH="/usr/local/lib/python3.6/dist-packages/torch"
ENV LD_LIBRARY_PATH="${PYTORCH_PATH}/lib:${LD_LIBRARY_PATH}"

ARG ROS_ENVIRONMENT=${ROS_ROOT}/install/setup.bash


# 
# upgrade cmake - https://stackoverflow.com/a/56690743
# this is needed for rtabmap which uses FindPython3.cmake
#
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
		  software-properties-common \
		  apt-transport-https \
		  ca-certificates \
		  gnupg \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean
		  
RUN wget -qO - https://apt.kitware.com/keys/kitware-archive-latest.asc | apt-key add - && \
    apt-add-repository 'deb https://apt.kitware.com/ubuntu/ bionic main' && \
    apt-get update && \
    apt-get install -y --only-upgrade --no-install-recommends \
            cmake \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean \
    && cmake --version
    

#
# orbslam2 - https://github.com/alsora/ros2-ORB_SLAM2
# TODO build https://github.com/DrTimothyAldenDavis/SuiteSparse from source for CUDA if any advantage?
#
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
            ffmpeg \
            libglew-dev \
		  libboost-all-dev \
		  libboost-system-dev \
		  libcanberra-gtk-module \
            libsuitesparse-dev \
	    libxkbcommon-dev \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean

# This is my, Luka's, try at fixing the error that comes from trying to clone pangolin. My solution is to
# install pkg-config before pangolin is cloned.
#
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    pkg-config \
    wayland-protocols \
    libeigen3-dev \
    libopenni2-dev && \
    ln -s /usr/include/eigen3/Eigen /usr/include/Eigen \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean

# pangolin
RUN git clone --recursive https://github.com/stevenlovegrove/Pangolin.git /tmp/pangolin && \
    cd /tmp/pangolin && \
    ./scripts/install_prerequisites.sh recommended && \
    mkdir build && \
    cd build && \
    cmake ../ && \
    make -j$(nproc) && \
    make install 
    
# orbslam2
#ENV ORB_SLAM2_ROOT_DIR="/opt/ORB_SLAM2"
#RUN git clone https://github.com/Windfisch/ORB_SLAM2 ${ORB_SLAM2_ROOT_DIR} && \
#    cd ${ORB_SLAM2_ROOT_DIR} && \
#    wget --no-check-certificate https://github.com/alsora/ros2-ORB_SLAM2/raw/master/docker/scripts/build.sh && \
#    wget --no-check-certificate https://github.com/alsora/ros2-ORB_SLAM2/raw/master/docker/scripts/orbslam.patch && \
#    git apply orbslam.patch && \
#    bash build.sh 
    
ENV ORB_SLAM2_ROOT_DIR="/opt/ORB_SLAM2_CUDA"
RUN git clone https://github.com/dusty-nv/ORB_SLAM2_CUDA ${ORB_SLAM2_ROOT_DIR} && \
    cd ${ORB_SLAM2_ROOT_DIR} && \
    bash build.sh && make -j1\
    ln -s ${ORB_SLAM2_ROOT_DIR}/lib/libORB_SLAM2_CUDA.so ${ORB_SLAM2_ROOT_DIR}/lib/libORB_SLAM2.so

# ros2_orbslam
RUN source ${ROS_ENVIRONMENT} && \
    cd ${ROS_ROOT} && \
    mkdir -p src/slam && \
    git clone https://github.com/alsora/ros2-ORB_SLAM2 src/slam/ros2-ORB_SLAM2 && \
    colcon build \
	  --base-paths src/slam \
	  --cmake-args -DCMAKE_CXX_FLAGS=-isystem\ /usr/local/cuda/include \
	  --event-handlers console_direct+ \
	  --merge-install \
    && rm -rf ${ROS_ROOT}/src \
    && rm -rf ${ROS_ROOT}/logs \
    && rm -rf ${ROS_ROOT}/build 
    
    
#
# rtabmap - https://github.com/introlab/rtabmap_ros/tree/ros2
#
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
		  libpcl-dev \
		  libpython3-dev \
		  python3-dev \
		  libsuitesparse-dev \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean

# install recommended dependencies - https://github.com/introlab/rtabmap/wiki/Installation#dependencies 
# note:  disable g2o when using orbslam, because orbslam has its own g2o
#RUN git clone https://github.com/RainerKuemmerle/g2o /tmp/g2o && \
#    cd /tmp/g2o && \
#    mkdir build && \
#    cd build && \
#    cmake -DBUILD_WITH_MARCH_NATIVE=OFF -DG2O_BUILD_APPS=OFF -DG2O_BUILD_EXAMPLES=OFF -DG2O_USE_OPENGL=OFF .. && \
#    make -j$(nproc) && \
#    make install && \
#    rm -rf /tmp/g2o
    
RUN git clone https://github.com/borglab/gtsam /tmp/gtsam && \
    cd /tmp/gtsam && \
    mkdir build && \
    cd build && \
    cmake -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF -DGTSAM_WITH_TBB=OFF .. && \
    make -j$(nproc) && \
    make install && \
    rm -rf /tmp/gtsam
    
RUN git clone https://github.com/ethz-asl/libnabo /tmp/libnabo && \
    cd /tmp/libnabo && \
    mkdir build && \
    cd build && \
    cmake .. && \
    make -j$(nproc) && \
    make install && \
    rm -rf /tmp/libnabo
    
RUN git clone https://github.com/ethz-asl/libpointmatcher /tmp/libpointmatcher && \
    cd /tmp/libpointmatcher && \
    mkdir build && \
    cd build && \
    cmake .. && \
    make -j$(nproc) && \
    make install && \
    rm -rf /tmp/libpointmatcher

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
	libyaml-cpp-dev \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean

# build rtabmap / rtabmap_ros
RUN git clone https://github.com/introlab/rtabmap.git /opt/rtabmap && \
    cd /opt/rtabmap/build && \
    cmake -DWITH_PYTHON=ON -DWITH_TORCH=ON -DTorch_DIR=${PYTORCH_PATH}/share/cmake/Torch .. && \
    make -j$(nproc) && \
    make install

# since rtabmap_ros is an 'unreleased' package for ros2, manually pull it's dependencies from
# https://github.com/introlab/rtabmap_ros/blob/dfdbe1f68314e851e017c8af3788b17518a5000b/package.xml#L24
RUN source ${ROS_ENVIRONMENT} && \
    export ROS_PACKAGE_PATH=${AMENT_PREFIX_PATH} && \
    cd ${ROS_ROOT} && \
    mkdir -p src/slam && \
    
    # download sources for dependency packages
    rosinstall_generator --deps --exclude RPP --rosdistro ${ROS_DISTRO} \
          octomap \
		nav2_common \
		laser_geometry \
		pcl_conversions \
		rviz_common \
		rviz_rendering \
		rviz_default_plugins \
		realsense2_camera \
		realsense2_description \
		diagnostic_updater \
		compressed_image_transport \
		compressed_depth_image_transport \
	> ros2.${ROS_DISTRO}.rtabmap.rosinstall && \
    cat ros2.${ROS_DISTRO}.rtabmap.rosinstall && \
    vcs import src/slam < ros2.${ROS_DISTRO}.rtabmap.rosinstall && \
    
    # install apt/deb dependencies using rosdep
    apt-get update && \
    rosdep install -y \
       --ignore-src \
       --from-paths src/slam \
	  --rosdistro ${ROS_DISTRO} \
	  --skip-keys "rtabmap find_object_2d Pangolin libopencv-dev libopencv-contrib-dev libopencv-imgproc-dev python-opencv python3-opencv" && \
    rm -rf /var/lib/apt/lists/* && \
    apt-get clean && \
    
    # build the dependency packages
    colcon build --merge-install --base-paths src/slam && \
	  
    # clean-up build files
    rm -rf ${ROS_ROOT}/src && \
    rm -rf ${ROS_ROOT}/logs && \
    rm -rf ${ROS_ROOT}/build && \
    rm ${ROS_ROOT}/*.rosinstall
    
# build rtabmap_ros, but first patch it to import tf2_geometry_msgs correctly
RUN source ${ROS_ENVIRONMENT} && \
    cd ${ROS_ROOT} && \
    mkdir -p src/slam && \
    
    # download and patch source
    git clone --branch ros2 https://github.com/introlab/rtabmap_ros.git src/slam/rtabmap_ros && \
    sed -i '/find_package(tf2_ros REQUIRED)/a find_package(tf2_geometry_msgs REQUIRED)' src/slam/rtabmap_ros/CMakeLists.txt && \
    sed -i '/   tf2_ros/a tf2_geometry_msgs' src/slam/rtabmap_ros/CMakeLists.txt && \
    
    # install apt/deb dependencies using rosdep
    apt-get update && \
    rosdep install -y \
    	  --ignore-src \
       --from-paths src/slam \
	  --rosdistro ${ROS_DISTRO} \
	  --skip-keys "rtabmap find_object_2d Pangolin libopencv-dev libopencv-contrib-dev libopencv-imgproc-dev python-opencv python3-opencv" && \
    rm -rf /var/lib/apt/lists/* && \
    apt-get clean && \
    
    # build the node
    colcon build \
       --merge-install \
	  --base-paths src/slam/rtabmap_ros \
	  --event-handlers console_direct+ && \

    # clean-up build files
    rm -rf ${ROS_ROOT}/src && \
    rm -rf ${ROS_ROOT}/logs && \
    rm -rf ${ROS_ROOT}/build 
	  

#
# ZED SDK / zed-ros2-wrapper
# https://github.com/stereolabs/zed-docker/blob/master/3.X/jetpack_4.X/devel/Dockerfile
#
ARG ZED_SDK_URL="https://download.stereolabs.com/zedsdk/3.5/jp45/jetsons"
ARG ZED_SDK_RUN="ZED_SDK_Linux_JP.run"

RUN cd /tmp && \
    wget --quiet --show-progress --progress=bar:force:noscroll --no-check-certificate ${ZED_SDK_URL} -O ${ZED_SDK_RUN} && \
    chmod +x ${ZED_SDK_RUN} && \
    ./${ZED_SDK_RUN} silent skip_tools && \
    rm -rf /usr/local/zed/resources/* && \
    rm -rf ${ZED_SDK_RUN} && \
    rm -rf /var/lib/apt/lists/* && \
    apt-get clean
    
RUN source ${ROS_ENVIRONMENT} && \
    cd ${ROS_ROOT} && \
    mkdir -p src/slam && \
    git clone https://github.com/stereolabs/zed-ros2-wrapper src/slam/zed-ros2-wrapper && \
    
    # install apt/deb dependencies using rosdep
    apt-get update && \
    rosdep install -y \
    	  --ignore-src \
       --from-paths src/slam \
	  --rosdistro ${ROS_DISTRO} \
	  --skip-keys "rtabmap find_object_2d Pangolin libopencv-dev libopencv-contrib-dev libopencv-imgproc-dev python-opencv python3-opencv" && \
    rm -rf /var/lib/apt/lists/* && \
    apt-get clean && \
    
    # build the node
    colcon build \
       --merge-install \
	  --base-paths src/slam/zed-ros2-wrapper \
	  --cmake-args=-DCMAKE_BUILD_TYPE=Release && \
	  
    # clean-up build files
    rm -rf ${ROS_ROOT}/src && \
    rm -rf ${ROS_ROOT}/logs && \
    rm -rf ${ROS_ROOT}/build
Editor is loading...