Skip to content

Commit

Permalink
rename to message_tf_frame_transformer
Browse files Browse the repository at this point in the history
  • Loading branch information
lreiher committed Apr 12, 2023
1 parent 8925cb0 commit 6d3b078
Show file tree
Hide file tree
Showing 15 changed files with 80 additions and 80 deletions.
8 changes: 4 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.12.0 FATAL_ERROR)
project(generic_transform)
project(message_tf_frame_transformer)

find_package(ros_environment REQUIRED QUIET)
set(ROS_VERSION $ENV{ROS_VERSION})
Expand All @@ -23,7 +23,7 @@ if(${ROS_VERSION} EQUAL 2)
find_package(tf2_ros REQUIRED)
find_package(tf2_sensor_msgs REQUIRED)

add_executable(${PROJECT_NAME} src/GenericTransform.ros2.cpp)
add_executable(${PROJECT_NAME} src/MessageTfFrameTransformer.ros2.cpp)

target_include_directories(${PROJECT_NAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
Expand Down Expand Up @@ -196,7 +196,7 @@ elseif(${ROS_VERSION} EQUAL 1)

## Declare a C++ library
add_library(${PROJECT_NAME}
src/GenericTransform.cpp
src/MessageTfFrameTransformer.cpp
)

## Add cmake target dependencies of the library
Expand All @@ -207,7 +207,7 @@ elseif(${ROS_VERSION} EQUAL 1)
## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
add_executable(${PROJECT_NAME}_node src/GenericTransform.node.cpp)
add_executable(${PROJECT_NAME}_node src/MessageTfFrameTransformer.node.cpp)

## Rename C++ executable without node postfix
set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME ${PROJECT_NAME} PREFIX "")
Expand Down
48 changes: 24 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
# generic_transform
# message_tf_frame_transformer

<p align="center">
<img src="https://img.shields.io/github/v/release/ika-rwth-aachen/generic_transform"/>
<img src="https://img.shields.io/github/license/ika-rwth-aachen/generic_transform"/>
<a href="https://github.com/ika-rwth-aachen/generic_transform/actions/workflows/build.yml"><img src="https://github.com/ika-rwth-aachen/generic_transform/actions/workflows/build.yml/badge.svg"/></a>
<img src="https://img.shields.io/github/v/release/ika-rwth-aachen/message_tf_frame_transformer"/>
<img src="https://img.shields.io/github/license/ika-rwth-aachen/message_tf_frame_transformer"/>
<a href="https://github.com/ika-rwth-aachen/message_tf_frame_transformer/actions/workflows/build.yml"><img src="https://github.com/ika-rwth-aachen/message_tf_frame_transformer/actions/workflows/build.yml/badge.svg"/></a>
<img src="https://img.shields.io/badge/ROS-noetic-blueviolet"/>
<img src="https://img.shields.io/badge/ROS 2-humble|rolling-blueviolet"/>
<a href="https://github.com/ika-rwth-aachen/generic_transform"><img src="https://img.shields.io/github/stars/ika-rwth-aachen/generic_transform?style=social"/></a>
<a href="https://github.com/ika-rwth-aachen/message_tf_frame_transformer"><img src="https://img.shields.io/github/stars/ika-rwth-aachen/message_tf_frame_transformer?style=social"/></a>
</p>

The *generic_transform* package provides a ROS / ROS 2 node(let) to transform ROS messages of arbitrary type to a different coordinate frame. This can be helpful if you cannot or do not want to modify the source code of other ROS nodes that require your data to be valid in a specific coordinate frame. Simply launch the *generic_transform* node and transform arbitrary ROS message to a target coordinate frame.
The *message_tf_frame_transformer* package provides a ROS / ROS 2 node(let) to transform ROS messages of arbitrary type to a different coordinate frame. This can be helpful if you cannot or do not want to modify the source code of other ROS nodes that require your data to be valid in a specific coordinate frame. Simply launch the *message_tf_frame_transformer* node and transform arbitrary ROS message to a target coordinate frame.

- [Installation](#installation)
- [Usage](#usage)
Expand All @@ -22,51 +22,51 @@ The *generic_transform* package provides a ROS / ROS 2 node(let) to transform RO

> :warning: At the time of writing, the ROS package has not yet been released to the public package manager repositories yet. In case the installation fails, you have to install the package from source for now.
The *generic_transform* package is released as an official ROS / ROS 2 package and can easily be installed via a package manager.
The *message_tf_frame_transformer* package is released as an official ROS / ROS 2 package and can easily be installed via a package manager.

```bash
sudo apt install ros-$ROS_DISTRO-generic-transform
sudo apt install ros-$ROS_DISTRO-message-tf-frame-transformer
```

If you would like to install *generic_transform* from source, simply clone this repository into your ROS workspace. All dependencies that are listed in the ROS [`package.xml`](./package.xml) can be installed using [*rosdep*](http://wiki.ros.org/rosdep).
If you would like to install *message_tf_frame_transformer* from source, simply clone this repository into your ROS workspace. All dependencies that are listed in the ROS [`package.xml`](./package.xml) can be installed using [*rosdep*](http://wiki.ros.org/rosdep).

```bash
# generic_transform$
# message_tf_frame_transformer$
rosdep install -r --ignore-src --from-paths .

# ROS 2
# workspace$
colcon build --packages-up-to generic_transform --cmake-args -DCMAKE_BUILD_TYPE=Release
colcon build --packages-up-to message_tf_frame_transformer --cmake-args -DCMAKE_BUILD_TYPE=Release

# ROS
# workspace$
catkin build -DCMAKE_BUILD_TYPE=Release generic_transform
catkin build -DCMAKE_BUILD_TYPE=Release message_tf_frame_transformer
```


## Usage

In order to transform messages on topic `$INPUT_TOPIC` to frame `$TARGET_FRAME_ID` and publish them to topic `$OUTPUT_TOPIC`, the *generic_transform* node can be started with the following topic remappings and parameter setting. The `frame_id` parameter is required, while the topics otherwise default to `~/input` and `~/transformed` in the node's private namespace.
In order to transform messages on topic `$INPUT_TOPIC` to frame `$TARGET_FRAME_ID` and publish them to topic `$OUTPUT_TOPIC`, the *message_tf_frame_transformer* node can be started with the following topic remappings and parameter setting. The `frame_id` parameter is required, while the topics otherwise default to `~/input` and `~/transformed` in the node's private namespace.

```bash
# ROS 2
ros2 run generic_transform generic_transform --ros-args \
ros2 run message_tf_frame_transformer message_tf_frame_transformer --ros-args \
-r \~/input:=$INPUT_TOPIC \
-r \~/transformed:=$OUTPUT_TOPIC \
-p frame_id:=$TARGET_FRAME_ID

# ROS
rosrun generic_transform generic_transform \
rosrun message_tf_frame_transformer message_tf_frame_transformer \
~input:=$INPUT_TOPIC \
~transformed:=$OUTPUT_TOPIC \
_frame_id:=$TARGET_FRAME_ID
```

The provided launch file enables you to directly launch a [`tf2_ros/static_transform_publisher`](http://wiki.ros.org/tf2_ros) alongside the *generic_transform* node. This way you can transform a topic to a new coordinate frame with a single command.
The provided launch file enables you to directly launch a [`tf2_ros/static_transform_publisher`](http://wiki.ros.org/tf2_ros) alongside the *message_tf_frame_transformer* node. This way you can transform a topic to a new coordinate frame with a single command.

```bash
# ROS 2
ros2 launch generic_transform generic_transform.launch.ros2.xml \
ros2 launch message_tf_frame_transformer message_tf_frame_transformer.launch.ros2.xml \
input_topic:=$INPUT_TOPIC \
output_topic:=$OUTPUT_TOPIC \
source_frame_id:=$SOURCE_FRAME_ID \
Expand All @@ -79,7 +79,7 @@ The provided launch file enables you to directly launch a [`tf2_ros/static_trans
yaw:=$YAW

# ROS
roslaunch generic_transform generic_transform.launch \
roslaunch message_tf_frame_transformer message_tf_frame_transformer.launch \
input_topic:=$INPUT_TOPIC \
output_topic:=$OUTPUT_TOPIC \
source_frame_id:=$SOURCE_FRAME_ID \
Expand All @@ -90,7 +90,7 @@ roslaunch generic_transform generic_transform.launch \

## Supported Message Types

The *generic_transform* package is able to support any ROS message type that integrates with [`tf2::doTransform`](http://wiki.ros.org/tf2/Tutorials/Transforming%20your%20own%20datatypes). Currently, the following message types are explicitly supported.
The *message_tf_frame_transformer* package is able to support any ROS message type that integrates with [`tf2::doTransform`](http://wiki.ros.org/tf2/Tutorials/Transforming%20your%20own%20datatypes). Currently, the following message types are explicitly supported.

| ROS | ROS 2 |
| --- | --- |
Expand All @@ -104,9 +104,9 @@ The *generic_transform* package is able to support any ROS message type that int

Through application of preprocessor macros, adding support for a new ROS message type is as easy as adding only two lines of code. Note that the ROS message types have to integrate with [`tf2::doTransform`](http://wiki.ros.org/tf2/Tutorials/Transforming%20your%20own%20datatypes). Feel free to open a pull request to add support for more message types!

1. [`message_types.h`](./include/generic_transform/message_types.h) (ROS) / [`message_types.ros2.hpp`](./include/generic_transform/message_types.ros2.hpp) (ROS 2)
1. [`message_types.h`](./include/message_tf_frame_transformer/message_types.h) (ROS) / [`message_types.ros2.hpp`](./include/message_tf_frame_transformer/message_types.ros2.hpp) (ROS 2)
- include required message headers
1. [`message_types.macro`](./include/generic_transform/message_types.h) (ROS) / [`message_types.ros2.macro`](./include/generic_transform/message_types.ros2.hpp) (ROS 2)
1. [`message_types.macro`](./include/message_tf_frame_transformer/message_types.h) (ROS) / [`message_types.ros2.macro`](./include/message_tf_frame_transformer/message_types.ros2.hpp) (ROS 2)
- define information about the new message type by calling the `MESSAGE_TYPE` macro
- `TYPE`: ROS message type (e.g. `geometry_msgs::msg::PointStamped`)
- `NAME`: *(ROS 2 only)* ROS message type name (e.g. `geometry_msgs/msg/PointStamped`)
Expand All @@ -118,15 +118,15 @@ Through application of preprocessor macros, adding support for a new ROS message

| Package | Node | Description |
| --- | --- | --- |
| `generic_transform` | `generic_transform` | transform arbitrary ROS messages to a different coordinate frame |
| `message_tf_frame_transformer` | `message_tf_frame_transformer` | transform arbitrary ROS messages to a different coordinate frame |

##### ROS

| Package | Node | Nodelet | Description |
| --- | --- | --- | --- |
| `generic_transform` | `generic_transform` | `GenericTransform` | transform arbitrary ROS messages to a different coordinate frame |
| `message_tf_frame_transformer` | `message_tf_frame_transformer` | `MessageTfFrameTransformer` | transform arbitrary ROS messages to a different coordinate frame |

### generic_transform/generic_transform
### message_tf_frame_transformer/message_tf_frame_transformer

#### Subscribed Topics

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ SOFTWARE.
#include <tf2_ros/transform_listener.h>


namespace generic_transform {
namespace message_tf_frame_transformer {

class GenericTransform : public nodelet::Nodelet {
class MessageTfFrameTransformer : public nodelet::Nodelet {

protected:

Expand Down Expand Up @@ -79,7 +79,7 @@ class GenericTransform : public nodelet::Nodelet {


template <typename T>
void GenericTransform::transform(const typename T::ConstPtr& msg) {
void MessageTfFrameTransformer::transform(const typename T::ConstPtr& msg) {

// transform
T tf_msg;
Expand All @@ -96,4 +96,4 @@ void GenericTransform::transform(const typename T::ConstPtr& msg) {
}


} // namespace generic_transform
} // namespace message_tf_frame_transformer
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,13 @@ SOFTWARE.
#include <tf2_ros/transform_listener.h>


namespace generic_transform {
namespace message_tf_frame_transformer {

class GenericTransform : public rclcpp::Node {
class MessageTfFrameTransformer : public rclcpp::Node {

public:

GenericTransform();
MessageTfFrameTransformer();

protected:

Expand Down Expand Up @@ -82,7 +82,7 @@ class GenericTransform : public rclcpp::Node {


template <typename T>
void GenericTransform::transform(const T& msg) {
void MessageTfFrameTransformer::transform(const T& msg) {

// transform
T tf_msg;
Expand All @@ -105,4 +105,4 @@ void GenericTransform::transform(const T& msg) {
}


} // namespace generic_transform
} // namespace message_tf_frame_transformer
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Example:
#define MESSAGE_TYPE(TYPE) \
std::cout << "The ROS message type " << #TYPE << " is supported. "; \
std::cout << std::endl;
#include "generic_transform/message_types.macro"
#include "message_tf_frame_transformer/message_types.macro"
#undef MESSAGE_TYPE

============================================================================= */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Example:
#define MESSAGE_TYPE(TYPE, NAME) \
std::cout << "The ROS message type " << #TYPE << " is supported. "; \
std::cout << std::endl;
#include "generic_transform/message_types.ros2.macro"
#include "message_tf_frame_transformer/message_types.ros2.macro"
#undef MESSAGE_TYPE

============================================================================= */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

<node pkg="tf2_ros" type="static_transform_publisher" name="$(anon static_transform_publisher)" args="$(arg xyzrpy) $(arg source_frame_id) $(arg target_frame_id)" output="screen" />

<node pkg="nodelet" type="nodelet" name="$(anon generic_transform)" args="standalone generic_transform/GenericTransform" output="screen">
<node pkg="nodelet" type="nodelet" name="$(anon message_tf_frame_transformer)" args="standalone message_tf_frame_transformer/MessageTfFrameTransformer" output="screen">
<remap from="~input" to="$(arg input_topic)" />
<remap from="~transformed" to="$(arg output_topic)" />
<param name="frame_id" value="$(arg target_frame_id)" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

<node pkg="tf2_ros" exec="static_transform_publisher" name="static_transform_publisher" args="--x $(var x) --y $(var y) --z $(var z) --roll $(var roll) --pitch $(var pitch) --yaw $(var yaw) --frame-id $(var source_frame_id) --child-frame-id $(var target_frame_id)" output="screen" />

<node pkg="generic_transform" exec="generic_transform" name="generic_transform" output="screen">
<node pkg="message_tf_frame_transformer" exec="message_tf_frame_transformer" name="message_tf_frame_transformer" output="screen">
<remap from="~/input" to="$(var input_topic)" />
<remap from="~/transformed" to="$(var output_topic)" />
<param name="frame_id" value="$(var target_frame_id)" />
Expand Down
6 changes: 3 additions & 3 deletions nodelet_plugins.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<library path="lib/libgeneric_transform">
<class name="generic_transform/GenericTransform" type="generic_transform::GenericTransform" base_class_type="nodelet::Nodelet">
<library path="lib/libmessage_tf_frame_transformer">
<class name="message_tf_frame_transformer/MessageTfFrameTransformer" type="message_tf_frame_transformer::MessageTfFrameTransformer" base_class_type="nodelet::Nodelet">
<description>
generic_transform nodelet
message_tf_frame_transformer nodelet
</description>
</class>
</library>
2 changes: 1 addition & 1 deletion package.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<package format="3">

<name>generic_transform</name>
<name>message_tf_frame_transformer</name>
<version>1.0.0</version>
<description>Transforms messages of arbitrary type to a different frame using tf2::doTransform</description>

Expand Down
30 changes: 15 additions & 15 deletions src/GenericTransform.cpp → src/MessageTfFrameTransformer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,26 +25,26 @@ SOFTWARE.
*/


#include <generic_transform/GenericTransform.h>
#include <generic_transform/message_types.h>
#include <message_tf_frame_transformer/MessageTfFrameTransformer.h>
#include <message_tf_frame_transformer/message_types.h>
#include <pluginlib/class_list_macros.h>
#include <ros/message_traits.h>


PLUGINLIB_EXPORT_CLASS(generic_transform::GenericTransform, nodelet::Nodelet)
PLUGINLIB_EXPORT_CLASS(message_tf_frame_transformer::MessageTfFrameTransformer, nodelet::Nodelet)


namespace generic_transform {
namespace message_tf_frame_transformer {


const std::string GenericTransform::kInputTopic = "input";
const std::string MessageTfFrameTransformer::kInputTopic = "input";

const std::string GenericTransform::kOutputTopic = "transformed";
const std::string MessageTfFrameTransformer::kOutputTopic = "transformed";

const std::string GenericTransform::kFrameIdParam = "frame_id";
const std::string MessageTfFrameTransformer::kFrameIdParam = "frame_id";


void GenericTransform::onInit() {
void MessageTfFrameTransformer::onInit() {

node_handle_ = this->getMTNodeHandle();
private_node_handle_ = this->getMTPrivateNodeHandle();
Expand All @@ -54,7 +54,7 @@ void GenericTransform::onInit() {
}


void GenericTransform::loadParameters() {
void MessageTfFrameTransformer::loadParameters() {

bool found = private_node_handle_.getParam(kFrameIdParam, frame_id_);
if (!found) {
Expand All @@ -68,17 +68,17 @@ void GenericTransform::loadParameters() {
}


void GenericTransform::setup() {
void MessageTfFrameTransformer::setup() {

// listen to tf
tf_listener_ = std::make_shared<tf2_ros::TransformListener>(tf_buffer_);

// setup subscriber to detect message type
subscriber_ = private_node_handle_.subscribe(kInputTopic, 10, &GenericTransform::detectMessageType, this);
subscriber_ = private_node_handle_.subscribe(kInputTopic, 10, &MessageTfFrameTransformer::detectMessageType, this);
}


void GenericTransform::detectMessageType(const topic_tools::ShapeShifter::ConstPtr& generic_msg) {
void MessageTfFrameTransformer::detectMessageType(const topic_tools::ShapeShifter::ConstPtr& generic_msg) {

const std::string msg_type = generic_msg->getDataType();
const std::string& msg_type_md5 = generic_msg->getMD5Sum();
Expand All @@ -101,12 +101,12 @@ void GenericTransform::detectMessageType(const topic_tools::ShapeShifter::ConstP
subscriber_ = private_node_handle_.subscribe( \
kInputTopic, \
10, \
&GenericTransform::transform<TYPE>, \
&MessageTfFrameTransformer::transform<TYPE>, \
this \
); \
\
}
#include "generic_transform/message_types.macro"
#include "message_tf_frame_transformer/message_types.macro"
#undef MESSAGE_TYPE
else {
NODELET_ERROR("Transforming message type '%s' is not supported",
Expand All @@ -116,4 +116,4 @@ void GenericTransform::detectMessageType(const topic_tools::ShapeShifter::ConstP
}


} // namespace generic_transform
} // namespace message_tf_frame_transformer
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,17 @@ SOFTWARE.
#include <nodelet/loader.h>
#include <ros/ros.h>

#include <generic_transform/GenericTransform.h>
#include <message_tf_frame_transformer/MessageTfFrameTransformer.h>


int main(int argc, char** argv) {

ros::init(argc, argv, "generic_transform");
ros::init(argc, argv, "message_tf_frame_transformer");
nodelet::Loader nodelet;
nodelet::M_string remap(ros::names::getRemappings());
nodelet::V_string nargv;
std::string nodelet_name = ros::this_node::getName();
nodelet.load(nodelet_name, "generic_transform/GenericTransform", remap, nargv);
nodelet.load(nodelet_name, "message_tf_frame_transformer/MessageTfFrameTransformer", remap, nargv);
ros::spin();
return 0;
}
Loading

0 comments on commit 6d3b078

Please sign in to comment.