component.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  *    marcel@informatik.uni-leipzig.de                                     *
00007  *                                                                         *
00008  *   This program is free software; you can redistribute it and/or modify  *
00009  *   it under the terms of the GNU General Public License as published by  *
00010  *   the Free Software Foundation; either version 2 of the License, or     *
00011  *   (at your option) any later version.                                   *
00012  *                                                                         *
00013  *   This program is distributed in the hope that it will be useful,       *
00014  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00015  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00016  *   GNU General Public License for more details.                          *
00017  *                                                                         *
00018  *   You should have received a copy of the GNU General Public License     *
00019  *   along with this program; if not, write to the                         *
00020  *   Free Software Foundation, Inc.,                                       *
00021  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00022  ***************************************************************************/
00023 
00024 
00025 #include <math.h>
00026 #include <ode/ode.h>
00027 #include <typeinfo>
00028 
00029 #include <vector>
00030 #include <list>
00031 
00032 
00033 #include "oderobot.h"
00034 #include "joint.h"
00035 
00036 
00037 
00038 #ifndef component_h
00039 #define component_h
00040 
00041 
00042 namespace lpzrobots
00043 {
00044     typedef struct
00045     {
00046         bool completesensormode; //if true, the controler of the Component also gets the sensor values of the robot of the component
00047         bool completemotormode; //if true, the controler of the component also controls the robot of the component
00048         double max_force;
00049         double speed;
00050     } ComponentConf;
00051 
00052 /**
00053  * Component
00054  *
00055  *
00056  */
00057 class Component : public OdeRobot
00058 {
00059  public:
00060     ComponentConf conf;
00061 
00062  public:
00063 
00064     typedef struct
00065     {
00066         Component* subcomponent;
00067         Joint* joint;
00068         bool softlink; //if true the connection ends the recursion, false = normal
00069         void *data;
00070     } componentConnection;
00071 
00072     std::vector <componentConnection> connection;
00073     std::vector <Component*> backwardreference;
00074 
00075 public: 
00076     Component* originComponent;
00077     Component* directOriginComponent;
00078 
00079  public:
00080 
00081     Component ( const OdeHandle &odeHandle, const OsgHandle &osgHandle, const ComponentConf& conf);
00082     
00083     ~Component ();
00084 
00085 static ComponentConf getDefaultConf()
00086 {
00087     ComponentConf conf;
00088     conf.completesensormode = true;
00089     conf.completemotormode = false;
00090     conf.max_force = 1;
00091     conf.speed = 1;
00092     return conf;
00093 }
00094 
00095  public:
00096 
00097 virtual int     getSensorNumber (); //returns number of sensors; recursivly adding of the number of sensors all subcomponents and the robots of all Subcomponents.
00098 
00099 virtual int     getMotorNumber (); //returns number of motors; recursivly adding of the number of sensors all subcomponents; at the moment only counts Hinge-, Slider-, Hinge2 and Universal-Joints; The Motor-Numbers of the robots of the Components is not counted.
00100 
00101 /**
00102  *Use this, to get all sensor values of all the joints of all subcomponents, and the sensors of all robots, belonging to all subcompionents.
00103  *The sensor values have the following sequence:
00104  *values of the component connecting joints, values of the robot of the component,
00105  *values of component connecting joints of the first subcomponent, values of the robot of the first subcomponent, ...
00106  *@robot sensor values of the connecting joints of this component and all subcomponents
00107  **/
00108 virtual int     getSensors (sensor *sensors, int sensornumber); //returns actual sensorvalues; only for the connecting joints
00109 
00110 
00111 /**
00112  *Sets the motor values for the joints connecting the component with its subcomponents, an recursivly the joints of all subComponents.
00113  *The motors of all robots of the subcomponents is not set.
00114  *@param 
00115  **/
00116 //virtual void  setMotors (const motor *motors, int motornumber); //sets actual motorcommands; only for the connecting joints
00117 virtual void    setMotors (const motor *motors, int motornumber); //sets actual motorcommands; only for the connecting joints
00118 /**
00119  *This sets all motors in the component structure to zero, starting from this component.
00120  **/
00121 virtual void    resetMotorsRecursive ( );
00122 
00123 //virtual int   getSensorNumber () = 0; //returns number of sensors; recursivly adding of the number of sensors all subcomponents and the robots of all Subcomponents.
00124 
00125 //virtual int   getMotorNumber () = 0; //returns number of motors; recursivly adding of the number of sensors all subcomponents; at the moment only counts Hinge-, Slider-, Hinge2 and Universal-Joints; The Motor-Numbers of the robots of the Components is not counted.
00126 
00127 virtual void    update () = 0;//update the OSG notes here; update of the underlying robot or Primitive and recursive update of all Components in the Connection-vector
00128 
00129 virtual void    place (const Pos &pos) = 0;//sets the vehicle to position pos - desired position of the robot; the first component is seen as center of the robot, on which the position pos refers; also recursive place of all subComponents
00130 
00131 virtual bool    collisionCallback (void *data, dGeomID o1, dGeomID o2);// checks for internal collisions and treats them.; should do nothing, because there should not be any ode-objects belonging to the component, which are not handled elsewhere....and what is with Primitives? are they automaticaly handled?
00132 
00133 virtual void    doInternalStuff (const GlobalData &globalData);// this function is called in each timestep.; maybee usefull
00134 
00135 // virtual void         setColor (const Color &col);    sets color of the robot; not nessecary
00136 
00137 virtual Position getPosition () const = 0; //returns position of the object; relates to the robot or Primitive belonging to the component
00138 
00139 //virtual Position getSpeed () const;//returns linear speed vector of the object; must be computed from all sub-robots
00140 
00141 //virtual matrix::Matrix        getOrientation () const;//returns the orientation of the object;
00142 
00143 
00144 /**
00145  *This is only a simple function, calculating the coordinates of the point exactly between two directly connected components.
00146  *@return Vector containing the Position
00147  *@param index number of the position
00148  **/
00149 virtual osg::Vec3 getPositionbetweenComponents ( Component* component );
00150 
00151 /**
00152  *return reference to the simple Primitive, or to the main Primitive of the robot assigend to the component. If nothimng is assigned, NULL is returned.
00153  **/
00154 virtual Primitive* getMainPrimitive () const = 0;
00155 
00156 /**
00157  *Gets the Number of subcomponents of this component.
00158  *@return Number of subcomponents
00159  **/
00160 virtual int getNumberSubcomponents ();
00161 
00162     
00163 /**
00164  *Gets the Number of all Subcomponents recursivly connected.
00165  *@return Number of subcomponents
00166  **/
00167 virtual int getNumberSubcomponentsAll ();
00168 
00169 /**
00170  *This method adds an existing Component as a subcomponent to this component
00171  *@param subcomponent to add
00172  *@param reference to external created joint, which connects both components
00173  **/
00174 virtual void addSubcomponent ( Component* newsubcomponent , Joint* newconnectingjoint , bool softlink );
00175 
00176 /**
00177  *This method removes an existing Component as a subcomponent of this component. This also removes all Subcomponents of the subcomponent.
00178  *@param subcomponent number to remove
00179  *@return reference to the removed subcomponent, so that it could be used to do other things
00180  **/
00181 virtual Component* removeSubcomponent ( int removedsubcomponentnumber );
00182 
00183 /**
00184  *This method removes an existing Component as a subcomponent of this component. This also removes all Subcomponents of the subcomponent.
00185  *@param subcomponent to remove
00186  *@return reference to the removed subcomponent, so that it could be used to do other things
00187  **/
00188 virtual Component* removeSubcomponent ( Component* removedsubcomponent );
00189 
00190 /**
00191  *This removes all subcomponents of THIS component, and all their subcomponents, till the whole structure is destroyed.
00192  **/
00193 //virtual void removeAllSubcomponentsRecursive ();
00194 
00195 /**
00196  *This updates the origin references within the component tree. If this is a removed subcomponent for examble, then parent should be this itself, so it is the top of the tree.
00197  *@param the component wich is the top of the tree structure, could also be this component itself
00198  **/
00199  virtual void updateOriginsRecursive ( Component* parent );
00200 
00201 /**
00202  *This removes all softlinks of the structure that has THIS as his origin.
00203  **/
00204  virtual void removeSoftlinksRecursive ();
00205 
00206 /**
00207  *This method looks if a special component is a subcomponent of this component. Only direct subcomponents are registrated.
00208  *Components which are only connected by softlink are a connection here as well.
00209  *@param the component, which could be a subcomponent of this component
00210  *@return true if it is a subcomponent, false if not
00211  **/
00212 virtual bool hasSubcomponent ( Component* subcomp );
00213 
00214 
00215 /**
00216  *This method looks if a special component is a subcomponent of this component and all its recursive subcomponents.
00217  *Softlinks count as connected, but are not recursivly counted.
00218  *@param the component, which could be a subcomponent
00219  *@return true if it is a subcomponent, false if not
00220  **/
00221 //virtual bool hasSubcomponentAll ( Component* subcomp );
00222 
00223 /**
00224  *This method looks if a special component somehow connected to this component.
00225  *@param the component, which could be connected
00226  *@return true if it is connected, false if not
00227  **/
00228 virtual bool isComponentConnected ( Component* connectedComp );
00229 
00230 /**
00231  *This garants an direct access to the connections between the components. Be carefull with using the given references. 
00232  *@param the number of the connection
00233  *@return the reference of connection element
00234  **/
00235 virtual componentConnection* getConnection ( int connectionnumber );
00236 
00237 /**
00238  *This returns the connection that connects to the target component.
00239  *@param the reference to the component which is subcomponent in the searched connection
00240  *@return the reference of connection element
00241  **/
00242 virtual componentConnection* getConnection ( Component* targetcomponent );
00243 
00244 /**
00245  *Sets the connection between the component and one of its subcomponents to be a softlink. That means that the recusion for this branch stops here.
00246  *@param number of the subcomponent in the subcomponent list of the component
00247  *@param true = connection becomes a softlink
00248  **/
00249 //virtual bool setSoftlink ( unsigned int position , bool state );
00250 
00251 /**
00252  *This divides the component structure, following this component into two seperate component structures
00253  *@param the relation between the two new component structures, if it is 1/2 the structures would have the same number of components or only have a difference by one if the whole structures has an odd number of components
00254  *@param maximum size of the whole Component structure of the first call of this function
00255  *@param the best component for dividing at the moment of calling this function; it should be NULL for the first call of the function, so that no best component is set up till now
00256  *@return the best Componet for dividing at the moment the function is finished
00257  */
00258 virtual Component* getBestDivideComponent ( double targetrelation , int maxsize , Component* currentBestDivideComponent );
00259      
00260 };
00261 
00262 
00263 }
00264 #endif

Generated on Mon Aug 7 16:40:14 2006 for Robotsystem of the Robot Group Leipzig by  doxygen 1.4.7