Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP | ROS2 port #40

Closed
wants to merge 74 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
fa61d0d
Add .dockerignore file
ruffsl Nov 24, 2019
51c25e7
Add inital .repo files
ruffsl Nov 24, 2019
e144a2c
Add inital Dockerfile
ruffsl Nov 24, 2019
c7f9f21
Build entire underlay
ruffsl Nov 25, 2019
bc1ae72
Build from VIO fork
ruffsl Nov 25, 2019
bfe6abb
Find needed boost package in cmake
ruffsl Nov 26, 2019
de97604
Update package to depend on libopencv-dev
ruffsl Nov 26, 2019
a67d777
Install optional OpenCV dependencies
ruffsl Nov 26, 2019
6dfb858
Install ROS1 for current ros1 overlay
ruffsl Nov 26, 2019
3d712f4
Ommit ccache mixin to avoid opencv build issue
ruffsl Nov 26, 2019
94aaa78
Add overlay step for ros packages
ruffsl Nov 26, 2019
60804cc
Skip invalid capilized key for boost
ruffsl Nov 26, 2019
c6724d4
Clean repos files
ruffsl Nov 27, 2019
132835f
Add ros repos file
ruffsl Nov 27, 2019
2f0b920
Update from dashing to eloquent
ruffsl Dec 9, 2019
427dbd4
Add cmake flags for opencv and gtsam
ruffsl Dec 9, 2019
b42cb35
Ingore warnings for now
ruffsl Dec 9, 2019
b89842b
Use upstream gtsam
ruffsl Dec 9, 2019
f57abe2
Fix naming convention
ruffsl Dec 10, 2019
b4796c2
Correct depends
ruffsl Jan 10, 2020
4213acf
Update depends for opencv
ruffsl Jan 10, 2020
4e67a83
Alpha sort cmake flags
ruffsl Jan 10, 2020
62ea2a5
Update latest building branches
ruffsl Jan 10, 2020
f1b44c1
Correct checkout branch for GTSAM
ruffsl Jan 14, 2020
944b303
Merge remote-tracking branch 'origin/patch-1' into docker
ruffsl Jan 14, 2020
0f54fa9
Remove duplicate boost in cmake
ruffsl Jan 14, 2020
33a178a
Switch to eloquent
ruffsl Jan 14, 2020
d6ef999
Checkout only eloquent branch
ruffsl Jan 14, 2020
0c7d421
Copy local repo
ruffsl Jan 14, 2020
1695260
Swap package to ament
ruffsl Jan 14, 2020
6619537
Swap to fork for ros2 port
ruffsl Jan 15, 2020
a28ba3f
Rename header files
ruffsl Jan 16, 2020
fd561b2
Update gitignore for clion
ruffsl Jan 16, 2020
cfb535e
Stage changes to Bag Data Provider
ruffsl Jan 20, 2020
711a5fd
Remove Bag Data Provider for now
ruffsl Jan 20, 2020
7791668
Add base multithreaded executor node
ruffsl Jan 20, 2020
f0f0eaf
Update package.xml
ruffsl Jan 20, 2020
9d34cc0
Update Cmake
ruffsl Jan 20, 2020
c51a73d
Fix class name typo
ruffsl Jan 20, 2020
e78fe9e
Update Cmake
ruffsl Jan 20, 2020
e85e277
Ignore build folder
ruffsl Jan 20, 2020
2ab53a7
Use message filters for image transport
ruffsl Jan 20, 2020
f504d00
Clean up
ruffsl Jan 20, 2020
8b095df
Add message_filters and image_transport repos
ruffsl Jan 22, 2020
0afd144
Stage message changes
ruffsl Jan 22, 2020
02158a6
Init gflag and glog
ruffsl Jan 22, 2020
7224894
Rename RosDataProviderInterface
ruffsl Jan 22, 2020
89e925c
Update package.xml CMake depends
ruffsl Jan 23, 2020
ac71a13
Port RosDataProviderInterface to ROS2
ruffsl Jan 23, 2020
151cb92
Comment out unported dependency
ruffsl Jan 23, 2020
4906b2a
Clone all .repos then copy over local source code
ruffsl Jan 23, 2020
bb48b3c
Be consistent when including headers
ruffsl Jan 23, 2020
f8184d2
Fix missing CMake listing for cv_bridge
ruffsl Jan 23, 2020
9573f43
Inherit from RosDataProviderInterface
ruffsl Jan 29, 2020
c37eb66
Stage WIP
ruffsl Jan 29, 2020
cf204c9
Install params folder
ruffsl Feb 4, 2020
07fa9ef
Remove ros args before gflag parsing
ruffsl Feb 4, 2020
0d011b4
Clean up commented code
ruffsl Feb 4, 2020
fabb4e0
Declare parameters
ruffsl Feb 4, 2020
2bb7c28
Leave static tf publishing to sensor source
ruffsl Feb 4, 2020
090251d
Fix time stamp conversion
ruffsl Feb 4, 2020
3a1749c
Use sensor qos for sensor topics
ruffsl Feb 4, 2020
e121cca
Add and regester pipline
ruffsl Feb 4, 2020
12dabe1
Stage minimal working stereo filter example
ruffsl Feb 4, 2020
dab3d15
Switch from image transport to message filter
ruffsl Feb 4, 2020
0ac6fc8
Stage work on xml launch files
ruffsl Feb 4, 2020
aea12d0
Filter out of order messages from callbacks
ruffsl Feb 4, 2020
5550107
Fix typo
ruffsl Feb 5, 2020
ecef41f
Renable tf broadcaster
ruffsl Feb 5, 2020
579dcb3
Change debug_img_pub_ to regular publisher for now
ruffsl Feb 5, 2020
f0b61d6
Clean out dead code
ruffsl Feb 5, 2020
4887973
Update lunch ciles
ruffsl Feb 5, 2020
419fda1
Set dataset for approrate config folder
ruffsl Feb 5, 2020
ca5587b
Add asyn handle to publish outputs
ruffsl Feb 5, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
################################################################################
# Repo

