angularmotor.h

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2005 by Robot Group Leipzig                             *
00003  *    martius@informatik.uni-leipzig.de                                    *
00004  *    fhesse@informatik.uni-leipzig.de                                     *
00005  *    der@informatik.uni-leipzig.de                                        *
00006  *                                                                         *
00007  *   This program is free software; you can redistribute it and/or modify  *
00008  *   it under the terms of the GNU General Public License as published by  *
00009  *   the Free Software Foundation; either version 2 of the License, or     *
00010  *   (at your option) any later version.                                   *
00011  *                                                                         *
00012  *   This program is distributed in the hope that it will be useful,       *
00013  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00014  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00015  *   GNU General Public License for more details.                          *
00016  *                                                                         *
00017  *   You should have received a copy of the GNU General Public License     *
00018  *   along with this program; if not, write to the                         *
00019  *   Free Software Foundation, Inc.,                                       *
00020  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00021  *                                                                         *
00022  *   $Log: angularmotor.h,v $
00023  *   Revision 1.1.2.6  2006/03/30 12:34:49  martius
00024  *   documentation updated
00025  *
00026  *   Revision 1.1.2.5  2006/02/23 18:05:30  martius
00027  *   setPower (on all axis the same)
00028  *
00029  *   Revision 1.1.2.4  2006/02/07 15:51:56  martius
00030  *   axis, setpower
00031  *
00032  *   Revision 1.1.2.3  2006/01/31 15:43:47  martius
00033  *   *** empty log message ***
00034  *
00035  *   Revision 1.1.2.2  2006/01/03 10:20:16  fhesse
00036  *   methods of AngularMotor1Axis public now
00037  *
00038  *   Revision 1.1.2.1  2005/12/21 15:38:12  martius
00039  *   angular motors nicely wrapped
00040  *
00041  *                                                                 *
00042  ***************************************************************************/
00043 #ifndef __ANGULARMOTOR_H
00044 #define __ANGULARMOTOR_H
00045 
00046 #include <list>
00047 #include "joint.h"
00048 
00049 namespace lpzrobots {
00050 
00051   /** Abstract angular motor class. This is a wrapper for ODE's AMotor.
00052    */
00053   class AngularMotor {
00054   public:
00055     /// creates a AMotor attached to the same bodies as the given joint.
00056     AngularMotor(const OdeHandle& odeHandle, Joint* joint);
00057 
00058     virtual ~AngularMotor (){}
00059 
00060     /// returns the number of Axis of this Motor
00061     virtual int getNumberOfAxes() = 0;
00062 
00063     /** sets the desired speed of the motor at the given axis.       
00064         @param velocity Desired motor velocity (this will be an angular or linear velocity).
00065     */
00066     virtual void set(int axisNumber, double velocity) = 0;
00067     /** returns the speed (PositionRate) at the given axis, or zero if the axis is out of range*/
00068     virtual double get(int axisNumber) = 0;
00069 
00070     /**  sets the maximal force the motor has
00071      */
00072     virtual void setPower(double power) = 0;
00073 
00074 
00075     /** sets the desired speed of all motor.
00076         @param velocities double array with desired velocities
00077         @param len length of the given array
00078         @return number actually returned velocities
00079     */
00080     virtual int set(const double* velocities, int len);
00081     /** returns the speed (PositionRate) of all axis
00082         @param velocities double array to fill in the velocities
00083         @param len length of the given array
00084         @return number actually returned velocities
00085     */
00086     virtual int get(double* velocities, int len);
00087   
00088   protected:
00089     dJointID motor;  
00090   };
00091 
00092 
00093   /// Angular motor for OneAxisJoints
00094   class AngularMotor1Axis : public AngularMotor {
00095   public:
00096     /** Constuct a motor attached to a OneAxisJoint. It will its axis of course.
00097         @param power The maximum force or torque that the motor will use to achieve the desired velocity. 
00098         This must always be greater than or equal to zero. 
00099         Setting this to zero (the default value) turns off the motor.      
00100     */
00101     AngularMotor1Axis(const OdeHandle& odeHandle, OneAxisJoint* joint, double power);
00102     virtual ~AngularMotor1Axis() {}
00103     
00104     /// returns the number of Axis of this Motor
00105     virtual int getNumberOfAxes() { return 1; };
00106 
00107     /** sets the desired speed of the motor at the given axis.       
00108         @param axisNumber is ignored because have only one axis
00109         @param velocity Desired motor velocity (this will be an angular or linear velocity).
00110     */
00111     virtual void set(int axisNumber, double velocity);
00112     /** returns the speed (PositionRate) at the given axis, or zero if the axis is out of range
00113         @param axisNumber is ignored because have only one axis
00114      */
00115     virtual double get(int axisNumber) ;    
00116 
00117     /**  sets the maximal force the motor has
00118      */
00119     virtual void setPower(double power);
00120     
00121   protected:
00122     OneAxisJoint* joint;  
00123   };
00124 
00125   /// Angular motor for TwoAxisJoints
00126   class AngularMotor2Axis : public AngularMotor {
00127   public:
00128     /** Constuct a motor attached to a TwoAxisJoint. It will its two axis of course.
00129         @param power The maximum force or torque that the motor will use to achieve the desired velocity. 
00130         This must always be greater than or equal to zero. 
00131         Setting this to zero (the default value) turns off the motor.      
00132     */
00133     AngularMotor2Axis(const OdeHandle& odeHandle, TwoAxisJoint* joint, double power1, double power2);
00134     virtual ~AngularMotor2Axis() {}
00135 
00136     /// returns the number of Axis of this Motor
00137     virtual int getNumberOfAxes() { return 2; };
00138 
00139     /** sets the desired speed of the motor at the given axis.       
00140         @param axisNumber either 0 or 1
00141         @param velocity Desired motor velocity (this will be an angular or linear velocity).
00142     */
00143     virtual void set(int axisNumber, double velocity);
00144     /** returns the speed (PositionRate) at the given axis, or zero if the axis is out of range*/
00145     virtual double get(int axisNumber) ;    
00146     
00147     /**  sets the maximal force the motor has
00148      */
00149     virtual void setPower(double power);
00150 
00151   protected:
00152     TwoAxisJoint* joint;      
00153   };
00154 
00155 
00156   /// Angular motor for Ball Joints with Euler control
00157   class AngularMotor3AxisEuler : public AngularMotor {
00158   public:
00159     /** Constuct a motor attached to a BallJoint. 
00160         @param axis1 axis relative to body 1
00161         @param axis3 axis relative to body 2 (must be perpendicular to axis1 
00162         (the axis 2 is calculated automatically)        
00163         @param power The maximum force or torque that the motor will use to achieve the desired velocity. 
00164         This must always be greater than or equal to zero. 
00165         Setting this to zero (the default value) turns off the motor.      
00166     */
00167     AngularMotor3AxisEuler(const OdeHandle& odeHandle, BallJoint* joint, 
00168                            const Axis& axis1, const Axis& axis3, double power);
00169     
00170     /// returns the number of Axis of this Motor
00171     virtual int getNumberOfAxes() { return 3; };
00172 
00173     /** sets the desired speed of the motor at the given axis.       
00174         @param axisNumber either 0 or 1
00175         @param velocity Desired motor velocity (this will be an angular or linear velocity).
00176     */
00177     virtual void set(int axisNumber, double velocity);
00178     /** returns the speed (PositionRate) at the given axis, or zero if the axis is out of range*/
00179     virtual double get(int axisNumber) ;    
00180     
00181     /**  sets the maximal force the motor has
00182      */
00183     virtual void setPower(double power);
00184 
00185   protected:
00186     BallJoint* joint;      
00187   };
00188 
00189   /// Angular motor for arbitrary Joints with custom axis (up to 3)
00190   class AngularMotorNAxis : public AngularMotor {
00191   public:
00192     /** Constuct a motor attached to any Joint (not Sliders!). 
00193         The axis have to be provided by the user.       
00194         @param axis list of axis vector and power If empty then it motor is disabled. 
00195         Power is the maximum force or torque that the motor will use to achieve the desired velocity. 
00196         This must always be greater than or equal to zero. 
00197         Setting this to zero (the default value) turns off the motor.      
00198     */
00199     AngularMotorNAxis(const OdeHandle& odeHandle, Joint* joint, 
00200                       std::list<std::pair<double, Axis > > axis);
00201 
00202     virtual ~AngularMotorNAxis() {}
00203     
00204     /// returns the number of Axis of this Motor
00205     virtual int getNumberOfAxes();
00206 
00207     /** sets the desired speed of the motor at the given axis.       
00208         @param velocity Desired motor velocity (this will be an angular or linear velocity).
00209     */
00210     virtual void set(int axisNumber, double velocity);
00211     /** returns the speed (PositionRate) at the given axis, or zero if the axis is out of range
00212         The problem is, that we don't have actual information available. 
00213         So we return the last set position!.
00214      */
00215     virtual double get(int axisNumber) ;    
00216 
00217     /**
00218        sets the maximal force the motor has
00219      */
00220     virtual void setPower(double power);
00221     
00222   protected:
00223     Joint* joint; 
00224   };
00225 
00226 
00227 
00228 }
00229 #endif

Generated on Tue Apr 4 19:05:03 2006 for Robotsystem from Robot Group Leipzig by  doxygen 1.4.5