Skip to content

Commit cd59e8d

Browse files
authored
Merge pull request #1 from element-robotics/feature/tf2
Upgrade to tf2
2 parents 6a79be1 + 4dea726 commit cd59e8d

File tree

11 files changed

+85
-71
lines changed

11 files changed

+85
-71
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ This is the main Robot-Centric Elevation Mapping node. It uses the distance sens
145145

146146
The robot pose and covariance.
147147

148-
* **`/tf`** ([tf/tfMessage])
148+
* **`/tf`** ([tf2_msgs/TFMessage])
149149

150150
The transformation tree.
151151

@@ -432,7 +432,7 @@ Please report bugs and request features using the [Issue Tracker](https://github
432432
[grid_map_msgs/GridMap]: https://github.com/anybotics/grid_map/blob/master/grid_map_msgs/msg/GridMap.msg
433433
[sensor_msgs/PointCloud2]: http://docs.ros.org/api/sensor_msgs/html/msg/PointCloud2.html
434434
[geometry_msgs/PoseWithCovarianceStamped]: http://docs.ros.org/api/geometry_msgs/html/msg/PoseWithCovarianceStamped.html
435-
[tf/tfMessage]: http://docs.ros.org/kinetic/api/tf/html/msg/tfMessage.html
435+
[tf2_msgs/TFMessage]: http://docs.ros.org/en/noetic/api/tf2_msgs/html/msg/TFMessage.html
436436
[std_srvs/Empty]: http://docs.ros.org/api/std_srvs/html/srv/Empty.html
437437
[grid_map_msgs/GetGridMap]: https://github.com/anybotics/grid_map/blob/master/grid_map_msgs/srv/GetGridMap.srv
438438
[grid_map_msgs/ProcessFile]: https://github.com/ANYbotics/grid_map/blob/master/grid_map_msgs/srv/ProcessFile.srv

elevation_mapping/CMakeLists.txt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ add_compile_options(-Wall -Wextra -Wpedantic)
77
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
88

99
set(
10-
CATKIN_PACKAGE_DEPENDENCIES
10+
CATKIN_PACKAGE_DEPENDENCIES
1111
eigen_conversions
1212
grid_map_core
1313
grid_map_ros
@@ -20,11 +20,13 @@ set(
2020
roscpp
2121
sensor_msgs
2222
std_msgs
23-
tf
24-
tf_conversions
23+
tf2
24+
tf2_ros
25+
tf2_eigen
26+
tf2_geometry_msgs
2527
)
2628

27-
find_package(catkin REQUIRED
29+
find_package(catkin REQUIRED
2830
COMPONENTS
2931
${CATKIN_PACKAGE_DEPENDENCIES}
3032
)
@@ -111,7 +113,7 @@ target_link_libraries(${PROJECT_NAME}
111113
#############
112114

113115
install(
114-
TARGETS
116+
TARGETS
115117
${PROJECT_NAME}
116118
${PROJECT_NAME}_pcl_types
117119
${PROJECT_NAME}_library

elevation_mapping/include/elevation_mapping/ElevationMapping.hpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
#include <sensor_msgs/PointCloud2.h>
2222
#include <std_srvs/Empty.h>
2323
#include <std_srvs/Trigger.h>
24-
#include <tf/transform_listener.h>
24+
#include <tf2_ros/buffer.h>
25+
#include <tf2_ros/transform_listener.h>
2526

2627
// Eigen
2728
#include <Eigen/Core>
@@ -298,8 +299,9 @@ class ElevationMapping {
298299
//! Cache for the robot pose messages.
299300
message_filters::Cache<geometry_msgs::PoseWithCovarianceStamped> robotPoseCache_;
300301

301-
//! TF listener and broadcaster.
302-
tf::TransformListener transformListener_;
302+
//! TF listener and buffer.
303+
tf2_ros::Buffer transformBuffer_;
304+
tf2_ros::TransformListener transformListener_;
303305

304306
struct Parameters {
305307
//! Size of the cache for the robot pose messages.

elevation_mapping/include/elevation_mapping/sensor_processors/SensorProcessorBase.hpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010

1111
// ROS
1212
#include <ros/ros.h>
13-
#include <tf/transform_listener.h>
13+
#include <tf2_ros/buffer.h>
14+
#include <tf2_ros/transform_listener.h>
1415

1516
// Eigen
1617
#include <Eigen/Core>
@@ -139,8 +140,9 @@ class SensorProcessorBase {
139140
//! ROS nodehandle.
140141
ros::NodeHandle& nodeHandle_;
141142

142-
//! TF transform listener.
143-
tf::TransformListener transformListener_;
143+
//! TF transform listener and buffer.
144+
tf2_ros::Buffer transformBuffer_;
145+
tf2_ros::TransformListener transformListener_;
144146

145147
//! Rotation from Base to Sensor frame (C_SB)
146148
kindr::RotationMatrixD rotationBaseToSensor_;

elevation_mapping/package.xml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@
2929
<depend>roscpp</depend>
3030
<depend>sensor_msgs</depend>
3131
<depend>std_msgs</depend>
32-
<depend>tf</depend>
33-
<depend>tf_conversions</depend>
32+
<depend>tf2</depend>
33+
<depend>tf2_ros</depend>
34+
<depend>tf2_eigen</depend>
35+
<depend>tf2_geometry_msgs</depend>
3436

3537
<!-- <test_depend>cmake_code_coverage</test_depend> -->
3638
<test_depend>grid_map_filters</test_depend>

elevation_mapping/src/ElevationMapping.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@
2121
#include <grid_map_ros/grid_map_ros.hpp>
2222
#include <kindr/Core>
2323
#include <kindr_ros/kindr_ros.hpp>
24+
#include <geometry_msgs/TransformStamped.h>
25+
#include <geometry_msgs/PointStamped.h>
26+
#include <tf2/LinearMath/Transform.h>
27+
#include <tf2_geometry_msgs/tf2_geometry_msgs.h>
2428

2529
#include "elevation_mapping/ElevationMap.hpp"
2630
#include "elevation_mapping/ElevationMapping.hpp"
@@ -35,6 +39,7 @@ namespace elevation_mapping {
3539
ElevationMapping::ElevationMapping(ros::NodeHandle& nodeHandle)
3640
: nodeHandle_(nodeHandle),
3741
inputSources_(nodeHandle_),
42+
transformListener_(transformBuffer_),
3843
map_(nodeHandle),
3944
robotMotionMapUpdater_(nodeHandle),
4045
receivedFirstMatchingPointcloudAndPose_(false) {
@@ -542,8 +547,8 @@ bool ElevationMapping::updateMapLocation() {
542547
geometry_msgs::PointStamped trackPointTransformed;
543548

544549
try {
545-
transformListener_.transformPoint(map_.getFrameId(), trackPoint, trackPointTransformed);
546-
} catch (tf::TransformException& ex) {
550+
trackPointTransformed = transformBuffer_.transform(trackPoint, map_.getFrameId());
551+
} catch (tf2::TransformException& ex) {
547552
ROS_ERROR("%s", ex.what());
548553
return false;
549554
}
@@ -627,12 +632,14 @@ bool ElevationMapping::initializeElevationMap() {
627632
if (parameters.initializeElevationMap_) {
628633
if (static_cast<elevation_mapping::InitializationMethods>(parameters.initializationMethod_) ==
629634
elevation_mapping::InitializationMethods::PlanarFloorInitializer) {
630-
tf::StampedTransform transform;
635+
geometry_msgs::TransformStamped transform_msg;
636+
tf2::Stamped<tf2::Transform> transform;
631637

632638
// Listen to transform between mapFrameId_ and targetFrameInitSubmap_ and use z value for initialization
633639
try {
634-
transformListener_.waitForTransform(parameters.mapFrameId_, parameters.targetFrameInitSubmap_, ros::Time(0), ros::Duration(5.0));
635-
transformListener_.lookupTransform(parameters.mapFrameId_, parameters.targetFrameInitSubmap_, ros::Time(0), transform);
640+
transform_msg = transformBuffer_.lookupTransform(parameters.mapFrameId_, parameters.targetFrameInitSubmap_, ros::Time(0), ros::Duration(5.0));
641+
tf2::fromMsg(transform_msg, transform);
642+
636643
ROS_DEBUG_STREAM("Initializing with x: " << transform.getOrigin().x() << " y: " << transform.getOrigin().y()
637644
<< " z: " << transform.getOrigin().z());
638645

@@ -645,7 +652,7 @@ bool ElevationMapping::initializeElevationMap() {
645652
map_.setRawSubmapHeight(positionRobot, transform.getOrigin().z() + parameters.initSubmapHeightOffset_,
646653
parameters.initSubmapVariance_, parameters.lengthInXInitSubmap_, parameters.lengthInYInitSubmap_);
647654
return true;
648-
} catch (tf::TransformException& ex) {
655+
} catch (tf2::TransformException& ex) {
649656
ROS_DEBUG("%s", ex.what());
650657
ROS_WARN("Could not initialize elevation map with constant height. (This warning can be ignored if TF tree is not available.)");
651658
return false;

elevation_mapping/src/sensor_processors/SensorProcessorBase.cpp

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
#include "elevation_mapping/sensor_processors/SensorProcessorBase.hpp"
1010

11+
// ROS
12+
#include <geometry_msgs/TransformStamped.h>
13+
1114
// PCL
1215
#include <pcl/common/io.h>
1316
#include <pcl/common/transforms.h>
@@ -17,7 +20,7 @@
1720
#include <pcl/pcl_base.h>
1821

1922
// TF
20-
#include <tf_conversions/tf_eigen.h>
23+
#include <tf2_eigen/tf2_eigen.h>
2124

2225
// STL
2326
#include <cmath>
@@ -29,7 +32,9 @@
2932
namespace elevation_mapping {
3033

3134
SensorProcessorBase::SensorProcessorBase(ros::NodeHandle& nodeHandle, const GeneralParameters& generalConfig)
32-
: nodeHandle_(nodeHandle), firstTfAvailable_(false) {
35+
: nodeHandle_(nodeHandle),
36+
transformListener_(transformBuffer_),
37+
firstTfAvailable_(false) {
3338
pcl::console::setVerbosityLevel(pcl::console::L_ERROR);
3439
transformationSensorToMap_.setIdentity();
3540
generalParameters_ = generalConfig;
@@ -92,31 +97,33 @@ bool SensorProcessorBase::process(const PointCloudType::ConstPtr pointCloudInput
9297
bool SensorProcessorBase::updateTransformations(const ros::Time& timeStamp) {
9398
const Parameters parameters{parameters_.getData()};
9499
try {
95-
transformListener_.waitForTransform(sensorFrameId_, generalParameters_.mapFrameId_, timeStamp, ros::Duration(1.0));
96-
97-
tf::StampedTransform transformTf;
98-
transformListener_.lookupTransform(generalParameters_.mapFrameId_, sensorFrameId_, timeStamp, transformTf);
99-
poseTFToEigen(transformTf, transformationSensorToMap_);
100100

101-
transformListener_.lookupTransform(generalParameters_.robotBaseFrameId_, sensorFrameId_, timeStamp,
102-
transformTf); // TODO(max): Why wrong direction?
103-
Eigen::Affine3d transform;
104-
poseTFToEigen(transformTf, transform);
105-
rotationBaseToSensor_.setMatrix(transform.rotation().matrix());
106-
translationBaseToSensorInBaseFrame_.toImplementation() = transform.translation();
107-
108-
transformListener_.lookupTransform(generalParameters_.mapFrameId_, generalParameters_.robotBaseFrameId_, timeStamp,
109-
transformTf); // TODO(max): Why wrong direction?
110-
poseTFToEigen(transformTf, transform);
111-
rotationMapToBase_.setMatrix(transform.rotation().matrix());
112-
translationMapToBaseInMapFrame_.toImplementation() = transform.translation();
101+
geometry_msgs::TransformStamped transformGeom;
102+
transformGeom = transformBuffer_.lookupTransform(generalParameters_.mapFrameId_, sensorFrameId_, timeStamp, ros::Duration(1.0));
103+
transformationSensorToMap_ = tf2::transformToEigen(transformGeom);
104+
105+
transformGeom = transformBuffer_.lookupTransform(generalParameters_.robotBaseFrameId_, sensorFrameId_, timeStamp,
106+
ros::Duration(1.0)); // TODO(max): Why wrong direction?
107+
Eigen::Quaterniond rotationQuaternion;
108+
tf2::fromMsg(transformGeom.transform.rotation, rotationQuaternion);
109+
rotationBaseToSensor_.setMatrix(rotationQuaternion.toRotationMatrix());
110+
Eigen::Vector3d translationVector;
111+
tf2::fromMsg(transformGeom.transform.translation, translationVector);
112+
translationBaseToSensorInBaseFrame_.toImplementation() = translationVector;
113+
114+
transformGeom = transformBuffer_.lookupTransform(generalParameters_.mapFrameId_, generalParameters_.robotBaseFrameId_,
115+
timeStamp, ros::Duration(1.0)); // TODO(max): Why wrong direction?
116+
tf2::fromMsg(transformGeom.transform.rotation, rotationQuaternion);
117+
rotationMapToBase_.setMatrix(rotationQuaternion.toRotationMatrix());
118+
tf2::fromMsg(transformGeom.transform.translation, translationVector);
119+
translationMapToBaseInMapFrame_.toImplementation() = translationVector;
113120

114121
if (!firstTfAvailable_) {
115122
firstTfAvailable_ = true;
116123
}
117124

118125
return true;
119-
} catch (tf::TransformException& ex) {
126+
} catch (tf2::TransformException& ex) {
120127
if (!firstTfAvailable_) {
121128
return false;
122129
}
@@ -131,22 +138,20 @@ bool SensorProcessorBase::transformPointCloud(PointCloudType::ConstPtr pointClou
131138
timeStamp.fromNSec(1000 * pointCloud->header.stamp);
132139
const std::string inputFrameId(pointCloud->header.frame_id);
133140

134-
tf::StampedTransform transformTf;
135141
try {
136-
transformListener_.waitForTransform(targetFrame, inputFrameId, timeStamp, ros::Duration(1.0), ros::Duration(0.001));
137-
transformListener_.lookupTransform(targetFrame, inputFrameId, timeStamp, transformTf);
138-
} catch (tf::TransformException& ex) {
142+
geometry_msgs::TransformStamped transformGeom;
143+
transformGeom = transformBuffer_.lookupTransform(targetFrame, inputFrameId, timeStamp, ros::Duration(1.0)); // FIXME: missing 0.001 retry duration
144+
Eigen::Affine3d transform = tf2::transformToEigen(transformGeom);
145+
pcl::transformPointCloud(*pointCloud, *pointCloudTransformed, transform.cast<float>());
146+
pointCloudTransformed->header.frame_id = targetFrame;
147+
148+
ROS_DEBUG_THROTTLE(5, "Point cloud transformed to frame %s for time stamp %f.", targetFrame.c_str(),
149+
pointCloudTransformed->header.stamp / 1000.0);
150+
} catch (tf2::TransformException& ex) {
139151
ROS_ERROR("%s", ex.what());
140152
return false;
141153
}
142154

143-
Eigen::Affine3d transform;
144-
poseTFToEigen(transformTf, transform);
145-
pcl::transformPointCloud(*pointCloud, *pointCloudTransformed, transform.cast<float>());
146-
pointCloudTransformed->header.frame_id = targetFrame;
147-
148-
ROS_DEBUG_THROTTLE(5, "Point cloud transformed to frame %s for time stamp %f.", targetFrame.c_str(),
149-
pointCloudTransformed->header.stamp / 1000.0);
150155
return true;
151156
}
152157

elevation_mapping_demos/launch/simple_demo.launch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
</node> -->
1818

1919
<!-- Setup a transform between the world and the robot -->
20-
<node pkg="tf" type="static_transform_publisher" name="world_to_robot" args="2.0 6.0 0 0 0.0 0 /map /base 100"/>
20+
<node pkg="tf2_ros" type="static_transform_publisher" name="world_to_robot" args="2.0 6.0 0.0 0.0 0.0 0.0 /map /base"/>
2121

2222
<!-- Launch visualizations for the resulting elevation map -->
2323
<include file="$(find elevation_mapping_demos)/launch/visualization.launch" />

elevation_mapping_demos/launch/turtlesim3_waffle_demo.launch

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
<arg name="gui" value="false"/> <!-- Launch the user interface window of Gazebo-->
1616
<arg name="headless" value="false"/> <!-- Enable gazebo state log recording-->
1717
<arg name="debug" value="false"/> <!-- Start gzserver (Gazebo Server) in debug mode using gdb-->
18+
<arg name="verbose" value="false"/> <!-- Start gazebo in verbose mode-->
1819
</include>
1920

2021
<!-- Load robot_description param for tf, rviz and gazebo spawn. -->

elevation_mapping_demos/package.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<exec_depend>grid_map_visualization</exec_depend>
2020
<exec_depend>pcl_ros</exec_depend>
2121
<exec_depend>robot_state_publisher</exec_depend>
22-
<exec_depend>tf</exec_depend>
22+
<exec_depend>tf2_ros</exec_depend>
2323
<exec_depend>turtlebot3_gazebo</exec_depend>
2424
<exec_depend>xacro</exec_depend>
2525

0 commit comments

Comments
 (0)