00001
00010
00011
00012
00013
00014 #define ECL_USE_EIGEN3
00015
00016
00017
00018
00019
00020 #include <gtest/gtest.h>
00021 #include <ecl/linear_algebra.hpp>
00022 #include <ecl/math/constants.hpp>
00023 #include "../../include/ecl/geometry/angle.hpp"
00024 #include "../../include/ecl/geometry/pose2d.hpp"
00025
00026
00027
00028
00029
00030 using ecl::Angle;
00031 using ecl::Pose2D;
00032 using ecl::RotationAngleStorage;
00033 using ecl::linear_algebra::Matrix2d;
00034 using ecl::linear_algebra::Vector2d;
00035 using ecl::linear_algebra::Vector3d;
00036
00037
00038
00039
00040
00041 TEST(Pose2DTests,RotationMatrixConstructors) {
00042 Pose2D<double> pose1;
00043 EXPECT_EQ(0.0,pose1.x());
00044 EXPECT_EQ(0.0,pose1.y());
00045 EXPECT_GT(1.01,pose1.rotation()(0,0));
00046 EXPECT_LT(0.99,pose1.rotation()(0,0));
00047 EXPECT_GT(0.01,pose1.rotation()(0,1));
00048 EXPECT_LT(-0.01,pose1.rotation()(0,1));
00049 EXPECT_GT(0.01,pose1.rotation()(1,0));
00050 EXPECT_LT(-0.01,pose1.rotation()(1,0));
00051 EXPECT_GT(1.01,pose1.rotation()(1,1));
00052 EXPECT_LT(0.99,pose1.rotation()(1,1));
00053 Pose2D<double> pose2(1.0, 2.0, 3.14);
00054 EXPECT_EQ(1.0,pose2.x());
00055 EXPECT_EQ(2.0,pose2.y());
00056 EXPECT_EQ(3.14,pose2.heading());
00057 Vector2d trans; trans << 1.0, 2.0;
00058 Matrix2d rot = Angle<double>(3.14).rotationMatrix();
00059 Pose2D<double> pose3(rot,trans);
00060 EXPECT_EQ(1.0,pose3.x());
00061 EXPECT_EQ(2.0,pose3.y());
00062 EXPECT_GT(3.15, pose3.heading());
00063 EXPECT_LT(3.13, pose3.heading());
00064 Pose2D<double> pose4(3.14,trans);
00065 EXPECT_EQ(1.0,pose4.x());
00066 EXPECT_EQ(2.0,pose4.y());
00067 EXPECT_GT(3.15, pose4.heading());
00068 EXPECT_LT(3.13, pose4.heading());
00069 Pose2D<double> pose5(pose4);
00070 EXPECT_EQ(1.0,pose5.x());
00071 EXPECT_EQ(2.0,pose5.y());
00072 EXPECT_GT(3.15, pose5.heading());
00073 EXPECT_LT(3.13, pose5.heading());
00074 Pose2D<double,RotationAngleStorage> pose_other(3.14,trans);
00075 Pose2D<double> pose6(pose_other);
00076 EXPECT_EQ(1.0,pose6.x());
00077 EXPECT_EQ(2.0,pose6.y());
00078 EXPECT_GT(3.15, pose6.heading());
00079 EXPECT_LT(3.13, pose6.heading());
00080 }
00081
00082 TEST(Pose2DTests,RotationAngleConstructors) {
00083 Pose2D<double,RotationAngleStorage> pose1;
00084 EXPECT_EQ(0.0,pose1.x());
00085 EXPECT_EQ(0.0,pose1.y());
00086 EXPECT_GT(0.01,pose1.rotation());
00087 EXPECT_LT(-0.01,pose1.rotation());
00088 Pose2D<double,RotationAngleStorage> pose2(1.0, 2.0, 3.14);
00089 EXPECT_EQ(1.0,pose2.x());
00090 EXPECT_EQ(2.0,pose2.y());
00091 EXPECT_EQ(3.14,pose2.heading());
00092 Vector2d trans; trans << 1.0, 2.0;
00093 Matrix2d rot = Angle<double>(3.14).rotationMatrix();
00094 Pose2D<double,RotationAngleStorage> pose3(rot,trans);
00095 EXPECT_EQ(1.0,pose3.x());
00096 EXPECT_EQ(2.0,pose3.y());
00097 EXPECT_GT(3.15, pose3.heading());
00098 EXPECT_LT(3.13, pose3.heading());
00099 Pose2D<double,RotationAngleStorage> pose4(3.14,trans);
00100 EXPECT_EQ(1.0,pose4.x());
00101 EXPECT_EQ(2.0,pose4.y());
00102 EXPECT_GT(3.15, pose4.heading());
00103 EXPECT_LT(3.13, pose4.heading());
00104 Pose2D<double,RotationAngleStorage> pose5(pose4);
00105 EXPECT_EQ(1.0,pose5.x());
00106 EXPECT_EQ(2.0,pose5.y());
00107 EXPECT_GT(3.15, pose5.heading());
00108 EXPECT_LT(3.13, pose5.heading());
00109 Pose2D<double> pose_other(1.0, 2.0, 3.14);
00110 Pose2D<double,RotationAngleStorage> pose6(pose_other);
00111 EXPECT_EQ(1.0,pose6.x());
00112 EXPECT_EQ(2.0,pose6.y());
00113 EXPECT_GT(3.15, pose6.heading());
00114 EXPECT_LT(3.13, pose6.heading());
00115 }
00116
00117 TEST(Pose2DTests,assignment) {
00118 Pose2D<double> pose_r1(2.0, 1.0, 1.14);
00119 Pose2D<double,RotationAngleStorage> pose_a1(1.0, 2.0, 3.14);
00120 Pose2D<double> pose_r2;
00121 Pose2D<double,RotationAngleStorage> pose_a2;
00122 pose_r2 = pose_r1;
00123 EXPECT_EQ(2.0,pose_r2.x());
00124 EXPECT_EQ(1.0,pose_r2.y());
00125 EXPECT_GT(1.15, pose_r2.heading());
00126 EXPECT_LT(1.13, pose_r2.heading());
00127 pose_r2 = pose_a1;
00128 EXPECT_EQ(1.0,pose_r2.x());
00129 EXPECT_EQ(2.0,pose_r2.y());
00130 EXPECT_GT(3.15, pose_r2.heading());
00131 EXPECT_LT(3.13, pose_r2.heading());
00132 pose_a2 = pose_r1;
00133 EXPECT_EQ(2.0,pose_a2.x());
00134 EXPECT_EQ(1.0,pose_a2.y());
00135 EXPECT_GT(1.15, pose_a2.heading());
00136 EXPECT_LT(1.13, pose_a2.heading());
00137 pose_a2 = pose_a1;
00138 EXPECT_EQ(1.0,pose_a2.x());
00139 EXPECT_EQ(2.0,pose_a2.y());
00140 EXPECT_GT(3.15, pose_a2.heading());
00141 EXPECT_LT(3.13, pose_a2.heading());
00142 }
00143
00144 TEST(Pose2DTests,eigenStyle) {
00145 Vector2d trans; trans << 1.0, 2.0;
00146 Matrix2d rot = Angle<double>(3.14).rotationMatrix();
00147 Pose2D<double> rpose;
00148 rpose.rotation(rot);
00149 rpose.translation(trans);
00150 EXPECT_EQ(1.0,rpose.x());
00151 EXPECT_EQ(2.0,rpose.y());
00152 EXPECT_GT(3.15, rpose.heading());
00153 EXPECT_LT(3.13, rpose.heading());
00154 rot = rpose.rotation();
00155 trans = rpose.translation();
00156 EXPECT_EQ(1.0,trans[0]);
00157 EXPECT_EQ(2.0,trans[1]);
00158 EXPECT_GT(3.15, Angle<double>(rot));
00159 EXPECT_LT(3.13, Angle<double>(rot));
00160 Pose2D<double,RotationAngleStorage> apose;
00161 apose.rotation(3.14);
00162 apose.translation(trans);
00163 EXPECT_EQ(1.0,apose.x());
00164 EXPECT_EQ(2.0,apose.y());
00165 EXPECT_GT(3.15, apose.heading());
00166 EXPECT_LT(3.13, apose.heading());
00167 double angle = apose.rotation();
00168 trans = apose.translation();
00169 EXPECT_EQ(1.0,trans[0]);
00170 EXPECT_EQ(2.0,trans[1]);
00171 EXPECT_GT(3.15, angle);
00172 EXPECT_LT(3.13, angle);
00173 }
00174 TEST(Pose2DTests,convenienceStyle) {
00175 Vector2d trans; trans << 1.0, 2.0;
00176 Matrix2d rot;
00177 Pose2D<double> rpose;
00178 rpose.x(1.0); rpose.y(2.0); rpose.heading(3.14);
00179 EXPECT_EQ(1.0,rpose.x());
00180 EXPECT_EQ(2.0,rpose.y());
00181 EXPECT_GT(3.15, rpose.heading());
00182 EXPECT_LT(3.13, rpose.heading());
00183 rpose.heading(0.0);
00184 rot = rpose.rotationMatrix();
00185 EXPECT_GT(1.01,rot(0,0));
00186 EXPECT_LT(0.99,rot(0,0));
00187 EXPECT_GT(0.01,rot(0,1));
00188 EXPECT_LT(-0.01,rot(0,1));
00189 EXPECT_GT(0.01,rot(1,0));
00190 EXPECT_LT(-0.01,rot(1,0));
00191 EXPECT_GT(1.01,rot(1,1));
00192 EXPECT_LT(0.99,rot(1,1));
00193 Pose2D<double,RotationAngleStorage> apose;
00194 apose.x(1.0); apose.y(2.0); apose.heading(3.14);
00195 EXPECT_EQ(1.0,apose.x());
00196 EXPECT_EQ(2.0,apose.y());
00197 EXPECT_GT(3.15, apose.heading());
00198 EXPECT_LT(3.13, apose.heading());
00199 apose.heading(0.0);
00200 rot = apose.rotationMatrix();
00201 EXPECT_GT(1.01,rot(0,0));
00202 EXPECT_LT(0.99,rot(0,0));
00203 EXPECT_GT(0.01,rot(0,1));
00204 EXPECT_LT(-0.01,rot(0,1));
00205 EXPECT_GT(0.01,rot(1,0));
00206 EXPECT_LT(-0.01,rot(1,0));
00207 EXPECT_GT(1.01,rot(1,1));
00208 EXPECT_LT(0.99,rot(1,1));
00209 }
00210 TEST(Pose2DTests,inverse) {
00211 Pose2D<double> pose(1.0, 2.0, ecl::pi);
00212 Pose2D<double> inverse = pose.inverse();
00213 EXPECT_GT(1.01,inverse.x());
00214 EXPECT_LT(0.99,inverse.x());
00215 EXPECT_GT(2.01,inverse.y());
00216 EXPECT_LT(1.99,inverse.y());
00217 EXPECT_GT(-ecl::pi+0.01,inverse.heading());
00218 EXPECT_LT(-ecl::pi-0.01,inverse.heading());
00219 Pose2D<double,RotationAngleStorage> apose(1.0, 2.0, ecl::pi);
00220 Pose2D<double,RotationAngleStorage> ainverse = pose.inverse();
00221 EXPECT_GT(1.01,ainverse.x());
00222 EXPECT_LT(0.99,ainverse.x());
00223 EXPECT_GT(2.01,ainverse.y());
00224 EXPECT_LT(1.99,ainverse.y());
00225 EXPECT_GT(-ecl::pi+0.01,ainverse.heading());
00226 EXPECT_LT(-ecl::pi-0.01,ainverse.heading());
00227 }
00228
00229 TEST(Pose2DTests,operators) {
00230 Pose2D<double> a(1.0, 2.0, 0.0), b(1.0, 3.0, ecl::pi);
00231 Pose2D<double> diff = a.inverse()*b;
00232 EXPECT_EQ(0.0,diff.x());
00233 EXPECT_EQ(1.0,diff.y());
00234 EXPECT_EQ(ecl::pi,diff.heading());
00235 Pose2D<double,RotationAngleStorage> a2(1.0, 2.0, 0.0), b2(1.0, 3.0, ecl::pi);
00236 Pose2D<double,RotationAngleStorage> diff2 = a2.inverse()*b2;
00237 EXPECT_EQ(0.0,diff2.x());
00238 EXPECT_EQ(1.0,diff2.y());
00239 EXPECT_EQ(ecl::pi,diff2.heading());
00240 }
00241 TEST(Pose2DTests,relative) {
00242 Pose2D<double> a(1.0, 1.0, 1.57), b(1.0, 2.0, 3.14);
00243 Pose2D<double> brela = b.relative(a);
00244 EXPECT_GT(1.01,brela.x());
00245 EXPECT_LT(0.99,brela.x());
00246 EXPECT_GT(0.01,brela.y());
00247 EXPECT_LT(-0.01,brela.y());
00248 EXPECT_GT(1.58,brela.heading());
00249 EXPECT_LT(1.56,brela.heading());
00250 Pose2D<double,RotationAngleStorage> a_(1.0, 1.0, 1.57), b_(1.0, 2.0, 3.14);
00251 Pose2D<double,RotationAngleStorage> brela_ = b.relative(a);
00252 EXPECT_GT(1.01,brela_.x());
00253 EXPECT_LT(0.99,brela_.x());
00254 EXPECT_GT(0.01,brela_.y());
00255 EXPECT_LT(-0.01,brela_.y());
00256 EXPECT_GT(1.58,brela_.heading());
00257 EXPECT_LT(1.56,brela_.heading());
00258 }
00259
00260
00261
00262
00263
00264 int main(int argc, char **argv) {
00265 testing::InitGoogleTest(&argc,argv);
00266 return RUN_ALL_TESTS();
00267 }