diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..dca6942 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +################################################################################ +# Repo + +.git/* +.dockerignore +.gitignore +**Dockerfile +**.Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..16bdcc7 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,86 @@ +ARG FROM_IMAGE=ros:eloquent + +# multi-stage for caching +FROM $FROM_IMAGE AS cache + +# clone underlay source +ENV UNDERLAY_WS /opt/underlay_ws +RUN mkdir -p $UNDERLAY_WS/src +WORKDIR $UNDERLAY_WS +COPY ./tools/underlay.repos ./ +RUN vcs import src < underlay.repos + +# copy overlay source +ENV OVERLAY_WS /opt/overlay_ws +RUN mkdir -p $OVERLAY_WS/src +WORKDIR $OVERLAY_WS +COPY ./ src/navigation2 +# COPY ./tools/overlay.repos ./ +# RUN vcs import src < overlay.repos + +# copy manifests for caching +WORKDIR /opt +RUN find ./ -name "package.xml" | \ + xargs cp --parents -t /tmp + # && find ./ -name "COLCON_IGNORE" | \ + # xargs cp --parents -t /tmp + +# multi-stage for building +FROM $FROM_IMAGE AS build + +# install CI dependencies +RUN apt-get update && apt-get install -q -y \ + ccache \ + lcov \ + && rm -rf /var/lib/apt/lists/* + +# copy underlay manifests +ENV UNDERLAY_WS /opt/underlay_ws +COPY --from=cache /tmp/underlay_ws $UNDERLAY_WS +WORKDIR $UNDERLAY_WS + +# install underlay dependencies +RUN . /opt/ros/$ROS_DISTRO/setup.sh && \ + apt-get update && rosdep install -q -y \ + --from-paths src \ + --ignore-src \ + && rm -rf /var/lib/apt/lists/* + +# copy underlay source +COPY --from=cache $UNDERLAY_WS ./ + +# build underlay source +ARG UNDERLAY_MIXINS="release ccache" +RUN . /opt/ros/$ROS_DISTRO/setup.sh && \ + colcon build \ + --symlink-install \ + --mixin $UNDERLAY_MIXINS + +# copy overlay manifests +ENV OVERLAY_WS /opt/overlay_ws +COPY --from=cache /tmp/overlay_ws $OVERLAY_WS +WORKDIR $OVERLAY_WS + +# install overlay dependencies +RUN . $UNDERLAY_WS/install/setup.sh && \ + apt-get update && rosdep install -q -y \ + --from-paths \ + src \ + $UNDERLAY_WS/src \ + --ignore-src \ + && rm -rf /var/lib/apt/lists/* + +# copy overlay source +COPY --from=cache $OVERLAY_WS ./ + +# build overlay source +ARG OVERLAY_MIXINS="release ccache" +RUN . $UNDERLAY_WS/install/setup.sh && \ + colcon build \ + --symlink-install \ + --mixin $OVERLAY_MIXINS + +# source overlay from entrypoint +RUN sed --in-place \ + 's|^source .*|source "$OVERLAY_WS/install/setup.bash"|' \ + /ros_entrypoint.sh \ No newline at end of file diff --git a/realsense_examples/package.xml b/realsense_examples/package.xml index b9e1ceb..d99f051 100644 --- a/realsense_examples/package.xml +++ b/realsense_examples/package.xml @@ -14,7 +14,7 @@ realsense_ros realsense_node - realsense2 + librealsense2 realsense_msgs launch_ros diff --git a/realsense_node/CMakeLists.txt b/realsense_node/CMakeLists.txt index 3935952..a242862 100644 --- a/realsense_node/CMakeLists.txt +++ b/realsense_node/CMakeLists.txt @@ -73,6 +73,11 @@ find_package(tf2 REQUIRED) find_package(tf2_ros REQUIRED) find_package(realsense_ros REQUIRED) find_package(realsense_msgs REQUIRED) +find_package(realsense2 REQUIRED) + +include_directories( + ${realsense2_INCLUDE_DIR} +) add_executable(realsense_node src/realsense_node.cpp diff --git a/realsense_ros/CMakeLists.txt b/realsense_ros/CMakeLists.txt index 1b2b885..d47b6ab 100644 --- a/realsense_ros/CMakeLists.txt +++ b/realsense_ros/CMakeLists.txt @@ -65,6 +65,7 @@ set(CMAKE_CXX_FLAGS "-fPIE -fPIC -D_FORTIFY_SOURCE=2 -fstack-protector -Wformat # find dependencies find_package(ament_cmake REQUIRED) +find_package(rcl REQUIRED) find_package(rclcpp REQUIRED) find_package(rclcpp_components REQUIRED) find_package(nav_msgs REQUIRED) @@ -82,7 +83,7 @@ endif() include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include - ${realsense2_INCLUDE_DIRS} + ${realsense2_INCLUDE_DIR} ) set(node_plugins "") @@ -96,10 +97,11 @@ add_library(${PROJECT_NAME} SHARED ) target_link_libraries(${PROJECT_NAME} - realsense2 + ${realsense2_LIBRARY} ) ament_target_dependencies(${PROJECT_NAME} + rcl rclcpp rclcpp_components nav_msgs @@ -133,6 +135,7 @@ install( if(BUILD_TESTING) find_package(ament_lint_auto REQUIRED) + find_package(rcl REQUIRED) find_package(rclcpp REQUIRED) find_package(nav_msgs REQUIRED) find_package(sensor_msgs REQUIRED) @@ -159,9 +162,10 @@ if(BUILD_TESTING) ${${PROJECT_NAME}_INCLUDE_DIRS} ) target_link_libraries(${target} - realsense2 + ${realsense2_LIBRARY} ${PROJECT_NAME}) ament_target_dependencies(${target} + "rcl" "rclcpp" "nav_msgs" "sensor_msgs" diff --git a/realsense_ros/include/realsense/rs_base.hpp b/realsense_ros/include/realsense/rs_base.hpp index ecd5381..1d05b12 100644 --- a/realsense_ros/include/realsense/rs_base.hpp +++ b/realsense_ros/include/realsense/rs_base.hpp @@ -80,6 +80,7 @@ class RealSenseBase Result toggleStream(const stream_index_pair & stream, const rclcpp::Parameter & param); Result changeResolution(const stream_index_pair & stream, const rclcpp::Parameter & param); Result changeFPS(const stream_index_pair & stream, const rclcpp::Parameter & param); + rclcpp::Time frameToTime(const rs2::frame & frame); typedef struct VideoStreamInfo { diff --git a/realsense_ros/package.xml b/realsense_ros/package.xml index a85f0b7..d44a3b8 100644 --- a/realsense_ros/package.xml +++ b/realsense_ros/package.xml @@ -17,10 +17,12 @@ tf2 tf2_ros pcl_conversions - realsense2 + librealsense2 realsense_msgs image_transport + rcl + launch_ros ament_lint_auto diff --git a/realsense_ros/src/rs_base.cpp b/realsense_ros/src/rs_base.cpp index 355f978..b47bf90 100644 --- a/realsense_ros/src/rs_base.cpp +++ b/realsense_ros/src/rs_base.cpp @@ -13,6 +13,7 @@ // limitations under the License. #include +#include "rcl/time.h" #include "realsense/rs_base.hpp" namespace realsense @@ -457,4 +458,8 @@ Result RealSenseBase::changeFPS(const stream_index_pair & stream, const rclcpp:: } return result; } + +rclcpp::Time RealSenseBase::frameToTime(const rs2::frame & frame) { + return rclcpp::Time(RCL_MS_TO_NS(frame.get_timestamp())); +} } // namespace realsense diff --git a/realsense_ros/src/rs_d435.cpp b/realsense_ros/src/rs_d435.cpp index bcd8786..0d2a202 100644 --- a/realsense_ros/src/rs_d435.cpp +++ b/realsense_ros/src/rs_d435.cpp @@ -60,7 +60,7 @@ RealSenseD435::RealSenseD435(rs2::context ctx, rs2::device dev, rclcpp::Node & n void RealSenseD435::publishTopicsCallback(const rs2::frame & frame) { rs2::frameset frameset = frame.as(); - rclcpp::Time t = node_.now(); + rclcpp::Time t = frameToTime(frame); if (enable_[COLOR] && (image_pub_[COLOR]->get_subscription_count() > 0 || camera_info_pub_[COLOR]->get_subscription_count() > 0)){ auto frame = frameset.get_color_frame(); publishImageTopic(frame, t); diff --git a/realsense_ros/src/rs_d435i.cpp b/realsense_ros/src/rs_d435i.cpp index b452de2..a2b1662 100644 --- a/realsense_ros/src/rs_d435i.cpp +++ b/realsense_ros/src/rs_d435i.cpp @@ -35,7 +35,7 @@ RealSenseD435I::RealSenseD435I(rs2::context ctx, rs2::device dev, rclcpp::Node & void RealSenseD435I::publishTopicsCallback(const rs2::frame & frame) { - rclcpp::Time t = node_.now(); + rclcpp::Time t = frameToTime(frame); if (frame.is()) { RealSenseD435::publishTopicsCallback(frame); } else if (frame.is()) { diff --git a/realsense_ros/src/rs_t265.cpp b/realsense_ros/src/rs_t265.cpp index a44b30f..bde3b1a 100644 --- a/realsense_ros/src/rs_t265.cpp +++ b/realsense_ros/src/rs_t265.cpp @@ -42,7 +42,7 @@ RealSenseT265::RealSenseT265(rs2::context ctx, rs2::device dev, rclcpp::Node & n void RealSenseT265::publishTopicsCallback(const rs2::frame & frame) { - rclcpp::Time t = node_.now(); + rclcpp::Time t = frameToTime(frame); if (frame.is()) { auto frameset = frame.as(); diff --git a/tools/overlay.repos b/tools/overlay.repos new file mode 100644 index 0000000..374b2a6 --- /dev/null +++ b/tools/overlay.repos @@ -0,0 +1,5 @@ +repositories: + intel/ros2_intel_realsense: + type: git + url: https://github.com/ruffsl/ros2_intel_realsense.git + version: docker diff --git a/tools/underlay.repos b/tools/underlay.repos new file mode 100644 index 0000000..1c1baaa --- /dev/null +++ b/tools/underlay.repos @@ -0,0 +1,5 @@ +repositories: + intel/librealsense: + type: git + url: https://github.com/ruffsl/librealsense.git + version: docker