OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimSkyBoxLearSensor.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("ossimSkyBoxLearSensor:debug");
27 
28 RTTI_DEF1(ossimSkyBoxLearSensor, "ossimSkyBoxLearSensor", ossimSensorModel);
29 
30 enum
31 {
39  PARAM_ADJ_COUNT // here as last paramter for resizing the adjustment list
40 };
41 
43 {
45  theSensorID = "SkyBoxLear";
46 }
47 
49  ossimEcefRay& image_ray) const
50 {
51  ossimDpt f1 (image_point - theRefImgPt);
52  f1.x *= m_pixelSize.x;
53  f1.y *= -m_pixelSize.y;
54  ossimDpt film (f1 - m_principalPoint);
55 
56  // once we have them we can add distortion fixes
57  // here on the film
58  //
59 
60 
61  // now orient the local film point to the ECEF axes
62  // in a north east down lsr space.
63  //
67  ossimEcefVector ecf_ray_dir (rc_ecef);
68  image_ray.setDirection(ecf_ray_dir);
69 
70 }
71 
73  ossimGpt& worldPoint) const
74 {
75  ossimEcefRay ray;
76  imagingRay(image_point, ray);
77  ossimElevManager::instance()->intersectRay(ray, worldPoint);
78 
79 }
80 
82  const double& heightEllipsoid,
83  ossimGpt& worldPt) const
84 {
85  //***
86  // First establish imaging ray from image point:
87  //***
88  ossimEcefRay ray;
89  imagingRay(lineSampPt, ray);
90  ossimEcefPoint Pecf (ray.intersectAboveEarthEllipsoid(heightEllipsoid));
91  worldPt = ossimGpt(Pecf);
92 }
93 
95 {
99 
103  NEWMAT::Matrix rollM = ossimMatrix3x3::create(1, 0, 0,
104  0, cos(r), sin(r),
105  0, -sin(r), cos(r));
106  NEWMAT::Matrix pitchM = ossimMatrix3x3::create(cos(p), 0, -sin(p),
107  0, 1, 0,
108  sin(p), 0, cos(p));
109  NEWMAT::Matrix yawM = ossimMatrix3x3::create(cos(y), sin(y), 0,
110  -sin(y), cos(y), 0,
111  0,0,1);
112  m_air2Ned = rollM*pitchM*yawM;
113 
114  double sin_lat = ossim::sind(m_adjustedPlatformPosition.latd());
115  double cos_lat = ossim::cosd(m_adjustedPlatformPosition.latd());
116  double sin_lon = ossim::sind(m_adjustedPlatformPosition.lond());
117  double cos_lon = ossim::cosd(m_adjustedPlatformPosition.lond());
118  m_ecef2Ned = (ossimMatrix3x3::create(0,0,1,0,1,0,-1,0,0)*
119  ossimMatrix3x3::create(cos_lat, 0, sin_lat, 0,1,0, -sin_lat,0,cos_lat)*
120  ossimMatrix3x3::create(cos_lon,sin_lon,0, -sin_lon, cos_lon, 0, 0, 0, 1));
123  m_fovIntrack = (atan((theImageSize.y*theRefImgPt.y)/adjustedFocal));
124  m_fovCrossTrack = (atan((theImageSize.x*theRefImgPt.x)/adjustedFocal));
125 
126 
128 
132  ossimGpt gpt;
133 
135  theBoundGndPolygon[0] = gpt;
137  theBoundGndPolygon[1] = gpt;
139  theBoundGndPolygon[2] = gpt;
141  theBoundGndPolygon[3] = gpt;
142 
143  try
144  {
145  computeGsd();
146  }
147  catch(...)
148  {
149 
150  }
151 }
152 
154 {
156 
161 
166 
171 
176 
181 
186 
191 }
192 
193 bool ossimSkyBoxLearSensor::loadState(const ossimKeywordlist& kwl, const char* prefix)
194 {
195  theGSD.makeNan();
197  ossimSensorModel::loadState(kwl, prefix);
199  {
201  }
202  ossimString image_size = kwl.find(prefix, "image_size");
203  ossimString pixel_size = kwl.find(prefix, "pixel_size");
204  ossimString principal_point = kwl.find(prefix, "principal_point");
205  ossimString focal_length = kwl.find(prefix, "focal_length");
206  ossimString roll;
207  ossimString pitch;
208  ossimString yaw;
209  ossimString platform_position;
210  m_roll = 0;
211  m_pitch = 0;
212  m_yaw = 0;
213  roll = kwl.find(prefix, "roll");
214  pitch = kwl.find(prefix, "pitch");
215  yaw = kwl.find(prefix, "yaw");
216  platform_position = kwl.find(prefix, "platform_position");
217  bool result = (!pixel_size.empty()&&
218  !principal_point.empty()&&
219  !focal_length.empty()&&
220  !platform_position.empty());
221  if(!image_size.empty())
222  {
223  theImageSize.toPoint(image_size);
226  }
228  {
230  }
231  if(theRefImgPt.hasNans())
232  {
234  }
235  if(!focal_length.empty())
236  {
237  m_focalLength = focal_length.toDouble();
238  }
239  if(!pixel_size.empty())
240  {
241  m_pixelSize.toPoint(pixel_size);
242  }
243  if(!roll.empty())
244  {
245  m_roll = roll.toDouble();
246  }
247  if(!pitch.empty())
248  {
249  m_pitch = pitch.toDouble();
250  }
251  if(!yaw.empty())
252  {
253  m_yaw = yaw.toDouble();
254  }
255  if(!principal_point.empty())
256  {
257  m_principalPoint.toPoint(principal_point);
258  }
259  if(!platform_position.empty())
260  {
261  m_platformPosition.toPoint(platform_position);
264  if(!ossim::isnan(offset))
265  {
267  }
268  }
269  updateModel();
270 
271  if(theGSD.isNan())
272  {
273  try
274  {
275  // This will set theGSD and theMeanGSD. Method throws ossimException.
276  computeGsd();
277  }
278  catch (const ossimException& e)
279  {
280  if (traceDebug())
281  {
283  << "ossimSkyBoxLearSensor::loadState Caught Exception:\n"
284  << e.what() << std::endl;
285  }
286  }
287  }
288 
289  return result;
290 }
291 
292 bool ossimSkyBoxLearSensor::saveState(ossimKeywordlist& kwl, const char* prefix)const
293 {
294  ossimSensorModel::saveState(kwl, prefix);
295  kwl.add(prefix, "roll", ossimString::toString(m_roll), true);
296  kwl.add(prefix, "pitch", ossimString::toString(m_pitch), true);
297  kwl.add(prefix, "yaw", ossimString::toString(m_yaw), true);
298  kwl.add(prefix, "principal_point", m_principalPoint.toString(), true);
299  kwl.add(prefix, "pixel_size", m_pixelSize.toString(), true);
300  kwl.add(prefix, "platform_position",m_platformPosition.toString() ,true);
301  kwl.add(prefix, "focal_length", ossimString::toString(m_focalLength) ,true);
302  kwl.add(prefix, "image_size", theImageSize.toString() ,true);
303 
304  return true;
305 }
306 
307 
ossimString theSensorID
ossimString toString() const
Definition: ossimIpt.cpp:139
virtual void imagingRay(const ossimDpt &image_point, ossimEcefRay &image_ray) const
void setParameterDescription(ossim_uint32 idx, const ossimString &descrption)
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
Represents serializable keyword/value map.
ossim_uint32 y
bool intersectRay(const ossimEcefRay &ray, ossimGpt &gpt, double defaultElevValue=0.0)
METHOD: intersectRay()
const char * find(const char *key) const
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
virtual void lineSampeToWorld(const ossimDpt &image_point, ossimGpt &worldPoint) const
const ossimDpt & ul() const
Definition: ossimDrect.h:339
double y
Definition: ossimDpt.h:165
static ossimString toString(bool aValue)
Numeric to string methods.
static ossimElevManager * instance()
METHOD: instance() Implements singelton pattern.
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
RTTI_DEF1(ossimSkyBoxLearSensor, "ossimSkyBoxLearSensor", ossimSensorModel)
virtual void lineSampleHeightToWorld(const ossimDpt &image_point, const double &heightEllipsoid, ossimGpt &worldPoint) const
void setOrigin(const ossimEcefPoint &orig)
Definition: ossimEcefRay.h:81
double latd() const
Will convert the radian measure to degrees.
Definition: ossimGpt.h:87
double ossim_float64
void add(const char *prefix, const ossimKeywordlist &kwl, bool overwrite=true)
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
void computeGsd()
This method computes the ground sample distance(gsd) and sets class attributes theGSD and theMeanGSD ...
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.
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
void setParameterUnit(ossim_uint32 idx, ossimUnitType unit)
static NEWMAT::Matrix create()
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) 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
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
NEWMAT::Matrix m_ecef2NedInverse
const ossimDpt & ur() const
Definition: ossimDrect.h:340
virtual void initAdjustableParameters()
ground to image faster (you don&#39;t need DEM) //TBC
double x
Definition: ossimDpt.h:164
void resizeAdjustableParameterArray(ossim_uint32 numberOfParameters)
bool empty() const
Definition: ossimString.h:411
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)
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
void makeNan()
Definition: ossimDpt.h:65
bool isnan(const float &v)
isnan Test for floating point Not A Number (NAN) value.
Definition: ossimCommon.h:91