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>
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>
2932namespace elevation_mapping {
3033
3134SensorProcessorBase::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
9297bool 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
0 commit comments