|
21 | 21 | #include <gtsam/base/numericalDerivative.h> |
22 | 22 | #include <gtsam/geometry/ExtendedPose3.h> |
23 | 23 |
|
| 24 | +#include <functional> |
| 25 | + |
24 | 26 | using namespace gtsam; |
25 | 27 |
|
26 | 28 | using ExtendedPose33 = ExtendedPose3<3>; |
@@ -158,6 +160,93 @@ TEST(ExtendedPose3, AdjointConsistency) { |
158 | 160 | EXPECT(assert_equal(d_generic, d.AdjointMap(), 1e-9)); |
159 | 161 | } |
160 | 162 |
|
| 163 | +//****************************************************************************** |
| 164 | +TEST(ExtendedPose3, AdjointTranspose) { |
| 165 | + const ExtendedPose33 f(kR1, kX1); |
| 166 | + const ExtendedPose3d d(kR1, ExtendedPose3d::Matrix3K(kX1)); |
| 167 | + const Vector12 x = kXi; |
| 168 | + const Vector x_dynamic = x; |
| 169 | + |
| 170 | + EXPECT(assert_equal(Vector(f.AdjointMap().transpose() * x), |
| 171 | + Vector(f.AdjointTranspose(x)))); |
| 172 | + EXPECT(assert_equal(d.AdjointMap().transpose() * x_dynamic, |
| 173 | + d.AdjointTranspose(x_dynamic))); |
| 174 | + |
| 175 | + std::function<Vector12(const ExtendedPose33&, const Vector12&)> |
| 176 | + f_adjoint_transpose = [](const ExtendedPose33& g, const Vector12& v) { |
| 177 | + return Vector12(g.AdjointTranspose(v)); |
| 178 | + }; |
| 179 | + Matrix Hf_state, Hf_x; |
| 180 | + f.AdjointTranspose(x, Hf_state, Hf_x); |
| 181 | + EXPECT(assert_equal(numericalDerivative21(f_adjoint_transpose, f, x), Hf_state, |
| 182 | + 1e-8)); |
| 183 | + EXPECT( |
| 184 | + assert_equal(numericalDerivative22(f_adjoint_transpose, f, x), Hf_x)); |
| 185 | + |
| 186 | + std::function<Vector(const ExtendedPose3d&, const Vector&)> |
| 187 | + d_adjoint_transpose = [](const ExtendedPose3d& g, const Vector& v) { |
| 188 | + return g.AdjointTranspose(v); |
| 189 | + }; |
| 190 | + Matrix Hd_state, Hd_x; |
| 191 | + d.AdjointTranspose(x_dynamic, Hd_state, Hd_x); |
| 192 | + EXPECT(assert_equal( |
| 193 | + numericalDerivative21<Vector, ExtendedPose3d, Vector, 12>( |
| 194 | + d_adjoint_transpose, d, x_dynamic), |
| 195 | + Hd_state, 1e-8)); |
| 196 | + EXPECT(assert_equal( |
| 197 | + numericalDerivative22<Vector, ExtendedPose3d, Vector, 12>( |
| 198 | + d_adjoint_transpose, d, x_dynamic), |
| 199 | + Hd_x)); |
| 200 | +} |
| 201 | + |
| 202 | +//****************************************************************************** |
| 203 | +TEST(ExtendedPose3, adjointTranspose) { |
| 204 | + const Vector12 xi = kXi; |
| 205 | + const Vector12 y = |
| 206 | + (Vector12() << 0.03, -0.07, 0.02, 0.4, 0.1, -0.2, -0.3, 0.5, 0.9, 0.2, |
| 207 | + -0.8, 0.6) |
| 208 | + .finished(); |
| 209 | + const Vector xi_dynamic = xi; |
| 210 | + const Vector y_dynamic = y; |
| 211 | + |
| 212 | + EXPECT(assert_equal(Vector(ExtendedPose33::adjointMap(xi).transpose() * y), |
| 213 | + Vector(ExtendedPose33::adjointTranspose(xi, y)))); |
| 214 | + EXPECT(assert_equal(ExtendedPose3d::adjointMap(xi_dynamic).transpose() * |
| 215 | + y_dynamic, |
| 216 | + ExtendedPose3d::adjointTranspose(xi_dynamic, y_dynamic))); |
| 217 | + |
| 218 | + std::function<Vector12(const Vector12&, const Vector12&)> |
| 219 | + f_adjoint_transpose = [](const Vector12& x, const Vector12& v) { |
| 220 | + return Vector12(ExtendedPose33::adjointTranspose(x, v)); |
| 221 | + }; |
| 222 | + Matrix Hf_xi, Hf_y; |
| 223 | + EXPECT(assert_equal(Vector(ExtendedPose33::adjointTranspose(xi, y, Hf_xi, Hf_y)), |
| 224 | + Vector(f_adjoint_transpose(xi, y)))); |
| 225 | + EXPECT( |
| 226 | + assert_equal(numericalDerivative21(f_adjoint_transpose, xi, y, 1e-5), Hf_xi, |
| 227 | + 1e-5)); |
| 228 | + EXPECT( |
| 229 | + assert_equal(numericalDerivative22(f_adjoint_transpose, xi, y, 1e-5), Hf_y, |
| 230 | + 1e-5)); |
| 231 | + |
| 232 | + std::function<Vector(const Vector&, const Vector&)> d_adjoint_transpose = |
| 233 | + [](const Vector& x, const Vector& v) { |
| 234 | + return ExtendedPose3d::adjointTranspose(x, v); |
| 235 | + }; |
| 236 | + Matrix Hd_xi, Hd_y; |
| 237 | + EXPECT(assert_equal(ExtendedPose3d::adjointTranspose(xi_dynamic, y_dynamic, |
| 238 | + Hd_xi, Hd_y), |
| 239 | + d_adjoint_transpose(xi_dynamic, y_dynamic))); |
| 240 | + EXPECT(assert_equal( |
| 241 | + numericalDerivative21<Vector, Vector, Vector, 12>( |
| 242 | + d_adjoint_transpose, xi_dynamic, y_dynamic, 1e-5), |
| 243 | + Hd_xi, 1e-5)); |
| 244 | + EXPECT(assert_equal( |
| 245 | + numericalDerivative22<Vector, Vector, Vector, 12>( |
| 246 | + d_adjoint_transpose, xi_dynamic, y_dynamic, 1e-5), |
| 247 | + Hd_y, 1e-5)); |
| 248 | +} |
| 249 | + |
161 | 250 | //****************************************************************************** |
162 | 251 | TEST(ExtendedPose3, Derivatives) { |
163 | 252 | const ExtendedPose33 f(kR1, kX1); |
|
0 commit comments