Go to the documentation of this file.00001
00027 #ifndef INCLUDE_STOMP_MOVEIT_UTILS_POLYNOMIAL_H_
00028 #define INCLUDE_STOMP_MOVEIT_UTILS_POLYNOMIAL_H_
00029
00030 #include <stomp_core/utils.h>
00031 #include <moveit/robot_model/robot_model.h>
00032 #include <Eigen/Core>
00033
00037 namespace stomp_moveit
00038 {
00039
00043 namespace utils
00044 {
00045
00049 namespace polynomial
00050 {
00052 struct PolyFitRequest
00053 {
00054 int d;
00055 Eigen::Matrix<double, 2, Eigen::Dynamic> xy;
00056 Eigen::Matrix<double, 2, Eigen::Dynamic> xyfp;
00057 Eigen::Matrix<double, 2, Eigen::Dynamic> xyfs;
00058 Eigen::VectorXd output_domain;
00064 bool hasConstraints() const
00065 {
00066 return ((xyfp.cols() > 0) || (xyfs.cols() > 0));
00067 }
00068
00073 bool hasPositionConstraints() const
00074 {
00075 return (xyfp.cols() > 0);
00076 }
00077
00082 bool hasSlopeConstraints() const
00083 {
00084 return (xyfs.cols() > 0);
00085 }
00086
00087 };
00088
00090 struct PolyFitResults
00091 {
00092 Eigen::VectorXd p;
00093 Eigen::VectorXd x;
00094 Eigen::VectorXd y;
00095 bool successful;
00096 };
00097
00098
00104 PolyFitResults polyFit(const PolyFitRequest &request);
00105
00118 void generateMinimumDomainValues(const std::vector<const moveit::core::JointModel*> joint_models, const Eigen::MatrixXd ¶meters,
00119 Eigen::VectorXd &domain_values);
00120
00128 void fillVandermondeMatrix(const Eigen::ArrayXd &domain_vals, const int &order, Eigen::MatrixXd &v);
00129
00140 bool applyPolynomialSmoothing(moveit::core::RobotModelConstPtr robot_model, const std::string& group_name, Eigen::MatrixXd& parameters,
00141 int poly_order = 5, double joint_limit_margin = 1e-5);
00142
00143 }
00144 }
00145 }
00146
00147
00148 #endif