MotionLimiter.h
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     // override with private so this can't be called; this helps guarantee vel/acc limits maintain the appropriate lengths
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     // store index into limits array
00165     std::map<std::string, unsigned int> jointLimitIndices;
00166     // store joints vector for setLimits to save cycles if it hasn't changed
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     // store index into limits array
00217     std::map<std::string, unsigned int> jointLimitIndices;
00218     // store joints vector for setLimits to save cycles if it hasn't changed
00219     std::vector<std::string> joints;
00220     std::vector<double> velLimits;
00221     std::vector<double> accLimits;
00222     // store joints into map
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


robodyn_controllers
Author(s):
autogenerated on Sat Jun 8 2019 20:20:53