5 #include <Eigen/Geometry> 7 #include <boost/math/distributions/chi_squared.hpp> 9 #include "geometry_msgs/PoseWithCovarianceStamped.h" 11 #include "std_msgs/Float64MultiArray.h" 18 #define REV_STATE_DIM 7 52 _sigma_delta_meas_uncertainty_angular(-1),
53 _accumulated_rotation(0.0)
130 Gaussian system_uncertainty_PDF(sys_noise_MU, sys_noise_COV);
131 this->
_sys_PDF =
new LinearAnalyticConditionalGaussian( A, system_uncertainty_PDF);
138 ColumnVector meas_noise_MU(
MEAS_DIM);
140 SymmetricMatrix meas_noise_COV(
MEAS_DIM);
141 meas_noise_COV = 0.0;
142 for (
unsigned int i = 1; i <=
MEAS_DIM; i++)
145 Gaussian meas_uncertainty_PDF(meas_noise_MU, meas_noise_COV);
180 Gaussian prior_PDF(prior_MU, prior_COV);
182 this->
_ekf =
new ExtendedKalmanFilter(&prior_PDF);
218 this->
_sys_PDF =
new LinearAnalyticConditionalGaussian(*(rev_joint.
_sys_PDF));
222 this->
_ekf =
new ExtendedKalmanFilter(*(rev_joint.
_ekf));
232 sys_noise_COV(3, 3) = this->
_sigma_sys_noise_px* (std::pow((time_interval_ns/1e9),3) / 3.0);
233 sys_noise_COV(4, 4) = this->
_sigma_sys_noise_py* (std::pow((time_interval_ns/1e9),3) / 3.0);
234 sys_noise_COV(5, 5) = this->
_sigma_sys_noise_pz* (std::pow((time_interval_ns/1e9),3) / 3.0);
235 sys_noise_COV(6, 6) = this->
_sigma_sys_noise_jv* (std::pow((time_interval_ns/1e9),3) / 3.0);
246 A(6, 7) = time_interval_ns/1e9;;
249 this->
_sys_PDF->AdditiveNoiseSigmaSet(sys_noise_COV);
257 ColumnVector state_updated_state = this->
_ekf->PostGet()->ExpectedValueGet();
259 ColumnVector predicted_delta_pose_in_rrbf = this->
_meas_MODEL->PredictionGet(empty, state_updated_state);
262 predicted_delta_pose_in_rrbf(6), predicted_delta_pose_in_rrbf(1),
263 predicted_delta_pose_in_rrbf(2), predicted_delta_pose_in_rrbf(3));
267 Eigen::Displacementd T_rrbf_srbf_t_next = predicted_delta * T_rrbf_srbf_t0;
279 ColumnVector updated_state = this->
_ekf->PostGet()->ExpectedValueGet();
280 ColumnVector rb2_measured_delta_relative_pose_cv(
MEAS_DIM);
281 rb2_measured_delta_relative_pose_cv = 0.;
297 meas_uncertainty_factor = std::min(meas_uncertainty_factor, 1e6);
299 SymmetricMatrix current_delta_pose_cov_in_rrbf(6);
300 for (
unsigned int i = 0; i < 6; i++)
302 for (
unsigned int j = 0; j < 6; j++)
308 this->
_meas_PDF->AdditiveNoiseSigmaSet(current_delta_pose_cov_in_rrbf * meas_uncertainty_factor );
310 this->
_ekf->Update(this->
_meas_MODEL, rb2_measured_delta_relative_pose_cv);
312 updated_state = this->
_ekf->PostGet()->ExpectedValueGet();
318 SymmetricMatrix updated_uncertainty = this->
_ekf->PostGet()->CovarianceGet();
320 for(
int i=0; i<3; i++)
323 for(
int j=0; j<3; j++)
368 double accumulated_error = 0.;
370 double p_one_meas_given_model_params = 0;
371 double p_all_meas_given_model_params = 0;
373 double sigma_translation = 0.05;
374 double sigma_rotation = 0.2;
376 ColumnVector updated_state = this->
_ekf->PostGet()->ExpectedValueGet();
377 double phi = updated_state(1);
378 double theta = updated_state(2);
379 double sp =
sin(phi);
380 double cp =
cos(phi);
381 double st =
sin(theta);
382 double ct =
cos(theta);
384 double px = updated_state(3);
385 double py = updated_state(4);
386 double pz = updated_state(5);
390 Eigen::Vector3d rev_joint_rotation_unitary = Eigen::Vector3d(cp * st, sp * st, ct);
391 rev_joint_rotation_unitary.normalize();
394 Eigen::Vector3d rev_joint_position = Eigen::Vector3d(px, py, pz);
395 Eigen::Vector3d rev_joint_translation_unitary = (-rev_joint_rotation_unitary).
cross(rev_joint_position);
400 double delta_idx_samples = (double)std::max(1., (
double)trajectory_length/(double)this->_likelihood_sample_num);
401 size_t current_idx = 0;
403 double max_norm_of_deltas = 0;
414 for (
size_t sample_idx = 0; sample_idx < amount_samples; sample_idx++)
416 current_idx = boost::math::round(sample_idx*delta_idx_samples);
417 Eigen::Displacementd rb2_last_delta_relative_displ = this->
_delta_poses_in_rrbf.at(current_idx).exp(1e-12);
419 max_norm_of_deltas = std::max(this->
_delta_poses_in_rrbf.at(current_idx).norm(), max_norm_of_deltas);
421 Eigen::Vector3d rb2_last_delta_relative_translation = rb2_last_delta_relative_displ.getTranslation();
422 Eigen::Quaterniond rb2_last_delta_relative_rotation = Eigen::Quaterniond(rb2_last_delta_relative_displ.qw(),
423 rb2_last_delta_relative_displ.qx(),
424 rb2_last_delta_relative_displ.qy(),
425 rb2_last_delta_relative_displ.qz());
427 Eigen::Vector3d rev_joint_translation = this->
_joint_states_all.at(current_idx) * rev_joint_translation_unitary;
428 Eigen::Vector3d rev_joint_rotation = this->
_joint_states_all.at(current_idx) * rev_joint_rotation_unitary;
429 Eigen::Displacementd rb2_last_delta_relative_displ_rev_hyp = Eigen::Twistd( rev_joint_rotation.x(),
430 rev_joint_rotation.y(),
431 rev_joint_rotation.z(),
432 rev_joint_translation.x(),
433 rev_joint_translation.y(),
434 rev_joint_translation.z()).
exp(1e-12);
435 Eigen::Vector3d rb2_last_delta_relative_translation_rev_hyp = rb2_last_delta_relative_displ_rev_hyp.getTranslation();
436 Eigen::Quaterniond rb2_last_delta_relative_rotation_rev_hyp = Eigen::Quaterniond(rb2_last_delta_relative_displ_rev_hyp.qw(),
437 rb2_last_delta_relative_displ_rev_hyp.qx(),
438 rb2_last_delta_relative_displ_rev_hyp.qy(),
439 rb2_last_delta_relative_displ_rev_hyp.qz());
442 double translation_error = (rb2_last_delta_relative_translation - rb2_last_delta_relative_translation_rev_hyp).norm();
443 Eigen::Quaterniond rotation_error = rb2_last_delta_relative_rotation.inverse() * rb2_last_delta_relative_rotation_rev_hyp;
444 double rotation_error_angle = Eigen::Displacementd(0., 0., 0., rotation_error.w(), rotation_error.x(), rotation_error.y(), rotation_error.z()).
log(1e-12).norm();
446 accumulated_error += translation_error + fabs(rotation_error_angle);
448 p_one_meas_given_model_params = (1.0/(sigma_translation*
sqrt(2.0*M_PI)))*
exp((-1.0/2.0)*
pow(translation_error/sigma_translation, 2)) *
449 (1.0/(sigma_rotation*
sqrt(2.0*M_PI)))*
exp((-1.0/2.0)*
pow(rotation_error_angle/sigma_rotation, 2));
451 p_all_meas_given_model_params += (p_one_meas_given_model_params/(double)amount_samples);
471 double p_params_given_model = 1;
474 double distance_to_rrb = 0;
477 distance_to_rrb = (point2_in_rrbf- point1_in_rrbf).
cross(point1_in_rrbf).norm()/((point2_in_rrbf - point1_in_rrbf).norm());
481 Eigen::Vector4d point1_in_rrbf_homo(point1_in_rrbf.x(), point1_in_rrbf.y(), point1_in_rrbf.z(), 1.0);
482 Eigen::Vector4d point1_in_sf_homo =
_rrb_current_pose_in_sf.exp(1e-12).toHomogeneousMatrix()*point1_in_rrbf_homo;
483 Eigen::Vector3d point1_in_sf(point1_in_sf_homo[0],point1_in_sf_homo[1],point1_in_sf_homo[2]);
485 Eigen::Vector4d point2_in_rrbf_homo(point2_in_rrbf.x(), point2_in_rrbf.y(), point2_in_rrbf.z(), 1.0);
486 Eigen::Vector4d point2_in_sf_homo =
_rrb_current_pose_in_sf.exp(1e-12).toHomogeneousMatrix()*point2_in_rrbf_homo;
487 Eigen::Vector3d point2_in_sf(point2_in_sf_homo[0],point2_in_sf_homo[1],point2_in_sf_homo[2]);
489 double distance_to_srb = ((point2_in_sf - point1_in_sf).
cross(point1_in_sf -
_srb_centroid_in_sf)).norm()/((point2_in_sf - point1_in_sf).norm());
500 geometry_msgs::TwistWithCovariance hypothesis;
502 hypothesis.twist.linear.x = predicted_delta_pose_in_sf.vx();
503 hypothesis.twist.linear.y = predicted_delta_pose_in_sf.vy();
504 hypothesis.twist.linear.z = predicted_delta_pose_in_sf.vz();
505 hypothesis.twist.angular.x = predicted_delta_pose_in_sf.rx();
506 hypothesis.twist.angular.y = predicted_delta_pose_in_sf.ry();
507 hypothesis.twist.angular.z = predicted_delta_pose_in_sf.rz();
511 ColumnVector state_updated_state = this->
_ekf->PostGet()->ExpectedValueGet();
512 SymmetricMatrix measurement_cov = this->
_meas_MODEL->CovarianceGet(empty, state_updated_state);
513 for(
int i=0; i<6; i++)
515 for(
int j=0; j<6; j++)
517 hypothesis.covariance[6 * i + j] = measurement_cov(i+1,j+1);
528 geometry_msgs::TwistWithCovariance hypothesis;
530 hypothesis.twist.linear.x = predicted_delta_pose_in_sf.vx();
531 hypothesis.twist.linear.y = predicted_delta_pose_in_sf.vy();
532 hypothesis.twist.linear.z = predicted_delta_pose_in_sf.vz();
533 hypothesis.twist.angular.x = predicted_delta_pose_in_sf.rx();
534 hypothesis.twist.angular.y = predicted_delta_pose_in_sf.ry();
535 hypothesis.twist.angular.z = predicted_delta_pose_in_sf.rz();
539 ColumnVector state_updated_state = this->
_ekf->PostGet()->ExpectedValueGet();
540 SymmetricMatrix measurement_cov = this->
_meas_MODEL->CovarianceGet(empty, state_updated_state);
541 for(
int i=0; i<6; i++)
543 for(
int j=0; j<6; j++)
545 hypothesis.covariance[6 * i + j] = measurement_cov(i+1,j+1);
557 Eigen::Displacementd T_sf_rrbf_next = rrb_next_pose_in_sf.exp(1e-12);
560 Eigen::Displacementd T_sf_srbf_next = T_rrbf_srbf_next*T_sf_rrbf_next;
562 Eigen::Twistd srb_next_pose_in_sf = T_sf_srbf_next.log(1e-12);
564 geometry_msgs::TwistWithCovariance hypothesis;
566 hypothesis.twist.linear.x = srb_next_pose_in_sf.vx();
567 hypothesis.twist.linear.y = srb_next_pose_in_sf.vy();
568 hypothesis.twist.linear.z = srb_next_pose_in_sf.vz();
569 hypothesis.twist.angular.x = srb_next_pose_in_sf.rx();
570 hypothesis.twist.angular.y = srb_next_pose_in_sf.ry();
571 hypothesis.twist.angular.z = srb_next_pose_in_sf.rz();
575 ColumnVector state_updated_state = this->
_ekf->PostGet()->ExpectedValueGet();
576 SymmetricMatrix measurement_cov = this->
_meas_MODEL->CovarianceGet(empty, state_updated_state);
577 Eigen::Matrix<double,6,6> measurement_cov_eigen;
578 for(
int i=0; i<6; i++)
580 for(
int j=0; j<6; j++)
582 measurement_cov_eigen(i,j) = measurement_cov(i+1,j+1);
588 Eigen::Matrix<double,6,6> new_pose_covariance = this->
_rrb_pose_cov_in_sf + adjoint_eigen*measurement_cov_eigen*adjoint_eigen.transpose();
589 for (
unsigned int i = 0; i < 6; i++)
591 for (
unsigned int j = 0; j < 6; j++)
593 hypothesis.covariance[6 * i + j] = new_pose_covariance(i, j);
598 #ifdef PUBLISH_PREDICTED_POSE_AS_PWC 600 geometry_msgs::PoseWithCovarianceStamped pose_with_cov_stamped;
602 pose_with_cov_stamped.header.frame_id =
"camera_rgb_optical_frame";
604 Eigen::Displacementd displ_from_twist = srb_next_pose_in_sf.exp(1e-12);
605 pose_with_cov_stamped.pose.pose.position.x = displ_from_twist.x();
606 pose_with_cov_stamped.pose.pose.position.y = displ_from_twist.y();
607 pose_with_cov_stamped.pose.pose.position.z = displ_from_twist.z();
608 pose_with_cov_stamped.pose.pose.orientation.x = displ_from_twist.qx();
609 pose_with_cov_stamped.pose.pose.orientation.y = displ_from_twist.qy();
610 pose_with_cov_stamped.pose.pose.orientation.z = displ_from_twist.qz();
611 pose_with_cov_stamped.pose.pose.orientation.w = displ_from_twist.qw();
613 for (
unsigned int i = 0; i < 6; i++)
614 for (
unsigned int j = 0; j < 6; j++)
615 pose_with_cov_stamped.pose.covariance[6 * i + j] = new_pose_covariance(i, j);
617 _predicted_next_pose_publisher.publish(pose_with_cov_stamped);
632 std::vector<visualization_msgs::Marker> revolute_markers;
634 visualization_msgs::Marker axis_orientation_marker;
635 axis_orientation_marker.ns =
"kinematic_structure";
636 axis_orientation_marker.action = visualization_msgs::Marker::ADD;
637 axis_orientation_marker.type = visualization_msgs::Marker::ARROW;
643 axis_orientation_marker.id = 3 * this->
_joint_id;
645 axis_orientation_marker.scale.y = 0.f;
646 axis_orientation_marker.scale.z = 0.f;
647 axis_orientation_marker.color.r = 1.f;
648 axis_orientation_marker.color.g = 0.f;
649 axis_orientation_marker.color.b = 0.f;
650 axis_orientation_marker.color.a = 1.f;
651 Eigen::Vector3d point_on_rot_axis_1 = rev_joint_posi_in_ref_rb - this->
_joint_state * rev_joint_ori_in_ref_rb;
652 geometry_msgs::Point pt1;
653 pt1.x = point_on_rot_axis_1.x();
654 pt1.y = point_on_rot_axis_1.y();
655 pt1.z = point_on_rot_axis_1.z();
656 axis_orientation_marker.points.push_back(pt1);
657 Eigen::Vector3d point_on_rot_axis_2 = rev_joint_posi_in_ref_rb + this->
_joint_state * rev_joint_ori_in_ref_rb;
658 geometry_msgs::Point pt2;
659 pt2.x = point_on_rot_axis_2.x();
660 pt2.y = point_on_rot_axis_2.y();
661 pt2.z = point_on_rot_axis_2.z();
662 axis_orientation_marker.points.push_back(pt2);
663 revolute_markers.push_back(axis_orientation_marker);
666 visualization_msgs::Marker axis_orientation_markerb;
667 axis_orientation_markerb.ns =
"kinematic_structure";
668 axis_orientation_markerb.action = visualization_msgs::Marker::ADD;
669 axis_orientation_markerb.type = visualization_msgs::Marker::ARROW;
674 axis_orientation_markerb.id = 3 * this->
_joint_id + 1;
676 axis_orientation_markerb.scale.y = 0.f;
677 axis_orientation_markerb.scale.z = 0.f;
678 axis_orientation_markerb.color.r = 1.f;
679 axis_orientation_markerb.color.g = 0.f;
680 axis_orientation_markerb.color.b = 0.f;
681 axis_orientation_markerb.color.a = 1.f;
682 Eigen::Vector3d point_on_rot_axis_1b = rev_joint_posi_in_ref_rb - 100 * rev_joint_ori_in_ref_rb;
683 geometry_msgs::Point pt1b;
684 pt1b.x = point_on_rot_axis_1b.x();
685 pt1b.y = point_on_rot_axis_1b.y();
686 pt1b.z = point_on_rot_axis_1b.z();
687 axis_orientation_markerb.points.push_back(pt1b);
688 Eigen::Vector3d point_on_rot_axis_2b = rev_joint_posi_in_ref_rb + 100 * rev_joint_ori_in_ref_rb;
689 geometry_msgs::Point pt2b;
690 pt2b.x = point_on_rot_axis_2b.x();
691 pt2b.y = point_on_rot_axis_2b.y();
692 pt2b.z = point_on_rot_axis_2b.z();
693 axis_orientation_markerb.points.push_back(pt2b);
695 revolute_markers.push_back(axis_orientation_markerb);
698 axis_orientation_markerb.points.clear();
699 axis_orientation_markerb.id = 3 * this->
_joint_id + 2;
700 axis_orientation_markerb.type = visualization_msgs::Marker::TEXT_VIEW_FACING;
702 std::ostringstream oss_joint_value;
703 oss_joint_value << std::fixed<< std::setprecision(0) << (180/M_PI)*this->
_joint_state;
704 axis_orientation_markerb.text = oss_joint_value.str() + std::string(
" deg");
705 axis_orientation_markerb.pose.position.x = rev_joint_posi_in_ref_rb.x();
706 axis_orientation_markerb.pose.position.y = rev_joint_posi_in_ref_rb.y();
707 axis_orientation_markerb.pose.position.z = rev_joint_posi_in_ref_rb.z();
708 axis_orientation_markerb.pose.orientation.x = 0;
709 axis_orientation_markerb.pose.orientation.y = 0;
710 axis_orientation_markerb.pose.orientation.z = 0;
711 axis_orientation_markerb.pose.orientation.w = 1;
713 revolute_markers.push_back(axis_orientation_markerb);
717 visualization_msgs::Marker axis_position_uncertainty_marker;
718 axis_position_uncertainty_marker.pose.position.x = rev_joint_posi_in_ref_rb.x();
719 axis_position_uncertainty_marker.pose.position.y = rev_joint_posi_in_ref_rb.y();
720 axis_position_uncertainty_marker.pose.position.z = rev_joint_posi_in_ref_rb.z();
725 axis_position_uncertainty_marker.ns =
"kinematic_structure_uncertainty";
726 axis_position_uncertainty_marker.type = visualization_msgs::Marker::SPHERE;
727 axis_position_uncertainty_marker.action = visualization_msgs::Marker::ADD;
728 axis_position_uncertainty_marker.id = 3 * this->
_joint_id ;
734 axis_position_uncertainty_marker.color.a = 0.3;
735 axis_position_uncertainty_marker.color.r = 1.0;
736 axis_position_uncertainty_marker.color.g = 0.0;
737 axis_position_uncertainty_marker.color.b = 0.0;
738 revolute_markers.push_back(axis_position_uncertainty_marker);
740 visualization_msgs::Marker rev_axis_unc_cone1;
741 rev_axis_unc_cone1.type = visualization_msgs::Marker::MESH_RESOURCE;
742 rev_axis_unc_cone1.action = visualization_msgs::Marker::ADD;
743 rev_axis_unc_cone1.mesh_resource =
"package://joint_tracker/meshes/cone.stl";
744 rev_axis_unc_cone1.pose.position.x = rev_joint_posi_in_ref_rb.x();
745 rev_axis_unc_cone1.pose.position.y = rev_joint_posi_in_ref_rb.y();
746 rev_axis_unc_cone1.pose.position.z = rev_joint_posi_in_ref_rb.z();
763 double confidence_value = 0.5;
764 boost::math::chi_squared chi_sq_dist(2);
765 double critical_value = boost::math::quantile(chi_sq_dist, confidence_value);
766 double major_axis_length = 2*eigensolver.eigenvalues()[1]*std::sqrt(critical_value);
767 double minor_axis_length = 2*eigensolver.eigenvalues()[0]*std::sqrt(critical_value);
771 double alpha =
atan2(eigensolver.eigenvectors().col(1)[1],eigensolver.eigenvectors().col(1)[0]);
773 Eigen::AngleAxisd init_rot(-alpha, Eigen::Vector3d::UnitZ());
780 Eigen::Quaterniond ori_quat;
781 ori_quat.setFromTwoVectors(Eigen::Vector3d::UnitZ(), rev_joint_ori_in_ref_rb);
785 Eigen::Vector3d coplanar_xy_orthogonal_to_joint_ori = rev_joint_ori_in_ref_rb.cross(Eigen::Vector3d::UnitZ());
787 coplanar_xy_orthogonal_to_joint_ori.normalize();
791 Eigen::Vector3d y_pos = rev_joint_ori_in_ref_rb.cross(coplanar_xy_orthogonal_to_joint_ori);
794 Eigen::Matrix3d rotation_pos;
795 rotation_pos << coplanar_xy_orthogonal_to_joint_ori.x(),y_pos.x(),rev_joint_ori_in_ref_rb.x(),
796 coplanar_xy_orthogonal_to_joint_ori.y(),y_pos.y(),rev_joint_ori_in_ref_rb.y(),
797 coplanar_xy_orthogonal_to_joint_ori.z(),y_pos.z(),rev_joint_ori_in_ref_rb.z();
800 Eigen::Quaterniond ori_quat_final(rotation_pos);
802 Eigen::Quaterniond ori_quat_final_ellipse(ori_quat_final.toRotationMatrix()*init_rot.toRotationMatrix());
804 rev_axis_unc_cone1.pose.orientation.x = ori_quat_final_ellipse.x();
805 rev_axis_unc_cone1.pose.orientation.y = ori_quat_final_ellipse.y();
806 rev_axis_unc_cone1.pose.orientation.z = ori_quat_final_ellipse.z();
807 rev_axis_unc_cone1.pose.orientation.w = ori_quat_final_ellipse.w();
812 rev_axis_unc_cone1.ns =
"kinematic_structure_uncertainty";
813 rev_axis_unc_cone1.id = 3 * this->
_joint_id + 1;
814 rev_axis_unc_cone1.color.a = 0.4;
815 rev_axis_unc_cone1.color.r = 1.0;
816 rev_axis_unc_cone1.color.g = 0.0;
817 rev_axis_unc_cone1.color.b = 0.0;
824 rev_axis_unc_cone1.scale.x = major_axis_length / (M_PI / 6.0);
825 rev_axis_unc_cone1.scale.y = minor_axis_length / (M_PI / 6.0);
826 rev_axis_unc_cone1.scale.z = 1.;
827 revolute_markers.push_back(rev_axis_unc_cone1);
831 Eigen::Vector3d rev_joint_ori_in_ref_rb_neg = -rev_joint_ori_in_ref_rb;
832 Eigen::Quaterniond ori_quat_neg;
833 ori_quat_neg.setFromTwoVectors(Eigen::Vector3d::UnitZ(), rev_joint_ori_in_ref_rb_neg);
837 Eigen::Vector3d coplanar_xy_orthogonal_to_joint_ori_neg = rev_joint_ori_in_ref_rb_neg.cross(Eigen::Vector3d::UnitZ());
839 coplanar_xy_orthogonal_to_joint_ori_neg.normalize();
843 Eigen::Vector3d y_neg = rev_joint_ori_in_ref_rb_neg.cross(coplanar_xy_orthogonal_to_joint_ori_neg);
846 Eigen::Matrix3d rotation_neg;
847 rotation_neg << coplanar_xy_orthogonal_to_joint_ori_neg.x(),y_neg.x(),rev_joint_ori_in_ref_rb_neg.x(),
848 coplanar_xy_orthogonal_to_joint_ori_neg.y(),y_neg.y(),rev_joint_ori_in_ref_rb_neg.y(),
849 coplanar_xy_orthogonal_to_joint_ori_neg.z(),y_neg.z(),rev_joint_ori_in_ref_rb_neg.z();
852 Eigen::Quaterniond ori_quat_neg_final(rotation_neg);
855 Eigen::AngleAxisd init_rot_neg(alpha, Eigen::Vector3d::UnitZ());
856 Eigen::Quaterniond ori_quat_neg_final_ellipse(ori_quat_neg_final.toRotationMatrix()*init_rot_neg.toRotationMatrix());
858 rev_axis_unc_cone1.pose.orientation.x = ori_quat_neg_final_ellipse.x();
859 rev_axis_unc_cone1.pose.orientation.y = ori_quat_neg_final_ellipse.y();
860 rev_axis_unc_cone1.pose.orientation.z = ori_quat_neg_final_ellipse.z();
861 rev_axis_unc_cone1.pose.orientation.w = ori_quat_neg_final_ellipse.w();
862 rev_axis_unc_cone1.scale.x = major_axis_length / (M_PI / 6.0);
863 rev_axis_unc_cone1.scale.y = minor_axis_length / (M_PI / 6.0);
864 rev_axis_unc_cone1.scale.z = 1.;
865 rev_axis_unc_cone1.id = 3 * this->
_joint_id + 2;
866 revolute_markers.push_back(rev_axis_unc_cone1);
868 return revolute_markers;
878 return std::string(
"RevoluteJointFilter");
EIGEN_MAKE_ALIGNED_OPERATOR_NEW RevoluteJointFilter()
Eigen::Twistd _rrb_current_pose_in_sf
double _sigma_delta_meas_uncertainty_angular
double _sigma_sys_noise_px
bool _from_inverted_to_non_inverted
Eigen::Twistd _predicted_delta_pose_in_rrbf
TFSIMD_FORCE_INLINE Vector3 cross(const Vector3 &v) const
void _initializeMeasurementModel()
INLINE Rall1d< T, V, S > log(const Rall1d< T, V, S > &arg)
Eigen::Matrix3d _uncertainty_joint_position
Eigen::Matrix< double, 6, 6 > _current_delta_pose_cov_in_rrbf
virtual void setMinRotationRevolute(const double &value)
virtual void initialize()
virtual std::vector< visualization_msgs::Marker > getJointMarkersInRRBFrame() const
double _sigma_sys_noise_py
double _joint_orientation_phi
double _uncertainty_joint_velocity
BFL::LinearAnalyticConditionalGaussian * _sys_PDF
Eigen::Twistd _srb_initial_pose_in_rrbf
int _likelihood_sample_num
double _rev_max_joint_distance_for_ee
std::vector< double > _joint_states_all
Eigen::Matrix< double, 6, 6 > _rrb_pose_cov_in_sf
Eigen::Twistd _rrb_current_vel_in_sf
double _model_prior_probability
bool _from_non_inverted_to_inverted
BFL::ExtendedKalmanFilter * _ekf
virtual JointFilterType getJointFilterType() const
Eigen::Twistd _srb_predicted_pose_in_rrbf
virtual ~RevoluteJointFilter()
Eigen::Matrix2d _uncertainty_joint_orientation_phitheta
virtual void setMaxRadiusDistanceRevolute(const double &value)
double _uncertainty_joint_state
virtual void initialize()
#define JOINT_VALUE_TEXT_SIZE
Eigen::Vector3d _joint_orientation
bool _inverted_delta_srb_pose_in_rrbf
virtual std::string getJointFilterTypeStr() const
double _measurements_likelihood
virtual geometry_msgs::TwistWithCovariance getPredictedSRBPoseWithCovInSensorFrame()
We use the kinematic structure to predict the next pose-twist of the second rigid body of the joint (...
double _unnormalized_model_probability
BFL::AnalyticMeasurementModelGaussianUncertainty * _meas_MODEL
Eigen::Twistd unwrapTwist(Eigen::Twistd ¤t_twist, Eigen::Displacementd ¤t_displacement, Eigen::Twistd &previous_twist, bool &changed)
Eigen::Vector3d _joint_position
INLINE Rall1d< T, V, S > sqrt(const Rall1d< T, V, S > &arg)
BFL::NonLinearRevoluteMeasurementPdf * _meas_PDF
double _joint_orientation_theta
void _initializeSystemModel()
#define JOINT_AXIS_AND_VARIABLE_MARKER_RADIUS
INLINE Rall1d< T, V, S > exp(const Rall1d< T, V, S > &arg)
Eigen::Twistd _current_delta_pose_in_rrbf
INLINE Rall1d< T, V, S > pow(const Rall1d< T, V, S > &arg, double m)
virtual void setCovarianceDeltaMeasurementAngular(double sigma_delta_meas_uncertainty_angular)
virtual void estimateMeasurementHistoryLikelihood()
INLINE Rall1d< T, V, S > acos(const Rall1d< T, V, S > &x)
JointCombinedFilterId _joint_id
double _sigma_sys_noise_theta
virtual void estimateUnnormalizedModelProbability()
BFL::LinearAnalyticSystemModelGaussianUncertainty * _sys_MODEL
#define JOINT_AXIS_MARKER_RADIUS
double _accumulated_rotation
double _sigma_sys_noise_jvd
INLINE Rall1d< T, V, S > atan2(const Rall1d< T, V, S > &y, const Rall1d< T, V, S > &x)
std::vector< Eigen::Twistd > _delta_poses_in_rrbf
virtual void predictState(double time_interval_ns)
First step when updating the filter. The next state is predicted from current state and system model...
virtual geometry_msgs::TwistWithCovariance getPredictedSRBDeltaPoseWithCovInSensorFrame()
Generate a prediction about the change in pose of the second rigid body (SRB) and its covariance usin...
double _sigma_sys_noise_jv
INLINE Rall1d< T, V, S > cos(const Rall1d< T, V, S > &arg)
Eigen::Vector3d _srb_centroid_in_sf
virtual void predictMeasurement()
double _sigma_sys_noise_phi
Eigen::Twistd _srb_previous_predicted_pose_in_rrbf
double _sigma_sys_noise_pz
INLINE Rall1d< T, V, S > sin(const Rall1d< T, V, S > &arg)
virtual geometry_msgs::TwistWithCovariance getPredictedSRBVelocityWithCovInSensorFrame()
Generate a prediction about the velocity of the second rigid body (SRB) and its covariance using the ...
virtual void correctState()
double _rev_min_rot_for_ee