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 * Generic rotation vector (cannot be used as is !). 33 * 34 * Authors: 35 * Eric Marchand 36 * 37 *****************************************************************************/ 38 39 #ifndef vpRotationVECTOR_H 40 #define vpRotationVECTOR_H 41 42 /*! 43 \file vpRotationVector.h 44 \brief class that consider the case of a generic rotation vector 45 (cannot be used as is !) 46 */ 47 48 #include <iostream> 49 #include <math.h> 50 #include <stdio.h> 51 52 #include <visp3/core/vpArray2D.h> 53 54 class vpRowVector; 55 class vpColVector; 56 57 /*! 58 \class vpRotationVector 59 60 \ingroup group_core_transformations 61 62 \brief Implementation of a generic rotation vector. 63 64 Class that consider the case of a generic rotation vector 65 (cannot be used as is !) consisting in three or four angles. 66 67 The vpRotationVector class is derived from vpArray2D<double>. 68 The vpRotationVector class is also the base class of specific rotations 69 vectors such as vpThetaUVector, vpRxyzVector, vpRzyxVector, vpRzyzVector and 70 vpQuaternionVector. 71 72 The code below shows how this class can be used to manipulate a 73 vpRxyzVector. 74 75 \code 76 #include <iostream> 77 #include <visp3/core/vpMath.h> 78 #include <visp3/core/vpRxyzVector.h> 79 80 int main() 81 { 82 vpRxyzVector r; // By default initialized to zero 83 // Rotation around x set to 45 degres converted in radians 84 r[0] = vpMath::rad(45); 85 // Rotation around y set to PI radians 86 r[1] = M_PI; 87 // Rotation around z set to 0 radians 88 r[2] = 0; 89 90 std::cout << "Rxyz rotation vector: " << r << std::endl; 91 92 double rx = r[0]; // Get the value of the angle around x axis 93 double ry = r[1]; // Get the value of the angle around y axis 94 double rz = r[2]; // Get the value of the angle around z axis 95 } 96 \endcode 97 98 */ 99 100 class VISP_EXPORT vpRotationVector : public vpArray2D<double> 101 { 102 public: 103 //! Constructor that constructs a 0-size rotation vector. vpRotationVector()104 vpRotationVector() : vpArray2D<double>(), m_index(0) {} 105 106 //! Constructor that constructs a vector of size n and initialize all values 107 //! to zero. vpRotationVector(unsigned int n)108 explicit vpRotationVector(unsigned int n) : vpArray2D<double>(n, 1), m_index(0) {} 109 110 /*! 111 Copy operator. 112 */ vpRotationVector(const vpRotationVector & v)113 vpRotationVector(const vpRotationVector &v) : vpArray2D<double>(v), m_index(0) {} 114 115 /*! 116 Destructor. 117 */ ~vpRotationVector()118 virtual ~vpRotationVector(){}; 119 120 /** @name Inherited functionalities from vpRotationVector */ 121 //@{ 122 123 /*! 124 Operator that allows to set the value of an element of the rotation 125 vector: r[i] = value 126 */ 127 inline double &operator[](unsigned int i) { return *(data + i); } 128 /*! 129 Operator that allows to get the value of an element of the rotation 130 vector: value = r[i] 131 */ 132 inline const double &operator[](unsigned int i) const { return *(data + i); } 133 134 /*! 135 Affectation of two vectors. 136 */ 137 vpRotationVector &operator=(const vpRotationVector &v) 138 { 139 resize(v.size(), 1); 140 for (unsigned int i = 0; i < v.size(); i++) { 141 data[i] = v.data[i]; 142 } 143 return *this; 144 } 145 146 vpColVector operator*(double x) const; 147 148 vpRotationVector &operator<<(double val); 149 vpRotationVector &operator,(double val); 150 151 double sumSquare() const; 152 153 // Transpose of the rotation vector. 154 vpRowVector t() const; 155 156 std::vector<double> toStdVector(); 157 158 //@} 159 160 protected: 161 unsigned int m_index; // index used for operator<< and operator, to fill a vector 162 }; 163 164 #ifndef DOXYGEN_SHOULD_SKIP_THIS 165 VISP_EXPORT 166 #endif 167 vpColVector operator*(const double &x, const vpRotationVector &v); 168 169 #endif 170