1 /****************************************************************************
2  *
3  * ViSP, open source Visual Servoing Platform software.
4  * Copyright (C) 2005 - 2019 by Inria. All rights reserved.
5  *
6  * This software is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  * See the file LICENSE.txt at the root directory of this source
11  * distribution for additional information about the GNU GPL.
12  *
13  * For using ViSP with software that can not be combined with the GNU
14  * GPL, please contact Inria about acquiring a ViSP Professional
15  * Edition License.
16  *
17  * See http://visp.inria.fr for more information.
18  *
19  * This software was developed at:
20  * Inria Rennes - Bretagne Atlantique
21  * Campus Universitaire de Beaulieu
22  * 35042 Rennes Cedex
23  * France
24  *
25  * If you have questions regarding the use of this file, please contact
26  * Inria at visp@inria.fr
27  *
28  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
29  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
30  *
31  * Description:
32  * Common features for Pioneer unicycle mobile robots.
33  *
34  * Authors:
35  * Fabien Spindler
36  *
37  *****************************************************************************/
38 #ifndef VPPIONEER_H
39 #define VPPIONEER_H
40 
41 #include <visp3/core/vpRxyzVector.h>
42 #include <visp3/core/vpTranslationVector.h>
43 #include <visp3/robot/vpUnicycle.h>
44 
45 /*!
46 
47   \class vpPioneer
48 
49   \ingroup group_robot_real_unicycle group_robot_simu_unicycle
50 
51   \brief Generic functions for Pioneer mobile robots.
52 
53   This class provides common features for Pioneer mobile robots.
54   This robot has two control velocities \f$(v_x, w_z)\f$, the translational
55   and rotational velocities of the mobile platform respectively.
56 
57   The figure below shows the position of the frames that are used to model the
58   robot. The end effector frame is here located at the middle point between
59   the two wheels.
60 
61   \image html pioneer.png
62 
63   The robot jacobian at the end effector frame, the point located at the
64   middle between the two wheels is given by:
65 
66   \f[
67   {^e}{\bf J}_e = \left(\begin{array}{cc}
68   1  &   0   \\
69   0  &   0   \\
70   0  &   0   \\
71   0  &   0   \\
72   0  &   0   \\
73   0  &   1   \\
74   \end{array}
75   \right)
76   \f]
77 
78   Considering \f$(v_x, w_z)\f$, it is possible to compute \f$\bf v\f$ the six
79   dimention velocity skew expressed at the end effector frame by:
80 
81   \f[
82   {\bf v} = {^e}{\bf J}_e \;
83   \left(\begin{array}{c}
84   v_x \\
85   w_z \\
86   \end{array}
87   \right)
88   \f].
89 
90 */
91 class VISP_EXPORT vpPioneer : public vpUnicycle
92 {
93 public:
94   /*!
95     Create a default Pioneer robot.
96     */
vpPioneer()97   vpPioneer() : vpUnicycle()
98   {
99     set_cMe();
100     set_eJe();
101   }
102 
103   /*!
104     Destructor that does nothing.
105     */
~vpPioneer()106   virtual ~vpPioneer(){};
107 
108 private:
109   /*!
110     Set the transformation between the camera frame and the mobile platform
111     end effector frame.
112     */
set_cMe()113   void set_cMe()
114   {
115     // Position of mobile platform end effector frame in the camera frame
116     double l = 0.13;         // distance between the camera frame and the mobile robot frame
117     vpTranslationVector cte; // meters
118     vpRxyzVector cre;        // radian
119     cte.set(0, 0, -l);
120     cre.buildFrom(vpMath::rad(90.), 0, vpMath::rad(90.));
121     cMe_.buildFrom(cte, vpRotationMatrix(cre));
122   }
123 
124   /*!
125     Set the robot jacobian at the end effector frame, the point located at the
126     middle between the two wheels.
127 
128     Considering \f${\bf v} = {^e}{\bf J}_e \; [v_x, w_z]\f$ with
129     \f$(v_x, w_z)\f$ respectively the translational and rotational control
130     velocities of the mobile robot and \f$\bf v\f$ the six dimention velocity
131     skew expressed at the end effector frame, the robot jacobian is given by:
132 
133     \f[
134     {^e}{\bf J}_e = \left(\begin{array}{cc}
135     1  &   0   \\
136     0  &   0   \\
137     0  &   0   \\
138     0  &   0   \\
139     0  &   0   \\
140     0  &   1   \\
141     \end{array}
142     \right)
143     \f]
144 
145   */
set_eJe()146   void set_eJe()
147   {
148     eJe_.resize(6, 2); // pioneer jacobian expressed at point M
149     eJe_ = 0;
150     eJe_[0][0] = 1; // vx
151     eJe_[5][1] = 1; // wz
152   }
153 };
154 
155 #endif
156