Skip to content

Commit 5e60240

Browse files
convert jacobian into RPY space
1 parent fd1aaec commit 5e60240

1 file changed

Lines changed: 10 additions & 1 deletion

File tree

fuse_models/include/fuse_models/omnidirectional_3d_predict.hpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,16 @@ inline void predict(const fuse_core::Vector3d& position1, const Eigen::Quaternio
493493
vel_linear2.y(), vel_linear2.z(), vel_angular2.x(), vel_angular2.y(), vel_angular2.z(), acc_linear2.x(),
494494
acc_linear2.y(), acc_linear2.z(), jacobians.data(), jacobian_quat2rpy);
495495

496-
jacobian << J[0], J[1], J[2], J[3], J[4];
496+
// Convert J[1] from quaternion space (15x4) to RPY space (15x3) using the
497+
// pseudo-inverse of the quaternion-to-RPY Jacobian.
498+
// Chain rule: J[1] = d(state2)/d(quat1) = d(state2)/d(rpy1) * d(rpy)/d(quat)
499+
// So: d(state2)/d(rpy1) = J[1] * pinv(d(rpy)/d(quat))
500+
Eigen::Map<fuse_core::Matrix<double, 3, 4>> j_quat2rpy_map(jacobian_quat2rpy);
501+
fuse_core::Matrix<double, 4, 3> j_quat2rpy_pinv =
502+
j_quat2rpy_map.transpose() * (j_quat2rpy_map * j_quat2rpy_map.transpose()).inverse();
503+
fuse_core::Matrix<double, 15, 3> J1_rpy = J[1] * j_quat2rpy_pinv;
504+
505+
jacobian << J[0], J1_rpy, J[2], J[3], J[4];
497506

498507
// Convert back to quaternion
499508
orientation2 = Eigen::AngleAxisd(rpy[2], Eigen::Vector3d::UnitZ()) *

0 commit comments

Comments
 (0)