3 #include <gtest/gtest.h>
5 #include <boost/archive/xml_oarchive.hpp>
6 #include <boost/archive/xml_iarchive.hpp>
7 #include <boost/serialization/shared_ptr.hpp>
32 using Ptr = std::shared_ptr<TestResourceLocator>;
33 using ConstPtr = std::shared_ptr<const TestResourceLocator>;
39 std::string mod_url = url;
40 if (url.find(
"package://tesseract_common") == 0)
42 mod_url.erase(0, strlen(
"package://tesseract_common"));
43 size_t pos = mod_url.find(
'/');
44 if (pos == std::string::npos)
47 mod_url.erase(0, pos);
49 std::filesystem::path file_path(__FILE__);
50 std::string package_path = file_path.parent_path().parent_path().string();
52 if (package_path.empty())
55 mod_url = package_path + mod_url;
58 if (!std::filesystem::path(mod_url).is_absolute())
61 return std::make_shared<tesseract_common::SimpleLocatedResource>(
62 url, mod_url, std::make_shared<TestResourceLocator>(*
this));
81 TEST(TesseractCommonUnit, ProfileDictionary)
85 const std::string ns{
"test_ns" };
86 const std::string profile_name{
"test_profile" };
87 const std::string profile_name_2{
"test_profile_2" };
88 const std::size_t profile_key{ 100 };
89 auto profile = std::make_shared<const TestProfile>(profile_key);
90 auto profile2 = std::make_shared<const TestProfile>(2 * profile_key);
91 profiles.
addProfile(ns, profile_name, profile);
92 profiles.
addProfile(ns, profile_name_2, profile);
93 profiles.
addProfile(ns, profile_name, profile2);
94 profiles.
addProfile(ns, profile_name_2, profile2);
101 profiles_copy_assign = profiles;
106 profiles_move_assign = std::move(profiles_copy_assign);
109 EXPECT_FALSE(profiles.
hasProfile(profile_key, ns,
"does_not_exist"));
110 EXPECT_FALSE(profiles.
hasProfile(profile_key,
"does_not_exist", profile_name));
111 EXPECT_FALSE(profiles.
hasProfile(0, ns, profile_name));
112 EXPECT_TRUE(profiles.
hasProfile(profile_key, ns, profile_name));
113 EXPECT_TRUE(profiles.
hasProfile(profile_key, ns, profile_name_2));
114 EXPECT_TRUE(profiles.
hasProfile(2 * profile_key, ns, profile_name));
115 EXPECT_TRUE(profiles.
hasProfile(2 * profile_key, ns, profile_name_2));
116 EXPECT_TRUE(profile == profiles.
getProfile(profile_key, ns, profile_name));
117 EXPECT_TRUE(profile == profiles.
getProfile(profile_key, ns, profile_name_2));
118 EXPECT_TRUE(profile2 == profiles.
getProfile(2 * profile_key, ns, profile_name));
119 EXPECT_TRUE(profile2 == profiles.
getProfile(2 * profile_key, ns, profile_name_2));
130 profiles.
removeProfile(profile_key,
"does_not_exist", profile_name);
151 profiles.
addProfile(ns, std::vector<std::string>{ profile_name, profile_name_2 }, profile);
152 profiles.
addProfile(ns, std::vector<std::string>{ profile_name, profile_name_2 }, profile2);
159 profiles.
addProfile(ns, std::vector<std::string>{ profile_name }, profile);
160 profiles.
addProfile(ns, std::vector<std::string>{ profile_name_2 }, profile);
161 profiles.
addProfile(ns, std::vector<std::string>{ profile_name }, profile2);
162 profiles.
addProfile(ns, std::vector<std::string>{ profile_name_2 }, profile2);
179 EXPECT_ANY_THROW(profiles.
addProfile(ns, std::vector<std::string>{
"" }, profile));
182 profiles.
addProfile(ns, std::vector<std::string>{ profile_name }, profile);
183 profiles.
addProfile(ns, std::vector<std::string>{ profile_name_2 }, profile);
185 EXPECT_ANY_THROW(profiles.
addProfile(
"", profile_name, profile));
186 EXPECT_ANY_THROW(profiles.
addProfile(ns,
"", profile));
187 EXPECT_ANY_THROW(profiles.
addProfile(ns, profile_name,
nullptr));
188 EXPECT_ANY_THROW(profiles.
addProfile(
"", std::vector<std::string>{ profile_name }, profile));
189 EXPECT_ANY_THROW(profiles.
addProfile(ns, std::vector<std::string>(), profile));
190 EXPECT_ANY_THROW(profiles.
addProfile(ns, std::vector<std::string>{
"" }, profile));
191 EXPECT_ANY_THROW(profiles.
addProfile(ns, std::vector<std::string>{
"" }, profile2));
192 EXPECT_ANY_THROW(profiles.
addProfile(ns, std::vector<std::string>{ profile_name },
nullptr));
193 EXPECT_ANY_THROW(profiles.
getProfileEntry(profile_key,
"does_not_exist"));
199 std::vector<std::string> true_test = {
"1",
"1.5",
"-1",
"-1.5",
"1e-5",
"1e5",
200 "-1e-5",
"-1e5",
"1.0e-5",
"1.0e5",
"-1.0e-5",
"-1.0e5" };
203 for (
const auto& s : true_test)
208 std::vector<std::string> false_test = {
"a",
"test sdfs",
"1 2",
"1.0 2.0",
"+",
"-",
"=" };
210 for (
const auto& s : false_test)
215 std::string empty_string;
221 std::vector<std::string> true_test = {
"1",
"1.5",
"-1",
"-1.5",
"1e-5",
"1e5",
222 "-1e-5",
"-1e5",
"1.0e-5",
"1.0e5",
"-1.0e-5",
"-1.0e5" };
224 std::vector<double> true_test_value = { 1, 1.5, -1, -1.5, 1e-5, 1e5, -1e-5, -1e5, 1.0e-5, 1.0e5, -1.0e-5, -1.0e5 };
227 for (
size_t i = 0; i < true_test.size(); ++i)
231 EXPECT_NEAR(value, true_test_value[i], 1e-8);
234 std::vector<std::string> false_test = {
"a",
"test sdfs",
"1 2",
"1.0 2.0",
"+",
"-",
"=" };
236 for (
const auto& s : false_test)
240 EXPECT_NEAR(value, 0, 1e-8);
243 std::string empty_string;
250 Eigen::MatrixX2d limits(4, 2);
261 EXPECT_EQ(limits.rows(), random_numbers.rows());
262 for (
long i = 0; i < limits.rows(); ++i)
264 EXPECT_LE(random_numbers(i), limits(i, 1));
265 EXPECT_GE(random_numbers(i), limits(i, 0));
268 Eigen::MatrixX2d empty_limits;
270 EXPECT_EQ(empty_limits.rows(), random_numbers2.rows());
272 Eigen::MatrixX2d equal_limits(4, 2);
273 equal_limits(0, 0) = 5;
274 equal_limits(0, 1) = 5;
275 equal_limits(1, 0) = 5;
276 equal_limits(1, 1) = 5;
277 equal_limits(2, 0) = 5;
278 equal_limits(2, 1) = 5;
279 equal_limits(3, 0) = 5;
280 equal_limits(3, 1) = 5;
282 EXPECT_EQ(equal_limits.rows(), random_numbers3.rows());
283 for (
long i = 0; i < equal_limits.rows(); ++i)
285 EXPECT_NEAR(random_numbers3(i), 5, 1e-5);
288 Eigen::MatrixX2d wrong_limits(4, 2);
289 wrong_limits(0, 0) = 5;
290 wrong_limits(0, 1) = -5;
291 wrong_limits(1, 0) = 5;
292 wrong_limits(1, 1) = -5;
293 wrong_limits(2, 0) = 5;
294 wrong_limits(2, 1) = -5;
295 wrong_limits(3, 0) = 5;
296 wrong_limits(3, 1) = -5;
298 EXPECT_EQ(wrong_limits.rows(), random_numbers4.rows());
299 for (
long i = 0; i < limits.rows(); ++i)
301 EXPECT_GE(random_numbers4(i), wrong_limits(i, 1));
302 EXPECT_LE(random_numbers4(i), wrong_limits(i, 0));
308 std::string check1 =
" trim";
309 std::string check2 =
"trim ";
310 std::string check3 =
" trim ";
311 std::string check_trimmed =
"trim";
313 std::string s = check1;
315 EXPECT_EQ(s, check1);
317 EXPECT_EQ(s, check_trimmed);
321 EXPECT_EQ(s, check2);
323 EXPECT_EQ(s, check_trimmed);
327 EXPECT_EQ(s, check_trimmed);
331 EXPECT_EQ(s, check_trimmed);
335 EXPECT_EQ(s, check_trimmed);
341 int add(
int a)
const {
return a + 1; }
346 bool update(std::shared_ptr<TestHasMemberWithArgFunction>& p) {
return (p ==
nullptr); }
347 double add(
double a,
double b)
const {
return a + b; }
353 double add(
int a)
const {
return a + 1; }
362 TEST(TesseractCommonUnit, sfinaeHasMemberFunction)
364 bool t_true = has_member_update<TestHasMemberFunction>::value;
365 bool t_false = has_member_update<TestMissingMemberFunction>::value;
367 EXPECT_FALSE(t_false);
370 TEST(TesseractCommonUnit, sfinaeHasMemberFunctionInvocable)
372 bool i_update_true = has_member_func_invocable_update<TestHasMemberWithArgFunction>::value;
373 bool i_add_true = has_member_func_invocable_add<TestHasMemberWithArgFunction>::value;
374 bool i_update_false = has_member_func_invocable_update<TestHasMemberFunction>::value;
375 bool i_add_false = has_member_func_invocable_add<TestHasMemberFunction>::value;
376 EXPECT_TRUE(i_update_true);
377 EXPECT_TRUE(i_add_true);
378 EXPECT_FALSE(i_update_false);
379 EXPECT_FALSE(i_add_false);
382 TEST(TesseractCommonUnit, sfinaeHasMemberFunctionWithReturnType)
384 bool i_add_true = has_member_func_return_type_add<TestHasMemberFunction>::value;
385 bool t_add_false = has_member_func_return_type_add<TestMissingMemberFunction>::value;
386 EXPECT_TRUE(i_add_true);
387 EXPECT_FALSE(t_add_false);
390 TEST(TesseractCommonUnit, sfinaeHasMemberFunctionSignature)
392 bool i_add_true = has_member_func_signature_add<TestHasMemberWithArgFunction>::value;
393 bool t_add_false = has_member_func_signature_add<TestMissingMemberFunction>::value;
394 EXPECT_TRUE(i_add_true);
395 EXPECT_FALSE(t_add_false);
398 TEST(TesseractCommonUnit, bytesResource)
400 std::vector<uint8_t> data;
402 for (uint8_t i = 0; i < 8; i++)
405 std::shared_ptr<tesseract_common::BytesResource> bytes_resource =
406 std::make_shared<tesseract_common::BytesResource>(
"package://test_package/data.bin", data);
407 EXPECT_EQ(bytes_resource->getUrl(),
"package://test_package/data.bin");
408 EXPECT_EQ(bytes_resource->isFile(),
false);
409 EXPECT_EQ(bytes_resource->getFilePath(),
"");
410 EXPECT_EQ(bytes_resource->locateResource(
"test"),
nullptr);
411 auto data2 = bytes_resource->getResourceContents();
412 ASSERT_EQ(data.size(), data2.size());
413 for (
size_t i = 0; i < data.size(); i++)
415 EXPECT_EQ(data[i], data2[i]);
417 auto data2_stream = bytes_resource->getResourceContentStream();
418 for (
unsigned char& i : data)
421 data2_stream->read(&data2_val, 1);
422 EXPECT_EQ(i, *
reinterpret_cast<uint8_t*
>(&data2_val));
425 std::shared_ptr<tesseract_common::BytesResource> bytes_resource2 =
426 std::make_shared<tesseract_common::BytesResource>(
"package://test_package/data.bin", data.data(), data.size());
427 EXPECT_EQ(bytes_resource2->getUrl(),
"package://test_package/data.bin");
428 EXPECT_EQ(bytes_resource->getResourceContents().size(), data.size());
436 EXPECT_FALSE(data.empty());
439 TEST(TesseractCommonUnit, stopwatch)
446 EXPECT_GT(elapsed_ms, 999);
447 EXPECT_GT(elapsed_s, 0.999);
452 EXPECT_GT(elapsed_ms, 1999);
453 EXPECT_GT(elapsed_s, 1.999);
456 TEST(TesseractCommonUnit, timer)
459 auto callback = [&counter]() { ++counter; };
460 std::chrono::steady_clock::duration interval(std::chrono::milliseconds(1));
462 timer.
start(callback, interval);
465 EXPECT_GT(counter, 900);
468 TEST(TesseractCommonUnit, ManipulatorInfo)
472 EXPECT_TRUE(manip_info.
empty());
473 EXPECT_TRUE(manip_info.
tcp_frame.empty());
479 manip_info_override.
tcp_offset = Eigen::Isometry3d::Identity() * Eigen::Translation3d(0.0, 0.0, 0.25);
483 manip_info = manip_info.
getCombined(manip_info_override);
484 EXPECT_FALSE(manip_info.
empty());
493 EXPECT_TRUE(manip_info.
empty());
498 EXPECT_TRUE(manip_info.
empty());
503 EXPECT_TRUE(manip_info.
empty());
509 EXPECT_TRUE(manip_info.
empty());
513 TEST(TesseractCommonUnit, JointStateTest)
515 std::vector<std::string> joint_names{
"joint_1",
"joint_2",
"joint_3" };
516 Eigen::VectorXd positons = Eigen::VectorXd::Constant(3, 5);
518 EXPECT_TRUE(joint_state.
joint_names == joint_names);
519 EXPECT_TRUE(joint_state.
position.isApprox(positons, 1e-5));
522 TEST(TesseractCommonUnit, anyUnit)
525 EXPECT_TRUE(any_null.
getType() == std::type_index(
typeid(
nullptr)));
526 EXPECT_TRUE(any_null.
isNull());
529 EXPECT_TRUE(any_type.
getType() == std::type_index(
typeid(
nullptr)));
530 EXPECT_TRUE(any_type.
isNull());
533 EXPECT_TRUE(any_double.
getType() == std::type_index(
typeid(
double)));
534 EXPECT_FALSE(any_double.
isNull());
536 EXPECT_TRUE(any_null == any_type);
539 joint_state.
joint_names = {
"joint_1",
"joint_2",
"joint_3" };
540 joint_state.
position = Eigen::VectorXd::Constant(3, 5);
541 joint_state.
velocity = Eigen::VectorXd::Constant(3, 6);
542 joint_state.
acceleration = Eigen::VectorXd::Constant(3, 7);
543 joint_state.
effort = Eigen::VectorXd::Constant(3, 8);
544 joint_state.
time = 100;
546 any_type = joint_state;
548 EXPECT_FALSE(any_type.
isNull());
552 EXPECT_FALSE(any_type == any_null);
553 EXPECT_FALSE(any_type == any_double);
564 EXPECT_FALSE(any_interface_copy.
isNull());
569 EXPECT_TRUE(any_copy == any_type);
572 any_copy2 = any_type;
573 EXPECT_TRUE(any_copy2 == any_type);
579 EXPECT_TRUE(&any_type_ref1 == &any_type_ref2);
580 EXPECT_TRUE(&any_type_ref1 != &any_copy_ref);
581 EXPECT_TRUE(&any_type_ref2 != &any_copy_ref);
585 EXPECT_TRUE(&any_type_const_ref1 == &any_type_const_ref2);
589 boost::archive::xml_oarchive oa(os);
590 oa << BOOST_SERIALIZATION_NVP(any_type);
597 boost::archive::xml_iarchive ia(ifs);
600 ia >> BOOST_SERIALIZATION_NVP(nany_type);
610 template <
typename T>
614 EXPECT_TRUE(any_type.getType() == std::type_index(
typeid(T)));
615 EXPECT_TRUE(any_type.as<T>() == value);
619 EXPECT_TRUE(any_copy == any_type);
620 EXPECT_TRUE(any_copy.
as<T>() == value);
624 std::ofstream os(filepath);
625 boost::archive::xml_oarchive oa(os);
626 oa << BOOST_SERIALIZATION_NVP(any_type);
631 std::ifstream ifs(filepath);
633 boost::archive::xml_iarchive ia(ifs);
636 ia >> BOOST_SERIALIZATION_NVP(nany_type);
639 EXPECT_TRUE(nany_type.
getType() == std::type_index(
typeid(T)));
640 EXPECT_TRUE(nany_type.
as<T>() == value);
646 TEST(TesseractCommonUnit, anyIntegralTypesUnit)
648 runAnyPolyIntegralTest<bool>(
true,
"bool");
649 runAnyPolyIntegralTest<int>(-10,
"int");
650 runAnyPolyIntegralTest<unsigned>(5,
"unsigned");
651 runAnyPolyIntegralTest<double>(1.2,
"double");
652 runAnyPolyIntegralTest<float>(-0.2F,
"float");
653 runAnyPolyIntegralTest<std::string>(
"this",
"string");
654 runAnyPolyIntegralTest<std::size_t>(10,
"std_size_t");
657 template <
typename T>
660 std::unordered_map<std::string, T> data;
661 data[
"test"] = std::move(value);
663 EXPECT_TRUE(any_type.getType() == std::type_index(
typeid(std::unordered_map<std::string, T>)));
664 bool check = any_type.as<std::unordered_map<std::string, T>>() == data;
669 EXPECT_TRUE(any_copy == any_type);
670 check = any_copy.
as<std::unordered_map<std::string, T>>() == data;
676 std::ofstream os(filepath);
677 boost::archive::xml_oarchive oa(os);
678 oa << BOOST_SERIALIZATION_NVP(any_type);
683 std::ifstream ifs(filepath);
685 boost::archive::xml_iarchive ia(ifs);
688 ia >> BOOST_SERIALIZATION_NVP(nany_type);
691 EXPECT_TRUE(nany_type.
getType() == std::type_index(
typeid(std::unordered_map<std::string, T>)));
692 check = nany_type.
as<std::unordered_map<std::string COMMA T>>() == data;
699 TEST(TesseractCommonUnit, anyUnorderedMapIntegralTypesUnit)
701 runAnyPolyUnorderedMapIntegralTest<bool>(
true,
"bool");
702 runAnyPolyUnorderedMapIntegralTest<int>(-10,
"int");
703 runAnyPolyUnorderedMapIntegralTest<unsigned>(5,
"unsigned");
704 runAnyPolyUnorderedMapIntegralTest<double>(1.2,
"double");
705 runAnyPolyUnorderedMapIntegralTest<float>(-0.2F,
"float");
706 runAnyPolyUnorderedMapIntegralTest<std::string>(
"this",
"string");
707 runAnyPolyUnorderedMapIntegralTest<std::size_t>(10,
"std_size_t");
710 TEST(TesseractCommonUnit, anySharedPtrUnit)
713 EXPECT_TRUE(any_type.
getType() == std::type_index(
typeid(
nullptr)));
716 joint_state.
joint_names = {
"joint_1",
"joint_2",
"joint_3" };
717 joint_state.
position = Eigen::VectorXd::Constant(3, 5);
718 joint_state.
velocity = Eigen::VectorXd::Constant(3, 6);
719 joint_state.
acceleration = Eigen::VectorXd::Constant(3, 7);
720 joint_state.
effort = Eigen::VectorXd::Constant(3, 8);
721 joint_state.
time = 100;
723 auto joint_state_ptr = std::make_shared<tesseract_common::JointState>(joint_state);
724 any_type = joint_state_ptr;
725 EXPECT_TRUE(any_type.
getType() == std::type_index(
typeid(std::shared_ptr<tesseract_common::JointState>)));
726 EXPECT_TRUE(*any_type.
as<std::shared_ptr<tesseract_common::JointState>>() == joint_state);
727 EXPECT_TRUE(any_type.
as<std::shared_ptr<tesseract_common::JointState>>() == joint_state_ptr);
731 EXPECT_TRUE(any_copy == any_type);
734 auto& any_type_ref1 = any_type.
as<std::shared_ptr<tesseract_common::JointState>>();
735 auto& any_type_ref2 = any_type.
as<std::shared_ptr<tesseract_common::JointState>>();
736 auto& any_copy_ref = any_copy.
as<std::shared_ptr<tesseract_common::JointState>>();
737 EXPECT_TRUE(&any_type_ref1 == &any_type_ref2);
738 EXPECT_TRUE(&any_type_ref1 != &any_copy_ref);
739 EXPECT_TRUE(&any_type_ref2 != &any_copy_ref);
741 const auto& any_type_const_ref1 = any_type.
as<std::shared_ptr<tesseract_common::JointState>>();
742 const auto& any_type_const_ref2 = any_type.
as<std::shared_ptr<tesseract_common::JointState>>();
743 EXPECT_TRUE(&any_type_const_ref1 == &any_type_const_ref2);
747 boost::archive::xml_oarchive oa(os);
748 oa << BOOST_SERIALIZATION_NVP(any_type);
755 boost::archive::xml_iarchive ia(ifs);
758 ia >> BOOST_SERIALIZATION_NVP(nany_type);
761 EXPECT_TRUE(nany_type.
getType() == std::type_index(
typeid(std::shared_ptr<tesseract_common::JointState>)));
762 EXPECT_TRUE(*nany_type.
as<std::shared_ptr<tesseract_common::JointState>>() == joint_state);
768 TEST(TesseractCommonUnit, boundsUnit)
770 Eigen::VectorXd v = Eigen::VectorXd::Ones(6);
771 v = v.array() + std::numeric_limits<float>::epsilon();
772 Eigen::MatrixX2d limits(6, 2);
773 limits.col(0) = -Eigen::VectorXd::Ones(6);
774 limits.col(1) = Eigen::VectorXd::Ones(6);
782 v = -Eigen::VectorXd::Ones(6);
783 v = v.array() - std::numeric_limits<float>::epsilon();
792 v = Eigen::VectorXd::Constant(6, -2);
796 ASSERT_EQ((v - limits.col(0)).norm(), 0);
798 v = Eigen::VectorXd::Constant(6, 2);
802 ASSERT_EQ((v - limits.col(1)).norm(), 0);
804 v = Eigen::VectorXd::Ones(6);
805 v = v.array() - std::numeric_limits<float>::epsilon();
808 v = Eigen::VectorXd::Ones(6);
809 v(3) = v(3) + std::numeric_limits<float>::epsilon();
812 v = -Eigen::VectorXd::Ones(6);
813 v(3) = v(3) - std::numeric_limits<float>::epsilon();
817 TEST(TesseractCommonUnit, isIdenticalUnit)
819 std::vector<std::string> v1{
"a",
"b",
"c" };
820 std::vector<std::string> v2{
"a",
"b",
"c" };
824 v2 = {
"c",
"b",
"a" };
828 v2 = {
"a",
"b",
"d" };
833 TEST(TesseractCommonUnit, isIdenticalMapUnit)
835 std::map<std::string, int> v1;
838 std::map<std::string, int> v2;
839 bool equal = tesseract_common::isIdenticalMap<std::map<std::string, int>,
int>(v1, v2);
843 equal = tesseract_common::isIdenticalMap<std::map<std::string, int>,
int>(v1, v2);
847 equal = tesseract_common::isIdenticalMap<std::map<std::string, int>,
int>(v1, v2);
851 equal = tesseract_common::isIdenticalMap<std::map<std::string, int>,
int>(v1, v2);
855 TEST(TesseractCommonUnit, isIdenticalSetUnit)
859 bool equal = tesseract_common::isIdenticalSet<int>(v1, v2);
863 equal = tesseract_common::isIdenticalSet<int>(v1, v2);
868 equal = tesseract_common::isIdenticalSet<int>(v1, v2);
872 equal = tesseract_common::isIdenticalSet<int>(v1, v2);
876 TEST(TesseractCommonUnit, isIdenticalArrayUnit)
879 std::array<int, 4> v1 = { 1, 2, 3, 4 };
880 std::array<int, 4> v2 = { 1, 2, 3, 4 };
881 bool equal = tesseract_common::isIdenticalArray<int, 4>(v1, v2);
885 std::array<int, 4> v1 = { 1, 2, 3, 4 };
886 std::array<int, 4> v2 = { -1, 2, 3, 4 };
887 bool equal = tesseract_common::isIdenticalArray<int, 4>(v1, v2);
892 std::array<int, 4> v1 = { 1, 2, 3, 6 };
893 std::array<int, 4> v2;
894 bool equal = tesseract_common::isIdenticalArray<int, 4>(v1, v2);
902 auto p1 = std::make_shared<int>(1);
903 auto p2 = std::make_shared<int>(2);
908 auto p1 = std::make_shared<int>(1);
910 bool equal = tesseract_common::pointersEqual<int>(p1, p2);
915 auto p2 = std::make_shared<int>(2);
916 bool equal = tesseract_common::pointersEqual<int>(p1, p2);
922 bool equal = tesseract_common::pointersEqual<int>(p1, p2);
926 auto p1 = std::make_shared<int>(1);
927 auto p2 = std::make_shared<int>(1);
928 bool equal = tesseract_common::pointersEqual<int>(p1, p2);
937 auto p1 = std::make_shared<int>(1);
938 auto p2 = std::make_shared<int>(2);
939 bool equal = tesseract_common::pointersComparison<int>(p1, p2);
943 auto p1 = std::make_shared<int>(1);
945 bool equal = tesseract_common::pointersComparison<int>(p1, p2);
950 auto p2 = std::make_shared<int>(2);
951 bool equal = tesseract_common::pointersComparison<int>(p1, p2);
957 bool equal = tesseract_common::pointersComparison<int>(p1, p2);
961 auto p1 = std::make_shared<int>(1);
962 auto p2 = std::make_shared<int>(1);
963 bool equal = tesseract_common::pointersComparison<int>(p1, p2);
968 TEST(TesseractCommonUnit, getTimestampStringUnit)
971 EXPECT_FALSE(s1.empty());
976 std::vector<std::vector<Eigen::Index>> checks;
977 checks.push_back({ 5, 4, 3, 2, 1, 0 });
978 checks.push_back({ 0, 1, 2, 3, 4, 5 });
979 checks.push_back({ 3, 2, 4, 1, 5, 0 });
980 Eigen::VectorXd v = Eigen::VectorXd::Random(6);
982 for (
const auto& check : checks)
984 Eigen::VectorXd v_copy = v;
987 for (std::size_t i = 0; i < check.size(); ++i)
989 EXPECT_NEAR(v_copy(
static_cast<Eigen::Index
>(i)), v(check[i]), 1e-8);
994 TEST(TesseractCommonUnit, getTempPathUnit)
997 EXPECT_FALSE(s1.empty());
998 EXPECT_TRUE(std::filesystem::exists(s1));
1001 TEST(TesseractCommonUnit, QueryStringValueUnit)
1004 std::string str = R
"(<box>Test</box>)";
1005 tinyxml2::XMLDocument xml_doc;
1006 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1008 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("box");
1009 EXPECT_TRUE(element !=
nullptr);
1011 std::string string_value;
1013 EXPECT_TRUE(status == tinyxml2::XML_SUCCESS);
1014 EXPECT_TRUE(string_value ==
"box");
1018 TEST(TesseractCommonUnit, QueryStringTextUnit)
1021 std::string str = R
"(<box>Test</box>)";
1022 tinyxml2::XMLDocument xml_doc;
1023 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1025 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("box");
1026 EXPECT_TRUE(element !=
nullptr);
1028 std::string string_value;
1030 EXPECT_TRUE(status == tinyxml2::XML_SUCCESS);
1031 EXPECT_TRUE(string_value ==
"Test");
1035 std::string str = R
"(<box></box>)";
1036 tinyxml2::XMLDocument xml_doc;
1037 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1039 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("box");
1040 EXPECT_TRUE(element !=
nullptr);
1042 std::string string_value;
1044 EXPECT_TRUE(status == tinyxml2::XML_NO_ATTRIBUTE);
1048 TEST(TesseractCommonUnit, QueryStringAttributeUnit)
1051 std::string str = R
"(<box name="test" />)";
1052 tinyxml2::XMLDocument xml_doc;
1053 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1055 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("box");
1056 EXPECT_TRUE(element !=
nullptr);
1058 std::string string_value;
1060 EXPECT_TRUE(status == tinyxml2::XML_SUCCESS);
1061 EXPECT_TRUE(string_value ==
"test");
1065 std::string str = R
"(<box missing="test" />)";
1066 tinyxml2::XMLDocument xml_doc;
1067 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1069 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("box");
1070 EXPECT_TRUE(element !=
nullptr);
1072 std::string string_value;
1074 EXPECT_TRUE(status == tinyxml2::XML_NO_ATTRIBUTE);
1078 TEST(TesseractCommonUnit, StringAttributeUnit)
1081 std::string str = R
"(<box name="test" />)";
1082 tinyxml2::XMLDocument xml_doc;
1083 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1085 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("box");
1086 EXPECT_TRUE(element !=
nullptr);
1089 EXPECT_TRUE(string_value ==
"test");
1093 std::string str = R
"(<box name="test" />)";
1094 tinyxml2::XMLDocument xml_doc;
1095 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1097 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("box");
1098 EXPECT_TRUE(element !=
nullptr);
1101 EXPECT_TRUE(string_value ==
"default");
1105 TEST(TesseractCommonUnit, QueryStringAttributeRequiredUnit)
1108 std::string str = R
"(<box name="test" />)";
1109 tinyxml2::XMLDocument xml_doc;
1110 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1112 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("box");
1113 EXPECT_TRUE(element !=
nullptr);
1115 std::string string_value;
1117 EXPECT_TRUE(status == tinyxml2::XML_SUCCESS);
1118 EXPECT_TRUE(string_value ==
"test");
1122 std::string str = R
"(<box name="test" />)";
1123 tinyxml2::XMLDocument xml_doc;
1124 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1126 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("box");
1127 EXPECT_TRUE(element !=
nullptr);
1129 std::string string_value;
1131 EXPECT_TRUE(status == tinyxml2::XML_NO_ATTRIBUTE);
1135 TEST(TesseractCommonUnit, QueryDoubleAttributeRequiredUnit)
1138 std::string str = R
"(<box name="1.5" />)";
1139 tinyxml2::XMLDocument xml_doc;
1140 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1142 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("box");
1143 EXPECT_TRUE(element !=
nullptr);
1145 double double_value{ 0 };
1147 EXPECT_TRUE(status == tinyxml2::XML_SUCCESS);
1148 EXPECT_NEAR(double_value, 1.5, 1e-6);
1152 std::string str = R
"(<box name="1.5" />)";
1153 tinyxml2::XMLDocument xml_doc;
1154 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1156 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("box");
1157 EXPECT_TRUE(element !=
nullptr);
1159 double double_value{ 0 };
1161 EXPECT_TRUE(status == tinyxml2::XML_NO_ATTRIBUTE);
1165 std::string str = R
"(<box name="abc" />)";
1166 tinyxml2::XMLDocument xml_doc;
1167 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1169 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("box");
1170 EXPECT_TRUE(element !=
nullptr);
1172 double double_value{ 0 };
1174 EXPECT_TRUE(status == tinyxml2::XML_WRONG_ATTRIBUTE_TYPE);
1178 TEST(TesseractCommonUnit, QueryIntAttributeRequiredUnit)
1181 std::string str = R
"(<box name="1" />)";
1182 tinyxml2::XMLDocument xml_doc;
1183 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1185 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("box");
1186 EXPECT_TRUE(element !=
nullptr);
1190 EXPECT_TRUE(status == tinyxml2::XML_SUCCESS);
1191 EXPECT_NEAR(int_value, 1, 1e-6);
1195 std::string str = R
"(<box name="1.5" />)";
1196 tinyxml2::XMLDocument xml_doc;
1197 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1199 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("box");
1200 EXPECT_TRUE(element !=
nullptr);
1204 EXPECT_TRUE(status == tinyxml2::XML_NO_ATTRIBUTE);
1208 std::string str = R
"(<box name="abc" />)";
1209 tinyxml2::XMLDocument xml_doc;
1210 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1212 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("box");
1213 EXPECT_TRUE(element !=
nullptr);
1217 EXPECT_TRUE(status == tinyxml2::XML_WRONG_ATTRIBUTE_TYPE);
1226 throw std::runtime_error(
"failed");
1230 std::throw_with_nested(std::runtime_error(
"runThrowNestedException() failed"));
1234 TEST(TesseractCommonUnit, printNestedExceptionUnit)
1240 catch (
const std::exception& e)
1248 std::set<std::string> expected_keys{
"search_paths",
"search_libraries" };
1250 std::string yaml_string = R
"(kinematic_plugins:
1254 - tesseract_kinematics_kdl_factories)";
1263 expected_keys = {
"search_paths" };
1267 TEST(TesseractCommonUnit, almostEqualRelativeAndAbsUnit)
1276 a = 100000000000000.01;
1277 b = 100000000000000;
1280 a = 100000000000000.1;
1281 b = 100000000000000;
1284 Eigen::VectorXd v1 = Eigen::VectorXd::Constant(3, 1e-5);
1285 Eigen::VectorXd v2 = Eigen::VectorXd::Constant(3, 0);
1288 v1 = Eigen::VectorXd::Constant(3, 1e-7);
1291 v1 = Eigen::VectorXd::Constant(3, 100000000000000.01);
1292 v2 = Eigen::VectorXd::Constant(3, 100000000000000);
1295 v1 = Eigen::VectorXd::Constant(3, 100000000000000.1);
1296 v2 = Eigen::VectorXd::Constant(3, 100000000000000);
1299 v2 = Eigen::VectorXd::Constant(1, 100000000000000);
1305 TEST(TesseractCommonUnit, kinematicsPluginInfoUnit)
1308 EXPECT_TRUE(kpi.
empty());
1317 kpi_insert.
fwd_plugin_infos[
"manipulator"].plugins = { std::make_pair(
"KDLFwdKin", pi) };
1324 kpi_insert.
inv_plugin_infos[
"manipulator"].plugins = { std::make_pair(
"KDLInvKin", pi) };
1328 EXPECT_FALSE(kpi_insert.
empty());
1330 EXPECT_NE(kpi, kpi_insert);
1332 EXPECT_FALSE(kpi.
empty());
1333 EXPECT_EQ(kpi, kpi_insert);
1336 EXPECT_TRUE(kpi.
empty());
1339 TEST(TesseractCommonUnit, ContactManagersPluginInfoUnit)
1342 EXPECT_TRUE(cmpi.
empty());
1362 EXPECT_FALSE(cmpi_insert.
empty());
1364 EXPECT_NE(cmpi, cmpi_insert);
1365 cmpi.
insert(cmpi_insert);
1366 EXPECT_FALSE(cmpi.
empty());
1367 EXPECT_EQ(cmpi, cmpi_insert);
1370 EXPECT_TRUE(cmpi.
empty());
1373 TEST(TesseractCommonUnit, TaskComposerPluginInfoUnit)
1376 EXPECT_TRUE(tcpi.
empty());
1384 pi.
class_name =
"TaskComposerExecutorPluginFactory";
1391 pi.
class_name =
"TaskComposerNodePluginFactory";
1396 EXPECT_FALSE(tcpi_insert.
empty());
1398 EXPECT_NE(tcpi, tcpi_insert);
1399 tcpi.
insert(tcpi_insert);
1400 EXPECT_FALSE(tcpi.
empty());
1401 EXPECT_EQ(tcpi, tcpi_insert);
1404 EXPECT_TRUE(tcpi.
empty());
1407 TEST(TesseractPluginFactoryUnit, KinematicsPluginInfoYamlUnit)
1409 std::string yaml_string = R
"(kinematic_plugins:
1413 - tesseract_kinematics_kdl_factories
1416 default: KDLFwdKinChain
1419 class: KDLFwdKinChainFactory
1421 base_link: base_link
1425 default: KDLInvKinChainLMA
1428 class: KDLInvKinChainLMAFactory
1430 base_link: base_link
1433 class: KDLInvKinChainNRFactory
1435 base_link: base_link
1444 const YAML::Node& plugin_info = plugin_config[
"kinematic_plugins"];
1445 const YAML::Node& search_paths = plugin_info[
"search_paths"];
1446 const YAML::Node& search_libraries = plugin_info[
"search_libraries"];
1447 const YAML::Node& fwd_kin_default_plugin = plugin_info[
"fwd_kin_plugins"][
"iiwa_manipulator"][
"default"];
1448 const YAML::Node& fwd_kin_plugins = plugin_info[
"fwd_kin_plugins"][
"iiwa_manipulator"][
"plugins"];
1449 const YAML::Node& inv_kin_default_plugin = plugin_info[
"inv_kin_plugins"][
"iiwa_manipulator"][
"default"];
1450 const YAML::Node& inv_kin_plugins = plugin_info[
"inv_kin_plugins"][
"iiwa_manipulator"][
"plugins"];
1454 EXPECT_EQ(sp.size(), 1);
1456 for (
auto it = search_paths.begin(); it != search_paths.end(); ++it)
1458 EXPECT_TRUE(sp.find(it->as<std::string>()) != sp.end());
1463 std::set<std::string> sl = cmpi.search_libraries;
1464 EXPECT_EQ(sl.size(), 1);
1466 for (
auto it = search_libraries.begin(); it != search_libraries.end(); ++it)
1468 EXPECT_TRUE(sl.find(it->as<std::string>()) != sl.end());
1472 EXPECT_EQ(fwd_kin_default_plugin.as<std::string>(), cmpi.fwd_plugin_infos[
"iiwa_manipulator"].default_plugin);
1473 EXPECT_EQ(fwd_kin_plugins.size(), cmpi.fwd_plugin_infos[
"iiwa_manipulator"].plugins.size());
1475 EXPECT_EQ(inv_kin_default_plugin.as<std::string>(), cmpi.inv_plugin_infos[
"iiwa_manipulator"].default_plugin);
1476 EXPECT_EQ(inv_kin_plugins.size(), cmpi.inv_plugin_infos[
"iiwa_manipulator"].plugins.size());
1480 std::string yaml_string = R
"(kinematic_plugins:
1484 - tesseract_kinematics_kdl_factories
1487 default: KDLFwdKinChain
1490 class: KDLFwdKinChainFactory
1492 base_link: base_link
1496 default: KDLInvKinChainLMA
1499 class: KDLInvKinChainLMAFactory
1501 base_link: base_link
1504 class: KDLInvKinChainNRFactory
1506 base_link: base_link
1516 std::string yaml_string = R
"(kinematic_plugins:
1523 default: KDLFwdKinChain
1526 class: KDLFwdKinChainFactory
1528 base_link: base_link
1532 default: KDLInvKinChainLMA
1535 class: KDLInvKinChainLMAFactory
1537 base_link: base_link
1540 class: KDLInvKinChainNRFactory
1542 base_link: base_link
1552 std::string yaml_string = R
"(kinematic_plugins:
1556 - tesseract_kinematics_kdl_factories
1559 default: KDLFwdKinChain
1562 default: KDLInvKinChainLMA
1565 class: KDLInvKinChainLMAFactory
1567 base_link: base_link
1570 class: KDLInvKinChainNRFactory
1572 base_link: base_link
1583 std::string yaml_string = R
"(kinematic_plugins:
1587 - tesseract_kinematics_kdl_factories
1590 - tesseract_collision_bullet_factories
1591 - tesseract_collision_fcl_factories
1594 default: KDLInvKinChainLMA
1597 class: KDLInvKinChainLMAFactory
1599 base_link: base_link
1602 class: KDLInvKinChainNRFactory
1604 base_link: base_link
1614 std::string yaml_string = R
"(kinematic_plugins:
1618 - tesseract_kinematics_kdl_factories
1621 default: KDLFwdKinChain
1624 class: KDLFwdKinChainFactory
1626 base_link: base_link
1630 default: KDLInvKinChainLMA)";
1639 std::string yaml_string = R
"(kinematic_plugins:
1643 - tesseract_kinematics_kdl_factories
1646 default: KDLFwdKinChain
1649 class: KDLFwdKinChainFactory
1651 base_link: base_link
1655 - tesseract_collision_bullet_factories
1656 - tesseract_collision_fcl_factories)";
1665 TEST(TesseractPluginFactoryUnit, ContactManagersPluginInfoYamlUnit)
1667 std::string yaml_string = R
"(contact_manager_plugins:
1671 - tesseract_collision_bullet_factories
1672 - tesseract_collision_fcl_factories
1674 default: BulletDiscreteBVHManager
1676 BulletDiscreteBVHManager:
1677 class: BulletDiscreteBVHManagerFactory
1678 BulletDiscreteSimpleManager:
1679 class: BulletDiscreteSimpleManagerFactory
1680 FCLDiscreteBVHManager:
1681 class: FCLDiscreteBVHManagerFactory
1683 default: BulletCastBVHManager
1685 BulletCastBVHManager:
1686 class: BulletCastBVHManagerFactory
1687 BulletCastSimpleManager:
1688 class: BulletCastSimpleManagerFactory)";
1696 const YAML::Node& plugin_info = plugin_config[
"contact_manager_plugins"];
1697 const YAML::Node& search_paths = plugin_info[
"search_paths"];
1698 const YAML::Node& search_libraries = plugin_info[
"search_libraries"];
1699 const YAML::Node& discrete_default_plugin = plugin_info[
"discrete_plugins"][
"default"];
1700 const YAML::Node& discrete_plugins = plugin_info[
"discrete_plugins"][
"plugins"];
1701 const YAML::Node& continuous_default_plugin = plugin_info[
"continuous_plugins"][
"default"];
1702 const YAML::Node& continuous_plugins = plugin_info[
"continuous_plugins"][
"plugins"];
1706 EXPECT_EQ(sp.size(), 1);
1708 for (
auto it = search_paths.begin(); it != search_paths.end(); ++it)
1710 EXPECT_TRUE(sp.find(it->as<std::string>()) != sp.end());
1715 std::set<std::string> sl = cmpi.search_libraries;
1716 EXPECT_EQ(sl.size(), 2);
1718 for (
auto it = search_libraries.begin(); it != search_libraries.end(); ++it)
1720 EXPECT_TRUE(sl.find(it->as<std::string>()) != sl.end());
1724 EXPECT_EQ(discrete_default_plugin.as<std::string>(), cmpi.discrete_plugin_infos.default_plugin);
1725 EXPECT_EQ(discrete_plugins.size(), cmpi.discrete_plugin_infos.plugins.size());
1727 EXPECT_EQ(continuous_default_plugin.as<std::string>(), cmpi.continuous_plugin_infos.default_plugin);
1728 EXPECT_EQ(continuous_plugins.size(), cmpi.continuous_plugin_infos.plugins.size());
1732 std::string yaml_string = R
"(contact_manager_plugins:
1736 - tesseract_collision_bullet_factories
1737 - tesseract_collision_fcl_factories
1739 default: BulletDiscreteBVHManager
1741 BulletDiscreteBVHManager:
1742 class: BulletDiscreteBVHManagerFactory
1743 BulletDiscreteSimpleManager:
1744 class: BulletDiscreteSimpleManagerFactory
1745 FCLDiscreteBVHManager:
1746 class: FCLDiscreteBVHManagerFactory
1748 default: BulletCastBVHManager
1750 BulletCastBVHManager:
1751 class: BulletCastBVHManagerFactory
1752 BulletCastSimpleManager:
1753 class: BulletCastSimpleManagerFactory)";
1761 std::string yaml_string = R
"(contact_manager_plugins:
1767 default: BulletDiscreteBVHManager
1769 BulletDiscreteBVHManager:
1770 class: BulletDiscreteBVHManagerFactory
1771 BulletDiscreteSimpleManager:
1772 class: BulletDiscreteSimpleManagerFactory
1773 FCLDiscreteBVHManager:
1774 class: FCLDiscreteBVHManagerFactory
1776 default: BulletCastBVHManager
1778 BulletCastBVHManager:
1779 class: BulletCastBVHManagerFactory
1780 BulletCastSimpleManager:
1781 class: BulletCastSimpleManagerFactory)";
1789 std::string yaml_string = R
"(contact_manager_plugins:
1793 - tesseract_collision_bullet_factories
1794 - tesseract_collision_fcl_factories
1796 default: BulletDiscreteBVHManager
1798 default: BulletCastBVHManager
1800 BulletCastBVHManager:
1801 class: BulletCastBVHManagerFactory
1802 BulletCastSimpleManager:
1803 class: BulletCastSimpleManagerFactory)";
1811 std::string yaml_string = R
"(contact_manager_plugins:
1815 - tesseract_collision_bullet_factories
1816 - tesseract_collision_fcl_factories
1818 - tesseract_collision_bullet_factories
1819 - tesseract_collision_fcl_factories
1821 default: BulletCastBVHManager
1823 BulletCastBVHManager:
1824 class: BulletCastBVHManagerFactory
1825 BulletCastSimpleManager:
1826 class: BulletCastSimpleManagerFactory)";
1834 std::string yaml_string = R
"(contact_manager_plugins:
1838 - tesseract_collision_bullet_factories
1839 - tesseract_collision_fcl_factories
1841 default: BulletDiscreteBVHManager
1843 BulletDiscreteBVHManager:
1844 class: BulletDiscreteBVHManagerFactory
1845 BulletDiscreteSimpleManager:
1846 class: BulletDiscreteSimpleManagerFactory
1847 FCLDiscreteBVHManager:
1848 class: FCLDiscreteBVHManagerFactory
1850 default: BulletCastBVHManager)";
1858 std::string yaml_string = R
"(contact_manager_plugins:
1862 - tesseract_collision_bullet_factories
1863 - tesseract_collision_fcl_factories
1865 default: BulletDiscreteBVHManager
1867 BulletDiscreteBVHManager:
1868 class: BulletDiscreteBVHManagerFactory
1869 BulletDiscreteSimpleManager:
1870 class: BulletDiscreteSimpleManagerFactory
1871 FCLDiscreteBVHManager:
1872 class: FCLDiscreteBVHManagerFactory
1874 - tesseract_collision_bullet_factories
1875 - tesseract_collision_fcl_factories)";
1883 TEST(TesseractPluginFactoryUnit, TaskComposerPluginInfoYamlUnit)
1885 std::string yaml_string = R
"(task_composer_plugins:
1889 - tesseract_task_composer_executor_factories
1890 - tesseract_task_composer_node_factories
1892 default: TaskflowTaskComposerExecutor
1894 TaskflowTaskComposerExecutor:
1895 class: TaskflowTaskComposerExecutorFactory
1898 TaskflowTaskComposerExecutor2:
1899 class: TaskflowTaskComposerExecutorFactory
1902 TaskflowTaskComposerExecutor3:
1903 class: TaskflowTaskComposerExecutorFactory
1907 default: CartesianMotionPipeline
1909 CartesianMotionPipeline:
1910 class: CartesianMotionPipelineFactory
1913 output_key: "output"
1914 FreespaceMotionPipeline:
1915 class: FreespaceMotionPipelineFactory
1918 output_key: "output")";
1926 const YAML::Node& plugin_info = plugin_config[
"task_composer_plugins"];
1927 const YAML::Node& search_paths = plugin_info[
"search_paths"];
1928 const YAML::Node& search_libraries = plugin_info[
"search_libraries"];
1929 const YAML::Node& executor_default_plugin = plugin_info[
"executors"][
"default"];
1930 const YAML::Node& executor_plugins = plugin_info[
"executors"][
"plugins"];
1931 const YAML::Node& task_default_plugin = plugin_info[
"tasks"][
"default"];
1932 const YAML::Node& task_plugins = plugin_info[
"tasks"][
"plugins"];
1936 EXPECT_EQ(sp.size(), 1);
1938 for (
auto it = search_paths.begin(); it != search_paths.end(); ++it)
1940 EXPECT_TRUE(sp.find(it->as<std::string>()) != sp.end());
1945 std::set<std::string> sl = tcpi.search_libraries;
1946 EXPECT_EQ(sl.size(), 2);
1948 for (
auto it = search_libraries.begin(); it != search_libraries.end(); ++it)
1950 EXPECT_TRUE(sl.find(it->as<std::string>()) != sl.end());
1954 EXPECT_EQ(executor_default_plugin.as<std::string>(), tcpi.executor_plugin_infos.default_plugin);
1955 EXPECT_EQ(executor_plugins.size(), tcpi.executor_plugin_infos.plugins.size());
1957 EXPECT_EQ(task_default_plugin.as<std::string>(), tcpi.task_plugin_infos.default_plugin);
1958 EXPECT_EQ(task_plugins.size(), tcpi.task_plugin_infos.plugins.size());
1962 std::string yaml_string = R
"(task_composer_plugins:
1966 - tesseract_task_composer_executor_factories
1967 - tesseract_task_composer_node_factories
1969 default: TaskflowTaskComposerExecutor
1971 TaskflowTaskComposerExecutor:
1972 class: TaskflowTaskComposerExecutorFactory
1975 TaskflowTaskComposerExecutor2:
1976 class: TaskflowTaskComposerExecutorFactory
1979 TaskflowTaskComposerExecutor3:
1980 class: TaskflowTaskComposerExecutorFactory
1984 default: CartesianMotionPipeline
1986 CartesianMotionPipeline:
1987 class: CartesianMotionPipelineFactory
1990 output_key: "output"
1991 FreespaceMotionPipeline:
1992 class: FreespaceMotionPipelineFactory
1995 output_key: "output")";
2003 std::string yaml_string = R
"(task_composer_plugins:
2009 default: TaskflowTaskComposerExecutor
2011 TaskflowTaskComposerExecutor:
2012 class: TaskflowTaskComposerExecutorFactory
2015 TaskflowTaskComposerExecutor2:
2016 class: TaskflowTaskComposerExecutorFactory
2019 TaskflowTaskComposerExecutor3:
2020 class: TaskflowTaskComposerExecutorFactory
2024 default: CartesianMotionPipeline
2026 CartesianMotionPipeline:
2027 class: CartesianMotionPipelineFactory
2030 output_key: "output"
2031 FreespaceMotionPipeline:
2032 class: FreespaceMotionPipelineFactory
2035 output_key: "output")";
2043 std::string yaml_string = R
"(task_composer_plugins:
2047 - tesseract_task_composer_executor_factories
2048 - tesseract_task_composer_node_factories
2050 default: TaskflowTaskComposerExecutor
2052 default: CartesianMotionPipeline
2054 CartesianMotionPipeline:
2055 class: CartesianMotionPipelineFactory
2058 output_key: "output"
2059 FreespaceMotionPipeline:
2060 class: FreespaceMotionPipelineFactory
2063 output_key: "output")";
2071 std::string yaml_string = R
"(task_composer_plugins:
2075 - tesseract_task_composer_executor_factories
2076 - tesseract_task_composer_node_factories
2078 - TaskflowTaskComposerExecutor:
2079 class: TaskflowTaskComposerExecutorFactory
2082 - TaskflowTaskComposerExecutor2:
2083 class: TaskflowTaskComposerExecutorFactory
2086 - TaskflowTaskComposerExecutor3:
2087 class: TaskflowTaskComposerExecutorFactory
2091 default: CartesianMotionPipeline
2093 CartesianMotionPipeline:
2094 class: CartesianMotionPipelineFactory
2097 output_key: "output"
2098 FreespaceMotionPipeline:
2099 class: FreespaceMotionPipelineFactory
2102 output_key: "output")";
2110 std::string yaml_string = R
"(task_composer_plugins:
2114 - tesseract_task_composer_executor_factories
2115 - tesseract_task_composer_node_factories
2117 default: TaskflowTaskComposerExecutor
2119 TaskflowTaskComposerExecutor:
2120 class: TaskflowTaskComposerExecutorFactory
2123 TaskflowTaskComposerExecutor2:
2124 class: TaskflowTaskComposerExecutorFactory
2127 TaskflowTaskComposerExecutor3:
2128 class: TaskflowTaskComposerExecutorFactory
2132 default: CartesianMotionPipeline)";
2140 std::string yaml_string = R
"(task_composer_plugins:
2144 - tesseract_task_composer_executor_factories
2145 - tesseract_task_composer_node_factories
2147 default: TaskflowTaskComposerExecutor
2149 TaskflowTaskComposerExecutor:
2150 class: TaskflowTaskComposerExecutorFactory
2153 TaskflowTaskComposerExecutor2:
2154 class: TaskflowTaskComposerExecutorFactory
2157 TaskflowTaskComposerExecutor3:
2158 class: TaskflowTaskComposerExecutorFactory
2162 - CartesianMotionPipeline:
2163 class: CartesianMotionPipelineFactory
2166 output_key: "output"
2167 - FreespaceMotionPipeline:
2168 class: FreespaceMotionPipelineFactory
2171 output_key: "output")";
2179 TEST(TesseractCommonUnit, TransformMapYamlUnit)
2181 std::string yaml_string =
2208 EXPECT_EQ(trans_map.size(), 2);
2209 EXPECT_FALSE(trans_map.empty());
2210 EXPECT_TRUE(trans_map.find(
"joint_1") != trans_map.end());
2211 EXPECT_TRUE(trans_map.find(
"joint_2") != trans_map.end());
2214 std::string bad_yaml_string =
2239 EXPECT_ANY_THROW(node[
"joints"].as<tesseract_common::TransformMap>());
2243 TEST(TesseractCommonUnit, CalibrationInfoYamlUnit)
2245 std::string yaml_string =
2272 EXPECT_FALSE(cal_info.empty());
2273 EXPECT_TRUE(cal_info.joints.find(
"joint_1") != cal_info.joints.end());
2274 EXPECT_TRUE(cal_info.joints.find(
"joint_2") != cal_info.joints.end());
2277 EXPECT_TRUE(cal_insert.
empty());
2278 cal_insert.
insert(cal_info);
2279 EXPECT_FALSE(cal_insert.
empty());
2280 EXPECT_TRUE(cal_insert.
joints.find(
"joint_1") != cal_insert.
joints.end());
2281 EXPECT_TRUE(cal_insert.
joints.find(
"joint_2") != cal_insert.
joints.end());
2284 EXPECT_TRUE(cal_info.empty());
2287 TEST(TesseractCommonUnit, linkNamesPairUnit)
2293 EXPECT_EQ(p1.first, p2.first);
2294 EXPECT_EQ(p1.second, p2.second);
2297 EXPECT_EQ(hash(p1), hash(p2));
2306 EXPECT_EQ(p1.first, p2.first);
2307 EXPECT_EQ(p1.second, p2.second);
2310 EXPECT_EQ(hash(p1), hash(p2));
2322 EXPECT_EQ(p1.first, mp1.first);
2323 EXPECT_EQ(p1.second, mp1.second);
2324 EXPECT_EQ(p2.first, mp2.first);
2325 EXPECT_EQ(p2.second, mp2.second);
2332 Eigen::Isometry3d identity = Eigen::Isometry3d::Identity();
2333 Eigen::Isometry3d pi_rot = identity * Eigen::AngleAxisd(M_PI - 0.0001, Eigen::Vector3d::UnitZ());
2335 EXPECT_NEAR(rot_err.norm(), M_PI - 0.0001, 1e-6);
2336 EXPECT_TRUE(rot_err.normalized().isApprox(Eigen::Vector3d::UnitZ(), 1e-6));
2338 pi_rot = identity * Eigen::AngleAxisd(-M_PI + 0.0001, Eigen::Vector3d::UnitZ());
2340 EXPECT_NEAR(rot_err.norm(), M_PI - 0.0001, 1e-6);
2341 EXPECT_TRUE(rot_err.normalized().isApprox(-Eigen::Vector3d::UnitZ(), 1e-6));
2344 pi_rot = identity * Eigen::AngleAxisd(3 * M_PI_2, Eigen::Vector3d::UnitZ());
2346 EXPECT_NEAR(rot_err.norm(), M_PI_2, 1e-6);
2347 EXPECT_TRUE(rot_err.normalized().isApprox(-Eigen::Vector3d::UnitZ(), 1e-6));
2350 pi_rot = identity * Eigen::AngleAxisd(-3 * M_PI_2, Eigen::Vector3d::UnitZ());
2352 EXPECT_NEAR(rot_err.norm(), M_PI_2, 1e-6);
2353 EXPECT_TRUE(rot_err.normalized().isApprox(Eigen::Vector3d::UnitZ(), 1e-6));
2356 Eigen::Isometry3d pi_rot_plus = identity * Eigen::AngleAxisd(M_PI_2 + 0.001, Eigen::Vector3d::UnitZ());
2357 Eigen::Isometry3d pi_rot_minus = identity * Eigen::AngleAxisd(M_PI_2 - 0.001, Eigen::Vector3d::UnitZ());
2360 EXPECT_NEAR(pi_rot_delta.norm(), 0.002, 1e-6);
2363 pi_rot_plus = identity * Eigen::AngleAxisd(-M_PI_2 + 0.001, Eigen::Vector3d::UnitZ());
2364 pi_rot_minus = identity * Eigen::AngleAxisd(-M_PI_2 - 0.001, Eigen::Vector3d::UnitZ());
2367 EXPECT_NEAR(pi_rot_delta.norm(), 0.002, 1e-6);
2370 pi_rot_plus = identity * Eigen::AngleAxisd(0.001, Eigen::Vector3d::UnitZ());
2371 pi_rot_minus = identity * Eigen::AngleAxisd(-0.001, Eigen::Vector3d::UnitZ());
2374 EXPECT_NEAR(pi_rot_delta.norm(), 0.002, 1e-6);
2377 pi_rot_plus = identity * Eigen::AngleAxisd(M_PI + 0.001, Eigen::Vector3d::UnitZ());
2378 pi_rot_minus = identity * Eigen::AngleAxisd(M_PI - 0.001, Eigen::Vector3d::UnitZ());
2381 EXPECT_TRUE(pi_rot_delta.norm() > M_PI);
2384 pi_rot_plus = identity * Eigen::AngleAxisd(-M_PI + 0.001, Eigen::Vector3d::UnitZ());
2385 pi_rot_minus = identity * Eigen::AngleAxisd(-M_PI - 0.001, Eigen::Vector3d::UnitZ());
2388 EXPECT_TRUE(pi_rot_delta.norm() > M_PI);
2391 for (
int i = 0; i < 100; i++)
2393 Eigen::Vector3d axis = Eigen::Vector3d::Random().normalized();
2396 Eigen::VectorXd angles = Eigen::VectorXd::LinSpaced(100, -M_PI + 0.005, M_PI - 0.005);
2397 for (Eigen::Index j = 0; j < angles.rows(); j++)
2399 pi_rot_plus = identity * Eigen::AngleAxisd(angles(j) + 0.001, axis);
2400 pi_rot_minus = identity * Eigen::AngleAxisd(angles(j) - 0.001, axis);
2403 EXPECT_FALSE((e1.norm() < -M_PI));
2404 EXPECT_FALSE((e1.norm() > M_PI));
2405 EXPECT_FALSE((e2.norm() < -M_PI));
2406 EXPECT_FALSE((e2.norm() > M_PI));
2407 pi_rot_delta = e1 - e2;
2408 EXPECT_NEAR(pi_rot_delta.norm(), 0.002, 1e-6);
2412 angles = Eigen::VectorXd::LinSpaced(100, M_PI + 0.005, 2 * M_PI);
2413 for (Eigen::Index j = 0; j < angles.rows(); j++)
2415 pi_rot_plus = identity * Eigen::AngleAxisd(angles(j) + 0.001, axis);
2416 pi_rot_minus = identity * Eigen::AngleAxisd(angles(j) - 0.001, axis);
2419 EXPECT_FALSE((e1.norm() < -M_PI));
2420 EXPECT_FALSE((e1.norm() > M_PI));
2421 EXPECT_FALSE((e2.norm() < -M_PI));
2422 EXPECT_FALSE((e2.norm() > M_PI));
2423 pi_rot_delta = e1 - e2;
2424 EXPECT_NEAR(pi_rot_delta.norm(), 0.002, 1e-6);
2428 angles = Eigen::VectorXd::LinSpaced(100, -M_PI - 0.005, -2 * M_PI);
2429 for (Eigen::Index j = 0; j < angles.rows(); j++)
2431 pi_rot_plus = identity * Eigen::AngleAxisd(angles(j) + 0.001, axis);
2432 pi_rot_minus = identity * Eigen::AngleAxisd(angles(j) - 0.001, axis);
2435 EXPECT_FALSE((e1.norm() < -M_PI));
2436 EXPECT_FALSE((e1.norm() > M_PI));
2437 EXPECT_FALSE((e2.norm() < -M_PI));
2438 EXPECT_FALSE((e2.norm() > M_PI));
2439 pi_rot_delta = e1 - e2;
2440 EXPECT_NEAR(pi_rot_delta.norm(), 0.002, 1e-6);
2445 pi_rot_plus = identity * Eigen::AngleAxisd(M_PI + 0.001, axis);
2446 pi_rot_minus = identity * Eigen::AngleAxisd(M_PI - 0.001, axis);
2449 EXPECT_FALSE((e1.norm() < -M_PI));
2450 EXPECT_FALSE((e1.norm() > M_PI));
2451 EXPECT_FALSE((e2.norm() < -M_PI));
2452 EXPECT_FALSE((e2.norm() > M_PI));
2453 pi_rot_delta = e1 - e2;
2454 EXPECT_TRUE(pi_rot_delta.norm() > M_PI);
2457 pi_rot_plus = identity * Eigen::AngleAxisd(-M_PI + 0.001, axis);
2458 pi_rot_minus = identity * Eigen::AngleAxisd(-M_PI - 0.001, axis);
2461 EXPECT_FALSE((e1.norm() < -M_PI));
2462 EXPECT_FALSE((e1.norm() > M_PI));
2463 EXPECT_FALSE((e2.norm() < -M_PI));
2464 EXPECT_FALSE((e2.norm() > M_PI));
2465 pi_rot_delta = e1 - e2;
2466 EXPECT_TRUE(pi_rot_delta.norm() > M_PI);
2474 Eigen::Isometry3d identity = Eigen::Isometry3d::Identity();
2477 Eigen::Isometry3d pi_rot = identity * Eigen::AngleAxisd(M_PI_2, Eigen::Vector3d::UnitX());
2479 EXPECT_TRUE(err.head(3).isApprox(Eigen::Vector3d::Zero()));
2480 EXPECT_TRUE(err.tail(3).isApprox(Eigen::Vector3d(M_PI_2, 0, 0)));
2484 Eigen::Isometry3d pi_rot = identity * Eigen::AngleAxisd(M_PI_2, Eigen::Vector3d::UnitY());
2486 EXPECT_TRUE(err.head(3).isApprox(Eigen::Vector3d::Zero()));
2487 EXPECT_TRUE(err.tail(3).isApprox(Eigen::Vector3d(0, M_PI_2, 0)));
2491 Eigen::Isometry3d pi_rot = identity * Eigen::AngleAxisd(M_PI_2, Eigen::Vector3d::UnitZ());
2493 EXPECT_TRUE(err.head(3).isApprox(Eigen::Vector3d::Zero()));
2494 EXPECT_TRUE(err.tail(3).isApprox(Eigen::Vector3d(0, 0, M_PI_2)));
2498 Eigen::Isometry3d pi_rot = identity * Eigen::Translation3d(1, 2, 3);
2500 EXPECT_TRUE(err.head(3).isApprox(Eigen::Vector3d(1, 2, 3)));
2501 EXPECT_TRUE(err.tail(3).isApprox(Eigen::Vector3d::Zero()));
2507 Eigen::Isometry3d identity = Eigen::Isometry3d::Identity();
2508 const double eps = 0.001;
2510 Eigen::Isometry3d target_tf{ identity };
2511 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2512 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge, Eigen::Vector3d::UnitX());
2513 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge + eps, Eigen::Vector3d::UnitX());
2515 EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d::Zero()));
2516 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(eps, 0, 0)));
2520 Eigen::Isometry3d target_tf{ identity };
2521 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2522 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge, Eigen::Vector3d::UnitX());
2523 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge - eps, Eigen::Vector3d::UnitX());
2525 EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d::Zero()));
2526 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(-eps, 0, 0)));
2530 Eigen::Isometry3d target_tf{ identity };
2531 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2532 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge + eps, Eigen::Vector3d::UnitX());
2533 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge - eps, Eigen::Vector3d::UnitX());
2535 EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d::Zero()));
2536 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(-2 * eps, 0, 0)));
2540 Eigen::Isometry3d target_tf{ identity };
2541 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2542 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge, Eigen::Vector3d::UnitX());
2543 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge - eps, Eigen::Vector3d::UnitX());
2544 source_tf_perturbed.translation() += Eigen::Vector3d(eps, -eps, eps);
2546 EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d(eps, -eps, eps)));
2547 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(-eps, 0, 0)));
2551 Eigen::Isometry3d target_tf{ identity };
2552 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2553 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge, Eigen::Vector3d::UnitY());
2554 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge + eps, Eigen::Vector3d::UnitY());
2556 EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d::Zero()));
2557 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(0, eps, 0)));
2561 Eigen::Isometry3d target_tf{ identity };
2562 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2563 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge, Eigen::Vector3d::UnitY());
2564 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge - eps, Eigen::Vector3d::UnitY());
2566 EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d::Zero()));
2567 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(0, -eps, 0)));
2571 Eigen::Isometry3d target_tf{ identity };
2572 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2573 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge + eps, Eigen::Vector3d::UnitY());
2574 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge - eps, Eigen::Vector3d::UnitY());
2576 EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d::Zero()));
2577 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(0, -2 * eps, 0)));
2581 Eigen::Isometry3d target_tf{ identity };
2582 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2583 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge, Eigen::Vector3d::UnitY());
2584 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge - eps, Eigen::Vector3d::UnitY());
2585 source_tf_perturbed.translation() += Eigen::Vector3d(-eps, eps, -eps);
2587 EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d(-eps, eps, -eps)));
2588 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(0, -eps, 0)));
2592 Eigen::Isometry3d target_tf{ identity };
2593 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2594 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge, Eigen::Vector3d::UnitZ());
2595 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge + eps, Eigen::Vector3d::UnitZ());
2597 EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d::Zero()));
2598 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(0, 0, eps)));
2602 Eigen::Isometry3d target_tf{ identity };
2603 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2604 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge, Eigen::Vector3d::UnitZ());
2605 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge - eps, Eigen::Vector3d::UnitZ());
2607 EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d::Zero()));
2608 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(0, 0, -eps)));
2612 Eigen::Isometry3d target_tf{ identity };
2613 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2614 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge + eps, Eigen::Vector3d::UnitZ());
2615 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge - eps, Eigen::Vector3d::UnitZ());
2617 EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d::Zero()));
2618 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(0, 0, -2 * eps)));
2622 Eigen::Isometry3d target_tf{ identity };
2623 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2624 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge, Eigen::Vector3d::UnitZ());
2625 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge - eps, Eigen::Vector3d::UnitZ());
2626 source_tf_perturbed.translation() += Eigen::Vector3d(-eps, -eps, eps);
2628 EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d(-eps, -eps, eps)));
2629 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(0, 0, -eps)));
2635 Eigen::Isometry3d identity = Eigen::Isometry3d::Identity();
2636 const double eps = 0.001;
2638 Eigen::Isometry3d target_tf{ identity };
2639 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2640 Eigen::Isometry3d target_tf_perturbed = Eigen::AngleAxisd(-eps, Eigen::Vector3d::UnitX()) * target_tf;
2641 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(angle, Eigen::Vector3d::UnitX());
2642 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(angle + eps, Eigen::Vector3d::UnitX());
2644 target_tf, target_tf_perturbed, source_tf, source_tf_perturbed);
2646 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(2 * eps, 0, 0)));
2650 Eigen::Isometry3d target_tf{ identity };
2651 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2652 Eigen::Isometry3d target_tf_perturbed = Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitX()) * target_tf;
2653 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(angle, Eigen::Vector3d::UnitX());
2654 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(angle - eps, Eigen::Vector3d::UnitX());
2656 target_tf, target_tf_perturbed, source_tf, source_tf_perturbed);
2658 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(-2 * eps, 0, 0)));
2662 Eigen::Isometry3d target_tf{ identity };
2663 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2664 Eigen::Isometry3d target_tf_perturbed = Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitX()) * target_tf;
2665 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(angle + eps, Eigen::Vector3d::UnitX());
2666 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(angle - eps, Eigen::Vector3d::UnitX());
2668 target_tf, target_tf_perturbed, source_tf, source_tf_perturbed);
2670 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(-3 * eps, 0, 0)));
2674 Eigen::Isometry3d target_tf{ identity };
2675 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2676 Eigen::Isometry3d target_tf_perturbed =
2677 Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitX()) * target_tf * Eigen::Translation3d(eps, -eps, eps);
2679 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(angle, Eigen::Vector3d::UnitX());
2680 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(angle - eps, Eigen::Vector3d::UnitX());
2682 target_tf, target_tf_perturbed, source_tf, source_tf_perturbed);
2683 EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d(-eps, eps, -eps)));
2684 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(-2 * eps, 0, 0)));
2688 Eigen::Isometry3d target_tf{ identity };
2689 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2690 Eigen::Isometry3d target_tf_perturbed = Eigen::AngleAxisd(-eps, Eigen::Vector3d::UnitY()) * target_tf;
2691 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(angle, Eigen::Vector3d::UnitY());
2692 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(angle + eps, Eigen::Vector3d::UnitY());
2694 target_tf, target_tf_perturbed, source_tf, source_tf_perturbed);
2696 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(0, 2 * eps, 0)));
2700 Eigen::Isometry3d target_tf{ identity };
2701 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2702 Eigen::Isometry3d target_tf_perturbed = Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitY()) * target_tf;
2703 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(angle, Eigen::Vector3d::UnitY());
2704 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(angle - eps, Eigen::Vector3d::UnitY());
2706 target_tf, target_tf_perturbed, source_tf, source_tf_perturbed);
2708 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(0, -2 * eps, 0)));
2712 Eigen::Isometry3d target_tf{ identity };
2713 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2714 Eigen::Isometry3d target_tf_perturbed = Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitY()) * target_tf;
2715 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(angle + eps, Eigen::Vector3d::UnitY());
2716 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(angle - eps, Eigen::Vector3d::UnitY());
2718 target_tf, target_tf_perturbed, source_tf, source_tf_perturbed);
2720 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(0, -3 * eps, 0)));
2724 Eigen::Isometry3d target_tf{ identity };
2725 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2726 Eigen::Isometry3d target_tf_perturbed =
2727 Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitY()) * target_tf * Eigen::Translation3d(-eps, eps, -eps);
2728 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(angle, Eigen::Vector3d::UnitY());
2729 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(angle - eps, Eigen::Vector3d::UnitY());
2731 target_tf, target_tf_perturbed, source_tf, source_tf_perturbed);
2732 EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d(eps, -eps, eps)));
2733 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(0, -2 * eps, 0)));
2737 Eigen::Isometry3d target_tf{ identity };
2738 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2739 Eigen::Isometry3d target_tf_perturbed = Eigen::AngleAxisd(-eps, Eigen::Vector3d::UnitZ()) * target_tf;
2740 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(angle, Eigen::Vector3d::UnitZ());
2741 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(angle + eps, Eigen::Vector3d::UnitZ());
2743 target_tf, target_tf_perturbed, source_tf, source_tf_perturbed);
2745 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(0, 0, 2 * eps)));
2749 Eigen::Isometry3d target_tf{ identity };
2750 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2751 Eigen::Isometry3d target_tf_perturbed = Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitZ()) * target_tf;
2752 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(angle, Eigen::Vector3d::UnitZ());
2753 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(angle - eps, Eigen::Vector3d::UnitZ());
2755 target_tf, target_tf_perturbed, source_tf, source_tf_perturbed);
2757 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(0, 0, -2 * eps)));
2761 Eigen::Isometry3d target_tf{ identity };
2762 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2763 Eigen::Isometry3d target_tf_perturbed = Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitZ()) * target_tf;
2764 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(angle + eps, Eigen::Vector3d::UnitZ());
2765 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(angle - eps, Eigen::Vector3d::UnitZ());
2767 target_tf, target_tf_perturbed, source_tf, source_tf_perturbed);
2769 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(0, 0, -3 * eps)));
2773 Eigen::Isometry3d target_tf{ identity };
2774 target_tf.translation() = Eigen::Vector3d(1, 2, 3);
2775 Eigen::Isometry3d target_tf_perturbed =
2776 Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitZ()) * target_tf * Eigen::Translation3d(-eps, -eps, eps);
2777 Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(angle, Eigen::Vector3d::UnitZ());
2778 Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(angle - eps, Eigen::Vector3d::UnitZ());
2780 target_tf, target_tf_perturbed, source_tf, source_tf_perturbed);
2781 EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d(eps, eps, -eps)));
2782 EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(0, 0, -2 * eps)));
2806 EXPECT_FALSE(color(0) < 0);
2807 EXPECT_FALSE(color(1) < 0);
2808 EXPECT_FALSE(color(2) < 0);
2809 EXPECT_FALSE(color(3) < 0);
2810 EXPECT_FALSE(color(0) > 1);
2811 EXPECT_FALSE(color(1) > 1);
2812 EXPECT_FALSE(color(2) > 1);
2813 EXPECT_FALSE(color(3) > 1);
2819 Eigen::Vector3d a(1, 2, 3);
2820 Eigen::Vector3d b(4, 5, 6);
2823 EXPECT_EQ(c.rows(), a.rows() + b.rows());
2824 EXPECT_TRUE(c.head(3).isApprox(a));
2825 EXPECT_TRUE(c.tail(3).isApprox(b));
2828 TEST(TesseractCommonUnit, TestAllowedCollisionMatrix)
2840 EXPECT_TRUE(acm_copy == acm);
2847 EXPECT_TRUE(acm_move == acm);
2883 std::stringstream ss;
2884 EXPECT_NO_THROW(ss << acm);
2887 TEST(TesseractCommonUnit, TestAllowedCollisionEntriesCompare)
2909 TEST(TesseractCommonUnit, CollisionMarginDataUnit)
2911 double tol = std::numeric_limits<double>::epsilon();
2920 double increment = 0.01;
2937 double default_margin = 0.0254;
2948 EXPECT_NEAR(data.
getCollisionMargin(
"link_1",
"link_2"), scale * default_margin, tol);
2959 double default_margin = 0.0254;
2969 double default_margin = 0.0;
2970 double pair_margin = 0.5;
2981 double default_margin = 0.0254;
2982 double pair_margin = 0.5;
2993 double default_margin = 0.0254;
2994 double pair_margin = 0.5;
2996 temp[std::make_pair(
"link_1",
"link_2")] = pair_margin;
3007 double default_margin = 0.0;
3008 double pair_margin = 0.5;
3010 temp[std::make_pair(
"link_1",
"link_2")] = pair_margin;
3020 double default_margin = 0.0254;
3021 double pair_margin = 0.5;
3031 double default_margin = 0.0254;
3032 double pair_margin = 0.01;
3042 double default_margin = 0.0254;
3043 double pair_margin = 0.5;
3047 default_margin = 2 * pair_margin;
3056 double default_margin = 0.0254;
3057 double pair_margin = 0.5;
3068 double default_margin = 0.05;
3069 double pair_margin = 0.0254;
3073 default_margin = 0.0;
3082 double default_margin = 0.0254;
3083 double pair_margin = 0.5;
3084 double increment = 0.01;
3089 EXPECT_NEAR(data.
getMaxCollisionMargin(), std::max(default_margin + increment, pair_margin + increment), tol);
3090 EXPECT_NEAR(data.
getCollisionMargin(
"link_1",
"link_2"), pair_margin + increment, tol);
3095 double default_margin = 0.0254;
3096 double pair_margin = 0.5;
3097 double increment = -0.01;
3102 EXPECT_NEAR(data.
getMaxCollisionMargin(), std::max(default_margin + increment, pair_margin + increment), tol);
3103 EXPECT_NEAR(data.
getCollisionMargin(
"link_1",
"link_2"), pair_margin + increment, tol);
3108 double default_margin = 0.0254;
3109 double pair_margin = 0.5;
3115 EXPECT_NEAR(data.
getMaxCollisionMargin(), std::max(default_margin * scale, pair_margin * scale), tol);
3121 double default_margin = 0.0254;
3122 double pair_margin = 0.5;
3128 EXPECT_NEAR(data.
getMaxCollisionMargin(), std::max(default_margin * scale, pair_margin * scale), tol);
3134 double default_margin = 0.0254;
3135 double pair_margin = 0.5;
3139 default_margin = default_margin * 3;
3148 double default_margin = 0.0254;
3149 double pair_margin = 0.5;
3153 default_margin = default_margin * 3;
3154 pair_margin = pair_margin * 3;
3166 double default_margin = 0.0254;
3167 double pair_margin = 0.5;
3171 default_margin = default_margin * 3;
3172 pair_margin = pair_margin * 3;
3184 double default_margin = 0.0254;
3185 double pair_margin = 0.5;
3189 default_margin = default_margin * 3;
3201 double default_margin = 0.0254;
3202 double pair_margin = 0.5;
3206 default_margin = default_margin * 3;
3219 EXPECT_EQ(pair_data_copy.getCollisionMargins().size(), 2);
3220 EXPECT_FALSE(pair_data_copy.empty());
3221 pair_data_copy.clear();
3222 EXPECT_EQ(pair_data_copy.getCollisionMargins().size(), 0);
3223 EXPECT_TRUE(pair_data_copy.empty());
3227 double default_margin = 0.0254;
3228 double pair_margin = 0.5;
3232 pair_margin = pair_margin * 3;
3233 default_margin = default_margin * 3;
3247 double default_margin = 0.0254;
3248 double pair_margin = 0.5;
3252 default_margin = default_margin * 3;
3265 double default_margin = 0.0254;
3266 double pair_margin = 0.5;
3270 pair_margin = pair_margin * 3;
3271 default_margin = default_margin * 3;
3285 TEST(TesseractCommonUnit, CollisionMarginDataCompare)
3291 EXPECT_TRUE(margin_data1 == margin_data2);
3300 EXPECT_TRUE(margin_data1 == margin_data2);
3307 EXPECT_FALSE(margin_data1 == margin_data2);
3317 EXPECT_FALSE(margin_data1 == margin_data2);
3326 EXPECT_FALSE(margin_data1 == margin_data2);
3335 EXPECT_FALSE(margin_data1 == margin_data2);
3342 std::ofstream file(filePath);
3343 ASSERT_TRUE(file.is_open());
3348 TEST(TesseractCommonUnit, YamlBasicIncludeTest)
3350 std::string separator(1, std::filesystem::path::preferred_separator);
3354 std::filesystem::create_directory(test_dir);
3362 key2: !include included.yaml
3365 included_key1: included_value1
3366 included_key2: included_value2
3370 YAML::Node root =
loadYamlFile(test_dir +
"main.yaml", locator);
3374 ASSERT_TRUE(root[
"key1"].IsScalar());
3375 ASSERT_EQ(root[
"key1"].as<std::string>(),
"value1");
3377 ASSERT_TRUE(root[
"key2"].IsMap());
3378 ASSERT_EQ(root[
"key2"][
"included_key1"].as<std::string>(),
"included_value1");
3379 ASSERT_EQ(root[
"key2"][
"included_key2"].as<std::string>(),
"included_value2");
3382 std::filesystem::remove_all(test_dir);
3385 TEST(TesseractCommonUnit, YamlIncludeNestedIncludesTest)
3387 std::string separator(1, std::filesystem::path::preferred_separator);
3391 std::filesystem::create_directory(test_dir);
3399 key2: !include included.yaml
3402 nested_key1: !include nested.yaml
3405 deep_key1: deep_value1
3409 YAML::Node root =
loadYamlFile(test_dir +
"main.yaml", locator);
3413 ASSERT_TRUE(root[
"key2"].IsMap());
3414 ASSERT_TRUE(root[
"key2"][
"nested_key1"].IsMap());
3415 ASSERT_EQ(root[
"key2"][
"nested_key1"][
"deep_key1"].as<std::string>(),
"deep_value1");
3418 std::filesystem::remove_all(test_dir);
3421 TEST(TesseractCommonUnit, YamlIncludeSequenceIncludesTest)
3423 std::string separator(1, std::filesystem::path::preferred_separator);
3427 std::filesystem::create_directory(test_dir);
3436 - !include included.yaml
3444 YAML::Node root =
loadYamlFile(test_dir +
"main.yaml", locator);
3448 ASSERT_TRUE(root[
"key1"].IsSequence());
3449 ASSERT_EQ(root[
"key1"].size(), 2);
3450 ASSERT_EQ(root[
"key1"][0].as<std::string>(),
"item1");
3451 ASSERT_EQ(root[
"key1"][1][0].as<std::string>(),
"included_item1");
3452 ASSERT_EQ(root[
"key1"][1][1].as<std::string>(),
"included_item2");
3455 std::filesystem::remove_all(test_dir);
3458 TEST(TesseractCommonUnit, YamlIncludeSequenceIncludesMapTest)
3460 std::string separator(1, std::filesystem::path::preferred_separator);
3464 std::filesystem::create_directory(test_dir);
3473 - !include included.yaml
3481 YAML::Node root =
loadYamlFile(test_dir +
"main.yaml", locator);
3485 ASSERT_TRUE(root[
"key1"].IsSequence());
3486 ASSERT_EQ(root[
"key1"].size(), 2);
3487 ASSERT_EQ(root[
"key1"][0].as<std::string>(),
"item1");
3490 ASSERT_TRUE(root[
"key1"][1].IsMap());
3491 ASSERT_EQ(root[
"key1"][1][
"keyA"].as<std::string>(),
"valueA");
3492 ASSERT_EQ(root[
"key1"][1][
"keyB"].as<std::string>(),
"valueB");
3495 std::filesystem::remove_all(test_dir);
3498 TEST(TesseractCommonUnit, YamlIncludeMissingIncludeFileTest)
3500 std::string separator(1, std::filesystem::path::preferred_separator);
3504 std::filesystem::create_directory(test_dir);
3511 key1: !include missing.yaml
3515 EXPECT_THROW(
loadYamlFile(test_dir +
"main.yaml", locator), std::runtime_error);
3518 std::filesystem::remove_all(test_dir);
3521 TEST(TesseractCommonUnit, YamlIncludeInvalidIncludeTagTest)
3523 std::string separator(1, std::filesystem::path::preferred_separator);
3527 std::filesystem::create_directory(test_dir);
3538 EXPECT_THROW(
loadYamlFile(test_dir +
"main.yaml", locator), std::runtime_error);
3541 std::filesystem::remove_all(test_dir);
3544 TEST(TesseractCommonUnit, YamlCollisionMarginPairOverrideType)
3547 YAML::Node n = YAML::Load(R
"(NONE)");
3553 YAML::Node n = YAML::Load(R
"(MODIFY)");
3559 YAML::Node n = YAML::Load(R
"(REPLACE)");
3583 YAML::Node n = YAML::Load(R
"(DOES_NOT_EXIST)");
3588 YAML::Node n = YAML::Load(R
"(["test", "test"])");
3593 TEST(TesseractCommonUnit, YamlPairsCollisionMarginData)
3595 const std::string yaml_string = R
"(
3596 ["link1","link2"]: 0.8
3597 ["base","tool0"]: 1.5
3601 data_original[std::make_pair("link1",
"link2")] = 0.8;
3602 data_original[std::make_pair(
"base",
"tool0")] = 1.5;
3605 YAML::Node n(data_original);
3607 EXPECT_EQ(data.size(), 2U);
3608 EXPECT_DOUBLE_EQ(data.at({
"link1",
"link2" }), data_original[std::make_pair(
"link1",
"link2")]);
3609 EXPECT_DOUBLE_EQ(data.at({
"base",
"tool0" }), data_original[std::make_pair(
"base",
"tool0")]);
3613 YAML::Node n = YAML::Load(yaml_string);
3615 EXPECT_EQ(data.size(), 2U);
3616 EXPECT_DOUBLE_EQ(data.at({
"link1",
"link2" }), data_original[std::make_pair(
"link1",
"link2")]);
3617 EXPECT_DOUBLE_EQ(data.at({
"base",
"tool0" }), data_original[std::make_pair(
"base",
"tool0")]);
3621 YAML::Node n = YAML::Load(R
"(["test", "test"])");
3626 const std::string invalid_yaml = R
"(
3627 ["link1","link2", "link2"]: 0.8
3628 ["base","tool0"]: 1.5
3630 YAML::Node n = YAML::Load(invalid_yaml);
3635 TEST(TesseractCommonUnit, YamlCollisionMarginPairData)
3637 const std::string yaml_string = R
"(
3638 ["link1","link2"]: 0.8
3639 ["base","tool0"]: 1.5
3645 pair_data[std::make_pair("link1",
"link2")] = 0.8;
3646 pair_data[std::make_pair(
"base",
"tool0")] = 1.5;
3651 YAML::Node n = YAML::Load(yaml_string);
3653 EXPECT_EQ(data.getCollisionMargins().size(), 2U);
3663 YAML::Node n(data_original);
3665 EXPECT_EQ(data.getCollisionMargins().size(), 2U);
3675 TEST(TesseractCommonUnit, YamlAllowedCollisionEntries)
3677 const std::string yaml_string = R
"(
3678 ["link1","link2"]: "adjacent"
3679 ["base","tool0"]: "never"
3683 data_original[std::make_pair("link1",
"link2")] =
"adjacent";
3684 data_original[std::make_pair(
"base",
"tool0")] =
"never";
3687 YAML::Node n(data_original);
3689 EXPECT_EQ(data.size(), 2U);
3690 EXPECT_EQ(data.at({
"link1",
"link2" }), data_original[std::make_pair(
"link1",
"link2")]);
3691 EXPECT_EQ(data.at({
"base",
"tool0" }), data_original[std::make_pair(
"base",
"tool0")]);
3695 YAML::Node n = YAML::Load(yaml_string);
3697 EXPECT_EQ(data.size(), 2U);
3698 EXPECT_EQ(data.at({
"link1",
"link2" }), data_original[std::make_pair(
"link1",
"link2")]);
3699 EXPECT_EQ(data.at({
"base",
"tool0" }), data_original[std::make_pair(
"base",
"tool0")]);
3703 YAML::Node n = YAML::Load(R
"(["test", "test"])");
3708 const std::string invalid_yaml = R
"(
3709 ["link1","link2", "link2"]: 0.8
3710 ["base","tool0"]: 1.5
3712 YAML::Node n = YAML::Load(invalid_yaml);
3717 TEST(TesseractCommonUnit, YamlAllowedCollisionMatrix)
3719 const std::string yaml_string = R
"(
3720 ["link1","link2"]: "adjacent"
3721 ["base","tool0"]: "never"
3727 pair_data[std::make_pair("link1",
"link2")] =
"adjacent";
3728 pair_data[std::make_pair(
"base",
"tool0")] =
"never";
3733 YAML::Node n(data_original);
3735 EXPECT_EQ(data.getAllAllowedCollisions().size(), 2U);
3736 EXPECT_EQ(data.isCollisionAllowed(
"link1",
"link2"), data_original.
isCollisionAllowed(
"link1",
"link2"));
3737 EXPECT_EQ(data.isCollisionAllowed(
"base",
"tool0"), data_original.
isCollisionAllowed(
"base",
"tool0"));
3741 YAML::Node n = YAML::Load(yaml_string);
3743 EXPECT_EQ(data.getAllAllowedCollisions().size(), 2U);
3744 EXPECT_EQ(data.isCollisionAllowed(
"link1",
"link2"), data_original.
isCollisionAllowed(
"link1",
"link2"));
3745 EXPECT_EQ(data.isCollisionAllowed(
"base",
"tool0"), data_original.
isCollisionAllowed(
"base",
"tool0"));
3749 TEST(TesseractCommonUnit, YamlStdUnorderedMapStringBool)
3751 using DataType = std::unordered_map<std::string, bool>;
3753 const std::string yaml_string = R
"(
3758 DataType data_original;
3759 data_original["link1"] =
true;
3760 data_original[
"tool0"] =
false;
3763 YAML::Node n(data_original);
3764 auto data = n.as<DataType>();
3765 EXPECT_EQ(data.size(), 2U);
3766 EXPECT_EQ(data[
"link1"], data_original[
"link1"]);
3767 EXPECT_EQ(data[
"tool0"], data_original[
"tool0"]);
3771 YAML::Node n = YAML::Load(yaml_string);
3772 auto data = n.as<DataType>();
3773 EXPECT_EQ(data.size(), 2U);
3774 EXPECT_EQ(data[
"link1"], data_original[
"link1"]);
3775 EXPECT_EQ(data[
"tool0"], data_original[
"tool0"]);
3779 YAML::Node n = YAML::Load(R
"(["test", "test"])");
3780 EXPECT_ANY_THROW(n.as<DataType>());
3784 int main(
int argc,
char** argv)
3786 testing::InitGoogleTest(&argc, argv);
3788 return RUN_ALL_TESTS();