FastTF is a drop-in replacement for the ros/geometry2.
FastTF implements the interface of tf2_ros::Buffer
without busy-waiting. This results in faster execution:
The chart above shows the CPU consumption for a Buffer/TransformListener pair with multiple threads querying the Buffer. The x-axis shows the number of querying threads (with the ticks 10, 50, 100 and 200). The y-axis shows the CPU usage.
The data was obtained using the perf/publisher.py, perf/listener_new and perf/listener_legacy nodes (these nodes aren't part of the installation). The results where obtained on Ubuntu 20.04, running on a AMD Ryzen 5 PRO 4650U with Radeon Graphics CPU. The compiler used is GCC 9.3.0.
The project is splitted in fast_tf and fast_tf_ros libraries. The first library depends only on Eigen - allowing it to be easier ported to ROS2, eventually. The second library mimics the interfaces of the tf2_ros library - aiming to ease potential switch.
Following features were added w.r.t. tf2_ros:
- cycle detection at insertion time.
- true shortest path computation: a query will evaluate only the nodes which connect the target and source frames.
- no busy waiting: use condition_variables to wake up a query thread when (relevant) new data becomes available.
- check if a link is already static/dynamic - preventing the change.
FastTF depends on Eigen and tf2 (tf2, tf2_ros, tf2_msgs and tf2_eigen). The compilation requires C++17.
When you want to try out this library, replace the tf2_ros classes with fast_tf classes. The code from the c++ transform listener tutorial would look then something like this:
// this replaces tf2_ros/transform_listener.h and tf2_ros/buffer.h
#include <fast_tf/fast_tf_ros.hpp>
// same includes as in the tutorial
#include <ros/ros.h>
#include <geometry_msgs/TransformStamped.h>
#include <geometry_msgs/Twist.h>
int main(int argc, char** argv){
ros::init(argc, argv, "fast_tf_listener");
ros::NodeHandle node;
// turtle-sim related code does not change...
// the only thing that changes is the namespace here
fast_tf::Buffer tfBuffer;
fast_tf::TransformListener tfListener(tfBuffer);
ros::Rate rate(10.0);
while (node.ok()){
geometry_msgs::TransformStamped transformStamped;
try{
transformStamped = tfBuffer.lookupTransform("turtle2", "turtle1", ros::Time::now());
}
catch (tf2::TransformException &ex) {
ROS_WARN("%s",ex.what());
ros::Duration(1.0).sleep();
continue;
}
rate.sleep();
}
return 0;
};
The FastTF library is still in development. Following features aren't supported yet:
- clearing of the buffer on time-jumps.
- message-filters.