OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimIpodSensor.cpp
Go to the documentation of this file.
1 //*******************************************************************
2 //
3 // License: See top level LICENSE.txt file.
4 //
5 // Author: Garrett Potts
6 //
7 // Description:
8 //
9 // Sonoma
10 //*******************************************************************
11 // $Id$
15 #include <ossim/base/ossimTrace.h>
16 #include <ossim/base/ossimLsrRay.h>
24 #include <ossim/matrix/newmatio.h>
25 
26 static ossimTrace traceDebug("ossimIpodSensor:debug");
27 
28 RTTI_DEF1(ossimIpodSensor, "ossimIpodSensor", ossimSensorModel);
29 
31 {
33  theSensorID = "Ipod";
34 }
35 
36 void ossimIpodSensor::imagingRay(const ossimDpt& image_point,
37  ossimEcefRay& image_ray) const
38 {
39 
40  ossimDpt f1 (image_point - theRefImgPt);
41  f1.x *= m_pixelSize.x;
42  f1.y *= -m_pixelSize.y;
43  ossimDpt film (f1 - m_principalPoint);
44 
45  // once we have them we can add distortion fixes
46  // here on the film
47  //
48 
49 
50  // now orient the local film point to the ECEF axes
51  // in a north east down lsr space.
52  //
53  ossimColumnVector3d rc_body(film.y, film.x, m_focalLength + computeParameterOffset(6));
56  ossimEcefVector ecf_ray_dir (rc_ecef);
57  image_ray.setDirection(ecf_ray_dir);
58 
59 }
60 
62  const double& heightEllipsoid,
63  ossimGpt& worldPt) const
64 {
65  if (!insideImage(lineSampPt))
66  {
67  worldPt.makeNan();
68  // worldPoint = extrapolate(image_point, heightEllipsoid);
69  }
70  else
71  {
72  //***
73  // First establish imaging ray from image point:
74  //***
75  ossimEcefRay ray;
76  imagingRay(lineSampPt, ray);
77  ossimEcefPoint Pecf (ray.intersectAboveEarthEllipsoid(heightEllipsoid));
78  worldPt = ossimGpt(Pecf);
79  }
80 }
81 
82 
84 {
85 
89 
93  NEWMAT::Matrix rollM = ossimMatrix3x3::create(1, 0, 0,
94  0, cos(-r), sin(-r),
95  0, -sin(-r), cos(-r));
96  NEWMAT::Matrix pitchM = ossimMatrix3x3::create(cos(-p), 0, -sin(-p),
97  0, 1, 0,
98  sin(-p), 0, cos(-p));
99  NEWMAT::Matrix yawM = ossimMatrix3x3::create(cos(-y), sin(-y), 0,
100  -sin(-y), cos(-y), 0,
101  0,0,1);
102 
103 
104 
105 
106  NEWMAT::Matrix camAM = ossimMatrix3x3::create(0,1,0,-1,0,0,0,0,1); //90 deg rotation @ 3- for camera orientation on copter
107 
108  NEWMAT::Matrix camM = ossimMatrix3x3::create(-1,0,0,0,-1,0,0,0,1); //180 deg rotation @ 3- for corner alignment (mirroring)
109 
110  m_air2Ned = camM*rollM*pitchM*yawM*camAM;
111 
112  double sin_lat = ossim::sind(m_adjustedPlatformPosition.latd());
113  double cos_lat = ossim::cosd(m_adjustedPlatformPosition.latd());
114  double sin_lon = ossim::sind(m_adjustedPlatformPosition.lond());
115  double cos_lon = ossim::cosd(m_adjustedPlatformPosition.lond());
116  m_ecef2Ned = (ossimMatrix3x3::create(0,0,1,0,1,0,-1,0,0)*
117  ossimMatrix3x3::create(cos_lat, 0, sin_lat, 0,1,0, -sin_lat,0,cos_lat)*
118  ossimMatrix3x3::create(cos_lon,sin_lon,0, -sin_lon, cos_lon, 0, 0, 0, 1));
120  double adjustedFocal = m_focalLength + computeParameterOffset(6);
121  m_fovIntrack = (atan((theImageSize.y*theRefImgPt.y)/adjustedFocal));
122  m_fovCrossTrack = (atan((theImageSize.x*theRefImgPt.x)/adjustedFocal));
123 
124 
126 
130  ossimGpt gpt;
131 
133  theBoundGndPolygon[0] = gpt;
135  theBoundGndPolygon[1] = gpt;
137  theBoundGndPolygon[2] = gpt;
139  theBoundGndPolygon[3] = gpt;
140  try{
141  computeGsd();
142  }
143  catch(...)
144  {
145  }
146 
147 }
148 
150 {
152 
153  setAdjustableParameter(0, 0.0);
154  setParameterDescription(0, "lon_offset");
155  setParameterUnit(0, "degrees");
156 
157  setAdjustableParameter(1, 0.0);
158  setParameterDescription(1, "lat_offset");
159  setParameterUnit(1, "degrees");
160 
161  setAdjustableParameter(2, 0.0);
162  setParameterDescription(2, "roll");
163  setParameterUnit(2, "degrees");
164 
165  setAdjustableParameter(3, 0.0);
166  setParameterDescription(3, "pitch");
167  setParameterUnit(3, "degrees");
168 
169  setAdjustableParameter(4, 0.0);
170  setParameterDescription(4, "yaw");
171  setParameterUnit(4, "degrees");
172 
173  setAdjustableParameter(5, 0.0);
174  setParameterDescription(5, "Altitude delta");
175  setParameterUnit(5, "meters");
176 
177  setAdjustableParameter(6, 0.0);
178  setParameterDescription(6, "focal length delta");
179  setParameterUnit(6, "meters");
180 
181  setParameterSigma(0, .001);
182  setParameterSigma(1, .001);
183  setParameterSigma(2, 10);
184  setParameterSigma(3, 10);
185  setParameterSigma(4, 10);
186  setParameterSigma(5, 100);
187  setParameterSigma(6, .04);
188 
189 }
190 
191 bool ossimIpodSensor::loadState(const ossimKeywordlist& kwl, const char* prefix)
192 {
194  {
196  }
197  theGSD.makeNan();
199  ossimSensorModel::loadState(kwl, prefix);
200  ossimString image_size = kwl.find(prefix, "image_size");
201  ossimString pixel_size = kwl.find(prefix, "pixel_size");
202  ossimString principal_point = kwl.find(prefix, "principal_point");
203  ossimString focal_length = kwl.find(prefix, "focal_length");
204  ossimString roll;
205  ossimString pitch;
206  ossimString yaw;
207  ossimString platform_position;
208  m_roll = 0;
209  m_pitch = 0;
210  m_yaw = 0;
211  roll = kwl.find(prefix, "roll");
212  pitch = kwl.find(prefix, "pitch");
213  yaw = kwl.find(prefix, "yaw");
214  platform_position = kwl.find(prefix, "platform_position");
215  bool result = (!pixel_size.empty()&&
216  !principal_point.empty()&&
217  !focal_length.empty()&&
218  !platform_position.empty());
219  if(!image_size.empty())
220  {
221  theImageSize.toPoint(image_size);
224  }
226  {
228  }
229  if(theRefImgPt.hasNans())
230  {
232  }
233  if(!focal_length.empty())
234  {
235  m_focalLength = focal_length.toDouble();
236  }
237  if(!pixel_size.empty())
238  {
239  m_pixelSize.toPoint(pixel_size);
240  }
241  if(!roll.empty())
242  {
243  m_roll = roll.toDouble();
244  }
245  if(!pitch.empty())
246  {
247  m_pitch = pitch.toDouble();
248  }
249  if(!yaw.empty())
250  {
251  m_yaw = yaw.toDouble();
252  }
253  if(!principal_point.empty())
254  {
255  m_principalPoint.toPoint(principal_point);
256  }
257  if(!platform_position.empty())
258  {
259  m_platformPosition.toPoint(platform_position);
262  if(!ossim::isnan(offset))
263  {
265  }
266  }
267  updateModel();
268 
269  if(theGSD.isNan())
270  {
271  try
272  {
273  // This will set theGSD and theMeanGSD. Method throws ossimException.
274  computeGsd();
275  }
276  catch (const ossimException& e)
277  {
278  if (traceDebug())
279  {
281  << "ossimIpodSensor::loadState Caught Exception:\n"
282  << e.what() << std::endl;
283  }
284  }
285  }
286 
287  return result;
288 }
289 
290 bool ossimIpodSensor::saveState(ossimKeywordlist& kwl, const char* prefix)const
291 {
292  ossimSensorModel::saveState(kwl, prefix);
293  kwl.add(prefix, "roll", ossimString::toString(m_roll), true);
294  kwl.add(prefix, "pitch", ossimString::toString(m_pitch), true);
295  kwl.add(prefix, "yaw", ossimString::toString(m_yaw), true);
296  kwl.add(prefix, "principal_point", m_principalPoint.toString(), true);
297  kwl.add(prefix, "pixel_size", m_pixelSize.toString(), true);
298  kwl.add(prefix, "platform_position",m_platformPosition.toString() ,true);
299  kwl.add(prefix, "focal_length", ossimString::toString(m_focalLength) ,true);
300  kwl.add(prefix, "image_size", theImageSize.toString() ,true);
301 
302  return true;
303 }
304 
305 
ossimString theSensorID
ossimString toString() const
Definition: ossimIpt.cpp:139
void setParameterDescription(ossim_uint32 idx, const ossimString &descrption)
virtual void initAdjustableParameters()
ground to image faster (you don&#39;t need DEM) //TBC
ossimGpt m_platformPositionEllipsoid
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
ossim_float64 width() const
Definition: ossimDrect.h:522
double lond() const
Will convert the radian measure to degrees.
Definition: ossimGpt.h:97
ossimEcefPoint intersectAboveEarthEllipsoid(const double &heightAboveEllipsoid, const ossimDatum *aDatum=ossimDatumFactory::instance() ->wgs84()) const
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
Represents serializable keyword/value map.
ossim_uint32 y
const char * find(const char *key) const
const ossimDpt & ul() const
Definition: ossimDrect.h:339
double y
Definition: ossimDpt.h:165
void makeNan()
Definition: ossimGpt.h:130
static ossimString toString(bool aValue)
Numeric to string methods.
ossimDpt m_pixelSize
double sind(double x)
Definition: ossimCommon.h:260
virtual void lineSampleToWorld(const ossimDpt &image_point, ossimGpt &world_point) const
bool isNan() const
Definition: ossimDpt.h:72
void setOrigin(const ossimEcefPoint &orig)
Definition: ossimEcefRay.h:81
double latd() const
Will convert the radian measure to degrees.
Definition: ossimGpt.h:87
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
double ossim_float64
void add(const char *prefix, const ossimKeywordlist &kwl, bool overwrite=true)
void computeGsd()
This method computes the ground sample distance(gsd) and sets class attributes theGSD and theMeanGSD ...
ossimDpt m_principalPoint
void toPoint(const std::string &s)
Initializes this point from string.
Definition: ossimGpt.cpp:116
double degreesToRadians(double x)
Definition: ossimCommon.h:258
virtual const char * what() const
Returns the error message.
ossimGpt m_platformPosition
void toPoint(const std::string &s)
Initializes this point from string.
Definition: ossimDpt.cpp:192
ossimPolygon theBoundGndPolygon
static ossimGeoidManager * instance()
Implements singelton pattern:
double height() const
Definition: ossimGpt.h:107
double toDouble() const
NEWMAT::Matrix m_air2Ned
virtual void imagingRay(const ossimDpt &image_point, ossimEcefRay &image_ray) const
void setParameterUnit(ossim_uint32 idx, ossimUnitType unit)
static NEWMAT::Matrix create()
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
void lineSampleHeightToWorld(const ossimDpt &image_point, const double &heightEllipsoid, ossimGpt &worldPoint) const
bool hasNans() const
Definition: ossimDrect.h:396
double cosd(double x)
Definition: ossimCommon.h:259
bool hasNans() const
Definition: ossimDpt.h:67
ossim_float64 height() const
Definition: ossimDrect.h:517
virtual void updateModel()
void toPoint(const std::string &s)
Initializes this point from string.
Definition: ossimIpt.cpp:170
ossimDrect theImageClipRect
ossimString toString(ossim_uint32 precision=15) const
Definition: ossimDpt.cpp:160
ossimDpt midPoint() const
Definition: ossimDrect.h:817
virtual void setAdjustableParameter(ossim_uint32 idx, double value, bool notify=false)
ossim_int32 y
Definition: ossimIpt.h:142
const ossimDpt & ur() const
Definition: ossimDrect.h:340
double x
Definition: ossimDpt.h:164
ossimGpt m_adjustedPlatformPosition
void resizeAdjustableParameterArray(ossim_uint32 numberOfParameters)
bool empty() const
Definition: ossimString.h:411
NEWMAT::Matrix m_ecef2NedInverse
virtual bool insideImage(const ossimDpt &p) const
ossim_int32 x
Definition: ossimIpt.h:141
const ossimDpt & ll() const
Definition: ossimDrect.h:342
ossimString toString(ossim_uint32 precision=15) const
Definition: ossimGpt.cpp:78
void resize(ossim_uint32 newSize)
void setDirection(const ossimEcefVector &d)
Definition: ossimEcefRay.h:82
virtual double offsetFromEllipsoid(const ossimGpt &gpt)
const ossimDpt & lr() const
Definition: ossimDrect.h:341
void setParameterSigma(ossim_uint32 idx, double value, bool notify=false)
NEWMAT::Matrix m_ecef2Ned
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
void makeNan()
Definition: ossimDpt.h:65
RTTI_DEF1(ossimIpodSensor, "ossimIpodSensor", ossimSensorModel)
bool isnan(const float &v)
isnan Test for floating point Not A Number (NAN) value.
Definition: ossimCommon.h:91