Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New approach for toMsg()/fromMsg() #368

Closed
wants to merge 51 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
9242703
Add test for Vector/Point toMsg()
gleichdick Jan 25, 2021
c095835
Complete rework of toMsg()/fromMsg()
gleichdick Feb 12, 2021
786fdd3
Reorganize some headers
gleichdick Jan 25, 2021
01e8c02
Cleanup of Time/Duration conversion
gleichdick Feb 12, 2021
3904bd0
Fix toMsg forward
gleichdick Jan 25, 2021
2499ae9
Reenable Eigen tests
gleichdick Feb 12, 2021
592056a
Reenable sensor_msgs cpp test
gleichdick Jan 25, 2021
402f4bd
Reenable conversion test
gleichdick Jan 25, 2021
71513ec
Add testcases from tf2_eigen_kdl to tf2_test
gleichdick Jan 26, 2021
4dc5453
Add Wrench conversion
gleichdick Jan 26, 2021
1f69cb0
Enable Transform and Quaternion for bullet
gleichdick Jan 26, 2021
8288bc4
fix bullet uncrustify
gleichdick Jan 26, 2021
185433a
bullet uncrustify format
gleichdick Jan 26, 2021
938d908
Fix bullet test and cmake
gleichdick Jan 26, 2021
9f39eb7
make Vector and Quaternion conversion reuseable
gleichdick Jan 26, 2021
d4d1704
Cleanup of Transform conversions
gleichdick Feb 12, 2021
97cd92a
Unify doTransform() (except for tf2_geometry_msgs)
gleichdick Feb 12, 2021
b050465
doTransformation for tf2_geometry_msgs
gleichdick Jan 26, 2021
e684163
Fix Vector transform
gleichdick Jan 26, 2021
2ed6b8f
Add WithCovarianceStamped test
gleichdick Jan 27, 2021
bf2c151
Generalize WithCovariance conversion
gleichdick Jan 27, 2021
983a605
doTransform() for KDL::Rotation
gleichdick Jan 28, 2021
2d47766
eigen doxy WIP
gleichdick Jan 28, 2021
a23dee7
more eigen doxygen
gleichdick Jan 28, 2021
f9b7417
doxygen + uncrustify for tf2_geometry_msgs
gleichdick Jan 28, 2021
ef67cbe
tf2_eigen uncrustify
gleichdick Feb 12, 2021
b7ccaef
tf2_kdl doxygen and linting
gleichdick Jan 28, 2021
d1f5cea
tf2_bullet doxygen
gleichdick Jan 28, 2021
747836a
Enable Linters on geometry_msgs and KDL
gleichdick Feb 12, 2021
f1469a0
more meaningful names
gleichdick Jan 29, 2021
3693ac6
Verbose error messages in case of missing includes
gleichdick Jan 29, 2021
7fa19a0
Reorder headers
gleichdick Feb 12, 2021
1ac23bc
Deprecate ToTransform and TransformTo Functions
gleichdick Jan 29, 2021
60abdea
Remove all overloads of tf2::convert
gleichdick Feb 12, 2021
5284017
Apply uncrustify
gleichdick Feb 12, 2021
5838568
Add sensor_msgs test dependency
gleichdick Mar 19, 2021
66eabfb
remove newlines in test_tf2/test/test_convert.cpp
gleichdick Mar 19, 2021
4cc83f6
[tf2_sensor_msgs] Fix Eigen3 dependency
gleichdick Mar 19, 2021
7704c91
Fix -Wextra-qualification
gleichdick Mar 19, 2021
988635e
Fix Bullet cmake
gleichdick Mar 19, 2021
a336830
Proper forwarding of messages (Code C4099)
gleichdick Mar 19, 2021
3278ca2
Add static_cast to tf2_bullet
gleichdick Apr 6, 2021
7795ded
Fix formatting nitpicks
gleichdick Apr 8, 2021
d3fb3bd
Add TODOs and comments
gleichdick Apr 8, 2021
c565ee6
Fix ament_lint_auto settings for cppcheck and uc
gleichdick Apr 12, 2021
9189789
[tf2_geometry_msgs] pep8 formatting
gleichdick Apr 12, 2021
0dbe030
[tf2_kdl] pep8 formatting
gleichdick Apr 12, 2021
59c66bd
[tf2_kdl] fix pep257
gleichdick Apr 12, 2021
ef72679
[tf2_geometry_msgs] fix copyright
gleichdick Apr 12, 2021
3e5fa25
[tf2_kdl] fix copyright
gleichdick Apr 12, 2021
cc6d47a
move headers to .cpp
gleichdick May 13, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 17 additions & 14 deletions test_tf2/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,19 @@ find_package(geometry_msgs REQUIRED)
find_package(launch_testing_ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(tf2 REQUIRED)
# TODO (ahcorde): activate when tf2_bullet is merged
# find_package(tf2_bullet REQUIRED)
find_package(tf2_bullet REQUIRED)
find_package(tf2_eigen REQUIRED)
find_package(tf2_geometry_msgs REQUIRED)
find_package(tf2_kdl REQUIRED)
find_package(tf2_ros REQUIRED)

ament_find_gtest()

# TODO (ahcorde): activate when tf2_bullet is merged
# find_package(PkgConfig REQUIRED)
# pkg_check_modules(bullet REQUIRED bullet)
# include_directories(include ${bullet_INCLUDE_DIRS})
if(WIN32)
set(BULLET_ROOT $ENV{ChocolateyInstall}/lib/bullet)
endif()
find_package(Bullet REQUIRED)
include_directories(include ${BULLET_INCLUDE_DIRS})

ament_add_gtest(buffer_core_test test/buffer_core_test.cpp)
if(TARGET buffer_core_test)
Expand All @@ -60,14 +61,16 @@ if(TARGET test_message_filter)
)
endif()

