31 #include <gtest/gtest.h>
35 #include "LinearMath/btVector3.h"
36 #include "LinearMath/btTransform.h"
37 #include "rostest/permuter.h"
41 trans.translation.x = 0;
42 trans.translation.y = 0;
43 trans.translation.z = 0;
51 void push_back_i(std::vector<std::string>& children, std::vector<std::string>& parents,
52 std::vector<double>& dx, std::vector<double>& dy)
62 children.push_back(
"b");
63 parents.push_back(
"a");
66 children.push_back(
"c");
67 parents.push_back(
"b");
73 void push_back_y(std::vector<std::string>& children, std::vector<std::string>& parents,
74 std::vector<double>& dx, std::vector<double>& dy)
84 children.push_back(
"b");
85 parents.push_back(
"a");
89 children.push_back(
"c");
90 parents.push_back(
"b");
94 children.push_back(
"d");
95 parents.push_back(
"b");
99 children.push_back(
"e");
100 parents.push_back(
"d");
105 void push_back_v(std::vector<std::string>& children, std::vector<std::string>& parents,
106 std::vector<double>& dx, std::vector<double>& dy)
116 children.push_back(
"b");
117 parents.push_back(
"a");
121 children.push_back(
"c");
122 parents.push_back(
"b");
126 children.push_back(
"f");
127 parents.push_back(
"a");
131 children.push_back(
"g");
132 parents.push_back(
"f");
138 void push_back_1(std::vector<std::string>& children, std::vector<std::string>& parents,
139 std::vector<double>& dx, std::vector<double>& dy)
141 children.push_back(
"2");
142 parents.push_back(
"1");
149 ROS_DEBUG(
"Clearing Buffer Core for new test setup");
152 ROS_DEBUG(
"Setting up test tree for formation %s", mode.c_str());
154 std::vector<std::string> children;
155 std::vector<std::string> parents;
156 std::vector<double> dx, dy;
162 else if (mode ==
"y")
167 else if (mode ==
"v")
172 else if (mode ==
"ring_45")
176 std::vector<std::string> frames;
180 frames.push_back(
"a");
181 frames.push_back(
"b");
182 frames.push_back(
"c");
183 frames.push_back(
"d");
184 frames.push_back(
"e");
185 frames.push_back(
"f");
186 frames.push_back(
"g");
187 frames.push_back(
"h");
188 frames.push_back(
"i");
190 for (uint8_t iteration = 0; iteration < 2; ++iteration)
192 double direction = 1;
193 std::string frame_prefix;
196 frame_prefix =
"inverse_";
201 for (uint64_t i = 1; i < frames.size(); i++)
203 geometry_msgs::TransformStamped ts;
205 ts.transform.translation.x = direction * ( sqrt(2)/2 - 1);
206 ts.transform.translation.y = direction * sqrt(2)/2;
207 ts.transform.rotation.x = 0;
208 ts.transform.rotation.y = 0;
209 ts.transform.rotation.z = sin(direction * M_PI/8);
210 ts.transform.rotation.w = cos(direction * M_PI/8);
211 if (time >
ros::Time() + (interpolation_space * .5))
212 ts.header.stamp = time - (interpolation_space * .5);
216 ts.child_frame_id = frame_prefix + frames[i];
218 ts.header.frame_id = frame_prefix + frames[i-1];
220 ts.header.frame_id = frames[i-1];
225 ts.header.stamp = time + interpolation_space * .5;
233 else if (mode ==
"1")
238 else if (mode ==
"1_v")
244 EXPECT_FALSE(
"Undefined mode for tree setup. Test harness improperly setup.");
248 for (uint64_t i = 0; i < children.size(); i++)
250 geometry_msgs::TransformStamped ts;
252 ts.transform.translation.x = dx[i];
253 ts.transform.translation.y = dy[i];
254 if (time >
ros::Time() + (interpolation_space * .5))
255 ts.header.stamp = time - (interpolation_space * .5);
259 ts.header.frame_id = parents[i];
260 ts.child_frame_id = children[i];
264 ts.header.stamp = time + interpolation_space * .5;
272 TEST(BufferCore_setTransform, NoInsertOnSelfTransform)
275 geometry_msgs::TransformStamped tranStamped;
278 tranStamped.header.frame_id =
"same_frame";
279 tranStamped.child_frame_id =
"same_frame";
280 EXPECT_FALSE(mBC.
setTransform(tranStamped,
"authority"));
283 TEST(BufferCore_setTransform, NoInsertWithNan)
286 geometry_msgs::TransformStamped tranStamped;
289 tranStamped.header.frame_id =
"same_frame";
290 tranStamped.child_frame_id =
"other_frame";
291 EXPECT_TRUE(mBC.
setTransform(tranStamped,
"authority"));
292 tranStamped.transform.translation.x = std::nan(
"");
293 EXPECT_TRUE(std::isnan(tranStamped.transform.translation.x));
294 EXPECT_FALSE(mBC.
setTransform(tranStamped,
"authority"));
298 TEST(BufferCore_setTransform, NoInsertWithNoFrameID)
301 geometry_msgs::TransformStamped tranStamped;
304 tranStamped.header.frame_id =
"same_frame";
305 tranStamped.child_frame_id =
"";
306 EXPECT_FALSE(mBC.
setTransform(tranStamped,
"authority"));
307 tranStamped.child_frame_id =
"/";
308 EXPECT_FALSE(mBC.
setTransform(tranStamped,
"authority"));
312 TEST(BufferCore_setTransform, NoInsertWithNoParentID)
315 geometry_msgs::TransformStamped tranStamped;
318 tranStamped.header.frame_id =
"";
319 tranStamped.child_frame_id =
"some_frame";
320 EXPECT_FALSE(mBC.
setTransform(tranStamped,
"authority"));
322 tranStamped.header.frame_id =
"/";
323 EXPECT_FALSE(mBC.
setTransform(tranStamped,
"authority"));
603 TEST(BufferCore_lookupTransform, i_configuration)
609 rostest::Permuter permuter;
611 std::vector<ros::Time> times;
616 permuter.addOptionSet(times, &eval_time);
618 std::vector<ros::Duration> durations;
625 std::vector<std::string> frames;
626 frames.push_back(
"a");
627 frames.push_back(
"b");
628 frames.push_back(
"c");
629 std::string source_frame;
630 permuter.addOptionSet(frames, &source_frame);
632 std::string target_frame;
633 permuter.addOptionSet(frames, &target_frame);
635 while (permuter.step())
639 setupTree(mBC,
"i", eval_time, interpolation_space);
641 geometry_msgs::TransformStamped outpose = mBC.
lookupTransform(source_frame, target_frame, eval_time);
643 EXPECT_EQ(outpose.header.stamp, eval_time);
644 EXPECT_EQ(outpose.header.frame_id, source_frame);
645 EXPECT_EQ(outpose.child_frame_id, target_frame);
646 EXPECT_NEAR(outpose.transform.translation.y, 0,
epsilon);
647 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
648 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
649 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
650 EXPECT_NEAR(outpose.transform.rotation.z, 0,
epsilon);
651 EXPECT_NEAR(outpose.transform.rotation.w, 1,
epsilon);
654 if (source_frame == target_frame)
656 EXPECT_NEAR(outpose.transform.translation.x, 0,
epsilon);
658 else if ((source_frame ==
"a" && target_frame ==
"b") ||
659 (source_frame ==
"b" && target_frame ==
"c"))
661 EXPECT_NEAR(outpose.transform.translation.x, 1,
epsilon);
663 else if ((source_frame ==
"b" && target_frame ==
"a") ||
664 (source_frame ==
"c" && target_frame ==
"b"))
666 EXPECT_NEAR(outpose.transform.translation.x, -1,
epsilon);
668 else if (source_frame ==
"a" && target_frame ==
"c")
670 EXPECT_NEAR(outpose.transform.translation.x, 2,
epsilon);
672 else if (source_frame ==
"c" && target_frame ==
"a")
674 EXPECT_NEAR(outpose.transform.translation.x, -2,
epsilon);
678 EXPECT_FALSE(
"i configuration: Shouldn't get here");
679 printf(
"source_frame %s target_frame %s time %f\n", source_frame.c_str(), target_frame.c_str(), eval_time.
toSec());
686 bool check_1_result(
const geometry_msgs::TransformStamped& outpose,
const std::string& source_frame,
const std::string& target_frame,
const ros::Time& eval_time,
double epsilon)
689 EXPECT_EQ(outpose.header.stamp, eval_time);
690 EXPECT_EQ(outpose.header.frame_id, source_frame);
691 EXPECT_EQ(outpose.child_frame_id, target_frame);
692 EXPECT_NEAR(outpose.transform.translation.y, 0,
epsilon);
693 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
694 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
695 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
696 EXPECT_NEAR(outpose.transform.rotation.z, 0,
epsilon);
697 EXPECT_NEAR(outpose.transform.rotation.w, 1,
epsilon);
700 if (source_frame == target_frame)
702 EXPECT_NEAR(outpose.transform.translation.x, 0,
epsilon);
704 else if (source_frame ==
"1" && target_frame ==
"2")
706 EXPECT_NEAR(outpose.transform.translation.x, 1,
epsilon);
708 else if (source_frame ==
"2" && target_frame ==
"1")
710 EXPECT_NEAR(outpose.transform.translation.x, -1,
epsilon);
721 bool check_v_result(
const geometry_msgs::TransformStamped& outpose,
const std::string& source_frame,
const std::string& target_frame,
const ros::Time& eval_time,
double epsilon)
724 EXPECT_EQ(outpose.header.stamp, eval_time);
725 EXPECT_EQ(outpose.header.frame_id, source_frame);
726 EXPECT_EQ(outpose.child_frame_id, target_frame);
727 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
728 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
729 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
730 EXPECT_NEAR(outpose.transform.rotation.z, 0,
epsilon);
731 EXPECT_NEAR(outpose.transform.rotation.w, 1,
epsilon);
734 if (source_frame == target_frame)
736 EXPECT_NEAR(outpose.transform.translation.x, 0,
epsilon);
738 else if ((source_frame ==
"a" && target_frame ==
"b") ||
739 (source_frame ==
"b" && target_frame ==
"c"))
741 EXPECT_NEAR(outpose.transform.translation.x, 1,
epsilon);
742 EXPECT_NEAR(outpose.transform.translation.y, 0,
epsilon);
744 else if ((source_frame ==
"b" && target_frame ==
"a") ||
745 (source_frame ==
"c" && target_frame ==
"b"))
747 EXPECT_NEAR(outpose.transform.translation.x, -1,
epsilon);
748 EXPECT_NEAR(outpose.transform.translation.y, 0,
epsilon);
750 else if ((source_frame ==
"a" && target_frame ==
"f") ||
751 (source_frame ==
"f" && target_frame ==
"g"))
753 EXPECT_NEAR(outpose.transform.translation.x, 0,
epsilon);
754 EXPECT_NEAR(outpose.transform.translation.y, 1,
epsilon);
756 else if ((source_frame ==
"f" && target_frame ==
"a") ||
757 (source_frame ==
"g" && target_frame ==
"f"))
759 EXPECT_NEAR(outpose.transform.translation.x, 0,
epsilon);
760 EXPECT_NEAR(outpose.transform.translation.y, -1,
epsilon);
762 else if (source_frame ==
"a" && target_frame ==
"g")
764 EXPECT_NEAR(outpose.transform.translation.x, 0,
epsilon);
765 EXPECT_NEAR(outpose.transform.translation.y, 2,
epsilon);
767 else if (source_frame ==
"g" && target_frame ==
"a")
769 EXPECT_NEAR(outpose.transform.translation.x, 0,
epsilon);
770 EXPECT_NEAR(outpose.transform.translation.y, -2,
epsilon);
772 else if (source_frame ==
"a" && target_frame ==
"c")
774 EXPECT_NEAR(outpose.transform.translation.x, 2,
epsilon);
775 EXPECT_NEAR(outpose.transform.translation.y, 0,
epsilon);
777 else if (source_frame ==
"c" && target_frame ==
"a")
779 EXPECT_NEAR(outpose.transform.translation.x, -2,
epsilon);
780 EXPECT_NEAR(outpose.transform.translation.y, 0,
epsilon);
782 else if (source_frame ==
"b" && target_frame ==
"f")
784 EXPECT_NEAR(outpose.transform.translation.x, -1,
epsilon);
785 EXPECT_NEAR(outpose.transform.translation.y, 1,
epsilon);
787 else if (source_frame ==
"f" && target_frame ==
"b")
789 EXPECT_NEAR(outpose.transform.translation.x, 1,
epsilon);
790 EXPECT_NEAR(outpose.transform.translation.y, -1,
epsilon);
792 else if (source_frame ==
"c" && target_frame ==
"f")
794 EXPECT_NEAR(outpose.transform.translation.x, -2,
epsilon);
795 EXPECT_NEAR(outpose.transform.translation.y, 1,
epsilon);
797 else if (source_frame ==
"f" && target_frame ==
"c")
799 EXPECT_NEAR(outpose.transform.translation.x, 2,
epsilon);
800 EXPECT_NEAR(outpose.transform.translation.y, -1,
epsilon);
802 else if (source_frame ==
"b" && target_frame ==
"g")
804 EXPECT_NEAR(outpose.transform.translation.x, -1,
epsilon);
805 EXPECT_NEAR(outpose.transform.translation.y, 2,
epsilon);
807 else if (source_frame ==
"g" && target_frame ==
"b")
809 EXPECT_NEAR(outpose.transform.translation.x, 1,
epsilon);
810 EXPECT_NEAR(outpose.transform.translation.y, -2,
epsilon);
812 else if (source_frame ==
"c" && target_frame ==
"g")
814 EXPECT_NEAR(outpose.transform.translation.x, -2,
epsilon);
815 EXPECT_NEAR(outpose.transform.translation.y, 2,
epsilon);
817 else if (source_frame ==
"g" && target_frame ==
"c")
819 EXPECT_NEAR(outpose.transform.translation.x, 2,
epsilon);
820 EXPECT_NEAR(outpose.transform.translation.y, -2,
epsilon);
831 bool check_y_result(
const geometry_msgs::TransformStamped& outpose,
const std::string& source_frame,
const std::string& target_frame,
const ros::Time& eval_time,
double epsilon)
834 EXPECT_EQ(outpose.header.stamp, eval_time);
835 EXPECT_EQ(outpose.header.frame_id, source_frame);
836 EXPECT_EQ(outpose.child_frame_id, target_frame);
837 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
838 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
839 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
840 EXPECT_NEAR(outpose.transform.rotation.z, 0,
epsilon);
841 EXPECT_NEAR(outpose.transform.rotation.w, 1,
epsilon);
844 if (source_frame == target_frame)
846 EXPECT_NEAR(outpose.transform.translation.x, 0,
epsilon);
848 else if ((source_frame ==
"a" && target_frame ==
"b") ||
849 (source_frame ==
"b" && target_frame ==
"c"))
851 EXPECT_NEAR(outpose.transform.translation.x, 1,
epsilon);
852 EXPECT_NEAR(outpose.transform.translation.y, 0,
epsilon);
854 else if ((source_frame ==
"b" && target_frame ==
"a") ||
855 (source_frame ==
"c" && target_frame ==
"b"))
857 EXPECT_NEAR(outpose.transform.translation.x, -1,
epsilon);
858 EXPECT_NEAR(outpose.transform.translation.y, 0,
epsilon);
860 else if ((source_frame ==
"b" && target_frame ==
"d") ||
861 (source_frame ==
"d" && target_frame ==
"e"))
863 EXPECT_NEAR(outpose.transform.translation.x, 0,
epsilon);
864 EXPECT_NEAR(outpose.transform.translation.y, 1,
epsilon);
866 else if ((source_frame ==
"d" && target_frame ==
"b") ||
867 (source_frame ==
"e" && target_frame ==
"d"))
869 EXPECT_NEAR(outpose.transform.translation.x, 0,
epsilon);
870 EXPECT_NEAR(outpose.transform.translation.y, -1,
epsilon);
872 else if (source_frame ==
"b" && target_frame ==
"e")
874 EXPECT_NEAR(outpose.transform.translation.x, 0,
epsilon);
875 EXPECT_NEAR(outpose.transform.translation.y, 2,
epsilon);
877 else if (source_frame ==
"e" && target_frame ==
"b")
879 EXPECT_NEAR(outpose.transform.translation.x, 0,
epsilon);
880 EXPECT_NEAR(outpose.transform.translation.y, -2,
epsilon);
882 else if (source_frame ==
"a" && target_frame ==
"c")
884 EXPECT_NEAR(outpose.transform.translation.x, 2,
epsilon);
885 EXPECT_NEAR(outpose.transform.translation.y, 0,
epsilon);
887 else if (source_frame ==
"c" && target_frame ==
"a")
889 EXPECT_NEAR(outpose.transform.translation.x, -2,
epsilon);
890 EXPECT_NEAR(outpose.transform.translation.y, 0,
epsilon);
892 else if (source_frame ==
"a" && target_frame ==
"d")
894 EXPECT_NEAR(outpose.transform.translation.x, 1,
epsilon);
895 EXPECT_NEAR(outpose.transform.translation.y, 1,
epsilon);
897 else if (source_frame ==
"d" && target_frame ==
"a")
899 EXPECT_NEAR(outpose.transform.translation.x, -1,
epsilon);
900 EXPECT_NEAR(outpose.transform.translation.y, -1,
epsilon);
902 else if (source_frame ==
"c" && target_frame ==
"d")
904 EXPECT_NEAR(outpose.transform.translation.x, -1,
epsilon);
905 EXPECT_NEAR(outpose.transform.translation.y, 1,
epsilon);
907 else if (source_frame ==
"d" && target_frame ==
"c")
909 EXPECT_NEAR(outpose.transform.translation.x, 1,
epsilon);
910 EXPECT_NEAR(outpose.transform.translation.y, -1,
epsilon);
912 else if (source_frame ==
"a" && target_frame ==
"e")
914 EXPECT_NEAR(outpose.transform.translation.x, 1,
epsilon);
915 EXPECT_NEAR(outpose.transform.translation.y, 2,
epsilon);
917 else if (source_frame ==
"e" && target_frame ==
"a")
919 EXPECT_NEAR(outpose.transform.translation.x, -1,
epsilon);
920 EXPECT_NEAR(outpose.transform.translation.y, -2,
epsilon);
922 else if (source_frame ==
"c" && target_frame ==
"e")
924 EXPECT_NEAR(outpose.transform.translation.x, -1,
epsilon);
925 EXPECT_NEAR(outpose.transform.translation.y, 2,
epsilon);
927 else if (source_frame ==
"e" && target_frame ==
"c")
929 EXPECT_NEAR(outpose.transform.translation.x, 1,
epsilon);
930 EXPECT_NEAR(outpose.transform.translation.y, -2,
epsilon);
941 TEST(BufferCore_lookupTransform, one_link_configuration)
947 rostest::Permuter permuter;
949 std::vector<ros::Time> times;
954 permuter.addOptionSet(times, &eval_time);
956 std::vector<ros::Duration> durations;
963 std::vector<std::string> frames;
964 frames.push_back(
"1");
965 frames.push_back(
"2");
966 std::string source_frame;
967 permuter.addOptionSet(frames, &source_frame);
969 std::string target_frame;
970 permuter.addOptionSet(frames, &target_frame);
972 while (permuter.step())
976 setupTree(mBC,
"1", eval_time, interpolation_space);
978 geometry_msgs::TransformStamped outpose = mBC.
lookupTransform(source_frame, target_frame, eval_time);
985 TEST(BufferCore_lookupTransform, v_configuration)
991 rostest::Permuter permuter;
993 std::vector<ros::Time> times;
998 permuter.addOptionSet(times, &eval_time);
1000 std::vector<ros::Duration> durations;
1007 std::vector<std::string> frames;
1008 frames.push_back(
"a");
1009 frames.push_back(
"b");
1010 frames.push_back(
"c");
1011 frames.push_back(
"f");
1012 frames.push_back(
"g");
1013 std::string source_frame;
1014 permuter.addOptionSet(frames, &source_frame);
1016 std::string target_frame;
1017 permuter.addOptionSet(frames, &target_frame);
1019 while (permuter.step())
1023 setupTree(mBC,
"v", eval_time, interpolation_space);
1025 geometry_msgs::TransformStamped outpose = mBC.
lookupTransform(source_frame, target_frame, eval_time);
1032 TEST(BufferCore_lookupTransform, y_configuration)
1038 rostest::Permuter permuter;
1040 std::vector<ros::Time> times;
1045 permuter.addOptionSet(times, &eval_time);
1047 std::vector<ros::Duration> durations;
1054 std::vector<std::string> frames;
1055 frames.push_back(
"a");
1056 frames.push_back(
"b");
1057 frames.push_back(
"c");
1058 frames.push_back(
"d");
1059 frames.push_back(
"e");
1060 std::string source_frame;
1061 permuter.addOptionSet(frames, &source_frame);
1063 std::string target_frame;
1064 permuter.addOptionSet(frames, &target_frame);
1066 while (permuter.step())
1070 setupTree(mBC,
"y", eval_time, interpolation_space);
1072 geometry_msgs::TransformStamped outpose = mBC.
lookupTransform(source_frame, target_frame, eval_time);
1078 TEST(BufferCore_lookupTransform, multi_configuration)
1084 rostest::Permuter permuter;
1086 std::vector<ros::Time> times;
1091 permuter.addOptionSet(times, &eval_time);
1093 std::vector<ros::Duration> durations;
1100 std::vector<std::string> frames;
1101 frames.push_back(
"1");
1102 frames.push_back(
"2");
1103 frames.push_back(
"a");
1104 frames.push_back(
"b");
1105 frames.push_back(
"c");
1106 frames.push_back(
"f");
1107 frames.push_back(
"g");
1108 std::string source_frame;
1109 permuter.addOptionSet(frames, &source_frame);
1111 std::string target_frame;
1112 permuter.addOptionSet(frames, &target_frame);
1114 while (permuter.step())
1118 setupTree(mBC,
"1_v", eval_time, interpolation_space);
1120 if (mBC.
canTransform(source_frame, target_frame, eval_time))
1122 geometry_msgs::TransformStamped outpose = mBC.
lookupTransform(source_frame, target_frame, eval_time);
1124 if ((source_frame ==
"1" || source_frame ==
"2") && (target_frame ==
"1" || target_frame ==
"2"))
1126 else if ((source_frame ==
"a" || source_frame ==
"b" || source_frame ==
"c" || source_frame ==
"f" || source_frame ==
"g") &&
1127 (target_frame ==
"a" || target_frame ==
"b" || target_frame ==
"c" || target_frame ==
"f" || target_frame ==
"g"))
1130 EXPECT_FALSE(
"Frames unhandled");
1133 EXPECT_TRUE(((source_frame ==
"a" || source_frame ==
"b" || source_frame ==
"c" || source_frame ==
"f" || source_frame ==
"g") &&
1134 (target_frame ==
"1" || target_frame ==
"2") )
1136 ((target_frame ==
"a" || target_frame ==
"b" || target_frame ==
"c" || target_frame ==
"f" || target_frame ==
"g") &&
1137 (source_frame ==
"1" || source_frame ==
"2"))
1143 #define CHECK_QUATERNION_NEAR(_q1, _x, _y, _z, _w, _epsilon) \
1145 btQuaternion q1(_q1.x, _q1.y, _q1.z, _q1.w); \
1146 btQuaternion q2(_x, _y, _z, _w); \
1147 double angle = q1.angle(q2); \
1148 EXPECT_TRUE(fabs(angle) < _epsilon || fabs(angle - M_PI) < _epsilon); \
1151 #define CHECK_TRANSFORMS_NEAR(_out, _expected, _eps) \
1152 EXPECT_NEAR(_out.transform.translation.x, _expected.getOrigin().x(), epsilon); \
1153 EXPECT_NEAR(_out.transform.translation.y, _expected.getOrigin().y(), epsilon); \
1154 EXPECT_NEAR(_out.transform.translation.z, _expected.getOrigin().z(), epsilon); \
1155 CHECK_QUATERNION_NEAR(_out.transform.rotation, _expected.getRotation().x(), _expected.getRotation().y(), _expected.getRotation().z(), _expected.getRotation().w(), _eps);
1159 TEST(BufferCore_lookupTransform, compound_xfm_configuration)
1174 geometry_msgs::TransformStamped tsa;
1175 tsa.header.frame_id =
"root";
1176 tsa.child_frame_id =
"a";
1177 tsa.transform.translation.x = 1.0;
1178 tsa.transform.translation.y = 1.0;
1179 tsa.transform.translation.z = 1.0;
1181 q1.setEuler(0.25, .5, .75);
1182 tsa.transform.rotation.x = q1.x();
1183 tsa.transform.rotation.y = q1.y();
1184 tsa.transform.rotation.z = q1.z();
1185 tsa.transform.rotation.w = q1.w();
1188 geometry_msgs::TransformStamped tsb;
1189 tsb.header.frame_id =
"root";
1190 tsb.child_frame_id =
"b";
1191 tsb.transform.translation.x = -1.0;
1192 tsb.transform.translation.y = 0.0;
1193 tsb.transform.translation.z = -1.0;
1195 q2.setEuler(1.0, 0.25, 0.5);
1196 tsb.transform.rotation.x = q2.x();
1197 tsb.transform.rotation.y = q2.y();
1198 tsb.transform.rotation.z = q2.z();
1199 tsb.transform.rotation.w = q2.w();
1202 geometry_msgs::TransformStamped tsc;
1203 tsc.header.frame_id =
"b";
1204 tsc.child_frame_id =
"c";
1205 tsc.transform.translation.x = 0.0;
1206 tsc.transform.translation.y = 2.0;
1207 tsc.transform.translation.z = 0.5;
1209 q3.setEuler(0.25, .75, 1.25);
1210 tsc.transform.rotation.x = q3.x();
1211 tsc.transform.rotation.y = q3.y();
1212 tsc.transform.rotation.z = q3.z();
1213 tsc.transform.rotation.w = q3.w();
1216 geometry_msgs::TransformStamped tsd;
1217 tsd.header.frame_id =
"c";
1218 tsd.child_frame_id =
"d";
1219 tsd.transform.translation.x = 0.5;
1220 tsd.transform.translation.y = -1;
1221 tsd.transform.translation.z = 1.5;
1223 q4.setEuler(-0.5, 1.0, -.75);
1224 tsd.transform.rotation.x = q4.x();
1225 tsd.transform.rotation.y = q4.y();
1226 tsd.transform.rotation.z = q4.z();
1227 tsd.transform.rotation.w = q4.w();
1230 btTransform ta, tb, tc, td, expected_ab, expected_bc, expected_cb, expected_ac, expected_ba, expected_ca, expected_ad, expected_da, expected_bd, expected_db, expected_rootd, expected_rootc;
1231 ta.setOrigin(btVector3(1.0, 1.0, 1.0));
1233 tb.setOrigin(btVector3(-1.0, 0.0, -1.0));
1235 tc.setOrigin(btVector3(0.0, 2.0, 0.5));
1237 td.setOrigin(btVector3(0.5, -1, 1.5));
1241 expected_ab = ta.inverse() * tb;
1242 expected_ac = ta.inverse() * tb * tc;
1243 expected_ad = ta.inverse() * tb * tc * td;
1244 expected_cb = tc.inverse();
1246 expected_bd = tc * td;
1247 expected_db = expected_bd.inverse();
1248 expected_ba = tb.inverse() * ta;
1249 expected_ca = tc.inverse() * tb.inverse() * ta;
1250 expected_da = td.inverse() * tc.inverse() * tb.inverse() * ta;
1251 expected_rootd = tb * tc * td;
1252 expected_rootc = tb * tc;
1299 TEST(BufferCore_lookupTransform, helix_configuration)
1323 double theta = 0.25;
1329 double dt = (
t - t0).toSec();
1330 double dt2 = (t2 - t0).toSec();
1332 geometry_msgs::TransformStamped ts;
1333 ts.header.frame_id =
"a";
1334 ts.header.stamp =
t;
1335 ts.child_frame_id =
"b";
1336 ts.transform.translation.z = vel * dt;
1337 ts.transform.rotation.w = 1.0;
1340 geometry_msgs::TransformStamped ts2;
1341 ts2.header.frame_id =
"b";
1342 ts2.header.stamp =
t;
1343 ts2.child_frame_id =
"c";
1344 ts2.transform.translation.x = cos(theta * dt);
1345 ts2.transform.translation.y = sin(theta * dt);
1347 q.setEuler(0,0,theta*dt);
1348 ts2.transform.rotation.z = q.z();
1349 ts2.transform.rotation.w = q.w();
1352 geometry_msgs::TransformStamped ts3;
1353 ts3.header.frame_id =
"a";
1354 ts3.header.stamp = t2;
1355 ts3.child_frame_id =
"d";
1356 ts3.transform.translation.z = cos(theta * dt2);
1357 ts3.transform.rotation.w = 1.0;
1365 double dt = (
t - t0).toSec();
1366 double dt2 = (t2 - t0).toSec();
1369 EXPECT_NEAR(out_ab.transform.translation.z, vel * dt,
epsilon);
1372 EXPECT_NEAR(out_ac.transform.translation.x, cos(theta * dt),
epsilon);
1373 EXPECT_NEAR(out_ac.transform.translation.y, sin(theta * dt),
epsilon);
1374 EXPECT_NEAR(out_ac.transform.translation.z, vel * dt,
epsilon);
1376 q.setEuler(0,0,theta*dt);
1380 EXPECT_NEAR(out_ad.transform.translation.z, cos(theta * dt),
epsilon);
1382 geometry_msgs::TransformStamped out_cd = mBC.
lookupTransform(
"c",
"d", t2);
1383 EXPECT_NEAR(out_cd.transform.translation.x, -1,
epsilon);
1384 EXPECT_NEAR(out_cd.transform.translation.y, 0,
epsilon);
1385 EXPECT_NEAR(out_cd.transform.translation.z, cos(theta * dt2) - vel * dt2,
epsilon);
1387 mq.setEuler(0,0,-theta*dt2);
1395 double dt = (
t - t0).toSec();
1396 double dt2 = (t2 - t0).toSec();
1398 geometry_msgs::TransformStamped out_cd2 = mBC.
lookupTransform(
"c",
t,
"d", t2,
"a");
1399 EXPECT_NEAR(out_cd2.transform.translation.x, -1,
epsilon);
1400 EXPECT_NEAR(out_cd2.transform.translation.y, 0,
epsilon);
1401 EXPECT_NEAR(out_cd2.transform.translation.z, cos(theta * dt2) - vel * dt,
epsilon);
1403 mq2.setEuler(0,0,-theta*dt);
1409 TEST(BufferCore_lookupTransform, ring_45_configuration)
1412 rostest::Permuter permuter;
1414 std::vector<ros::Time> times;
1419 permuter.addOptionSet(times, &eval_time);
1421 std::vector<ros::Duration> durations;
1428 std::vector<std::string> frames;
1429 frames.push_back(
"a");
1430 frames.push_back(
"b");
1431 frames.push_back(
"c");
1432 frames.push_back(
"d");
1433 frames.push_back(
"e");
1434 frames.push_back(
"f");
1435 frames.push_back(
"g");
1436 frames.push_back(
"h");
1437 frames.push_back(
"i");
1446 std::string source_frame;
1447 permuter.addOptionSet(frames, &source_frame);
1449 std::string target_frame;
1450 permuter.addOptionSet(frames, &target_frame);
1452 while (permuter.step())
1456 setupTree(mBC,
"ring_45", eval_time, interpolation_space);
1458 geometry_msgs::TransformStamped outpose = mBC.
lookupTransform(source_frame, target_frame, eval_time);
1462 EXPECT_EQ(outpose.header.stamp, eval_time);
1463 EXPECT_EQ(outpose.header.frame_id, source_frame);
1464 EXPECT_EQ(outpose.child_frame_id, target_frame);
1469 if (source_frame == target_frame ||
1470 (source_frame ==
"a" && target_frame ==
"i") ||
1471 (source_frame ==
"i" && target_frame ==
"a") ||
1472 (source_frame ==
"a" && target_frame ==
"inverse_i") ||
1473 (source_frame ==
"inverse_i" && target_frame ==
"a") )
1476 EXPECT_NEAR(outpose.transform.translation.x, 0,
epsilon);
1477 EXPECT_NEAR(outpose.transform.translation.y, 0,
epsilon);
1478 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
1479 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
1480 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
1481 EXPECT_NEAR(outpose.transform.rotation.z, 0,
epsilon);
1482 EXPECT_NEAR(fabs(outpose.transform.rotation.w), 1,
epsilon);
1485 else if ((source_frame ==
"a" && target_frame ==
"b") ||
1486 (source_frame ==
"b" && target_frame ==
"c") ||
1487 (source_frame ==
"c" && target_frame ==
"d") ||
1488 (source_frame ==
"d" && target_frame ==
"e") ||
1489 (source_frame ==
"e" && target_frame ==
"f") ||
1490 (source_frame ==
"f" && target_frame ==
"g") ||
1491 (source_frame ==
"g" && target_frame ==
"h") ||
1492 (source_frame ==
"h" && target_frame ==
"i")
1495 EXPECT_NEAR(outpose.transform.translation.x, sqrt(2)/2 - 1,
epsilon);
1496 EXPECT_NEAR(outpose.transform.translation.y, sqrt(2)/2 ,
epsilon);
1497 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
1498 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
1499 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
1500 EXPECT_NEAR(outpose.transform.rotation.z, sin(M_PI/8),
epsilon);
1501 EXPECT_NEAR(outpose.transform.rotation.w, cos(M_PI/8),
epsilon);
1504 else if ((source_frame ==
"b" && target_frame ==
"a") ||
1505 (source_frame ==
"c" && target_frame ==
"b") ||
1506 (source_frame ==
"d" && target_frame ==
"c") ||
1507 (source_frame ==
"e" && target_frame ==
"d") ||
1508 (source_frame ==
"f" && target_frame ==
"e") ||
1509 (source_frame ==
"g" && target_frame ==
"f") ||
1510 (source_frame ==
"h" && target_frame ==
"g") ||
1511 (source_frame ==
"i" && target_frame ==
"h")
1514 EXPECT_NEAR(outpose.transform.translation.x, sqrt(2)/2 - 1,
epsilon);
1515 EXPECT_NEAR(outpose.transform.translation.y, -sqrt(2)/2 ,
epsilon);
1516 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
1517 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
1518 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
1519 EXPECT_NEAR(outpose.transform.rotation.z, sin(-M_PI/8),
epsilon);
1520 EXPECT_NEAR(outpose.transform.rotation.w, cos(-M_PI/8),
epsilon);
1523 else if ((source_frame ==
"a" && target_frame ==
"c") ||
1524 (source_frame ==
"b" && target_frame ==
"d") ||
1525 (source_frame ==
"c" && target_frame ==
"e") ||
1526 (source_frame ==
"d" && target_frame ==
"f") ||
1527 (source_frame ==
"e" && target_frame ==
"g") ||
1528 (source_frame ==
"f" && target_frame ==
"h") ||
1529 (source_frame ==
"g" && target_frame ==
"i")
1532 EXPECT_NEAR(outpose.transform.translation.x, -1,
epsilon);
1533 EXPECT_NEAR(outpose.transform.translation.y, 1 ,
epsilon);
1534 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
1535 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
1536 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
1537 EXPECT_NEAR(outpose.transform.rotation.z, sin(M_PI/4),
epsilon);
1538 EXPECT_NEAR(outpose.transform.rotation.w, cos(M_PI/4),
epsilon);
1541 else if ((source_frame ==
"c" && target_frame ==
"a") ||
1542 (source_frame ==
"d" && target_frame ==
"b") ||
1543 (source_frame ==
"e" && target_frame ==
"c") ||
1544 (source_frame ==
"f" && target_frame ==
"d") ||
1545 (source_frame ==
"g" && target_frame ==
"e") ||
1546 (source_frame ==
"h" && target_frame ==
"f") ||
1547 (source_frame ==
"i" && target_frame ==
"g")
1550 EXPECT_NEAR(outpose.transform.translation.x, -1,
epsilon);
1551 EXPECT_NEAR(outpose.transform.translation.y, -1 ,
epsilon);
1552 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
1553 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
1554 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
1555 EXPECT_NEAR(outpose.transform.rotation.z, sin(-M_PI/4),
epsilon);
1556 EXPECT_NEAR(outpose.transform.rotation.w, cos(-M_PI/4),
epsilon);
1559 else if ((source_frame ==
"a" && target_frame ==
"d") ||
1560 (source_frame ==
"b" && target_frame ==
"e") ||
1561 (source_frame ==
"c" && target_frame ==
"f") ||
1562 (source_frame ==
"d" && target_frame ==
"g") ||
1563 (source_frame ==
"e" && target_frame ==
"h") ||
1564 (source_frame ==
"f" && target_frame ==
"i")
1567 EXPECT_NEAR(outpose.transform.translation.x, -1 - sqrt(2)/2,
epsilon);
1568 EXPECT_NEAR(outpose.transform.translation.y, sqrt(2)/2 ,
epsilon);
1569 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
1570 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
1571 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
1572 EXPECT_NEAR(outpose.transform.rotation.z, sin(M_PI*3/8),
epsilon);
1573 EXPECT_NEAR(outpose.transform.rotation.w, cos(M_PI*3/8),
epsilon);
1576 else if ((target_frame ==
"a" && source_frame ==
"d") ||
1577 (target_frame ==
"b" && source_frame ==
"e") ||
1578 (target_frame ==
"c" && source_frame ==
"f") ||
1579 (target_frame ==
"d" && source_frame ==
"g") ||
1580 (target_frame ==
"e" && source_frame ==
"h") ||
1581 (target_frame ==
"f" && source_frame ==
"i")
1584 EXPECT_NEAR(outpose.transform.translation.x, -1 - sqrt(2)/2,
epsilon);
1585 EXPECT_NEAR(outpose.transform.translation.y, - sqrt(2)/2 ,
epsilon);
1586 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
1587 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
1588 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
1589 EXPECT_NEAR(outpose.transform.rotation.z, sin(-M_PI*3/8),
epsilon);
1590 EXPECT_NEAR(outpose.transform.rotation.w, cos(-M_PI*3/8),
epsilon);
1593 else if ((source_frame ==
"a" && target_frame ==
"e") ||
1594 (source_frame ==
"b" && target_frame ==
"f") ||
1595 (source_frame ==
"c" && target_frame ==
"g") ||
1596 (source_frame ==
"d" && target_frame ==
"h") ||
1597 (source_frame ==
"e" && target_frame ==
"i")
1600 EXPECT_NEAR(outpose.transform.translation.x, -2,
epsilon);
1601 EXPECT_NEAR(outpose.transform.translation.y, 0 ,
epsilon);
1602 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
1603 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
1604 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
1605 EXPECT_NEAR(outpose.transform.rotation.z, sin(M_PI/2),
epsilon);
1606 EXPECT_NEAR(outpose.transform.rotation.w, cos(M_PI/2),
epsilon);
1609 else if ((target_frame ==
"a" && source_frame ==
"e") ||
1610 (target_frame ==
"b" && source_frame ==
"f") ||
1611 (target_frame ==
"c" && source_frame ==
"g") ||
1612 (target_frame ==
"d" && source_frame ==
"h") ||
1613 (target_frame ==
"e" && source_frame ==
"i")
1616 EXPECT_NEAR(outpose.transform.translation.x, -2,
epsilon);
1617 EXPECT_NEAR(outpose.transform.translation.y, 0 ,
epsilon);
1618 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
1619 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
1620 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
1621 EXPECT_NEAR(outpose.transform.rotation.z, sin(-M_PI/2),
epsilon);
1622 EXPECT_NEAR(outpose.transform.rotation.w, cos(-M_PI/2),
epsilon);
1625 else if ((source_frame ==
"a" && target_frame ==
"f") ||
1626 (source_frame ==
"b" && target_frame ==
"g") ||
1627 (source_frame ==
"c" && target_frame ==
"h") ||
1628 (source_frame ==
"d" && target_frame ==
"i")
1631 EXPECT_NEAR(outpose.transform.translation.x, -1 - sqrt(2) /2,
epsilon);
1632 EXPECT_NEAR(outpose.transform.translation.y, - sqrt(2) /2 ,
epsilon);
1633 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
1634 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
1635 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
1636 EXPECT_NEAR(outpose.transform.rotation.z, sin(M_PI*5/8),
epsilon);
1637 EXPECT_NEAR(outpose.transform.rotation.w, cos(M_PI*5/8),
epsilon);
1640 else if ((target_frame ==
"a" && source_frame ==
"f") ||
1641 (target_frame ==
"b" && source_frame ==
"g") ||
1642 (target_frame ==
"c" && source_frame ==
"h") ||
1643 (target_frame ==
"d" && source_frame ==
"i")
1646 EXPECT_NEAR(outpose.transform.translation.x, -1 - sqrt(2)/2,
epsilon);
1647 EXPECT_NEAR(outpose.transform.translation.y, sqrt(2)/2 ,
epsilon);
1648 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
1649 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
1650 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
1651 EXPECT_NEAR(outpose.transform.rotation.z, sin(-M_PI*5/8),
epsilon);
1652 EXPECT_NEAR(outpose.transform.rotation.w, cos(-M_PI*5/8),
epsilon);
1655 else if ((source_frame ==
"a" && target_frame ==
"g") ||
1656 (source_frame ==
"b" && target_frame ==
"h") ||
1657 (source_frame ==
"c" && target_frame ==
"i")
1660 EXPECT_NEAR(outpose.transform.translation.x, -1,
epsilon);
1661 EXPECT_NEAR(outpose.transform.translation.y, -1 ,
epsilon);
1662 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
1663 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
1664 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
1665 EXPECT_NEAR(outpose.transform.rotation.z, sin(M_PI*6/8),
epsilon);
1666 EXPECT_NEAR(outpose.transform.rotation.w, cos(M_PI*6/8),
epsilon);
1669 else if ((target_frame ==
"a" && source_frame ==
"g") ||
1670 (target_frame ==
"b" && source_frame ==
"h") ||
1671 (target_frame ==
"c" && source_frame ==
"i")
1674 EXPECT_NEAR(outpose.transform.translation.x, -1,
epsilon);
1675 EXPECT_NEAR(outpose.transform.translation.y, 1 ,
epsilon);
1676 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
1677 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
1678 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
1679 EXPECT_NEAR(outpose.transform.rotation.z, sin(-M_PI*6/8),
epsilon);
1680 EXPECT_NEAR(outpose.transform.rotation.w, cos(-M_PI*6/8),
epsilon);
1683 else if ((source_frame ==
"a" && target_frame ==
"h") ||
1684 (source_frame ==
"b" && target_frame ==
"i")
1687 EXPECT_NEAR(outpose.transform.translation.x, sqrt(2)/2 - 1,
epsilon);
1688 EXPECT_NEAR(outpose.transform.translation.y, -sqrt(2)/2 ,
epsilon);
1689 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
1690 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
1691 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
1692 EXPECT_NEAR(outpose.transform.rotation.z, sin(M_PI*7/8),
epsilon);
1693 EXPECT_NEAR(outpose.transform.rotation.w, cos(M_PI*7/8),
epsilon);
1696 else if ((target_frame ==
"a" && source_frame ==
"h") ||
1697 (target_frame ==
"b" && source_frame ==
"i")
1700 EXPECT_NEAR(outpose.transform.translation.x, sqrt(2)/2 - 1,
epsilon);
1701 EXPECT_NEAR(outpose.transform.translation.y, sqrt(2)/2 ,
epsilon);
1702 EXPECT_NEAR(outpose.transform.translation.z, 0,
epsilon);
1703 EXPECT_NEAR(outpose.transform.rotation.x, 0,
epsilon);
1704 EXPECT_NEAR(outpose.transform.rotation.y, 0,
epsilon);
1705 EXPECT_NEAR(outpose.transform.rotation.z, sin(-M_PI*7/8),
epsilon);
1706 EXPECT_NEAR(outpose.transform.rotation.w, cos(-M_PI*7/8),
epsilon);
1710 EXPECT_FALSE(
"Ring_45 testing Shouldn't get here");
1711 printf(
"source_frame %s target_frame %s time %f\n", source_frame.c_str(), target_frame.c_str(), eval_time.
toSec());
1717 TEST(BufferCore_lookupTransform, invalid_arguments)
1735 TEST(BufferCore_canTransform, invalid_arguments)
1769 TEST(BufferCore_transformableCallbacks, alreadyTransformable)
1774 geometry_msgs::TransformStamped
t;
1776 t.header.frame_id =
"a";
1777 t.child_frame_id =
"b";
1778 t.transform.rotation.w = 1.0;
1785 TEST(BufferCore_transformableCallbacks, waitForNewTransform)
1792 geometry_msgs::TransformStamped
t;
1793 for (uint32_t i = 1; i <= 10; ++i)
1796 t.header.frame_id =
"a";
1797 t.child_frame_id =
"b";
1798 t.transform.rotation.w = 1.0;
1812 TEST(BufferCore_transformableCallbacks, waitForOldTransform)
1819 geometry_msgs::TransformStamped
t;
1820 for (uint32_t i = 10; i > 0; --i)
1823 t.header.frame_id =
"a";
1824 t.child_frame_id =
"b";
1825 t.transform.rotation.w = 1.0;
2794 testing::InitGoogleTest(&argc, argv);
2797 return RUN_ALL_TESTS();