3 #include <Eigen/Geometry> 9 #include <Eigen/Eigenvalues> 11 #include <boost/math/distributions/chi_squared.hpp> 20 #define PRISM_STATE_DIM 4 50 _sigma_delta_meas_uncertainty_linear(-1)
90 Eigen::Affine3d current_ref_pose;
91 current_ref_pose.matrix() = current_ref_pose_displ.toHomogeneousMatrix();
121 Gaussian system_uncertainty_PDF(sys_noise_MU, sys_noise_COV);
122 this->
_sys_PDF =
new LinearAnalyticConditionalGaussian( A, system_uncertainty_PDF);
129 ColumnVector meas_noise_MU(
MEAS_DIM);
131 SymmetricMatrix meas_noise_COV(
MEAS_DIM);
132 meas_noise_COV = 0.0;
133 for (
unsigned int i = 1; i <=
MEAS_DIM; i++)
136 Gaussian meas_uncertainty_PDF(meas_noise_MU, meas_noise_COV);
143 ColumnVector meas_noise_ft_MU(6);
144 meas_noise_ft_MU = 0;
145 SymmetricMatrix meas_noise_ft_COV(6);
146 meas_noise_ft_COV = 0;
147 for (
unsigned int i=1; i<=6; i++)
148 meas_noise_ft_COV(i,i) = 1;
149 Gaussian meas_uncertainty_ft_PDF(meas_noise_ft_MU, meas_noise_ft_COV);
178 "Prismatic initial state (phi, theta, jv, jv_dot): " << prior_MU(1) <<
" " << prior_MU(2) <<
" " << prior_MU(3) <<
" " << prior_MU(4));
185 Gaussian prior_PDF(prior_MU, prior_COV);
187 this->
_ekf =
new ExtendedKalmanFilter(&prior_PDF);
223 this->
_sys_PDF =
new LinearAnalyticConditionalGaussian( *(prismatic_joint.
_sys_PDF));
224 this->
_sys_MODEL =
new LinearAnalyticSystemModelGaussianUncertainty( *(prismatic_joint.
_sys_MODEL));
227 this->
_ekf =
new ExtendedKalmanFilter(*(prismatic_joint.
_ekf));
237 sys_noise_COV(3, 3) = this->
_sigma_sys_noise_jv* (std::pow((time_interval_ns/1e9),3) / 3.0);
248 A(3, 4) = time_interval_ns/1e9;
251 this->
_sys_PDF->AdditiveNoiseSigmaSet(sys_noise_COV);
259 geometry_msgs::TwistWithCovariance hypothesis;
261 hypothesis.twist.linear.x = predicted_delta_pose_in_sf.vx();
262 hypothesis.twist.linear.y = predicted_delta_pose_in_sf.vy();
263 hypothesis.twist.linear.z = predicted_delta_pose_in_sf.vz();
264 hypothesis.twist.angular.x = predicted_delta_pose_in_sf.rx();
265 hypothesis.twist.angular.y = predicted_delta_pose_in_sf.ry();
266 hypothesis.twist.angular.z = predicted_delta_pose_in_sf.rz();
270 ColumnVector state_updated_state = this->
_ekf->PostGet()->ExpectedValueGet();
271 SymmetricMatrix measurement_cov = this->
_meas_MODEL->CovarianceGet(empty, state_updated_state);
272 for(
int i=0; i<6; i++)
274 for(
int j=0; j<6; j++)
276 hypothesis.covariance[6 * i + j] = measurement_cov(i+1,j+1);
287 geometry_msgs::TwistWithCovariance hypothesis;
289 hypothesis.twist.linear.x = predicted_delta_pose_in_sf.vx();
290 hypothesis.twist.linear.y = predicted_delta_pose_in_sf.vy();
291 hypothesis.twist.linear.z = predicted_delta_pose_in_sf.vz();
292 hypothesis.twist.angular.x = predicted_delta_pose_in_sf.rx();
293 hypothesis.twist.angular.y = predicted_delta_pose_in_sf.ry();
294 hypothesis.twist.angular.z = predicted_delta_pose_in_sf.rz();
298 ColumnVector state_updated_state = this->
_ekf->PostGet()->ExpectedValueGet();
299 SymmetricMatrix measurement_cov = this->
_meas_MODEL->CovarianceGet(empty, state_updated_state);
300 for(
int i=0; i<6; i++)
302 for(
int j=0; j<6; j++)
304 hypothesis.covariance[6 * i + j] = measurement_cov(i+1,j+1);
314 ColumnVector state_updated_state = this->
_ekf->PostGet()->ExpectedValueGet();
317 "Prismatic state after state update: " << state_updated_state(1) <<
" " << state_updated_state(2) <<
" " << state_updated_state(3) <<
" " << state_updated_state(4));
319 ColumnVector predicted_delta_pose_in_rrbf = this->
_meas_MODEL->PredictionGet(empty, state_updated_state);
322 predicted_delta_pose_in_rrbf(6), predicted_delta_pose_in_rrbf(1),
323 predicted_delta_pose_in_rrbf(2), predicted_delta_pose_in_rrbf(3));
327 Eigen::Displacementd T_rrbf_srbf_t_next = predicted_delta * T_rrbf_srbf_t0;
336 Eigen::Matrix4d _srb_current_pose_in_rrbf_matrix;
340 for(
int i=0; i<3; i++)
342 for(
int j=0; j<3; j++)
346 _srb_current_pose_in_rrbf_matrix(i,j) = 1;
348 _srb_current_pose_in_rrbf_matrix(i,j) = 0;
353 Eigen::Twistd _srb_current_pose_in_rrbf_no_rot;
356 Eigen::Twistd _current_delta_pose_in_rrbf_no_rot = (_srb_current_pose_in_rrbf_no_rot.exp(1e-12)*
_srb_initial_pose_in_rrbf.exp(1e-12).inverse()).
log(1e-12);
358 ColumnVector rb2_measured_delta_relative_pose_cv(
MEAS_DIM);
359 rb2_measured_delta_relative_pose_cv = 0.;
360 rb2_measured_delta_relative_pose_cv(1) = _current_delta_pose_in_rrbf_no_rot.vx();
361 rb2_measured_delta_relative_pose_cv(2) = _current_delta_pose_in_rrbf_no_rot.vy();
362 rb2_measured_delta_relative_pose_cv(3) = _current_delta_pose_in_rrbf_no_rot.vz();
363 rb2_measured_delta_relative_pose_cv(4) = _current_delta_pose_in_rrbf_no_rot.rx();
364 rb2_measured_delta_relative_pose_cv(5) = _current_delta_pose_in_rrbf_no_rot.ry();
365 rb2_measured_delta_relative_pose_cv(6) = _current_delta_pose_in_rrbf_no_rot.rz();
373 meas_uncertainty_factor = std::min(meas_uncertainty_factor, 1e6);
375 SymmetricMatrix current_delta_pose_cov_in_rrbf(6);
376 for (
unsigned int i = 0; i < 6; i++)
378 for (
unsigned int j = 0; j < 6; j++)
383 this->
_meas_PDF->AdditiveNoiseSigmaSet(current_delta_pose_cov_in_rrbf * meas_uncertainty_factor);
385 this->
_ekf->Update(this->
_meas_MODEL, rb2_measured_delta_relative_pose_cv);
387 ColumnVector updated_state = this->
_ekf->PostGet()->ExpectedValueGet();
394 SymmetricMatrix updated_uncertainty = this->
_ekf->PostGet()->CovarianceGet();
411 double accumulated_error = 0.;
413 double p_one_meas_given_model_params = 0;
414 double p_all_meas_given_model_params = 0;
416 double sigma_translation = 0.05;
417 double sigma_rotation = 0.2;
419 ColumnVector state_updated_state = this->
_ekf->PostGet()->ExpectedValueGet();
420 double phi = state_updated_state(1);
421 double theta = state_updated_state(2);
426 Eigen::Vector3d prism_joint_translation_unitary = Eigen::Vector3d(
cos(phi) *
sin(theta),
sin(phi) *
sin(theta),
cos(theta));
427 prism_joint_translation_unitary.normalize();
429 double frame_counter = 0.;
432 double delta_idx_samples = (double)std::max(1., (
double)trajectory_length/(double)this->_likelihood_sample_num);
433 size_t current_idx = 0;
435 double max_norm_of_deltas = 0;
443 for (
size_t sample_idx = 0; sample_idx < amount_samples; sample_idx++)
445 current_idx = boost::math::round(sample_idx*delta_idx_samples);
446 Eigen::Displacementd rb2_last_delta_relative_displ = this->
_delta_poses_in_rrbf.at(current_idx).exp(1e-12);
448 max_norm_of_deltas = std::max(this->
_delta_poses_in_rrbf.at(current_idx).norm(), max_norm_of_deltas);
450 Eigen::Vector3d rb2_last_delta_relative_translation = rb2_last_delta_relative_displ.getTranslation();
451 Eigen::Quaterniond rb2_last_delta_relative_rotation = Eigen::Quaterniond(rb2_last_delta_relative_displ.qw(),
452 rb2_last_delta_relative_displ.qx(),
453 rb2_last_delta_relative_displ.qy(),
454 rb2_last_delta_relative_displ.qz());
456 Eigen::Vector3d prism_joint_translation = this->
_joint_states_all.at(current_idx) * prism_joint_translation_unitary;
457 Eigen::Displacementd rb2_last_delta_relative_displ_prism_hyp = Eigen::Twistd(0.,
460 prism_joint_translation.x(),
461 prism_joint_translation.y(),
462 prism_joint_translation.z()).
exp(1e-12);
463 Eigen::Vector3d rb2_last_delta_relative_translation_prism_hyp = rb2_last_delta_relative_displ_prism_hyp.getTranslation();
464 Eigen::Quaterniond rb2_last_delta_relative_rotation_prism_hyp = Eigen::Quaterniond(rb2_last_delta_relative_displ_prism_hyp.qw(),
465 rb2_last_delta_relative_displ_prism_hyp.qx(),
466 rb2_last_delta_relative_displ_prism_hyp.qy(),
467 rb2_last_delta_relative_displ_prism_hyp.qz());
470 double translation_error = (rb2_last_delta_relative_translation - rb2_last_delta_relative_translation_prism_hyp).norm();
472 Eigen::Quaterniond rotation_error = rb2_last_delta_relative_rotation.inverse() * rb2_last_delta_relative_rotation_prism_hyp;
473 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();
476 accumulated_error += translation_error + fabs(rotation_error_angle);
478 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)) *
479 (1.0/(sigma_rotation*
sqrt(2.0*M_PI)))*
exp((-1.0/2.0)*
pow(rotation_error_angle/sigma_rotation, 2));
481 p_all_meas_given_model_params += (p_one_meas_given_model_params/(double)amount_samples);
486 if(frame_counter != 0)
505 Eigen::Displacementd T_sf_rrbf_next = rrb_next_pose_in_sf.exp(1e-12);
508 Eigen::Displacementd T_sf_srbf_next = T_rrbf_srbf_next*T_sf_rrbf_next;
510 Eigen::Twistd srb_next_pose_in_sf = T_sf_srbf_next.log(1e-12);
512 geometry_msgs::TwistWithCovariance hypothesis;
514 hypothesis.twist.linear.x = srb_next_pose_in_sf.vx();
515 hypothesis.twist.linear.y = srb_next_pose_in_sf.vy();
516 hypothesis.twist.linear.z = srb_next_pose_in_sf.vz();
517 hypothesis.twist.angular.x = srb_next_pose_in_sf.rx();
518 hypothesis.twist.angular.y = srb_next_pose_in_sf.ry();
519 hypothesis.twist.angular.z = srb_next_pose_in_sf.rz();
523 ColumnVector state_updated_state = this->
_ekf->PostGet()->ExpectedValueGet();
524 SymmetricMatrix measurement_cov = this->
_meas_MODEL->CovarianceGet(empty, state_updated_state);
525 Eigen::Matrix<double,6,6> measurement_cov_eigen;
526 for(
int i=0; i<6; i++)
528 for(
int j=0; j<6; j++)
530 measurement_cov_eigen(i,j) = measurement_cov(i+1,j+1);
536 Eigen::Matrix<double,6,6> new_pose_covariance = this->
_rrb_pose_cov_in_sf + adjoint_eigen*measurement_cov_eigen*adjoint_eigen.transpose();
537 for (
unsigned int i = 0; i < 6; i++)
539 for (
unsigned int j = 0; j < 6; j++)
541 hypothesis.covariance[6 * i + j] = new_pose_covariance(i, j);
545 #ifdef PUBLISH_PREDICTED_POSE_AS_PWC 547 geometry_msgs::PoseWithCovarianceStamped pose_with_cov_stamped;
549 pose_with_cov_stamped.header.frame_id =
"camera_rgb_optical_frame";
551 Eigen::Displacementd displ_from_twist = srb_next_pose_in_sf.exp(1e-12);
552 pose_with_cov_stamped.pose.pose.position.x = displ_from_twist.x();
553 pose_with_cov_stamped.pose.pose.position.y = displ_from_twist.y();
554 pose_with_cov_stamped.pose.pose.position.z = displ_from_twist.z();
555 pose_with_cov_stamped.pose.pose.orientation.x = displ_from_twist.qx();
556 pose_with_cov_stamped.pose.pose.orientation.y = displ_from_twist.qy();
557 pose_with_cov_stamped.pose.pose.orientation.z = displ_from_twist.qz();
558 pose_with_cov_stamped.pose.pose.orientation.w = displ_from_twist.qw();
560 for (
unsigned int i = 0; i < 6; i++)
561 for (
unsigned int j = 0; j < 6; j++)
562 pose_with_cov_stamped.pose.covariance[6 * i + j] = new_pose_covariance(i, j);
563 _predicted_next_pose_publisher.publish(pose_with_cov_stamped);
576 std::vector<visualization_msgs::Marker> prismatic_markers;
578 visualization_msgs::Marker axis_orientation_marker;
579 axis_orientation_marker.ns =
"kinematic_structure";
580 axis_orientation_marker.action = visualization_msgs::Marker::ADD;
581 axis_orientation_marker.type = visualization_msgs::Marker::ARROW;
582 axis_orientation_marker.id = 3 * this->
_joint_id;
584 axis_orientation_marker.scale.y = 0.f;
585 axis_orientation_marker.scale.z = 0.f;
586 axis_orientation_marker.color.r = 0.f;
587 axis_orientation_marker.color.g = 1.f;
588 axis_orientation_marker.color.b = 0.f;
589 axis_orientation_marker.color.a = 1.f;
596 Eigen::Vector3d position1 = second_centroid_relative_to_ref_body - this->
_joint_state * prism_joint_ori_in_ref_rb;
597 geometry_msgs::Point pt1;
598 pt1.x = position1.x();
599 pt1.y = position1.y();
600 pt1.z = position1.z();
601 axis_orientation_marker.points.push_back(pt1);
602 Eigen::Vector3d position2 = second_centroid_relative_to_ref_body + this->
_joint_state * prism_joint_ori_in_ref_rb;
603 geometry_msgs::Point pt2;
604 pt2.x = position2.x();
605 pt2.y = position2.y();
606 pt2.z = position2.z();
607 axis_orientation_marker.points.push_back(pt2);
609 prismatic_markers.push_back(axis_orientation_marker);
612 axis_orientation_marker.points.clear();
613 axis_orientation_marker.id = 3 * this->
_joint_id + 1;
616 Eigen::Vector3d position12 = second_centroid_relative_to_ref_body - 100 * prism_joint_ori_in_ref_rb;
617 geometry_msgs::Point pt12;
618 pt12.x = position12.x();
619 pt12.y = position12.y();
620 pt12.z = position12.z();
621 axis_orientation_marker.points.push_back(pt12);
622 Eigen::Vector3d position22 = second_centroid_relative_to_ref_body + 100 * prism_joint_ori_in_ref_rb;
623 geometry_msgs::Point pt22;
624 pt22.x = position22.x();
625 pt22.y = position22.y();
626 pt22.z = position22.z();
627 axis_orientation_marker.points.push_back(pt22);
629 prismatic_markers.push_back(axis_orientation_marker);
632 axis_orientation_marker.points.clear();
633 axis_orientation_marker.id = 3 * this->
_joint_id + 2;
634 axis_orientation_marker.type = visualization_msgs::Marker::TEXT_VIEW_FACING;
636 std::ostringstream oss_joint_value;
637 oss_joint_value << std::fixed<< std::setprecision(1) << 100*this->
_joint_state;
638 axis_orientation_marker.text = oss_joint_value.str() + std::string(
" cm");
639 axis_orientation_marker.pose.position.x = second_centroid_relative_to_ref_body.x();
640 axis_orientation_marker.pose.position.y = second_centroid_relative_to_ref_body.y();
641 axis_orientation_marker.pose.position.z = second_centroid_relative_to_ref_body.z();
642 axis_orientation_marker.pose.orientation.x = 0;
643 axis_orientation_marker.pose.orientation.y = 0;
644 axis_orientation_marker.pose.orientation.z = 0;
645 axis_orientation_marker.pose.orientation.w = 1;
647 prismatic_markers.push_back(axis_orientation_marker);
652 visualization_msgs::Marker axis_position_uncertainty_marker;
653 axis_position_uncertainty_marker.pose.position.x = second_centroid_relative_to_ref_body.x();
654 axis_position_uncertainty_marker.pose.position.y = second_centroid_relative_to_ref_body.y();
655 axis_position_uncertainty_marker.pose.position.z = second_centroid_relative_to_ref_body.z();
656 axis_position_uncertainty_marker.ns =
"kinematic_structure_uncertainty";
657 axis_position_uncertainty_marker.type = visualization_msgs::Marker::SPHERE;
658 axis_position_uncertainty_marker.action = visualization_msgs::Marker::DELETE;
659 axis_position_uncertainty_marker.id = 3 * this->
_joint_id ;
661 prismatic_markers.push_back(axis_position_uncertainty_marker);
663 visualization_msgs::Marker prism_axis_unc_cone1;
664 prism_axis_unc_cone1.type = visualization_msgs::Marker::MESH_RESOURCE;
665 prism_axis_unc_cone1.action = visualization_msgs::Marker::ADD;
666 prism_axis_unc_cone1.mesh_resource =
"package://joint_tracker/meshes/cone.stl";
667 prism_axis_unc_cone1.pose.position.x = second_centroid_relative_to_ref_body.x();
668 prism_axis_unc_cone1.pose.position.y = second_centroid_relative_to_ref_body.y();
669 prism_axis_unc_cone1.pose.position.z = second_centroid_relative_to_ref_body.z();
685 double confidence_value = 0.5;
686 boost::math::chi_squared chi_sq_dist(2);
687 double critical_value = boost::math::quantile(chi_sq_dist, confidence_value);
688 double major_axis_length = 2*eigensolver.eigenvalues()[1]*std::sqrt(critical_value);
689 double minor_axis_length = 2*eigensolver.eigenvalues()[0]*std::sqrt(critical_value);
693 double alpha =
atan2(eigensolver.eigenvectors().col(1)[1],eigensolver.eigenvectors().col(1)[0]);
695 Eigen::AngleAxisd init_rot(-alpha, Eigen::Vector3d::UnitZ());
702 Eigen::Quaterniond ori_quat;
703 ori_quat.setFromTwoVectors(Eigen::Vector3d::UnitZ(), prism_joint_ori_in_ref_rb);
707 Eigen::Vector3d coplanar_xy_orthogonal_to_joint_ori = prism_joint_ori_in_ref_rb.cross(Eigen::Vector3d::UnitZ());
709 coplanar_xy_orthogonal_to_joint_ori.normalize();
713 Eigen::Vector3d y_pos = prism_joint_ori_in_ref_rb.cross(coplanar_xy_orthogonal_to_joint_ori);
716 Eigen::Matrix3d rotation_pos;
717 rotation_pos << coplanar_xy_orthogonal_to_joint_ori.x(),y_pos.x(),prism_joint_ori_in_ref_rb.x(),
718 coplanar_xy_orthogonal_to_joint_ori.y(),y_pos.y(),prism_joint_ori_in_ref_rb.y(),
719 coplanar_xy_orthogonal_to_joint_ori.z(),y_pos.z(),prism_joint_ori_in_ref_rb.z();
722 Eigen::Quaterniond ori_quat_final(rotation_pos);
724 Eigen::Quaterniond ori_quat_final_ellipse(ori_quat_final.toRotationMatrix()*init_rot.toRotationMatrix());
726 prism_axis_unc_cone1.pose.orientation.x = ori_quat_final_ellipse.x();
727 prism_axis_unc_cone1.pose.orientation.y = ori_quat_final_ellipse.y();
728 prism_axis_unc_cone1.pose.orientation.z = ori_quat_final_ellipse.z();
729 prism_axis_unc_cone1.pose.orientation.w = ori_quat_final_ellipse.w();
730 prism_axis_unc_cone1.ns =
"kinematic_structure_uncertainty";
731 prism_axis_unc_cone1.id = 3 * this->
_joint_id + 1;
732 prism_axis_unc_cone1.color.a = 0.4;
733 prism_axis_unc_cone1.color.r = 0.0;
734 prism_axis_unc_cone1.color.g = 1.0;
735 prism_axis_unc_cone1.color.b = 0.0;
742 prism_axis_unc_cone1.scale.x = major_axis_length / (M_PI / 6.0);
743 prism_axis_unc_cone1.scale.y = minor_axis_length / (M_PI / 6.0);
744 prism_axis_unc_cone1.scale.z = 1.;
746 prismatic_markers.push_back(prism_axis_unc_cone1);
750 Eigen::Vector3d prism_joint_ori_in_ref_rb_neg = -prism_joint_ori_in_ref_rb;
751 Eigen::Quaterniond ori_quat_neg;
752 ori_quat_neg.setFromTwoVectors(Eigen::Vector3d::UnitZ(), prism_joint_ori_in_ref_rb_neg);
756 Eigen::Vector3d coplanar_xy_orthogonal_to_joint_ori_neg = prism_joint_ori_in_ref_rb_neg.cross(Eigen::Vector3d::UnitZ());
758 coplanar_xy_orthogonal_to_joint_ori_neg.normalize();
762 Eigen::Vector3d y_neg = prism_joint_ori_in_ref_rb_neg.cross(coplanar_xy_orthogonal_to_joint_ori_neg);
765 Eigen::Matrix3d rotation_neg;
766 rotation_neg << coplanar_xy_orthogonal_to_joint_ori_neg.x(),y_neg.x(),prism_joint_ori_in_ref_rb_neg.x(),
767 coplanar_xy_orthogonal_to_joint_ori_neg.y(),y_neg.y(),prism_joint_ori_in_ref_rb_neg.y(),
768 coplanar_xy_orthogonal_to_joint_ori_neg.z(),y_neg.z(),prism_joint_ori_in_ref_rb_neg.z();
771 Eigen::Quaterniond ori_quat_neg_final(rotation_neg);
774 Eigen::AngleAxisd init_rot_neg(alpha, Eigen::Vector3d::UnitZ());
775 Eigen::Quaterniond ori_quat_neg_final_ellipse(ori_quat_neg_final.toRotationMatrix()*init_rot_neg.toRotationMatrix());
777 prism_axis_unc_cone1.pose.orientation.x = ori_quat_neg_final_ellipse.x();
778 prism_axis_unc_cone1.pose.orientation.y = ori_quat_neg_final_ellipse.y();
779 prism_axis_unc_cone1.pose.orientation.z = ori_quat_neg_final_ellipse.z();
780 prism_axis_unc_cone1.pose.orientation.w = ori_quat_neg_final_ellipse.w();
781 prism_axis_unc_cone1.scale.x = major_axis_length / (M_PI / 6.0);
782 prism_axis_unc_cone1.scale.y = minor_axis_length / (M_PI / 6.0);
783 prism_axis_unc_cone1.scale.z = 1.;
784 prism_axis_unc_cone1.id =3 * this->
_joint_id + 2;
786 prismatic_markers.push_back(prism_axis_unc_cone1);
788 return prismatic_markers;
798 return std::string(
"PrismaticJointFilter");
void _initializeMeasurementModel()
Eigen::Twistd _rrb_current_pose_in_sf
virtual void correctState()
#define ROS_DEBUG_STREAM_NAMED(name, args)
virtual void estimateMeasurementHistoryLikelihood()
Eigen::Twistd _predicted_delta_pose_in_rrbf
EIGEN_MAKE_ALIGNED_OPERATOR_NEW PrismaticJointFilter()
INLINE Rall1d< T, V, S > log(const Rall1d< T, V, S > &arg)
Eigen::Matrix< double, 6, 6 > _current_delta_pose_cov_in_rrbf
virtual void initialize()
double _joint_orientation_phi
double _uncertainty_joint_velocity
Eigen::Twistd _srb_current_pose_in_rrbf
void TransformMatrix2Twist(const Eigen::Matrix4d &transformation_matrix, Eigen::Twistd &twist)
Eigen::Twistd _srb_initial_pose_in_rrbf
virtual void setCovarianceDeltaMeasurementLinear(double delta_meas)
virtual std::vector< visualization_msgs::Marker > getJointMarkersInRRBFrame() const
int _likelihood_sample_num
#define ROS_INFO_STREAM_NAMED(name, args)
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
Eigen::Twistd _srb_predicted_pose_in_rrbf
Eigen::Matrix2d _uncertainty_joint_orientation_phitheta
virtual geometry_msgs::TwistWithCovariance getPredictedSRBPoseWithCovInSensorFrame()
We use the kinematic structure to predict the next pose-twist of the second rigid body of the joint (...
virtual void estimateUnnormalizedModelProbability()
double _uncertainty_joint_state
virtual geometry_msgs::TwistWithCovariance getPredictedSRBVelocityWithCovInSensorFrame()
Generate a prediction about the velocity of the second rigid body (SRB) and its covariance using the ...
void Twist2TransformMatrix(const Eigen::Twistd &transformation_twist, Eigen::Matrix4d &matrix)
#define JOINT_VALUE_TEXT_SIZE
Eigen::Vector3d _joint_orientation
virtual Eigen::Vector3d getJointPositionInRRBFrame() const
virtual void initialize()
double _sigma_delta_meas_uncertainty_linear
BFL::NonLinearPrismaticMeasurementPdf * _meas_PDF
double _measurements_likelihood
double _unnormalized_model_probability
virtual ~PrismaticJointFilter()
virtual void predictState(double time_interval_ns)
First step when updating the filter. The next state is predicted from current state and system model...
Eigen::Vector3d _joint_position
BFL::LinearAnalyticConditionalGaussian * _sys_PDF
BFL::AnalyticMeasurementModelGaussianUncertainty * _meas_MODEL
INLINE Rall1d< T, V, S > sqrt(const Rall1d< T, V, S > &arg)
BFL::ExtendedKalmanFilter * _ekf
double _joint_orientation_theta
virtual std::string getJointFilterTypeStr() const
#define JOINT_AXIS_AND_VARIABLE_MARKER_RADIUS
virtual JointFilterType getJointFilterType() const
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 predictMeasurement()
INLINE Rall1d< T, V, S > acos(const Rall1d< T, V, S > &x)
BFL::LinearAnalyticSystemModelGaussianUncertainty * _sys_MODEL
JointCombinedFilterId _joint_id
double _sigma_sys_noise_theta
#define JOINT_AXIS_MARKER_RADIUS
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
double _sigma_sys_noise_jv
INLINE Rall1d< T, V, S > cos(const Rall1d< T, V, S > &arg)
void _initializeSystemModel()
Eigen::Vector3d _srb_centroid_in_sf
double _sigma_sys_noise_phi
virtual geometry_msgs::TwistWithCovariance getPredictedSRBDeltaPoseWithCovInSensorFrame()
Generate a prediction about the change in pose of the second rigid body (SRB) and its covariance usin...
INLINE Rall1d< T, V, S > sin(const Rall1d< T, V, S > &arg)