diff --git a/CMakeLists.txt b/CMakeLists.txt index db75b43b88ef363e7e072c810bfa0d2832f57a5a..eb88c7943c23af0bca3d937fe975c1c4a0f83bc3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,7 +30,7 @@ include(cmake/test.cmake) project(dynamic_graph_bridge) -SET(CATKIN_REQUIRED_COMPONENTS roscpp std_msgs message_generation std_srvs geometry_msgs sensor_msgs tf) +SET(CATKIN_REQUIRED_COMPONENTS roscpp std_msgs message_generation std_srvs geometry_msgs sensor_msgs tf2_ros) SET(CATKIN_DEPENDS_LIBRARIES ros_bridge sot_loader) ## LAAS cmake submodule part @@ -89,7 +89,7 @@ SET(SOT_PKGNAMES dynamic_graph_bridge_msgs) add_required_dependency(roscpp) -add_required_dependency(tf) +add_required_dependency(tf2_ros) add_required_dependency("realtime_tools >= 1.8") add_required_dependency(tf2_bullet) @@ -178,16 +178,16 @@ ENDIF(BUILD_PYTHON_INTERFACE) # Stand alone embedded intepreter with a robot controller. add_executable(geometric_simu src/geometric_simu.cpp src/sot_loader.cpp src/sot_loader_basic.cpp) -pkg_config_use_dependency(geometric_simu tf) +pkg_config_use_dependency(geometric_simu tf2_ros) pkg_config_use_dependency(geometric_simu roscpp) pkg_config_use_dependency(geometric_simu dynamic-graph) -target_link_libraries(geometric_simu ros_bridge tf ${Boost_LIBRARIES} ${CMAKE_DL_LIBS}) +target_link_libraries(geometric_simu ros_bridge tf2_ros ${Boost_LIBRARIES} ${CMAKE_DL_LIBS}) # Sot loader library add_library(sot_loader src/sot_loader.cpp src/sot_loader_basic.cpp) pkg_config_use_dependency(sot_loader dynamic-graph) pkg_config_use_dependency(sot_loader sot-core) -target_link_libraries(sot_loader ${Boost_LIBRARIES} roscpp ros_bridge tf) +target_link_libraries(sot_loader ${Boost_LIBRARIES} roscpp ros_bridge tf2_ros) install(TARGETS sot_loader DESTINATION lib) add_subdirectory(src) @@ -200,7 +200,7 @@ generate_messages( DEPENDENCIES std_msgs ) # This is necessary so that the pc file generated by catking is similar to the on # done directly by jrl-cmake-modules -catkin_package(CATKIN_DEPENDS message_runtime roscpp realtime_tools tf2_bullet ${SOT_PKGNAMES} tf +catkin_package(CATKIN_DEPENDS message_runtime roscpp realtime_tools tf2_bullet ${SOT_PKGNAMES} tf2_ros LIBRARIES ${CATKIN_DEPENDS_LIBRARIES} ) diff --git a/include/dynamic_graph_bridge/sot_loader.hh b/include/dynamic_graph_bridge/sot_loader.hh index e70ac484a806959e9432c1473603aef78058b0e0..60840a07d67d85e3f3df4412a99a0fde48f6b471 100644 --- a/include/dynamic_graph_bridge/sot_loader.hh +++ b/include/dynamic_graph_bridge/sot_loader.hh @@ -39,7 +39,7 @@ #include "ros/ros.h" #include "std_srvs/Empty.h" #include <sensor_msgs/JointState.h> -#include <tf/transform_broadcaster.h> +#include <tf2_ros/transform_broadcaster.h> // Sot Framework includes #include <sot/core/debug.hh> @@ -83,8 +83,8 @@ class SotLoader : public SotLoaderBasic { virtual void startControlLoop(); // Robot Pose Publisher - tf::TransformBroadcaster freeFlyerPublisher_; - tf::Transform freeFlyerPose_; + tf2_ros::TransformBroadcaster freeFlyerPublisher_; + geometry_msgs::TransformStamped freeFlyerPose_; public: SotLoader(); diff --git a/package.xml b/package.xml index 0dfcefc5c265be0a223c5960463b521ff9292080..52ec228f93939474e32dfd22c333c06840c84982 100644 --- a/package.xml +++ b/package.xml @@ -23,7 +23,7 @@ <build_depend>roscpp</build_depend> <build_depend>geometry_msgs</build_depend> <build_depend>sensor_msgs</build_depend> - <build_depend>tf</build_depend> + <build_depend>tf2_ros</build_depend> <build_depend>realtime_tools</build_depend> <build_depend>message_generation</build_depend> <build_depend>message_runtime</build_depend> @@ -39,7 +39,7 @@ <exec_depend>roscpp</exec_depend> <exec_depend>geometry_msgs</exec_depend> <exec_depend>sensor_msgs</exec_depend> - <exec_depend>tf</exec_depend> + <exec_depend>tf2_ros</exec_depend> <exec_depend>realtime_tools</exec_depend> <exec_depend>message_generation</exec_depend> <exec_depend>message_runtime</exec_depend> diff --git a/src/ros_tf_listener.cpp b/src/ros_tf_listener.cpp index da89ca31888140843c29259662805ce53adf17e0..87332493b30e798a2135883925837e440de913db 100644 --- a/src/ros_tf_listener.cpp +++ b/src/ros_tf_listener.cpp @@ -9,19 +9,21 @@ sot::MatrixHomogeneous& TransformListenerData::getTransform( sot::MatrixHomogeneous& res, int time) { static const ros::Time rosTime(0); try { - listener.lookupTransform(toFrame, fromFrame, rosTime, transform); - } catch (const tf::TransformException& ex) { + transform = buffer.lookupTransform(toFrame, fromFrame, rosTime); + } catch (const tf2::TransformException& ex) { res.setIdentity(); std::ostringstream oss; oss << "Enable to get transform at time " << time << ": " << ex.what(); entity->SEND_WARNING_STREAM_MSG(oss.str()); return res; } - for (int r = 0; r < 3; ++r) { - for (int c = 0; c < 3; ++c) - res.linear()(r, c) = transform.getBasis().getRow(r)[c]; - res.translation()[r] = transform.getOrigin()[r]; - } + + const geometry_msgs::TransformStamped::_transform_type::_rotation_type& + quat = transform.transform.rotation; + const geometry_msgs::TransformStamped::_transform_type::_translation_type& + trans = transform.transform.translation; + res.linear() = sot::Quaternion(quat.w, quat.x, quat.y, quat.z).matrix(); + res.translation() << trans.x, trans.y, trans.z; return res; } } // namespace internal diff --git a/src/ros_tf_listener.hh b/src/ros_tf_listener.hh index 6f0b4570087701ced1efc725a2eae4fb8819e61c..adf4b5db66fe3641a52b361577975b4df9e151b1 100644 --- a/src/ros_tf_listener.hh +++ b/src/ros_tf_listener.hh @@ -3,7 +3,8 @@ #include <boost/bind.hpp> -#include <tf/transform_listener.h> +#include <tf2_ros/transform_listener.h> +#include <geometry_msgs/TransformStamped.h> #include <dynamic-graph/entity.h> #include <dynamic-graph/signal.h> @@ -19,15 +20,15 @@ struct TransformListenerData { typedef Signal<sot::MatrixHomogeneous, int> signal_t; RosTfListener* entity; - tf::TransformListener& listener; + tf2_ros::Buffer& buffer; const std::string toFrame, fromFrame; - tf::StampedTransform transform; + geometry_msgs::TransformStamped transform; signal_t signal; - TransformListenerData(RosTfListener* e, tf::TransformListener& l, + TransformListenerData(RosTfListener* e, tf2_ros::Buffer& b, const std::string& to, const std::string& from, const std::string& signame) - : entity(e), listener(l), toFrame(to), fromFrame(from), signal(signame) { + : entity(e), buffer(b), toFrame(to), fromFrame(from), signal(signame) { signal.setFunction( boost::bind(&TransformListenerData::getTransform, this, _1, _2)); } @@ -42,7 +43,11 @@ class RosTfListener : public Entity { public: typedef internal::TransformListenerData TransformListenerData; - RosTfListener(const std::string& name) : Entity(name) { + RosTfListener(const std::string& name) + : Entity(name) + , buffer() + , listener(buffer, rosInit(), false) + { std::string docstring = "\n" " Add a signal containing the transform between two frames.\n" @@ -73,7 +78,7 @@ class RosTfListener : public Entity { signalName % getName() % signame; TransformListenerData* tld = - new TransformListenerData(this, listener, to, from, signalName.str()); + new TransformListenerData(this, buffer, to, from, signalName.str()); signalRegistration(tld->signal); listenerDatas[signame] = tld; } @@ -81,7 +86,8 @@ class RosTfListener : public Entity { private: typedef std::map<std::string, TransformListenerData*> Map_t; Map_t listenerDatas; - tf::TransformListener listener; + tf2_ros::Buffer buffer; + tf2_ros::TransformListener listener; }; } // end of namespace dynamicgraph. diff --git a/src/sot_loader.cpp b/src/sot_loader.cpp index 422d2334ea396707e70c3c1b3dc774e608caf962..6dcf031444d4404f8a1fe3045527bd3aa2227a30 100644 --- a/src/sot_loader.cpp +++ b/src/sot_loader.cpp @@ -126,6 +126,9 @@ SotLoader::SotLoader() thread_() { readSotVectorStateParam(); initPublication(); + + freeFlyerPose_.header.frame_id = "odom"; + freeFlyerPose_.child_frame_id = "base_link"; } SotLoader::~SotLoader() { @@ -198,14 +201,18 @@ void SotLoader::readControl(map<string, dgs::ControlValues> &controlValues) { // get the robot pose values std::vector<double> poseValue_ = controlValues["baseff"].getValues(); - freeFlyerPose_.setOrigin( - tf::Vector3(poseValue_[0], poseValue_[1], poseValue_[2])); - tf::Quaternion poseQ_(poseValue_[4], poseValue_[5], poseValue_[6], - poseValue_[3]); - freeFlyerPose_.setRotation(poseQ_); + freeFlyerPose_.transform.translation.x = poseValue_[0]; + freeFlyerPose_.transform.translation.y = poseValue_[1]; + freeFlyerPose_.transform.translation.z = poseValue_[2]; + + freeFlyerPose_.transform.rotation.w = poseValue_[3]; + freeFlyerPose_.transform.rotation.x = poseValue_[4]; + freeFlyerPose_.transform.rotation.y = poseValue_[5]; + freeFlyerPose_.transform.rotation.z = poseValue_[6]; + + freeFlyerPose_.header.stamp = joint_state_.header.stamp; // Publish - freeFlyerPublisher_.sendTransform(tf::StampedTransform( - freeFlyerPose_, ros::Time::now(), "odom", "base_link")); + freeFlyerPublisher_.sendTransform(freeFlyerPose_); } void SotLoader::setup() {