diff --git a/tesseract_common/src/utils.cpp b/tesseract_common/src/utils.cpp index 1f0f89d7399..33d077dc506 100644 --- a/tesseract_common/src/utils.cpp +++ b/tesseract_common/src/utils.cpp @@ -211,19 +211,16 @@ Eigen::VectorXd calcJacobianTransformErrorDiff(const Eigen::Isometry3d& target, throw std::runtime_error("calcJacobianTransformErrorDiff, angle axes are pointing in oposite directions!"); #endif - Eigen::Isometry3d ttp = target.inverse() * target_perturbed; - // The reason for premultiplying translation with ttp.rotation() is because the translation error needs to be in the - // target frame coordinates Angle axis has a discontinity at PI so need to correctly handle this calculating jacobian - // difference + // Angle axis has a discontinity at PI so need to correctly handle this calculating jacobiancdifference Eigen::VectorXd perturbed_err; if (perturbed_pose_rotation_err.second > M_PI_2 && pose_rotation_err.second < -M_PI_2) - perturbed_err = concat(ttp.rotation() * perturbed_pose_err.translation(), + perturbed_err = concat(perturbed_pose_err.translation(), perturbed_pose_rotation_err.first * (perturbed_pose_rotation_err.second - 2 * M_PI)); else if (perturbed_pose_rotation_err.second < -M_PI_2 && pose_rotation_err.second > M_PI_2) - perturbed_err = concat(ttp.rotation() * perturbed_pose_err.translation(), + perturbed_err = concat(perturbed_pose_err.translation(), perturbed_pose_rotation_err.first * (perturbed_pose_rotation_err.second + 2 * M_PI)); else - perturbed_err = concat(ttp.rotation() * perturbed_pose_err.translation(), + perturbed_err = concat(perturbed_pose_err.translation(), perturbed_pose_rotation_err.first * perturbed_pose_rotation_err.second); return (perturbed_err - err); diff --git a/tesseract_common/test/tesseract_common_unit.cpp b/tesseract_common/test/tesseract_common_unit.cpp index cbf7d507b36..1e57c8d781d 100644 --- a/tesseract_common/test/tesseract_common_unit.cpp +++ b/tesseract_common/test/tesseract_common_unit.cpp @@ -2205,7 +2205,7 @@ void runCalcJacobianTransformErrorDiffDynamicTargetTest(double anlge) { // X-Axis positive Eigen::Isometry3d target_tf{ identity }; target_tf.translation() = Eigen::Vector3d(1, 2, 3); - Eigen::Isometry3d target_tf_perturbed = target_tf * Eigen::AngleAxisd(-eps, Eigen::Vector3d::UnitX()); + Eigen::Isometry3d target_tf_perturbed = Eigen::AngleAxisd(-eps, Eigen::Vector3d::UnitX()) * target_tf; Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge, Eigen::Vector3d::UnitX()); Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge + eps, Eigen::Vector3d::UnitX()); Eigen::VectorXd diff = tesseract_common::calcJacobianTransformErrorDiff( @@ -2217,7 +2217,7 @@ void runCalcJacobianTransformErrorDiffDynamicTargetTest(double anlge) { // X-Axis negative Eigen::Isometry3d target_tf{ identity }; target_tf.translation() = Eigen::Vector3d(1, 2, 3); - Eigen::Isometry3d target_tf_perturbed = target_tf * Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitX()); + Eigen::Isometry3d target_tf_perturbed = Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitX()) * target_tf; Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge, Eigen::Vector3d::UnitX()); Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge - eps, Eigen::Vector3d::UnitX()); Eigen::VectorXd diff = tesseract_common::calcJacobianTransformErrorDiff( @@ -2229,7 +2229,7 @@ void runCalcJacobianTransformErrorDiffDynamicTargetTest(double anlge) { // X-Axis positive and negative Eigen::Isometry3d target_tf{ identity }; target_tf.translation() = Eigen::Vector3d(1, 2, 3); - Eigen::Isometry3d target_tf_perturbed = target_tf * Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitX()); + Eigen::Isometry3d target_tf_perturbed = Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitX()) * target_tf; Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge + eps, Eigen::Vector3d::UnitX()); Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge - eps, Eigen::Vector3d::UnitX()); Eigen::VectorXd diff = tesseract_common::calcJacobianTransformErrorDiff( @@ -2241,20 +2241,21 @@ void runCalcJacobianTransformErrorDiffDynamicTargetTest(double anlge) { // X-Axis translation Eigen::Isometry3d target_tf{ identity }; target_tf.translation() = Eigen::Vector3d(1, 2, 3); - Eigen::Isometry3d target_tf_perturbed = target_tf * Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitX()); + Eigen::Isometry3d target_tf_perturbed = + Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitX()) * target_tf * Eigen::Translation3d(eps, -eps, eps); + ; Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge, Eigen::Vector3d::UnitX()); Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge - eps, Eigen::Vector3d::UnitX()); - source_tf_perturbed.translation() += Eigen::Vector3d(eps, -eps, eps); Eigen::VectorXd diff = tesseract_common::calcJacobianTransformErrorDiff( target_tf, target_tf_perturbed, source_tf, source_tf_perturbed); - EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d(eps, -eps, eps))); + EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d(-eps, eps, -eps))); EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(-2 * eps, 0, 0))); } { // Y-Axis positive Eigen::Isometry3d target_tf{ identity }; target_tf.translation() = Eigen::Vector3d(1, 2, 3); - Eigen::Isometry3d target_tf_perturbed = target_tf * Eigen::AngleAxisd(-eps, Eigen::Vector3d::UnitY()); + Eigen::Isometry3d target_tf_perturbed = Eigen::AngleAxisd(-eps, Eigen::Vector3d::UnitY()) * target_tf; Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge, Eigen::Vector3d::UnitY()); Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge + eps, Eigen::Vector3d::UnitY()); Eigen::VectorXd diff = tesseract_common::calcJacobianTransformErrorDiff( @@ -2266,7 +2267,7 @@ void runCalcJacobianTransformErrorDiffDynamicTargetTest(double anlge) { // Y-Axis negative Eigen::Isometry3d target_tf{ identity }; target_tf.translation() = Eigen::Vector3d(1, 2, 3); - Eigen::Isometry3d target_tf_perturbed = target_tf * Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitY()); + Eigen::Isometry3d target_tf_perturbed = Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitY()) * target_tf; Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge, Eigen::Vector3d::UnitY()); Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge - eps, Eigen::Vector3d::UnitY()); Eigen::VectorXd diff = tesseract_common::calcJacobianTransformErrorDiff( @@ -2278,7 +2279,7 @@ void runCalcJacobianTransformErrorDiffDynamicTargetTest(double anlge) { // Y-Axis positive and negative Eigen::Isometry3d target_tf{ identity }; target_tf.translation() = Eigen::Vector3d(1, 2, 3); - Eigen::Isometry3d target_tf_perturbed = target_tf * Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitY()); + Eigen::Isometry3d target_tf_perturbed = Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitY()) * target_tf; Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge + eps, Eigen::Vector3d::UnitY()); Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge - eps, Eigen::Vector3d::UnitY()); Eigen::VectorXd diff = tesseract_common::calcJacobianTransformErrorDiff( @@ -2290,20 +2291,20 @@ void runCalcJacobianTransformErrorDiffDynamicTargetTest(double anlge) { // Y-Axis translation Eigen::Isometry3d target_tf{ identity }; target_tf.translation() = Eigen::Vector3d(1, 2, 3); - Eigen::Isometry3d target_tf_perturbed = target_tf * Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitY()); + Eigen::Isometry3d target_tf_perturbed = + Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitY()) * target_tf * Eigen::Translation3d(-eps, eps, -eps); Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge, Eigen::Vector3d::UnitY()); Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge - eps, Eigen::Vector3d::UnitY()); - source_tf_perturbed.translation() += Eigen::Vector3d(-eps, eps, -eps); Eigen::VectorXd diff = tesseract_common::calcJacobianTransformErrorDiff( target_tf, target_tf_perturbed, source_tf, source_tf_perturbed); - EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d(-eps, eps, -eps))); + EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d(eps, -eps, eps))); EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(0, -2 * eps, 0))); } { // Z-Axis positive Eigen::Isometry3d target_tf{ identity }; target_tf.translation() = Eigen::Vector3d(1, 2, 3); - Eigen::Isometry3d target_tf_perturbed = target_tf * Eigen::AngleAxisd(-eps, Eigen::Vector3d::UnitZ()); + Eigen::Isometry3d target_tf_perturbed = Eigen::AngleAxisd(-eps, Eigen::Vector3d::UnitZ()) * target_tf; Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge, Eigen::Vector3d::UnitZ()); Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge + eps, Eigen::Vector3d::UnitZ()); Eigen::VectorXd diff = tesseract_common::calcJacobianTransformErrorDiff( @@ -2315,7 +2316,7 @@ void runCalcJacobianTransformErrorDiffDynamicTargetTest(double anlge) { // Z-Axis negative Eigen::Isometry3d target_tf{ identity }; target_tf.translation() = Eigen::Vector3d(1, 2, 3); - Eigen::Isometry3d target_tf_perturbed = target_tf * Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitZ()); + Eigen::Isometry3d target_tf_perturbed = Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitZ()) * target_tf; Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge, Eigen::Vector3d::UnitZ()); Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge - eps, Eigen::Vector3d::UnitZ()); Eigen::VectorXd diff = tesseract_common::calcJacobianTransformErrorDiff( @@ -2327,7 +2328,7 @@ void runCalcJacobianTransformErrorDiffDynamicTargetTest(double anlge) { // Z-Axis positive and negative Eigen::Isometry3d target_tf{ identity }; target_tf.translation() = Eigen::Vector3d(1, 2, 3); - Eigen::Isometry3d target_tf_perturbed = target_tf * Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitZ()); + Eigen::Isometry3d target_tf_perturbed = Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitZ()) * target_tf; Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge + eps, Eigen::Vector3d::UnitZ()); Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge - eps, Eigen::Vector3d::UnitZ()); Eigen::VectorXd diff = tesseract_common::calcJacobianTransformErrorDiff( @@ -2339,13 +2340,13 @@ void runCalcJacobianTransformErrorDiffDynamicTargetTest(double anlge) { // Z-Axis translation Eigen::Isometry3d target_tf{ identity }; target_tf.translation() = Eigen::Vector3d(1, 2, 3); - Eigen::Isometry3d target_tf_perturbed = target_tf * Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitZ()); + Eigen::Isometry3d target_tf_perturbed = + Eigen::AngleAxisd(eps, Eigen::Vector3d::UnitZ()) * target_tf * Eigen::Translation3d(-eps, -eps, eps); Eigen::Isometry3d source_tf = identity * Eigen::AngleAxisd(anlge, Eigen::Vector3d::UnitZ()); Eigen::Isometry3d source_tf_perturbed = identity * Eigen::AngleAxisd(anlge - eps, Eigen::Vector3d::UnitZ()); - source_tf_perturbed.translation() += Eigen::Vector3d(-eps, -eps, eps); Eigen::VectorXd diff = tesseract_common::calcJacobianTransformErrorDiff( target_tf, target_tf_perturbed, source_tf, source_tf_perturbed); - EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d(-eps, -eps, eps))); + EXPECT_TRUE(diff.head(3).isApprox(Eigen::Vector3d(eps, eps, -eps))); EXPECT_TRUE(diff.tail(3).isApprox(Eigen::Vector3d(0, 0, -2 * eps))); } }