# TODO (ahcorde): activate when tf2_bullet is merged
# ament_add_gtest(test_convert test/test_convert.cpp)
# if(TARGET test_convert)
# ament_target_dependencies(test_convert
# tf2
# tf2_bullet
# )
# endif()
ament_add_gtest(test_convert test/test_convert.cpp)
if(TARGET test_convert)
ament_target_dependencies(test_convert
tf2
tf2_bullet
tf2_eigen
tf2_geometry_msgs
tf2_kdl
)
endif()

ament_add_gtest(test_utils test/test_utils.cpp)
if(TARGET test_utils)
Expand Down
2 changes: 2 additions & 0 deletions test_tf2/package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
<depend>geometry_msgs</depend>
<depend>rclcpp</depend>
<depend>tf2</depend>
<depend>tf2_bullet</depend>
<depend>tf2_eigen</depend>
<depend>tf2_geometry_msgs</depend>
<depend>tf2_kdl</depend>
<depend>tf2_ros</depend>
Expand Down
4 changes: 2 additions & 2 deletions test_tf2/test/test_buffer_client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@
#include <gtest/gtest.h>

#include <rclcpp/rclcpp.hpp>
#include <tf2_bullet/tf2_bullet.h>
#include <tf2_bullet/tf2_bullet.hpp>
#include <tf2_geometry_msgs/tf2_geometry_msgs.h>
#include <tf2_kdl/tf2_kdl.h>
#include <tf2_kdl/tf2_kdl.hpp>
#include <tf2_ros/buffer_client.h>

#include <chrono>
Expand Down
250 changes: 245 additions & 5 deletions test_tf2/test/test_convert.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,70 @@
*********************************************************************/
#include <gtest/gtest.h>
#include <tf2/convert.h>
#include <tf2_kdl/tf2_kdl.h>
#include <tf2_bullet/tf2_bullet.h>
#include <tf2_kdl/tf2_kdl.hpp>
#include <tf2_bullet/tf2_bullet.hpp>
#include <tf2_eigen/tf2_eigen.hpp>
#include <tf2_geometry_msgs/tf2_geometry_msgs.h>

#include <geometry_msgs/msg/vector3_stamped.hpp>


// test of tf2 type traits
static_assert(
!tf2::impl::MessageHasStdHeader<geometry_msgs::msg::Vector3>::value,
"MessageHasStdHeader traits error");
static_assert(
tf2::impl::MessageHasStdHeader<geometry_msgs::msg::Vector3Stamped>::value,
"MessageHasStdHeader traits error");

