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