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