namespace
{
struct MyPODMessage
{
int header;
};

template<typename Alloc>
struct MyAllocMessage
{
int header;
};

static_assert(
!tf2::impl::MessageHasStdHeader<MyPODMessage>::value,
"MessageHasStdHeader traits error");

template<typename T>
struct MyAllocator
{
using value_type = T;
using size_type = unsigned int;
T * allocate(size_type);
void deallocate(T *, size_type);
template<class U>
struct rebind { typedef MyAllocator<U> other; };
};
using MyVec = geometry_msgs::msg::Vector3_<MyAllocator<void>>;
using MyVecStamped = geometry_msgs::msg::Vector3Stamped_<MyAllocator<void>>;
using MyMessage = MyAllocMessage<MyAllocator<void>>;

static_assert(!tf2::impl::MessageHasStdHeader<MyVec>::value, "MessageHasStdHeader traits error");
static_assert(
tf2::impl::MessageHasStdHeader<MyVecStamped>::value,
"MessageHasStdHeader traits error");

static_assert(
!tf2::impl::MessageHasStdHeader<MyMessage>::value,
"MessageHasStdHeader traits error");
}

using Vector6d = Eigen::Matrix<double, 6, 1>;

TEST(tf2Convert, kdlToBullet)
{
double epsilon = 1e-9;

tf2::Stamped<btVector3> b(btVector3(1,2,3), tf2::timeFromSec(0), "my_frame");
tf2::Stamped<btVector3> b(btVector3(1, 2, 3), tf2::timeFromSec(0), "my_frame");

tf2::Stamped<btVector3> b1 = b;
tf2::Stamped<KDL::Vector> k1;
Expand All @@ -71,7 +126,7 @@ TEST(tf2Convert, kdlBulletROSConversions)
{
double epsilon = 1e-9;

tf2::Stamped<btVector3> b1(btVector3(1,2,3), tf2::timeFromSec(0), "my_frame"), b2, b3, b4;
tf2::Stamped<btVector3> b1(btVector3(1, 2, 3), tf2::timeFromSec(0), "my_frame"), b2, b3, b4;
geometry_msgs::msg::PointStamped r1, r2, r3;
tf2::Stamped<KDL::Vector> k1, k2, k3;

Expand All @@ -96,7 +151,192 @@ TEST(tf2Convert, kdlBulletROSConversions)
EXPECT_NEAR(b1.z(), b4.z(), epsilon);
}

int main(int argc, char** argv)
TEST(tf2Convert, ConvertTf2Quaternion)
{
tf2::Quaternion tq(1, 2, 3, 4);
Eigen::Quaterniond eq;
tf2::convert(tq, eq);

EXPECT_EQ(tq.w(), eq.w());
EXPECT_EQ(tq.x(), eq.x());
EXPECT_EQ(tq.y(), eq.y());
EXPECT_EQ(tq.z(), eq.z());
}

TEST(tf2Convert, PointVectorDefaultMessagetype)
{
// Verify the return type of `toMsg()`
// as it can return a Vector3 or a Point for certain datatypes
{
// Bullet
const tf2::Stamped<btVector3> b1{btVector3{1.0, 3.0, 4.0}, tf2::get_now(), "my_frame"};
const geometry_msgs::msg::PointStamped msg = tf2::toMsg(b1);

EXPECT_EQ(msg.point.x, 1.0);
EXPECT_EQ(msg.point.y, 3.0);
EXPECT_EQ(msg.point.z, 4.0);
EXPECT_EQ(msg.header.frame_id, b1.frame_id_);
EXPECT_EQ(msg.header.stamp, tf2::toMsg<>(b1.stamp_));
}
{
// Eigen
const Eigen::Vector3d e1{2.0, 4.0, 5.0};
const geometry_msgs::msg::Point msg = tf2::toMsg(e1);

EXPECT_EQ(msg.x, 2.0);
EXPECT_EQ(msg.y, 4.0);
EXPECT_EQ(msg.z, 5.0);
}
{
// tf2
const tf2::Vector3 t1{2.0, 4.0, 5.0};
const geometry_msgs::msg::Vector3 msg = tf2::toMsg(t1);

EXPECT_EQ(msg.x, 2.0);
EXPECT_EQ(msg.y, 4.0);
EXPECT_EQ(msg.z, 5.0);
}
{
// KDL
const tf2::Stamped<KDL::Vector> k1{KDL::Vector{1.0, 3.0, 4.0}, tf2::get_now(), "my_frame"};
const geometry_msgs::msg::PointStamped msg = tf2::toMsg(k1);

EXPECT_EQ(msg.point.x, 1.0);
EXPECT_EQ(msg.point.y, 3.0);
EXPECT_EQ(msg.point.z, 4.0);
EXPECT_EQ(msg.header.frame_id, k1.frame_id_);
EXPECT_EQ(msg.header.stamp, tf2::toMsg<>(k1.stamp_));
}
}

TEST(tf2Convert, PointVectorOtherMessagetype)
{
{
const tf2::Vector3 t1{2.0, 4.0, 5.0};
geometry_msgs::msg::Point msg;
const geometry_msgs::msg::Point & msg2 = tf2::toMsg(t1, msg);

// returned reference is second argument
EXPECT_EQ(&msg2, &msg);
EXPECT_EQ(msg.x, 2.0);
EXPECT_EQ(msg.y, 4.0);
EXPECT_EQ(msg.z, 5.0);
}
{
// Eigen
const Eigen::Vector3d e1{2.0, 4.0, 5.0};
geometry_msgs::msg::Vector3 msg;
const geometry_msgs::msg::Vector3 & msg2 = tf2::toMsg(e1, msg);

// returned reference is second argument
EXPECT_EQ(&msg2, &msg);
EXPECT_EQ(msg.x, 2.0);
EXPECT_EQ(msg.y, 4.0);
EXPECT_EQ(msg.z, 5.0);
}
}

TEST(TfEigenKdl, TestRotationQuaternion)
{
const auto kdl_v = KDL::Rotation::RPY(1.5, 0.2, 0.3);
Eigen::Quaterniond eigen_v = Eigen::Quaterniond::Identity();
tf2::convert(kdl_v, eigen_v);
KDL::Rotation kdl_v1;
tf2::convert(eigen_v, kdl_v1);
EXPECT_EQ(kdl_v, kdl_v1);
}

TEST(TfEigenKdl, TestQuaternionRotation)
{
const Eigen::Quaterniond eigen_v = Eigen::Quaterniond(1, 2, 1.5, 3).normalized();
KDL::Rotation kdl_v;
tf2::convert(eigen_v, kdl_v);
Eigen::Quaterniond eigen_v1;
tf2::convert(kdl_v, eigen_v1);
EXPECT_TRUE(eigen_v.isApprox(eigen_v1));
}

TEST(TfEigenKdl, TestFrameIsometry3d)
{
const auto kdl_v = KDL::Frame(KDL::Rotation::RPY(1.2, 0.2, 0), KDL::Vector(1, 2, 3));
Eigen::Isometry3d eigen_v = Eigen::Isometry3d::Identity();
tf2::convert(kdl_v, eigen_v);
KDL::Frame kdl_v1;
tf2::convert(eigen_v, kdl_v1);
EXPECT_EQ(kdl_v, kdl_v1);
}

TEST(TfEigenKdl, TestIsometry3dFrame)
{
const Eigen::Isometry3d eigen_v(
Eigen::Translation3d(1, 2, 3) * Eigen::AngleAxisd(1, Eigen::Vector3d::UnitX()));
KDL::Frame kdl_v;
tf2::convert(eigen_v, kdl_v);
Eigen::Isometry3d eigen_v1;
tf2::convert(kdl_v, eigen_v1);
EXPECT_EQ(eigen_v.translation(), eigen_v1.translation());
EXPECT_EQ(eigen_v.rotation(), eigen_v1.rotation());
}

TEST(TfEigenKdl, TestFrameAffine3d)
{
const auto kdl_v = KDL::Frame(KDL::Rotation::RPY(1.2, 0.2, 0), KDL::Vector(1, 2, 3));
Eigen::Affine3d eigen_v = Eigen::Affine3d::Identity();
tf2::convert(kdl_v, eigen_v);
KDL::Frame kdl_v1;
tf2::convert(eigen_v, kdl_v1);
EXPECT_EQ(kdl_v, kdl_v1);
}

TEST(TfEigenKdl, TestTwistMatrix)
{
const auto kdl_v = KDL::Twist(KDL::Vector(1, 2, 3), KDL::Vector(4, 5, 6));
Vector6d eigen_v;
tf2::convert(kdl_v, eigen_v);
KDL::Twist kdl_v1;
tf2::convert(eigen_v, kdl_v1);
EXPECT_EQ(kdl_v, kdl_v1);
}

TEST(TfEigenKdl, TestMatrixWrench)
{
Vector6d eigen_v;
eigen_v << 1, 2, 3, 3, 2, 1;
KDL::Wrench kdl_v;
tf2::convert(eigen_v, kdl_v);
std::array<tf2::Vector3, 2> tf2_v;
tf2::convert(kdl_v, tf2_v);
Vector6d eigen_v1;
tf2::convert(tf2_v, eigen_v1);
std::array<tf2::Vector3, 2> tf2_v1;
tf2::convert(eigen_v1, tf2_v1);
Vector6d eigen_v2;
tf2::convert(tf2_v1, eigen_v2);
EXPECT_EQ(eigen_v, eigen_v2);
}

TEST(TfEigenKdl, TestVectorVector3d)
{
const auto kdl_v = KDL::Vector(1, 2, 3);
Eigen::Vector3d eigen_v;
tf2::convert(kdl_v, eigen_v);
KDL::Vector kdl_v1;
tf2::convert(eigen_v, kdl_v1);
EXPECT_EQ(kdl_v, kdl_v1);
}

TEST(TfEigenKdl, TestVector3dVector)
{
Eigen::Vector3d eigen_v;
eigen_v << 1, 2, 3;
KDL::Vector kdl_v;
tf2::convert(eigen_v, kdl_v);
Eigen::Vector3d eigen_v1;
tf2::convert(kdl_v, eigen_v1);
EXPECT_EQ(eigen_v, eigen_v1);
}

int main(int argc, char ** argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
Expand Down
2 changes: 1 addition & 1 deletion test_tf2/test/test_tf2_bullet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

/** \author Wim Meeussen */

#include <tf2_bullet/tf2_bullet.h>
#include <tf2_bullet/tf2_bullet.hpp>
#include <tf2_ros/buffer.h>
#include <rclcpp/rclcpp.hpp>
#include <gtest/gtest.h>
Expand Down
2 changes: 1 addition & 1 deletion test_tf2/test/test_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
#include <tf2_geometry_msgs/tf2_geometry_msgs.h>
#include <tf2/LinearMath/Quaternion.h>
#include <tf2/utils.h>
#include <tf2_kdl/tf2_kdl.h>
#include <tf2_kdl/tf2_kdl.hpp>

double epsilon = 1e-9;

Expand Down
4 changes: 3 additions & 1 deletion tf2/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
endif()

find_package(ament_cmake)
find_package(builtin_interfaces REQUIRED)
find_package(console_bridge_vendor REQUIRED) # Provides console_bridge 0.4.0 on platforms without it.
find_package(console_bridge REQUIRED)
find_package(geometry_msgs REQUIRED)
Expand All @@ -25,6 +26,7 @@ target_include_directories(tf2 PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/bt>"
"$<INSTALL_INTERFACE:include>")
ament_target_dependencies(tf2
"builtin_interfaces"
"console_bridge"
"geometry_msgs"
"rcutils"
Expand Down Expand Up @@ -89,7 +91,7 @@ if(BUILD_TESTING)

endif()

ament_export_dependencies(console_bridge geometry_msgs rcutils)
ament_export_dependencies(builtin_interfaces console_bridge geometry_msgs rcutils)
ament_export_include_directories(include)
ament_export_libraries(tf2)
ament_export_targets(tf2)
Expand Down
Loading