.git/*
.dockerignore
.gitignore
**Dockerfile
**.Dockerfile
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,8 @@
*.app

# Vscode files
.vscode/
.vscode/
build/*

# Clion files
.idea/
121 changes: 111 additions & 10 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,44 @@
cmake_minimum_required(VERSION 2.8.3)
cmake_minimum_required(VERSION 3.5)
project(kimera_vio_ros)

find_package(catkin_simple REQUIRED)
# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)

find_package(geometry_msgs REQUIRED)
find_package(nav_msgs REQUIRED)
find_package(pcl_msgs)
find_package(pose_graph_msgs)
find_package(sensor_msgs REQUIRED)
find_package(std_msgs REQUIRED)

find_package(cv_bridge REQUIRED)
find_package(tf2_ros REQUIRED)

# find_package(Gflags REQUIRED)
# find_package(Glog 0.3.5 REQUIRED)
find_package(GTSAM REQUIRED)
# find_package(opengv REQUIRED)
find_package(OpenCV 3.3.1 REQUIRED)
# find_package(DBoW2 REQUIRED)
find_package(kimera_vio REQUIRED)
find_package(PCL REQUIRED QUIET COMPONENTS common io)

find_package(pose_graph_visualizer)

#find_package(pcl_ros)
find_package(pcl_conversions)

find_package(message_filters)
find_package(image_transport)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ruffsl I am not familiar with ROS2, but is this necessary? Or even, is this standard?
Why not using catkin_simple?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The officially supported method for integrating ROS2 with cmake is ament, please see:
https://design.ros2.org/articles/ament.html

It's hygienic to explicitly declare which dependencies are to be used in cmake, rather than roping just anything in the package.xml. This can be an issue when the package dependency name, and library the depency exports are not perfectly aligned strings. Also, it seems that catkin_simple hasn't been maintained since 2015.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, ament_cmake seems like a big deal. Thanks for the pointer.


### System Dependencies
find_package(Boost REQUIRED COMPONENTS
Expand All @@ -13,15 +50,79 @@ if(NOT TARGET Boost::boost)
INTERFACE_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}")
endif()

catkin_simple()
include_directories(
include
${PCL_COMMON_INCLUDE_DIRS}
)

cs_add_executable(${PROJECT_NAME}
src/KimeraVioRos.cpp
src/RosDataProvider.cpp
src/RosBagDataProvider.cpp
src/RosOnlineDataProvider.cpp)
set(executable_name kimera_vio_node)
add_executable(${executable_name}
src/KimeraVio.cpp
# src/stereo.cpp
# src/KimeraVioRos.cpp
# src/RosDataProviderInterface.cpp
# src/RosBagDataProvider.cpp
# src/RosOnlineDataProvider.cpp
)

set(library_name ${PROJECT_NAME})
add_library(${library_name} SHARED
src/KimeraVioNode.cpp
src/RosDataProviderInterface.cpp
# src/RosBagDataProvider.cpp
# src/RosOnlineDataProvider.cpp
)

set(dependencies
geometry_msgs
nav_msgs
pcl_msgs
pose_graph_msgs
sensor_msgs
std_msgs
# gtsam
cv_bridge
tf2_ros
kimera_vio
pcl_conversions
# pcl_ros
pose_graph_visualizer
rclcpp
message_filters
image_transport
)

ament_target_dependencies(${executable_name}
${dependencies}
)

target_link_libraries(${executable_name} ${library_name})
target_link_libraries(${PROJECT_NAME} kimera_vio)

cs_install()
ament_target_dependencies(${library_name}
${dependencies}
)

install(TARGETS ${executable_name} ${library_name}
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION lib/${PROJECT_NAME}
)

install(DIRECTORY include/
DESTINATION include/
)

install(DIRECTORY launch
DESTINATION share/${PROJECT_NAME})
install(DIRECTORY param
DESTINATION share/${PROJECT_NAME})

if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
ament_lint_auto_find_test_dependencies()
endif()

ament_export_include_directories(include)

cs_export()
ament_package()
164 changes: 164 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
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 ./install/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 ./install/overlay.repos ./
RUN vcs import src < overlay.repos

# copy ros source
ENV ROS_WS /opt/ros_ws
RUN mkdir -p $ROS_WS/src
WORKDIR $ROS_WS
COPY ./install/ros.repos ./
RUN vcs import src < ros.repos
COPY ./ src/MIT-SPARK/Kimera-VIO-ROS

# 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/*

# install opencv dependencies
RUN apt-get update && apt-get install -y \
gfortran \
libatlas-base-dev \
libgtk-3-dev \
libjpeg-dev \
libpng-dev \
libtiff-dev \
libvtk6-dev \
unzip \
&& 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"
RUN . /opt/ros/$ROS_DISTRO/setup.sh && \
colcon build \
--symlink-install \
--mixin $UNDERLAY_MIXINS \
--cmake-args \
--no-warn-unused-cli \
-DGTSAM_BUILD_TESTS=OFF \
-DGTSAM_BUILD_EXAMPLES_ALWAYS=OFF \
-DGTSAM_BUILD_UNSTABLE=ON \
-DGTSAM_POSE3_EXPMAP=ON \
-DGTSAM_ROT3_EXPMAP=ON \
-DOPENCV_EXTRA_MODULES_PATH=$UNDERLAY_WS/src/opencv/opencv/contrib/modules
# --event-handlers console_direct+

# 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 \
--cmake-args \
--no-warn-unused-cli \
-DCMAKE_CXX_FLAGS="\
-Wno-parentheses \
-Wno-reorder \
-Wno-sign-compare \
-Wno-unused-but-set-variable \
-Wno-unused-function \
-Wno-unused-parameter \
-Wno-unused-value \
-Wno-unused-variable"
# --event-handlers console_direct+

# copy ros manifests
ENV ROS_WS /opt/ros_ws
COPY --from=cache /tmp/ros_ws $ROS_WS
WORKDIR $ROS_WS

# install overlay dependencies
RUN . $OVERLAY_WS/install/setup.sh && \
apt-get update && rosdep install -q -y \
--from-paths \
src \
$UNDERLAY_WS/src \
$OVERLAY_WS/src \
--ignore-src \
--skip-keys "\
Boost" \
&& rm -rf /var/lib/apt/lists/*

# copy overlay source
COPY --from=cache $ROS_WS ./

# build overlay source
ARG ROS_MIXINS="release ccache"
RUN . $OVERLAY_WS/install/setup.sh && \
colcon build \
--symlink-install \
--mixin $ROS_MIXINS \
--cmake-args \
--no-warn-unused-cli \
-DCMAKE_CXX_FLAGS="\
-Wno-sign-compare \
-Wno-unused-value \
-Wno-unused-variable \
-Wno-unused-but-set-variable \
-Wno-reorder \
-Wno-parentheses \
-Wno-unused-parameter"
# --event-handlers console_direct+

# source overlay from entrypoint
RUN sed --in-place \
's|^source .*|source "$ROS_WS/install/setup.bash"|' \
/ros_entrypoint.sh
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't this file in another pr?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PR is still labeled WIP, so I haven't refactored everything possible into separate PRs yet. This is also used for development of the PR, so it was handy for me to keep in branch.

67 changes: 67 additions & 0 deletions include/kimera_vio_ros/KimeraVioNode.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// #include <chrono>
#include <functional>
#include <future>
#include <memory>
#include <string>
#include <thread>

// Still need gflags for parameters in VIO
#include <gflags/gflags.h>
#include <glog/logging.h>

#include "image_transport/subscriber_filter.h"

#include "message_filters/subscriber.h"
#include "message_filters/synchronizer.h"
#include "message_filters/sync_policies/exact_time.h"

#include "rclcpp/rclcpp.hpp"

#include "sensor_msgs/msg/image.hpp"
#include "sensor_msgs/msg/imu.hpp"

#include <kimera-vio/pipeline/Pipeline.h>
#include "kimera_vio_ros/RosDataProviderInterface.hpp"


using namespace message_filters::sync_policies;
using namespace sensor_msgs::msg;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we avoid using namespace?
Use an alias instead if it is just too long of a namespace:

namespace fbz = foo::bar::baz;

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure thing, I'll migrate to alias when I refactor.


class KimeraVioNode : public VIO::RosDataProviderInterface{
public:
KimeraVioNode(
const std::string & node_name,
const rclcpp::NodeOptions & options = rclcpp::NodeOptions());

~KimeraVioNode();

private:
VIO::FrameId frame_count_;

bool spin_outputs();
void stereo_cb(
const Image::SharedPtr left_msg,
const Image::SharedPtr right_msg);
void imu_cb(const Imu::SharedPtr imu_msg);
std::string timing_string();

rclcpp::callback_group::CallbackGroup::SharedPtr callback_group_stereo_;
rclcpp::callback_group::CallbackGroup::SharedPtr callback_group_imu_;
rclcpp::Subscription<Imu>::SharedPtr imu_sub_;

typedef ExactTime<Image, Image> ExactPolicy;
typedef message_filters::Synchronizer<ExactPolicy> ExactSync;
std::shared_ptr<ExactSync> exact_sync_;
image_transport::SubscriberFilter left_sub_, right_sub_;

std::shared_ptr<message_filters::Subscriber<Image> > l_sub_;
std::shared_ptr<message_filters::Subscriber<Image> > r_sub_;

VIO::Pipeline vio_pipeline_;
std::future<bool> handle_pipeline_;
std::future<bool> handle_outputs_;
rclcpp::WallRate outputs_loop_rate_;

rclcpp::Time last_imu_timestamp_;
rclcpp::Time last_stereo_timestamp_;
};
Loading