OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimAlphaSensorHSI.cpp
Go to the documentation of this file.
1 //*******************************************************************
2 //
3 // License: See top level LICENSE.txt file.
4 //
5 // Author: Dave Hicks
6 //
7 // Description: Alpha HSI Sensor Model
8 //
9 //*******************************************************************
10 // $Id$
13 #include <ossim/base/ossimTrace.h>
18 #include <ossim/matrix/newmatio.h>
20 
21 static ossimTrace traceExec ("ossimAlphaSensorHSI:exec");
22 static ossimTrace traceDebug("ossimAlphaSensorHSI:debug");
23 
24 RTTI_DEF1(ossimAlphaSensorHSI, "ossimAlphaSensorHSI", ossimSensorModel);
25 
26 
28 {
29  if (traceDebug())
30  {
32  << "ossimAlphaSensorHSI::ossimAlphaSensorHSI DEBUG:" << std::endl;
33  }
35  theSensorID = "AlphaHSI";
36 }
37 
39  :
40  ossimAlphaSensor(src)
41 {
42 }
43 
45 {
46  return new ossimAlphaSensorHSI(*this);
47 }
48 
50  ossimEcefRay& imageRay) const
51 {
52  ossim_float64 line = imagePoint.y;
53 
54  // Form camera frame LOS vector
55  ossim_float64 scanAngle = getScanAngle(line);
56  ossimColumnVector3d camLOS(imagePoint.x - theImageSize.x/2,
57  m_adjustedFocalLength * tan(scanAngle),
59 
60  // Compute camera position & orientation matrix
61  ossimEcefPoint platPos;
62  NEWMAT::Matrix cam2EcfRot;
63  getPositionOrientation(line, platPos, cam2EcfRot);
64 
65  // Rotate camera vector to ECF
66  ossimColumnVector3d ecfLOS = cam2EcfRot * camLOS.unit();
67 
68  // Construct ECF image ray
69  imageRay.setOrigin(platPos);
70  ossimEcefVector ecfRayDir(ecfLOS);
71  imageRay.setDirection(ecfRayDir);
72 
73  if (traceDebug())
74  {
76  << "ossimAlphaSensorHSI::imagingRay DEBUG:\n"
77  << " imagePoint = " << imagePoint << "\n"
78  << " imageRay = " << imageRay << "\n"
79  << " camLOS = " << camLOS << "\n"
80  << " platPos = " << platPos << "\n"
81  << std::endl;
82  }
83 
84 }
85 
87  ossimDpt& image_point) const
88 {
89  // Initialize at middle
90  ossim_float64 refL = theImageSize.y/2;
91  ossim_float64 drefL = 5;
92  int nIter = 0;
93  ossimColumnVector3d camLOS;
94  ossimColumnVector3d camLOS1;
95 
96  // Iterate using Newton's method
97  while (nIter<3)
98  {
99  ossim_float64 Fx[2];
100  ossim_float64 refl[2];
101  refl[0] = refL;
102  refl[1] = refL + drefL;
103 
104  for (int ll=0; ll<2; ++ll)
105  {
106  // Compute camera position & orientation matrix
107  ossimEcefPoint platPos;
108  NEWMAT::Matrix cam2EcfRot;
109  getPositionOrientation(refl[ll], platPos, cam2EcfRot);
110 
111  // Compute ECF vector
112  ossimEcefPoint worldPointECF = ossimEcefPoint(world_point);
113  ossimColumnVector3d ecfLOS = worldPointECF.data() - platPos.data();
114 
115  // Rotate to camera frame
116  camLOS = cam2EcfRot.t() * ecfLOS;
117  if (ll==0)
118  camLOS1 = camLOS;
119 
120  // Set function value
121  ossim_float64 cScanAngle = atan(camLOS[1]/camLOS[2]);
122  ossim_float64 scanAngle = getScanAngle(refl[ll]);
123  Fx[ll] = cScanAngle - scanAngle;
124  }
125 
126  // Compute numeric 1st derivative & new estimate for reference line (refL)
127  ossim_float64 dFx = (Fx[1]-Fx[0]) / drefL;
128  refL -= Fx[0]/dFx;
129 
130  nIter++;
131  }
132 
133  ossim_float64 samp = m_adjustedFocalLength*camLOS1[0]/camLOS1[2] + theImageSize.x/2;
134 
135  ossimDpt p(samp, refL);
136 
137  image_point = p;
138 }
139 
141 {
142  ossim_float64 scanAngle = evalPoly(m_scanPoly, line);
143 
144  return scanAngle;
145 }
146 
148 {
149  if (traceDebug())
150  {
152  << "ossimAlphaSensorHSI::updateModel DEBUG:" << std::endl;
153  }
155 
156  try
157  {
158  computeGsd();
159  }
160  catch(...)
161  {
162 
163  }
164  if (traceDebug())
165  {
167  << "ossimAlphaSensorHSI::updateModel complete..." << std::endl;
168  }
169 
170  // Ref point
172 
173 
174  // Bounding rectangle
175  ossimGpt gpt;
177 
178  lineSampleToWorld(theImageClipRect.ul(),gpt); //+ossimDpt(-w, -h), gpt);
179  theBoundGndPolygon.addPoint(gpt.lond(), gpt.latd());
180 
181  lineSampleToWorld(theImageClipRect.ur(),gpt); //+ossimDpt(w, -h), gpt);
182  theBoundGndPolygon.addPoint(gpt.lond(), gpt.latd());
183 
184  lineSampleToWorld(theImageClipRect.lr(),gpt); //+ossimDpt(w, h), gpt);
185  theBoundGndPolygon.addPoint(gpt.lond(), gpt.latd());
186 
187  lineSampleToWorld(theImageClipRect.ll(),gpt); //+ossimDpt(-w, h), gpt);
188  theBoundGndPolygon.addPoint(gpt.lond(), gpt.latd());
189 }
190 
192 {
193  if (traceExec())
194  ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimAlphaSensorHSI::initAdjustableParameters: returning..." << std::endl;
195 
197 }
198 
199 bool ossimAlphaSensorHSI::loadState(const ossimKeywordlist& kwl, const char* prefix)
200 {
201  if (traceDebug())
202  {
204  << "ossimAlphaSensorHSI::loadState DEBUG:" << std::endl;
205  }
206 
207  ossimAlphaSensor::loadState(kwl, prefix);
209  {
211  }
212 
213  updateModel();
214 
215  if (traceDebug())
216  {
218  << "ossimAlphaSensorHSI::loadState complete..." << std::endl;
219  }
220 
221  return true;
222 }
223 
224 bool ossimAlphaSensorHSI::saveState(ossimKeywordlist& kwl, const char* prefix)const
225 {
226  ossimAlphaSensor::saveState(kwl, prefix);
227 
228  return true;
229 }
230 
232 {
233  bool result = true; // Currently no error checking.
234 
235  ossimDpt imageSize = supData.getImageSize();
239 
240  setFov(supData.getFov());
241  setRollBias(supData.getRollBias());
242  setPitchBias(supData.getPitchBias());
243  setHeadingBias(supData.getHeadingBias());
244  setSlitRot(supData.getSlitRot());
245 
246  setRollPoly(supData.getRollPoly());
247  setPitchPoly(supData.getPitchPoly());
248  setHeadingPoly(supData.getHeadingPoly());
249  setLonPoly(supData.getLonPoly());
250  setLatPoly(supData.getLatPoly());
251  setAltPoly(supData.getAltPoly());
252  setScanPoly(supData.getScanPoly());
253 
254  updateModel();
255 
256  return result;
257 }
ossimString theSensorID
const ossimColumnVector3d & data() const
virtual void initAdjustableParameters()
void setFov(const double fov)
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
double lond() const
Will convert the radian measure to degrees.
Definition: ossimGpt.h:97
virtual void initAdjustableParameters()
RTTI_DEF1(ossimAlphaSensorHSI, "ossimAlphaSensorHSI", ossimSensorModel)
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
Represents serializable keyword/value map.
const std::vector< ossim_float64 > & getLatPoly() const
virtual ossimObject * dup() const
const ossimDpt & ul() const
Definition: ossimDrect.h:339
void setSlitRot(const double slitRot)
const ossim_float64 & getSlitRot() const
void addPoint(const ossimDpt &pt)
double y
Definition: ossimDpt.h:165
const std::vector< ossim_float64 > & getLonPoly() const
void setHeadingBias(const double headingBias)
virtual void imagingRay(const ossimDpt &image_point, ossimEcefRay &image_ray) const
const ossim_float64 & getFov() const
ossimColumnVector3d unit() const
void setPitchPoly(const std::vector< ossim_float64 > pitchPoly)
virtual void lineSampleToWorld(const ossimDpt &image_point, ossimGpt &world_point) const
void setAltPoly(const std::vector< ossim_float64 > altPoly)
void setOrigin(const ossimEcefPoint &orig)
Definition: ossimEcefRay.h:81
double latd() const
Will convert the radian measure to degrees.
Definition: ossimGpt.h:87
void setScanPoly(const std::vector< ossim_float64 > scanPoly)
ossimDpt imageSize() const
void setHeadingPoly(const std::vector< ossim_float64 > headingPoly)
double ossim_float64
void setLatPoly(const std::vector< ossim_float64 > latPoly)
void computeGsd()
This method computes the ground sample distance(gsd) and sets class attributes theGSD and theMeanGSD ...
const std::vector< ossim_float64 > & getAltPoly() const
ossimPolygon theBoundGndPolygon
const ossim_float64 & getHeadingBias() const
virtual void worldToLineSample(const ossimGpt &world_point, ossimDpt &image_point) const
void setImageRect(const ossimDrect &imageRect)
void setPitchBias(const double pitchBias)
void setLonPoly(const std::vector< ossim_float64 > lonPoly)
ossimDrect theImageClipRect
void setRollBias(const double rollBias)
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
ossim_int32 y
Definition: ossimIpt.h:142
const ossim_float64 & getRollBias() const
const ossimDpt & ur() const
Definition: ossimDrect.h:340
ossim_float64 getScanAngle(const ossim_float64 &line) const
ossim_float64 evalPoly(const std::vector< ossim_float64 > &polyCoef, const ossim_float64 &line) const
double x
Definition: ossimDpt.h:164
virtual void updateModel()
const std::vector< ossim_float64 > & getScanPoly() const
void getPositionOrientation(const ossim_float64 &line, ossimEcefPoint &pos, NEWMAT::Matrix &cam2EcfRot) const
virtual bool initialize(const ossimAlphaSensorSupportData &supData)
Initializes model from support data and calls update Model on success.
void setRollPoly(const std::vector< ossim_float64 > rollPoly)
ossim_int32 x
Definition: ossimIpt.h:141
const ossimDpt & ll() const
Definition: ossimDrect.h:342
void setRefImgPt(const ossimDpt &pt)
Sets the center line sampe of the image.
const std::vector< ossim_float64 > & getPitchPoly() const
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
void setDirection(const ossimEcefVector &d)
Definition: ossimEcefRay.h:82
std::vector< ossim_float64 > m_scanPoly
const ossimDpt & lr() const
Definition: ossimDrect.h:341
ossim_float64 m_adjustedFocalLength
const std::vector< ossim_float64 > & getHeadingPoly() const
const ossim_float64 & getPitchBias() const
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
const std::vector< ossim_float64 > & getRollPoly() const
void setImageSize(const ossimDpt &size)