fixed reproj error jacobians and added solid tests
parent
09853bfa13
commit
6467e3043d
|
|
@ -92,12 +92,24 @@ Unit3 SphericalCamera::project(const Point3& point,
|
|||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
Vector2 SphericalCamera::reprojectionError(const Point3& point, const Unit3& measured,
|
||||
OptionalJacobian<2, 6> Dpose,
|
||||
OptionalJacobian<2, 3> Dpoint) const {
|
||||
// on-manifold version of: camera.project(point) - zi
|
||||
std::cout << "SphericalCam:reprojectionError fix jacobians " << std::endl;
|
||||
return measured.localCoordinates( project2(point, Dpose, Dpoint) );
|
||||
Vector2 SphericalCamera::reprojectionError(
|
||||
const Point3& point, const Unit3& measured, OptionalJacobian<2, 6> Dpose,
|
||||
OptionalJacobian<2, 3> Dpoint) const {
|
||||
// project point
|
||||
if (Dpose || Dpoint) {
|
||||
Matrix26 H_project_pose;
|
||||
Matrix23 H_project_point;
|
||||
Matrix22 H_error;
|
||||
Unit3 projected = project2(point, H_project_pose, H_project_point);
|
||||
Vector2 error = measured.errorVector(projected, boost::none, H_error);
|
||||
if (Dpose)
|
||||
*Dpose = H_error * H_project_pose;
|
||||
if (Dpoint)
|
||||
*Dpoint = H_error * H_project_point;
|
||||
return error;
|
||||
} else {
|
||||
return measured.errorVector(project2(point, Dpose, Dpoint));
|
||||
}
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
|
|
|||
|
|
@ -39,17 +39,6 @@ class GTSAM_EXPORT EmptyCal {
|
|||
}
|
||||
};
|
||||
|
||||
//
|
||||
//class GTSAM_EXPORT EmptyCal {
|
||||
// public:
|
||||
// EmptyCal(){}
|
||||
// virtual ~EmptyCal() = default;
|
||||
// using shared_ptr = boost::shared_ptr<EmptyCal>;
|
||||
// void print(const std::string& s) const {
|
||||
// std::cout << "empty calibration: " << s << std::endl;
|
||||
// }
|
||||
//};
|
||||
|
||||
/**
|
||||
* A spherical camera class that has a Pose3 and measures bearing vectors
|
||||
* @addtogroup geometry
|
||||
|
|
|
|||
|
|
@ -109,6 +109,39 @@ TEST( SphericalCamera, Dproject)
|
|||
EXPECT(assert_equal(numerical_point, Dpoint, 1e-7));
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
static Vector2 reprojectionError2(const Pose3& pose, const Point3& point, const Unit3& measured) {
|
||||
return Camera(pose).reprojectionError(point,measured);
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
TEST( SphericalCamera, reprojectionError) {
|
||||
Matrix Dpose, Dpoint;
|
||||
Vector2 result = camera.reprojectionError(point1, bearing1, Dpose, Dpoint);
|
||||
Matrix numerical_pose = numericalDerivative31(reprojectionError2, pose,
|
||||
point1, bearing1);
|
||||
Matrix numerical_point = numericalDerivative32(reprojectionError2, pose,
|
||||
point1, bearing1);
|
||||
EXPECT(assert_equal(Vector2(0.0, 0.0), result));
|
||||
EXPECT(assert_equal(numerical_pose, Dpose, 1e-7));
|
||||
EXPECT(assert_equal(numerical_point, Dpoint, 1e-7));
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
TEST( SphericalCamera, reprojectionError_noisy) {
|
||||
Matrix Dpose, Dpoint;
|
||||
Unit3 bearing_noisy = bearing1.retract(Vector2(0.01, 0.05));
|
||||
Vector2 result = camera.reprojectionError(point1, bearing_noisy, Dpose,
|
||||
Dpoint);
|
||||
Matrix numerical_pose = numericalDerivative31(reprojectionError2, pose,
|
||||
point1, bearing_noisy);
|
||||
Matrix numerical_point = numericalDerivative32(reprojectionError2, pose,
|
||||
point1, bearing_noisy);
|
||||
EXPECT(assert_equal(Vector2(-0.050282, 0.00833482), result, 1e-5));
|
||||
EXPECT(assert_equal(numerical_pose, Dpose, 1e-7));
|
||||
EXPECT(assert_equal(numerical_point, Dpoint, 1e-7));
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
// Add a test with more arbitrary rotation
|
||||
TEST( SphericalCamera, Dproject2)
|
||||
|
|
|
|||
Loading…
Reference in New Issue