-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
adds rerun/examples/cpp-example-ros-bridge #30
- Loading branch information
1 parent
fa7fc43
commit edd0b09
Showing
12 changed files
with
491 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
# cpp-example-ros-bridge | ||
|
||
|
||
## Installation | ||
``` | ||
curl -fsSL https://pixi.sh/install.sh | bash | ||
echo 'eval "$(pixi completion --shell bash)"' >> ~/.bashrc | ||
#And then restart the shell or source the shell config file. | ||
#rm ~/.pixi/bin/pixi | ||
git clone [email protected]:rerun-io/cpp-example-ros-bridge.git | ||
mv pixi.toml .. | ||
mv rerun_bridge/ .. | ||
rm -rf cpp-example-ros-bridge/ | ||
$HOME/.pixi/bin/./pixi run example | ||
``` | ||
|
||
## some logs | ||
``` | ||
$HOME/.pixi/bin/./pixi run example | ||
✨ Pixi task (default): mkdir -p noetic_ws/src && ln -sfn $(pwd)/rerun_bridge noetic_ws/src/rerun_bridge | ||
⠉ updating packages in 'default' | ||
⠁ downloading [00:01:18] [━───────────────────] 21/542 ogre (+49) ⠁ linking [00:01:18] [━───────────────────] 21/542 | ||
``` | ||
|
||
|
||
## References | ||
https://github.com/rerun-io/cpp-example-ros-bridge?tab=readme-ov-file | ||
https://github.com/prefix-dev/pixi/ | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
[project] | ||
name = "rerun_cpp_example_ros" | ||
authors = ["rerun.io <[email protected]>"] | ||
channels = ["robostack-staging", "conda-forge"] | ||
description = "Use the Rerun C++ SDK together with ROS" | ||
homepage = "https://rerun.io" | ||
license = "Apache-2.0" | ||
platforms = ["linux-64"] | ||
repository = "https://github.com/rerun-io/cpp-example-ros" | ||
version = "0.1.0" | ||
|
||
[tasks] | ||
ws = { cmd = "mkdir -p noetic_ws/src && ln -sfn $(pwd)/rerun_bridge noetic_ws/src/rerun_bridge", cwd = "." } | ||
build = { cmd = "ls && catkin_make --cmake-args -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXPORT_COMPILE_COMMANDS=ON", depends_on = ["ws"], cwd = "noetic_ws"} | ||
example_data = { cmd = "curl -L -C - -O http://rpg.ifi.uzh.ch/datasets/uzh-fpv-newer-versions/v3/indoor_forward_3_snapdragon_with_gt.bag", depends_on=["ws"], cwd = "noetic_ws/src/rerun_bridge"} | ||
example = { cmd = "bash -c 'source ./devel/setup.bash && roslaunch rerun_bridge example.launch'", depends_on = [ "build", "example_data", "ws"], cwd = "noetic_ws" } | ||
|
||
[dependencies] | ||
compilers = ">=1.7.0,<1.8" | ||
opencv = ">=4.9.0,<4.10" | ||
ros-noetic-catkin = ">=0.8.10,<0.9" | ||
ros-noetic-desktop = ">=1.5.0,<1.6" | ||
ros-noetic-rosbag = ">=1.16.0,<1.17" | ||
yaml-cpp = ">=0.8.0,<0.9" | ||
rerun-sdk = ">=0.13.0,<0.14" |
38 changes: 38 additions & 0 deletions
38
rerun/examples/cpp-example-ros-bridge/rerun_bridge/CMakeLists.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
cmake_minimum_required(VERSION 3.0.2) | ||
project(rerun_bridge) | ||
|
||
if(NOT DEFINED CMAKE_CXX_STANDARD) | ||
set(CMAKE_CXX_STANDARD 17) | ||
endif() | ||
|
||
find_package(catkin REQUIRED COMPONENTS roscpp sensor_msgs nav_msgs cv_bridge) | ||
find_package(OpenCV REQUIRED) | ||
find_package(yaml-cpp REQUIRED) | ||
|
||
include(FetchContent) | ||
FetchContent_Declare(rerun_sdk URL https://github.com/rerun-io/rerun/releases/download/0.13.0/rerun_cpp_sdk.zip) | ||
FetchContent_MakeAvailable(rerun_sdk) | ||
|
||
include_directories( | ||
include | ||
${YAML_CPP_INCLUDE_DIRS} | ||
${catkin_INCLUDE_DIRS} | ||
) | ||
|
||
catkin_package( | ||
INCLUDE_DIRS include | ||
LIBRARIES ${PROJECT_NAME} | ||
CATKIN_DEPENDS roscpp sensor_msgs nav_msgs cv_bridge | ||
DEPENDS opencv yaml-cpp | ||
) | ||
|
||
add_library(${PROJECT_NAME} src/rerun_bridge/rerun_ros_interface.cpp) | ||
add_executable(visualizer src/rerun_bridge/visualizer_node.cpp) | ||
|
||
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) | ||
add_dependencies(visualizer ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) | ||
|
||
target_link_libraries(${PROJECT_NAME} ${catkin_LIBRARIES} ${OpenCV_LIBS} ${YAML_CPP_LIBRARIES} rerun_sdk) | ||
target_link_libraries(visualizer ${PROJECT_NAME} ${catkin_LIBRARIES} ${YAML_CPP_LIBRARIES} rerun_sdk) | ||
|
||
install(TARGETS visualizer DESTINATION bin) |
28 changes: 28 additions & 0 deletions
28
...examples/cpp-example-ros-bridge/rerun_bridge/include/rerun_bridge/rerun_ros_interface.hpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
#pragma once | ||
|
||
#include <geometry_msgs/PoseStamped.h> | ||
#include <nav_msgs/Odometry.h> | ||
#include <sensor_msgs/Image.h> | ||
#include <sensor_msgs/Imu.h> | ||
|
||
#include <rerun.hpp> | ||
|
||
void log_imu( | ||
const rerun::RecordingStream& rec, const std::string& entity_path, | ||
const sensor_msgs::Imu::ConstPtr& msg | ||
); | ||
|
||
void log_image( | ||
const rerun::RecordingStream& rec, const std::string& entity_path, | ||
const sensor_msgs::Image::ConstPtr& msg | ||
); | ||
|
||
void log_pose_stamped( | ||
const rerun::RecordingStream& rec, const std::string& entity_path, | ||
const geometry_msgs::PoseStamped::ConstPtr& msg | ||
); | ||
|
||
void log_odometry( | ||
const rerun::RecordingStream& rec, const std::string& entity_path, | ||
const nav_msgs::Odometry::ConstPtr& msg | ||
); |
11 changes: 11 additions & 0 deletions
11
rerun/examples/cpp-example-ros-bridge/rerun_bridge/launch/example.launch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
<launch> | ||
<!-- Publishes the voxel grid to rviz for display --> | ||
<node pkg="rosbag" type="play" name="player" args="-s 11.0 -u 47.0 -r 2.0 $(find rerun_bridge)/indoor_forward_3_snapdragon_with_gt.bag"> | ||
</node> | ||
|
||
<!-- Run the logger node --> | ||
<node name="rerun_bridge_node" pkg="rerun_bridge" type="visualizer" output="screen"> | ||
<rosparam param="yaml_path" subst_value="True">$(find rerun_bridge)/launch/example_params.yaml</rosparam> | ||
</node> | ||
|
||
</launch> |
30 changes: 30 additions & 0 deletions
30
rerun/examples/cpp-example-ros-bridge/rerun_bridge/launch/example_params.yaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
topic_to_entity_path: | ||
/snappy_cam/stereo_l: /groundtruth/pose/snappy_cam/stereo_l | ||
/snappy_cam/stereo_r: /groundtruth/pose/snappy_cam/stereo_r | ||
extra_transform3ds: | ||
- entity_path: /groundtruth/pose/snappy_cam/stereo_l | ||
transform: [ | ||
-0.028228787368606456, -0.999601488301944, 1.2175294828553618e-05, 0.02172388268966517, | ||
0.014401251861751119, -0.00041887083271471837, -0.9998962088597202, -6.605455433829172e-05, | ||
0.999497743623523, -0.028225682131089447, 0.014407337010089172, -0.00048817563004522853, | ||
0.0, 0.0, 0.0, 1.0 | ||
] | ||
from_parent: true | ||
- entity_path: /groundtruth/pose/snappy_cam/stereo_r | ||
transform: [ | ||
-0.011823057800830705, -0.9998701444077991, -0.010950325390841398, -0.057904961033265645, | ||
0.011552991631909482, 0.01081376681432078, -0.9998747875767439, 0.00043766687615362694, | ||
0.9998633625093938, -0.011948086424720228, 0.011423639621249038, -0.00039944945687402214, | ||
0.0, 0.0, 0.0, 1.0 | ||
] | ||
from_parent: true | ||
extra_pinholes: | ||
- entity_path: /groundtruth/pose/snappy_cam/stereo_l | ||
height: 480 | ||
width: 640 | ||
image_from_camera: [278.66723066149086, 0, 319.75221200593535, 0, 278.48991409740296, 241.96858910358173, 0, 0, 1] | ||
- entity_path: /groundtruth/pose/snappy_cam/stereo_r | ||
height: 480 | ||
width: 640 | ||
image_from_camera: [277.61640629770613, 0, 314.8944703346039, 0, 277.63749695723294, 236.04310050462587, 0, 0, 1] | ||
|
15 changes: 15 additions & 0 deletions
15
rerun/examples/cpp-example-ros-bridge/rerun_bridge/package.xml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
<?xml version="1.0"?> | ||
<package format="2"> | ||
<name>rerun_bridge</name> | ||
<version>0.1.0</version> | ||
<description>The rerun_bridge package</description> | ||
<maintainer email="[email protected]">rerun.io</maintainer> | ||
<license>Apache-2.0</license> | ||
<depend>roscpp</depend> | ||
<depend>sensor_msgs</depend> | ||
<depend>nav_msgs</depend> | ||
<depend>cv_bridge</depend> | ||
<depend>geometry_msgs</depend> | ||
<depend>yaml-cpp</depend> | ||
<buildtool_depend>catkin</buildtool_depend> | ||
</package> |
32 changes: 32 additions & 0 deletions
32
rerun/examples/cpp-example-ros-bridge/rerun_bridge/src/rerun_bridge/collection_adapters.hpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
#pragma once | ||
|
||
#include <opencv2/opencv.hpp> | ||
#include <rerun.hpp> | ||
|
||
// Adapters so we can borrow an OpenCV image easily into Rerun images without copying: | ||
template <> | ||
struct rerun::CollectionAdapter<uint8_t, cv::Mat> { | ||
/// Borrow for non-temporary. | ||
Collection<uint8_t> operator()(const cv::Mat& img) { | ||
assert( | ||
"OpenCV matrix was expected have bit depth CV_U8" && CV_MAT_DEPTH(img.type()) == CV_8U | ||
); | ||
|
||
return Collection<uint8_t>::borrow(img.data, img.total() * img.channels()); | ||
} | ||
|
||
// Do a full copy for temporaries (otherwise the data might be deleted when the temporary is destroyed). | ||
Collection<uint8_t> operator()(cv::Mat&& img) { | ||
assert( | ||
"OpenCV matrix was expected have bit depth CV_U8" && CV_MAT_DEPTH(img.type()) == CV_8U | ||
); | ||
|
||
std::vector<uint8_t> img_vec(img.total() * img.channels()); | ||
img_vec.assign(img.data, img.data + img.total() * img.channels()); | ||
return Collection<uint8_t>::take_ownership(std::move(img_vec)); | ||
} | ||
}; | ||
|
||
inline rerun::Collection<rerun::TensorDimension> tensor_shape(const cv::Mat& img) { | ||
return {img.rows, img.cols, img.channels()}; | ||
}; |
86 changes: 86 additions & 0 deletions
86
rerun/examples/cpp-example-ros-bridge/rerun_bridge/src/rerun_bridge/rerun_ros_interface.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
#include <cv_bridge/cv_bridge.h> | ||
#include <geometry_msgs/PoseStamped.h> | ||
#include <sensor_msgs/Image.h> | ||
#include <sensor_msgs/Imu.h> | ||
#include <nav_msgs/Odometry.h> | ||
#include <rerun.hpp> | ||
#include <rerun_bridge/rerun_ros_interface.hpp> | ||
|
||
#include "collection_adapters.hpp" | ||
|
||
void log_imu( | ||
const rerun::RecordingStream& rec, const std::string& entity_path, | ||
const sensor_msgs::Imu::ConstPtr& msg | ||
) { | ||
rec.set_time_seconds("timestamp", msg->header.stamp.toSec()); | ||
|
||
rec.log(entity_path + "/x", rerun::Scalar(msg->linear_acceleration.x)); | ||
rec.log(entity_path + "/y", rerun::Scalar(msg->linear_acceleration.y)); | ||
rec.log(entity_path + "/z", rerun::Scalar(msg->linear_acceleration.z)); | ||
} | ||
|
||
void log_image( | ||
const rerun::RecordingStream& rec, const std::string& entity_path, | ||
const sensor_msgs::Image::ConstPtr& msg | ||
) { | ||
rec.set_time_seconds("timestamp", msg->header.stamp.toSec()); | ||
|
||
cv::Mat img = cv_bridge::toCvCopy(msg, "rgb8")->image; | ||
rec.log(entity_path, rerun::Image(tensor_shape(img), rerun::TensorBuffer::u8(img))); | ||
} | ||
|
||
void log_pose_stamped( | ||
const rerun::RecordingStream& rec, const std::string& entity_path, | ||
const geometry_msgs::PoseStamped::ConstPtr& msg | ||
) { | ||
rec.set_time_seconds("timestamp", msg->header.stamp.toSec()); | ||
|
||
rec.log( | ||
entity_path, | ||
rerun::Transform3D( | ||
rerun::Vector3D(msg->pose.position.x, msg->pose.position.y, msg->pose.position.z), | ||
rerun::Quaternion::from_wxyz( | ||
msg->pose.orientation.w, | ||
msg->pose.orientation.x, | ||
msg->pose.orientation.y, | ||
msg->pose.orientation.z | ||
) | ||
) | ||
); | ||
|
||
// this is a somewhat hacky way to get a trajectory visualization in Rerun | ||
// this should be be easier in the future, see https://github.com/rerun-io/rerun/issues/723 | ||
std::string trajectory_entity_path = "/trajectories/" + entity_path; | ||
rec.log( | ||
trajectory_entity_path, | ||
rerun::Points3D( | ||
{{static_cast<float>(msg->pose.position.x), | ||
static_cast<float>(msg->pose.position.y), | ||
static_cast<float>(msg->pose.position.z)}} | ||
) | ||
); | ||
} | ||
|
||
void log_odometry( | ||
const rerun::RecordingStream& rec, const std::string& entity_path, | ||
const nav_msgs::Odometry::ConstPtr& msg | ||
) { | ||
rec.set_time_seconds("timestamp", msg->header.stamp.toSec()); | ||
|
||
rec.log( | ||
entity_path, | ||
rerun::Transform3D( | ||
rerun::Vector3D( | ||
msg->pose.pose.position.x, | ||
msg->pose.pose.position.y, | ||
msg->pose.pose.position.z | ||
), | ||
rerun::Quaternion::from_wxyz( | ||
msg->pose.pose.orientation.w, | ||
msg->pose.pose.orientation.x, | ||
msg->pose.pose.orientation.y, | ||
msg->pose.pose.orientation.z | ||
) | ||
) | ||
); | ||
} |
Oops, something went wrong.