00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00037 #ifndef CHOMP_COST_H_
00038 #define CHOMP_COST_H_
00039
00040 #include <Eigen/Core>
00041 #include <chomp_motion_planner/chomp_trajectory.h>
00042 #include <vector>
00043
00044 namespace chomp
00045 {
00046
00050 class ChompCost
00051 {
00052 public:
00053 ChompCost(const ChompTrajectory& trajectory, int joint_number, const std::vector<double>& derivative_costs, double ridge_factor=0.0);
00054 virtual ~ChompCost();
00055
00056 template<typename Derived>
00057 void getDerivative(Eigen::MatrixXd::ColXpr joint_trajectory, Eigen::MatrixBase<Derived>& derivative) const;
00058
00059 const Eigen::MatrixXd& getQuadraticCostInverse() const;
00060
00061 const Eigen::MatrixXd& getQuadraticCost() const;
00062
00063 double getCost(Eigen::MatrixXd::ColXpr joint_trajectory) const;
00064
00065 double getMaxQuadCostInvValue() const;
00066
00067 void scale(double scale);
00068
00069 private:
00070 Eigen::MatrixXd quad_cost_full_;
00071 Eigen::MatrixXd quad_cost_;
00072
00073 Eigen::MatrixXd quad_cost_inv_;
00074
00075 Eigen::MatrixXd getDiffMatrix(int size, const double* diff_rule) const;
00076
00077 };
00078
00079 template<typename Derived>
00080 void ChompCost::getDerivative(Eigen::MatrixXd::ColXpr joint_trajectory, Eigen::MatrixBase<Derived>& derivative) const
00081 {
00082 derivative = (quad_cost_full_ * (2.0 * joint_trajectory));
00083 }
00084
00085 inline const Eigen::MatrixXd& ChompCost::getQuadraticCostInverse() const
00086 {
00087 return quad_cost_inv_;
00088 }
00089
00090 inline const Eigen::MatrixXd& ChompCost::getQuadraticCost() const
00091 {
00092 return quad_cost_;
00093 }
00094
00095 inline double ChompCost::getCost(Eigen::MatrixXd::ColXpr joint_trajectory) const
00096 {
00097 return joint_trajectory.dot(quad_cost_full_ * joint_trajectory);
00098 }
00099
00100 }
00101
00102 #endif