rec::robotino::api2 C++ interface
OmniDriveModel.h
1 // Copyright (C) 2004-2013, Robotics Equipment Corporation GmbH
2 
3 //Copyright (c) ...
4 //
5 //REC Robotics Equipment Corporation GmbH, Planegg, Germany. All rights reserved.
6 //Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
7 //1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
8 //2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
9 //
10 //THIS SOFTWARE IS PROVIDED BY REC ROBOTICS EQUIPMENT CORPORATION GMBH �AS IS� AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
11 //THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL REC ROBOTICS EQUIPMENT CORPORATION GMBH
12 //BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
13 //GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
14 //LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
15 //
16 //Copyright (c) ...
17 //
18 //REC Robotics Equipment Corporation GmbH, Planegg, Germany. Alle Rechte vorbehalten.
19 //Weiterverbreitung und Verwendung in nichtkompilierter oder kompilierter Form, mit oder ohne Ver�nderung, sind unter den folgenden Bedingungen zul�ssig:
20 //1) Weiterverbreitete nichtkompilierte Exemplare m�ssen das obige Copyright, diese Liste der Bedingungen und den folgenden Haftungsausschluss im Quelltext enthalten.
21 //2) Weiterverbreitete kompilierte Exemplare m�ssen das obige Copyright, diese Liste der Bedingungen und den folgenden Haftungsausschluss in der Dokumentation und/oder anderen Materialien, die mit dem Exemplar verbreitet werden, enthalten.
22 //
23 //DIESE SOFTWARE WIRD VON REC ROBOTICS EQUIPMENT CORPORATION GMBH OHNE JEGLICHE SPEZIELLE ODER IMPLIZIERTE GARANTIEN ZUR VERF�GUNG GESTELLT, DIE UNTER
24 //ANDEREM EINSCHLIESSEN: DIE IMPLIZIERTE GARANTIE DER VERWENDBARKEIT DER SOFTWARE F�R EINEN BESTIMMTEN ZWECK. AUF KEINEN FALL IST REC ROBOTICS EQUIPMENT CORPORATION GMBH
25 //F�R IRGENDWELCHE DIREKTEN, INDIREKTEN, ZUF�LLIGEN, SPEZIELLEN, BEISPIELHAFTEN ODER FOLGESCH�DEN (UNTER ANDEREM VERSCHAFFEN VON ERSATZG�TERN ODER -DIENSTLEISTUNGEN;
26 //EINSCHR�NKUNG DER NUTZUNGSF�HIGKEIT; VERLUST VON NUTZUNGSF�HIGKEIT; DATEN; PROFIT ODER GESCH�FTSUNTERBRECHUNG), WIE AUCH IMMER VERURSACHT UND UNTER WELCHER VERPFLICHTUNG
27 //AUCH IMMER, OB IN VERTRAG, STRIKTER VERPFLICHTUNG ODER UNERLAUBTER HANDLUNG (INKLUSIVE FAHRL�SSIGKEIT) VERANTWORTLICH, AUF WELCHEM WEG SIE AUCH IMMER DURCH DIE BENUTZUNG
28 //DIESER SOFTWARE ENTSTANDEN SIND, SOGAR, WENN SIE AUF DIE M�GLICHKEIT EINES SOLCHEN SCHADENS HINGEWIESEN WORDEN SIND.
29 
30 #ifndef _REC_ROBOTINO_API2_OMNIDRIVEMODEL_H_
31 #define _REC_ROBOTINO_API2_OMNIDRIVEMODEL_H_
32 
33 #include "rec/robotino/api2/utils.h"
34 #include <cmath>
35 
36 namespace rec
37 {
38  namespace robotino
39  {
40  namespace api2
41  {
47  {
48  public:
50  : _rb( 0.132 )
51  , _rw( 0.040 )
52  , _gear( 16.0 )
53  {
54  }
55 
60  void setRb( double rb ) { _rb = rb; }
61 
66  void setRw( double rw ) { _rw = rw; }
67 
72  void setGear( double gear ) { _gear = gear; }
73 
75  double rb() const { return _rb; }
76 
78  double rw() const { return _rw; }
79 
81  double gear() const { return _gear; }
82 
95  void project( float* m1, float* m2, float* m3, float vx, float vy, float omega ) const
96  {
97  //Projection matrix
98  static const double v0[2] = { -0.5 * sqrt( 3.0 ), 0.5 };
99  static const double v1[2] = { 0.0 , -1.0 };
100  static const double v2[2] = { 0.5 * sqrt( 3.0 ), 0.5 };
101 
102  //Scale omega with the radius of the robot
103  double vOmegaScaled = _rb * (double)omega ;
104 
105  //Convert from m/s to RPM
106  const double k = 60.0 * _gear / ( 2.0 * rec::robotino::api2::PI * _rw );
107 
108  //Compute the desired velocity
109  *m1 = static_cast<float>( ( v0[0] * (double)vx + v0[1] * (double)vy + vOmegaScaled ) * k );
110  *m2 = static_cast<float>( ( v1[0] * (double)vx + v1[1] * (double)vy + vOmegaScaled ) * k );
111  *m3 = static_cast<float>( ( v2[0] * (double)vx + v2[1] * (double)vy + vOmegaScaled ) * k );
112  }
113 
126  void unproject( float* vx, float* vy, float* omega, float m1, float m2, float m3 ) const
127  {
128  //Convert from RPM to mm/s
129  const double k = 60.0 * _gear / ( 2.0 * rec::robotino::api2::PI * _rw );
130 
131  *vx = static_cast<float>( ( (double)m3 - (double)m1 ) / sqrt( 3.0 ) / k );
132  *vy = static_cast<float>( 2.0 / 3.0 * ( (double)m1 + 0.5 * ( (double)m3 - (double)m1 ) - (double)m2 ) / k );
133 
134  double vw = (double)*vy + (double)m2 / k;
135 
136  *omega = static_cast<float>( vw / _rb );
137  }
138 
139  private:
143  double _rb;
144 
148  double _rw;
149 
153  double _gear;
154  };
155  }
156  }
157 }
158 
159 #endif //_REC_ROBOTINO_API2_OMNIDRIVEMODEL_H_
void setRw(double rw)
Definition: OmniDriveModel.h:66
void project(float *m1, float *m2, float *m3, float vx, float vy, float omega) const
Definition: OmniDriveModel.h:95
double rb() const
Definition: OmniDriveModel.h:75
void setGear(double gear)
Definition: OmniDriveModel.h:72
void setRb(double rb)
Definition: OmniDriveModel.h:60
Definition: AnalogInput.h:36
double gear() const
Definition: OmniDriveModel.h:81
double rw() const
Definition: OmniDriveModel.h:78
Project single motor speeds to velocity vector and vice versa.
Definition: OmniDriveModel.h:46
void unproject(float *vx, float *vy, float *omega, float m1, float m2, float m3) const
Definition: OmniDriveModel.h:126