SE2d.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018-2019, CNRS-UM LIRMM
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  * this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  * this list of conditions and the following disclaimer in the documentation
13  * and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
19  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25  * POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #pragma once
29 
30 #include <mc_rbdyn/rpy_utils.h>
31 
32 #include <SpaceVecAlg/SpaceVecAlg>
33 
34 namespace utils
35 {
36 
40 struct SE2d
41 {
42  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
43 
53  SE2d(double x = 0., double y = 0., double theta = 0.) : x(x), y(y), theta(theta) {}
54 
60  inline sva::PTransformd operator*(const sva::PTransformd & X_0_a) const
61  {
62  sva::PTransformd X_a_b = asPTransform();
63  return X_a_b * X_0_a;
64  }
65 
69  inline sva::PTransformd asPTransform() const
70  {
71  return {mc_rbdyn::rpyToMat(0., 0., theta), Eigen::Vector3d{x, y, 0.}};
72  }
73 
79  inline Eigen::Vector2d pos() const
80  {
81  return {x, y};
82  }
83 
89  inline Eigen::Vector2d ori() const
90  {
91  return {std::cos(theta), std::sin(theta)};
92  }
93 
99  inline Eigen::Vector3d vector()
100  {
101  return {x, y, theta};
102  }
103 
109  inline Eigen::Vector3d vectorDegrees() const
110  {
111  return {x, y, theta * 180. / M_PI};
112  }
113 
114 public:
115  double x;
116  double y;
117  double theta;
118 };
119 
120 } // namespace utils
121 
122 using utils::SE2d;
Eigen::Vector2d pos() const
Get 2D position.
Definition: SE2d.h:79
sva::PTransformd operator*(const sva::PTransformd &X_0_a) const
Apply SE2 transform in horizontal plane of an SE3 frame.
Definition: SE2d.h:60
double y
Second translation coordinate.
Definition: SE2d.h:116
sva::PTransformd asPTransform() const
Convert to Plucker transform.
Definition: SE2d.h:69
Eigen::Vector3d vectorDegrees() const
Get transform in vector form, with the angle expressed in degrees.
Definition: SE2d.h:109
double x
First translation coordinate.
Definition: SE2d.h:115
Utility functions and classes.
Definition: clamp.h:35
SE2 transform.
Definition: SE2d.h:40
double theta
Orientation coordinate.
Definition: SE2d.h:117
Eigen::Vector2d ori() const
Get 2D orientation vector.
Definition: SE2d.h:89
EIGEN_MAKE_ALIGNED_OPERATOR_NEW SE2d(double x=0., double y=0., double theta=0.)
Initialize a new SE2 transform.
Definition: SE2d.h:53
Eigen::Vector3d vector()
Get transform in vector form.
Definition: SE2d.h:99