Go to the documentation of this file.00001
00008 #ifndef MOTION_LIMITER_H
00009 #define MOTION_LIMITER_H
00010
00011 #include <vector>
00012 #include <map>
00013
00014 #include <boost/shared_ptr.hpp>
00015
00016 #include <stdexcept>
00017 #include "nasa_common_logging/Logger.h"
00018
00023 class JointMotionLimitHelper
00024 {
00025 public:
00026 JointMotionLimitHelper(bool positiveOnly_in = true);
00027 JointMotionLimitHelper(const JointMotionLimitHelper& tocopy);
00028 virtual ~JointMotionLimitHelper();
00029
00036 void setLimits(const std::vector<double>& limArray_in);
00037
00043 void setLimit(double lim);
00044
00049 double getLimit(unsigned int index) const;
00050 inline const std::vector<double>& getLimits() const {return limArray;}
00051 inline bool getPositiveOnly() const {return positiveOnly;}
00052
00053 private:
00054 std::vector<double> limArray;
00055 bool positiveOnly;
00056 };
00057
00062 class JointVelocityLimiter
00063 {
00064 public:
00065 JointVelocityLimiter() {}
00066 JointVelocityLimiter(const JointVelocityLimiter& tocopy);
00067 virtual ~JointVelocityLimiter() {}
00068
00069 inline void setVelocityLimits(const std::vector<double>& limArray_in) {velMotionLimiter.setLimits(limArray_in);}
00070 inline void setVelocityLimit(double lim) {velMotionLimiter.setLimit(lim);}
00071 inline double getVelocityLimit(unsigned int index) const {return velMotionLimiter.getLimit(index);}
00072 inline const std::vector<double>& getVelocityLimits() const {return velMotionLimiter.getLimits();}
00073
00074 private:
00075 JointMotionLimitHelper velMotionLimiter;
00076 };
00077
00082 class JointPositionLimiter : public JointVelocityLimiter
00083 {
00084 public:
00085 JointPositionLimiter() : maxLimiter(false), minLimiter(false) {}
00086 JointPositionLimiter(const JointPositionLimiter& tocopy);
00087 virtual ~JointPositionLimiter() {}
00088
00089 void setLimits(const std::vector<double>& minLimits, const std::vector<double>& maxLimits);
00090 inline double getMaxPosition(unsigned int index) const {return maxLimiter.getLimit(index);}
00091 inline const std::vector<double>& getMaxPositions() const {return maxLimiter.getLimits();}
00092 inline double getMinPosition(unsigned int index) const {return minLimiter.getLimit(index);}
00093 inline const std::vector<double>& getMinPositions() const {return minLimiter.getLimits();}
00094
00095 private:
00096 JointMotionLimitHelper maxLimiter;
00097 JointMotionLimitHelper minLimiter;
00098 };
00099
00100 class JointMotionLimiter : public JointVelocityLimiter
00101 {
00102 public:
00103 JointMotionLimiter() {}
00104 JointMotionLimiter(const JointMotionLimiter& tocopy);
00105 virtual ~JointMotionLimiter() {}
00106
00107 void setLimits(const std::vector<double>& velLimits, const std::vector<double>& accLimits);
00108
00109 inline void setAccelerationLimit(double lim) {accMotionLimiter.setLimit(lim);}
00110 inline double getAccelerationLimit(unsigned int index) const {return accMotionLimiter.getLimit(index);}
00111 inline const std::vector<double>& getAccelerationLimits() const {return accMotionLimiter.getLimits();}
00112
00113 private:
00114 JointMotionLimitHelper accMotionLimiter;
00115
00116
00117 inline void setVelocityLimits(const std::vector<double>& limArray_in) {JointVelocityLimiter::setVelocityLimits(limArray_in);}
00118 };
00119
00124 class JointNamePositionLimiter
00125 {
00126 public:
00127 JointNamePositionLimiter() {}
00128 virtual ~JointNamePositionLimiter() {}
00129
00130 void setJointPositionLimiter(boost::shared_ptr<JointPositionLimiter> positionLimiter_in)
00131 {
00132 positionLimiter = positionLimiter_in;
00133 }
00134
00142 void setLimits(const std::vector<std::string>& jointNames, const std::vector<double>& minPositionArray_in, const std::vector<double>& maxPositionArray_in, const std::vector<double>& maxVelocityArray_in);
00143
00150 void reorderLimits(const std::vector<std::string>& jointNames);
00151
00152 inline bool hasLimits(const std::string& jointName) const {return jointLimitIndices.find(jointName) != jointLimitIndices.end();}
00153 double getMinPosition(const std::string& jointName) const;
00154 double getMaxPosition(const std::string& jointName) const;
00155 bool getMaxVelocity(const std::string& jointName, double& lim) const;
00156 bool getLimits(const std::string& jointName, std::pair<double, double>& limits) const;
00157
00158 bool limit(const std::string& jointName, double& value) const;
00159 bool limitVelocity(const std::string& jointName, double& value) const;
00160
00161 private:
00162 JointNamePositionLimiter(const JointNamePositionLimiter&) {}
00163 boost::shared_ptr<JointPositionLimiter> positionLimiter;
00164
00165 std::map<std::string, unsigned int> jointLimitIndices;
00166
00167 std::vector<std::string> joints;
00168 };
00169
00174 class JointNameMotionLimiter
00175 {
00176 public:
00177 JointNameMotionLimiter() {}
00178 virtual ~JointNameMotionLimiter() {}
00179
00180 void setJointMotionLimiter(boost::shared_ptr<JointMotionLimiter> motionLimiter_in)
00181 {
00182 motionLimiter = motionLimiter_in;
00183 }
00184
00192 void setLimits(const std::vector<std::string>& jointNames, const std::vector<double>& velLimitArray_in, const std::vector<double>& accLimitArray_in);
00199 void setLimits(const std::vector<std::string>& jointNames, double velLim, double accLim);
00200
00207 void reorderLimits(const std::vector<std::string>& jointNames);
00208
00209 double getVelocityLimit(const std::string& jointName) const;
00210 double getAccelerationLimit(const std::string& jointName) const;
00211 void getAllLimits(std::vector<std::string>& jointNames_out, std::vector<double>& velLimits_out, std::vector<double>& accLimits_out);
00212
00213 private:
00214 JointNameMotionLimiter(const JointNamePositionLimiter&) {}
00215 boost::shared_ptr<JointMotionLimiter> motionLimiter;
00216
00217 std::map<std::string, unsigned int> jointLimitIndices;
00218
00219 std::vector<std::string> joints;
00220 std::vector<double> velLimits;
00221 std::vector<double> accLimits;
00222
00223 std::map<std::string, std::pair<double, double> > jointNameLimitMap;
00224 };
00225
00230 class CartesianMotionLimitHelper
00231 {
00232 public:
00233 CartesianMotionLimitHelper();
00234 CartesianMotionLimitHelper(const CartesianMotionLimitHelper& tocopy);
00235 virtual ~CartesianMotionLimitHelper();
00236
00244 void setLimits(double linLimit_in = .10, double rotLimit_in = 0.50);
00245
00246 inline double getLinearLimit() const {return linLimit;}
00247 inline double getRotationalLimit() const {return rotLimit;}
00248
00249 private:
00250 double linLimit;
00251 double rotLimit;
00252 };
00253
00258 class CartesianVelocityLimiter
00259 {
00260 public:
00261 CartesianVelocityLimiter() {}
00262 CartesianVelocityLimiter(const CartesianVelocityLimiter& tocopy);
00263 virtual ~CartesianVelocityLimiter() {}
00264 inline void setVelocityLimits(double linLimit_in, double rotLimit_in) {motionLimiter.setLimits(linLimit_in, rotLimit_in);}
00265 inline double getLinearVelocityLimit() const {return motionLimiter.getLinearLimit();}
00266 inline double getRotationalVelocityLimit() const {return motionLimiter.getRotationalLimit();}
00267
00268 private:
00269 CartesianMotionLimitHelper motionLimiter;
00270 };
00271
00272 class CartesianMotionLimiter : public CartesianVelocityLimiter
00273 {
00274 public:
00275 CartesianMotionLimiter() {}
00276 CartesianMotionLimiter(const CartesianMotionLimiter& tocopy);
00277 virtual ~CartesianMotionLimiter() {}
00278
00279 inline void setAccelerationLimits(double linLimit_in, double rotLimit_in) {accMotionLimiter.setLimits(linLimit_in, rotLimit_in);}
00280 inline double getLinearAccelerationLimit() const {return accMotionLimiter.getLinearLimit();}
00281 inline double getRotationalAccelerationLimit() const {return accMotionLimiter.getRotationalLimit();}
00282
00283 private:
00284 CartesianMotionLimitHelper accMotionLimiter;
00285 };
00286
00287 #endif