JSBSim Flight Dynamics Model  1.0 (02 March 2017)
An Open Source Flight Dynamics and Control Software Library in C++
FGSensorOrientation.h
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 
3  Header: FGSensorOrientation.h
4  Author: Jon Berndt
5  Date started: September 2009
6 
7  ------------- Copyright (C) 2009 -------------
8 
9  This program is free software; you can redistribute it and/or modify it under
10  the terms of the GNU Lesser General Public License as published by the Free Software
11  Foundation; either version 2 of the License, or (at your option) any later
12  version.
13 
14  This program is distributed in the hope that it will be useful, but WITHOUT
15  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
17  details.
18 
19  You should have received a copy of the GNU Lesser General Public License along with
20  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
21  Place - Suite 330, Boston, MA 02111-1307, USA.
22 
23  Further information about the GNU Lesser General Public License can also be found on
24  the world wide web at http://www.gnu.org.
25 
26 HISTORY
27 --------------------------------------------------------------------------------
28 
29 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
30 SENTRY
31 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
32 
33 #ifndef FGSENSORORIENTATION_H
34 #define FGSENSORORIENTATION_H
35 
36 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
37 INCLUDES
38 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
39 
40 #include "FGSensor.h"
41 #include "input_output/FGXMLElement.h"
42 #include "math/FGColumnVector3.h"
43 #include "math/FGMatrix33.h"
44 
45 #include <iostream>
46 
47 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48 DEFINITIONS
49 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
50 
51 #define ID_SensorOrientation "$Id: FGSensorOrientation.h,v 1.6 2015/07/13 21:50:26 bcoconni Exp $"
52 
53 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
54 FORWARD DECLARATIONS
55 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
56 
57 namespace JSBSim {
58 
59 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
60 CLASS DOCUMENTATION
61 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
62 
71 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
72 CLASS DECLARATION
73 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
74 
76 {
77 public:
79  {
80  Element* orient_element = element->FindElement("orientation");
81  if (orient_element) vOrient = orient_element->FindElementTripletConvertTo("RAD");
82 
83  axis = 0;
84 
85  Element* axis_element = element->FindElement("axis");
86  if (axis_element) {
87  std::string sAxis = element->FindElementValue("axis");
88  if (sAxis == "X" || sAxis == "x") {
89  axis = 1;
90  } else if (sAxis == "Y" || sAxis == "y") {
91  axis = 2;
92  } else if (sAxis == "Z" || sAxis == "z") {
93  axis = 3;
94  }
95  }
96 
97  if (!axis) {
98  std::cerr << " Incorrect/no axis specified for this sensor; assuming X axis" << std::endl;
99  axis = 1;
100  }
101 
102  CalculateTransformMatrix();
103  }
104 
105 // ~FGSensorOrientation();
106 
107 protected:
108  FGColumnVector3 vOrient;
109  FGMatrix33 mT;
110  int axis;
111  void CalculateTransformMatrix(void)
112  {
113  double cp,sp,cr,sr,cy,sy;
114 
115  cp=cos(vOrient(ePitch)); sp=sin(vOrient(ePitch));
116  cr=cos(vOrient(eRoll)); sr=sin(vOrient(eRoll));
117  cy=cos(vOrient(eYaw)); sy=sin(vOrient(eYaw));
118 
119  mT(1,1) = cp*cy;
120  mT(1,2) = cp*sy;
121  mT(1,3) = -sp;
122 
123  mT(2,1) = sr*sp*cy - cr*sy;
124  mT(2,2) = sr*sp*sy + cr*cy;
125  mT(2,3) = sr*cp;
126 
127  mT(3,1) = cr*sp*cy + sr*sy;
128  mT(3,2) = cr*sp*sy - sr*cy;
129  mT(3,3) = cr*cp;
130 
131  // This transform is different than for FGForce, where we want a native nozzle
132  // force in body frame. Here we calculate the body frame accel and want it in
133  // the transformed accelerometer frame. So, the next line is commented out.
134  // mT = mT.Inverse();
135  }
136 
137 private:
138  void Debug(int from);
139 };
140 }
141 #endif
Element * FindElement(const std::string &el="")
Searches for a specified element.
JSBSim Base class.
Definition: FGJSBBase.h:80
std::string FindElementValue(const std::string &el="")
Searches for the named element and returns the string data belonging to it.
This class implements a 3 element column vector.
Encapsulates a SensorOrientation capability for a sensor.
Handles matrix math operations.
Definition: FGMatrix33.h:92
FGColumnVector3 FindElementTripletConvertTo(const std::string &target_units)
Composes a 3-element column vector for the supplied location or orientation.