Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifndef SMURFTRAJECTORYTRACKER_HPP_
00009 #define SMURFTRAJECTORYTRACKER_HPP_
00010
00011 #include <telekyb_defines/telekyb_defines.hpp>
00012
00013
00014
00015 #include <tk_trajctrl/TrajectoryTracker.hpp>
00016
00017
00018
00019 #include <pluginlib/class_loader.h>
00020
00021
00022 #include <tk_param_estimator/MassEstimator.hpp>
00023 #include <tk_param_estimator/InertiaMatrixEstimator.hpp>
00024
00025
00026 #include <ros/ros.h>
00027
00028 #include <telekyb_base/Options.hpp>
00029 #include <telekyb_base/Time.hpp>
00030
00031
00032 #include <boost/thread/mutex.hpp>
00033
00034
00035 TELEKYB_ENUM_VALUES(SaturationType, const char*,
00036 (none)("No command saturation applied")
00037 (uniform)("Uniform command saturation")
00038 (qp)("Quadratic programming command saturation")
00039 )
00040
00041
00042 namespace TELEKYB_NAMESPACE {
00043
00044 class SMURFTrajectoryTrackerOptions : public OptionContainer {
00045 public:
00046 Option<std::string>* tCommandTopic;
00047
00048 Option<SaturationTypeBaseEnum<const char*>::Type>* tSaturationType;
00049
00050 Option<std::string>* tMassPluginLookupName;
00051 Option<std::string>* tInertiaPluginLookupName;
00052
00053 Option<Eigen::Vector3d>* tPositionGain;
00054 Option<Eigen::Vector3d>* tVelocityGain;
00055 Option<Eigen::Vector3d>* tOrientationGain;
00056 Option<Eigen::Vector3d>* tAngVelGain;
00057 Option<Eigen::Vector3d>* tRotIntGain;
00058 Option<Eigen::Vector3d>* tSatRotInt;
00059 Option<Eigen::Vector3d>* tPosIntGain;
00060 Option<Eigen::Vector3d>* tSatPosInt;
00061
00062 Option<double>* tMinThrust;
00063 Option<double>* tMinForce;
00064 Option<double>* tMaxForce;
00065
00066 Option<double>* tArmLength;
00067 Option<double>* tCParam;
00068
00069 SMURFTrajectoryTrackerOptions();
00070 };
00071
00072 class SMURFTrajectoryTracker : public TrajectoryTracker {
00073 private:
00074 SMURFTrajectoryTrackerOptions options;
00075
00077
00078 inline
00079 Eigen::Matrix3d hat(const Eigen::Vector3d& w)
00080 {
00081 Eigen::Matrix3d Sw;
00082 Sw << 0.0, -w(2), w(1),
00083 w(2), 0.0, -w(0),
00084 -w(1), w(0), 0.0;
00085 return Sw;
00086 }
00087
00089
00090 inline
00091 Eigen::Vector3d vee(const Eigen::Matrix3d& S)
00092 {
00093 return Eigen::Vector3d(S(2,1), S(0,2), S(1,0));
00094 }
00095
00096
00097 Eigen::Matrix4d invA;
00098
00099 void saturateUniform(Eigen::Vector4d& force, double mass);
00100 void saturateQP(Eigen::Vector4d& force, double mass){};
00101
00102 protected:
00103
00104
00105 Option<bool>* tDoMassEstimation;
00106 Option<bool>* tDoInertiaMatrixEstimation;
00107
00108
00109 pluginlib::ClassLoader<MassEstimator> meLoader;
00110 pluginlib::ClassLoader<InertiaMatrixEstimator> imeLoader;
00111
00112
00113 MassEstimator* massEstimator;
00114 InertiaMatrixEstimator* inertiaEstimator;
00115
00116 double currentMass;
00117 Eigen::Matrix3d currentInertiaMatrix;
00118
00119 boost::mutex refTrajectoryMutex;
00120 TKTrajectory refTrajectory;
00121
00122 ros::NodeHandle nodeHandle;
00123 ros::NodeHandle commandNodeHandle;
00124 ros::Publisher tTcCommandsPub;
00125
00126 Eigen::Vector3d rotIntState;
00127 Eigen::Vector3d posIntState;
00128 ros::Publisher tIntPub;
00129 Timer integralTimer;
00130 bool firstExecution;
00131
00132 public:
00133
00134 SMURFTrajectoryTracker();
00135 virtual ~SMURFTrajectoryTracker();
00136
00137
00138 void initialize();
00139 void destroy();
00140 std::string getName() const;
00141
00142
00143 void trajectoryCB(const TKTrajectory& trajectory);
00144 void stateCB(const TKState& state);
00145
00146 void run(const TKTrajectory& input, const TKState& currentState, const double mass, const Eigen::Matrix3d& inertia , Eigen::Vector4d& inputs);
00147
00148 };
00149
00150 }
00151
00152 #endif