Commit 692b74af authored by kledmundson's avatar kledmundson Committed by dcookastro
Browse files

Lro lidar infrastructure (#3172)

* adding dedicated BundleLidarPointVector class

* adding dedicated BundleLidarPointVector class

* adding dedicated BundleLidarPointVector class

* temp commits for testing bundle with lidar

* temp commits to bundle lidar
parent 2ed006e1
Loading
Loading
Loading
Loading
+187 −3
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#include <QJsonObject>
#include <QJsonValue>
#include <QList>
#include <QMapIterator>
#include <QRegExp>
#include <QSharedPointer>
#include <QString>
@@ -15,6 +16,7 @@

#include "Angle.h"
#include "CameraFactory.h"
#include "ControlNet.h"
#include "Distance.h"
#include "FileName.h"
#include "IException.h"
@@ -34,7 +36,8 @@ namespace Isis {
   * Default constructor.
   */
  LidarData::LidarData() {

    m_numSimultaneousMeasures = 0;
    m_numAsynchronousMeasures = 0;
  }


@@ -75,6 +78,104 @@ namespace Isis {
  }


  /**
   * Returns number of Lidar data points.
   *
   * @return int Returns number of Lidar control points.
   */
  int LidarData::numberLidarPoints() {
    return m_points.size();
  }


  /**
   * Returns number of simultaneous lidar measures.
   *
   * @return int Returns number of simultaneous lidar measures.
   */
  int LidarData::numberSimultaneousMeasures() {
    return m_numSimultaneousMeasures;
  }

  /**
   * Returns number of non-simultaneous lidar measures.
   *
   * @return int Returns number of non-simultaneous lidar measures.
   */
  int LidarData::numberAsynchronousMeasures() {
    return m_numAsynchronousMeasures;
  }


  /**
   * Returns total number of lidar measures.
   *
   * @return int Returns total number of lidar measures.
   */
  int LidarData::numberMeasures() {
    return m_numSimultaneousMeasures + m_numAsynchronousMeasures;
  }


  /**
   * TODO: more detail below...
   *
   * Assigns Isis::Camera pointers to LidarControlPoint measures.
   *
   * @param controlNet Input ControlNet
   * @param progress A pointer to the progress of creating the cameras
   * @throws Isis::iException::User - "Lidar Control point measure does not have a cube with a
   *         matching serial number"
   * @internal
   *   @history 2019-02-06 Ken Edmundson - initial version.
   */
  void LidarData::SetImages(ControlNet &controlNet, Progress *progress) {

    // iterate over map between serial number and camera pointers
    QMapIterator< QString, Isis::Camera *> it(p_cameraMap);
    while (it.hasNext()) {
      it.next();
      QString serialNumber = it.key();

      // get corresponding camera pointer from controlNet
      Isis::Camera *cam = controlNet.Camera(serialNumber);
      p_cameraMap[serialNumber] = cam;
      p_cameraValidMeasuresMap[serialNumber] = 0;         // not sure if all this is needed
      p_cameraRejectedMeasuresMap[serialNumber] = 0;
      p_cameraList.push_back(cam);
    }

    // Loop through all measures and set the camera
    QHashIterator< QString, QSharedPointer<LidarControlPoint> > p(m_points);
    while (p.hasNext()) {
      p.next();
      LidarControlPointQsp curPoint = p.value();

      QList< QString > serialNums = curPoint->getCubeSerialNumbers();
      for (int m = 0; m < serialNums.size(); m++) {
        ControlMeasure *curMeasure = (*curPoint)[serialNums[m]];

        QString serialNumber = curMeasure->GetCubeSerialNumber();
        Isis::Camera *cam = p_cameraMap[serialNumber];

        if (cam == NULL) {
          IString msg = "Lidar Control point [" + curPoint->GetId() +
              "], measure [" + curMeasure->GetCubeSerialNumber() +
              "] does not have a cube in the ISIS control net with a matching serial number";
          throw IException(IException::User, msg, _FILEINFO_);
        }

        curMeasure->SetCamera(cam);

        // increment number of measures for this image (camera)
        if (!curMeasure->IsIgnored()) {
          p_cameraValidMeasuresMap[serialNumber]++;
        }
      }
    }
  }


  /**
   * Creates the ControlNet's image camera's based on the list of Serial Numbers
   *
@@ -178,6 +279,8 @@ namespace Isis {
      loadDoc = QJsonDocument::fromBinaryData(saveData);
    }

    int totalMeasures = 0;

    // Unserialize LidarData
    QJsonObject lidarDataObject = loadDoc.object();
    if (lidarDataObject.contains("points") && lidarDataObject["points"].isArray()) {
@@ -305,6 +408,7 @@ namespace Isis {
                // Unserialize each simultaneous image serial number
                newSerial =  simultaneousArray[simIndex].toString();
                lcp->addSimultaneous(newSerial);
                m_numSimultaneousMeasures++;
              }              
        }

@@ -330,6 +434,10 @@ namespace Isis {
              serialNumber = measureObject["serialNumber"].toString();
            }

            if (!p_cameraMap.contains(serialNumber)) {
              p_cameraMap.insert(serialNumber, NULL);
            }

            // QString type;
            // if (measureObject.contains("type") && measureObject["type"].isString()) {
            //   type = measureObject["type"].toString();
@@ -340,12 +448,14 @@ namespace Isis {
            measure->SetCubeSerialNumber(serialNumber);
            // measure->SetType(measure->StringToMeasureType(type));
            lcp->Add(measure);
            totalMeasures++;
          }
        }

        insert(lcp);
      }
    }
    m_numAsynchronousMeasures = totalMeasures - m_numSimultaneousMeasures;
  }


@@ -490,4 +600,78 @@ namespace Isis {
      saveFile.write(lidarDataDoc.toBinaryData());
    }
  }

  /**
   * Does a check to ensure that the given serial number is contained within
   * the network.
   *
   * @param serialNumber the cube serial number to validate
   *
   * @return @b bool If the serial number is contained in the network.
   */
  bool LidarData::ValidateSerialNumber(QString serialNumber) const {
    return p_cameraMap.contains(serialNumber);
  }


  /**
   * Return the number of measures in image specified by serialNumber
   *
   * @return Number of valid measures in image
   *
   * @history 2013-12-18 Tracie Sucharski - Renamed from GetNumberOfMeasuresInImage, it is
   *                         returning a count of only valid measures (Ignore=False).
   */
  int LidarData::GetNumberOfValidMeasuresInImage(const QString &serialNumber) {
    // If SetImage was called, use the map that has been populated with valid measures
    if (p_cameraList.size() > 0) {
      return p_cameraValidMeasuresMap[serialNumber];
    }
    return GetValidMeasuresInCube(serialNumber).size();
  }


  /**
   * Return the number of jigsaw rejected measures in image specified by serialNumber
   *
   * @return Number of jigsaw rejected measures in image
   */
  int LidarData::GetNumberOfJigsawRejectedMeasuresInImage(const QString &serialNumber) {
    return p_cameraRejectedMeasuresMap[serialNumber];
  }

  /**
   * Get all the valid measures pertaining to a given cube serial number
   *
   * @returns A list of all valid measures which are in a given cube
   */
  QList< ControlMeasure * > LidarData::GetValidMeasuresInCube(QString serialNumber) {
    QList< ControlMeasure * > validMeasures;

    // Get measures in cube will validate this for us, so we don't need to re-check
//    QList< ControlMeasure * > measureList = GetMeasuresInCube(serialNumber);
    QList< ControlMeasure * > measureList;

    foreach(ControlMeasure * measure, measureList) {
      if (!measure->IsIgnored())
        validMeasures.append(measure);
    }

    return validMeasures;
  }

  /**
   * Get all the measures pertaining to a given cube serial number
   *
   * @returns A list of all measures which are in a given cube
   */
//  QList< ControlMeasure * > LidarData::GetMeasuresInCube(QString serialNumber) {
//    if( !ValidateSerialNumber(serialNumber) ) {
//      IString msg = "Cube Serial Number [" + serialNumber + "] not found in "
//          "the network";
//      throw IException(IException::Programmer, msg, _FILEINFO_);

//    }
//    return m_controlGraph[m_vertexMap[serialNumber]].measures.values();
//  }
}
+27 −10
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@ class QJsonObject;

namespace Isis {
  class Camera;
  class ControlMeasure;
  class ControlNet;
  class FileName;
  class Progress;
  class SerialNumberList;
@@ -61,20 +63,35 @@ namespace Isis {
      QList< QSharedPointer<LidarControlPoint> > points(bool sort = false) const;

      void SetImages(SerialNumberList &list, Progress *progress = 0);
      void SetImages(ControlNet &controlNet, Progress *progress = 0);

      // Serialization methods for LidarData
      void read(FileName);
      void write(FileName, Format);

      int numberLidarPoints();
      int numberSimultaneousMeasures();
      int numberAsynchronousMeasures();
      int numberMeasures();

      bool ValidateSerialNumber(QString serialNumber) const;
      QList< ControlMeasure * > GetMeasuresInCube(QString serialNumber);
      QList< ControlMeasure * > GetValidMeasuresInCube(QString serialNumber);
      int GetNumberOfValidMeasuresInImage(const QString &serialNumber);
      int GetNumberOfJigsawRejectedMeasuresInImage(const QString &serialNumber);

    private:
      /** Hash of the LidarControlPoints this class contains. */
      QHash<QString, QSharedPointer <LidarControlPoint> > m_points;

      QMap<QString, Isis::Camera *> p_cameraMap; //!< A map from serialnumber to camera
      QMap<QString, int> p_cameraValidMeasuresMap; //!< A map from serialnumber to #measures
      QMap<QString, int> p_cameraRejectedMeasuresMap; //!< A map from serialnumber to
      //!  #rejected measures
      QVector<Isis::Camera *> p_cameraList; //!< Vector of image number to camera
      QHash<QString, QSharedPointer <LidarControlPoint> > m_points; //!< hash of LidarControlPoints

                                                                    //!< maps between serial# and...
      QMap<QString, Isis::Camera *> p_cameraMap;                    //!< camera
      QMap<QString, int> p_cameraValidMeasuresMap;                  //!< #measures
      QMap<QString, int> p_cameraRejectedMeasuresMap;               //!< #rejected measures

      QVector<Isis::Camera *> p_cameraList;                         //!< vector of image# to camera

      int m_numSimultaneousMeasures;
      int m_numAsynchronousMeasures;
  };

  // typedefs
+2 −5
Original line number Diff line number Diff line
@@ -2066,7 +2066,8 @@ namespace Isis {
    double derivative;
    double time = (p_et - p_baseTime) / p_timeScale;

    if (coeffIndex > 0  && coeffIndex <= m_polynomial.degree()) {
//    if (coeffIndex > 0  && coeffIndex <= m_polynomial.degree()) {
    if (coeffIndex > 0  && coeffIndex <= p_degree) {
      derivative = pow(time, coeffIndex);
    }
    else if (coeffIndex == 0) {
@@ -2279,8 +2280,6 @@ namespace Isis {
    // If polynomials have not been applied yet then simply set the degree and return
    if (!p_degreeApplied) {
      p_degree = degree;
      // TODO: verify
      m_polynomial.setDegree(degree);
    }

    // Otherwise adjust the degree.
@@ -2304,8 +2303,6 @@ namespace Isis {

      // Change the polynomial degree
      m_polynomial.setDegree(degree);
// TODO: verify next line
      p_degree = degree;

      // Reset the coefficients
      for (int i = 0; i < m_segments; i++) {
+852 −293

File changed.

Preview size limit exceeded, changes collapsed.

+17 −10
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@
// Isis lib
#include "BundleControlPoint.h"
#include "BundleControlPointVector.h"
#include "BundleLidarPointVector.h"
#include "BundleObservationSolveSettings.h"
#include "BundleObservationVector.h"
#include "BundleResults.h"
@@ -429,6 +430,7 @@ namespace Isis {
      bool computeBundleStatistics();
      void applyParameterCorrections();
      bool errorPropagation();
      void computeResiduals();
      double computeVtpv();
      bool computeRejectionLimit();
      bool flagOutliers();
@@ -436,16 +438,15 @@ namespace Isis {
      // normal equation matrices methods

      bool formNormalEquations();
      bool formPhotoNormals();
      bool formLidarNormals();
      int formPhotoNormalEquations();
      int formLidarNormalEquations();

      bool computePartials(LinearAlgebra::Matrix  &coeffTarget,          //!< multi-segment version
                           LinearAlgebra::Matrix  &coeffImagePosition,
                           LinearAlgebra::Matrix  &coeffImagePointing,
                           LinearAlgebra::Matrix  &coeffPoint3D,
                           LinearAlgebra::Vector  &coeffRHS,
                           BundleMeasure          &measure,
                           BundleControlPoint     &point);
                           BundleMeasure          &measure);
      bool formMeasureNormals(LinearAlgebra::MatrixUpperTriangular &N22, //!< multi-segment version
                              SparseBlockColumnMatrix              &N12,
                              LinearAlgebra::VectorCompressed      &n1,
@@ -456,11 +457,16 @@ namespace Isis {
                              LinearAlgebra::Matrix                &coeffPoint3D,
                              LinearAlgebra::Vector                &coeffRHS,
                              BundleMeasureQsp                     measure);
      bool formPointNormals(LinearAlgebra::MatrixUpperTriangular &N22,
      int formPointNormals(LinearAlgebra::MatrixUpperTriangular &N22,
                           SparseBlockColumnMatrix              &N12,
                           LinearAlgebra::Vector                &n2,
                           LinearAlgebra::Vector                &nj,
                           BundleControlPointQsp                &point);
      int formLidarPointNormals(LinearAlgebra::MatrixUpperTriangular &N22,
                                SparseBlockColumnMatrix              &N12,
                                LinearAlgebra::Vector                &n2,
                                LinearAlgebra::Vector                &nj,
                                BundleLidarControlPointQsp           &point);
      bool formWeightedNormals(LinearAlgebra::VectorCompressed  &n1,
                               LinearAlgebra::Vector            &nj);
      void applyPolynomialContinuityConstraints();
@@ -490,7 +496,6 @@ namespace Isis {
      bool initializeCHOLMODLibraryVariables();
      bool freeCHOLMODLibraryVariables();
      bool loadCholmodTriplet();
      bool wrapUp();

      // member variables

@@ -501,6 +506,7 @@ namespace Isis {
      QString m_cnetFileName;                                //!< The control net filename.

      BundleControlPointVector m_bundleControlPoints;        //!< Vector of control points.
      BundleLidarPointVector m_bundleLidarControlPoints;     //!< Vector of lidar points.

      QString m_lidarFileName;                               //!< Input lidar point filename.
      LidarDataQsp m_lidarDataSet;                           //!< Output lidar data.
@@ -523,6 +529,7 @@ namespace Isis {
                                                                   the destructor.*/
      int m_rank;                                            //!< The rank of the system.
      int m_iteration;                                       //!< The current iteration.
      double m_iterationTime;                                //!< Time for last iteration
      int m_numberOfImagePartials;                           //!< number of image-related partials.
      QList<ImageList *> m_imageLists;                        /**!< The lists of images used in the
                                                                   bundle.*/
Loading