#pragma once /*****************************************************************//** * \file SARSatelliteSimulationAbstractCls.h * \brief 定义SAR卫星仿真整个流程中得抽象模型,并定义一些常用的结构体 * 主要包含 * * 1. 卫星坐标状态 * 2. 卫星天线指向状态(扫描角、指向) * 3. 卫星天线方向图(以 以天线指向为0度,Z->Y : theta , X->Y phi ) * 4. 卫星参数(频率、带宽、快时间、PRF、Fs) * 天线方向图 : phi=0 与 X轴飞行方向一致,此时 G(phi)>G(theta) 即 G(V)>G(H) 水平极化 * 天线方向图 : phi=90 与 y轴飞行方向一致,此时 G(phi) #include #include #include #include "GeoOperator.h" /// /// 天线方向图的获取 /// 注意这里使用 双线性插值 /// class AbstractRadiationPattern { public: AbstractRadiationPattern(); virtual ~AbstractRadiationPattern(); public: virtual double getGain(double theta, double phi); virtual std::vector getGainList(); virtual ErrorCode getGain(double& theta, double& phi, double& GainValue); virtual ErrorCode getGainLinear(double& theta, double& phi, double& GainValue); double getGainLearThetaPhi(double theta, double phi); virtual ErrorCode setGain(double theta, double phi, double GainValue); virtual ErrorCode RecontructGainMatrix(double threshold=-3); virtual std::vector getThetas(); virtual std::vector getPhis(); virtual Eigen::MatrixXd getGainMatrix(); virtual double getMaxTheta(); virtual double getMinTheta(); virtual double getMaxPhi(); virtual double getMinPhi(); private: std::vector GainMap; // 天线方向图 std::vector thetas; std::vector phis; Eigen::MatrixXd GainMatrix; double maxGain, maxThetaGain, maxPhiGain; double mintheta, maxtheta, minphi, maxphi; double EdgethetaMin, EdgethetaMax; double EdgeXMin, EdgeXMax; }; /// /// 卫星轨道模型,与姿态控制 /// 如无特别说明,所有角度都是弧度制 /// 如果没有特别说明,卫星天线坐标系参考GF3: /// 天线展开放方向轴为X轴, /// X轴定义为: 天线摆动角为0时,卫星飞行方向 /// Z轴定义为纵向,理论上 Z轴应该为天线指向方向 /// H 极化定义为 垂直极化,Z->X 平面 /// V 极化定义为 水平极化,Z->Y 平面 /// -Z /// | /// [=====]X<---Y---[======] /// _ /// ___ /// _____ /// _________ /// /// /// /// -Z /// ^ /// | /// X<-Fly-Y /// _ /// ___ /// _______ /// /// 左右视 /// 左视(+) 右视(-) /// Z Z Z /// ^ \ / /// | \ / /// x<--O--- x<--O--- x<--O--- /// | |\ /| /// \ / /// /// /// X=Y x Z 摆动角(-) 摆动角(+) /// Z Z Z /// ^ \ / /// | \ / /// y<--X--- y<--X--- y<--X--- /// | |\ /| /// \ / /// 注:多普勒时间按照《合成孔径雷达成像算法与实现,cumming》中,前视为 - ,后视为 + /// /// class AbstractSatelliteOribtModel { public: virtual ~AbstractSatelliteOribtModel(); public: // 卫星轨道节点 virtual SatelliteOribtNode getSatelliteOribtNode(double& timeFromStartTime,bool& antAzAngleFlag); // 获取轨道节点 virtual ErrorCode getSatelliteOribtNode(double& timeFromStartTime, SatelliteOribtNode& node, bool& antAzAngleFlag); // 获取轨道节点 virtual ErrorCode getSatelliteAntDirectNormal(SatelliteOribtNode& Rs, Vector3D& Rt, SatelliteAntDirect& antNode); // 计算目标在天线方向图中的位置 public: // 卫星轨道模型的参考时间节点 virtual void setSatelliteOribtStartTime(long double oribtStartTime);// 设置卫星模型参考时间 virtual long double getSatelliteOribtStartTime();// 获取卫星模型参考时间 public: // 入射角相关参数 virtual void setbeamAngle(double beamAngle,bool RightLook);// 设置波位角 public: // 天线摆动角相关参数 virtual void setAzAngleRange(double cycletime,double minAzAngle,double maxAzAngle,double referenceAzAngle, double referenceTimeFromStartTime);//方位角变换循环时间 ;方位角变换范围; 特定时间的方位角,用于计算方位角变化情况 virtual double getAzAngleInCurrentTimeFromStartTime(double& currentTime);// 获取当前时间的 天线摆动角 virtual ErrorCode getAzAngleInCurrentTimeFromStartTime(double& currentTime, double& AzAngle);// 获取当前时间的 天线摆动角 public: // 定义在原始天线坐标下的天线坐标系的调整,其中仍然定义-Z 轴为 天线指向方向 virtual void setAntnnaAxisX(double X,double Y,double Z); // 设置天线X轴指向 virtual void setAntnnaAxisY(double X, double Y, double Z); // 设置天线X轴指向 virtual void setAntnnaAxisZ(double X, double Y, double Z); // 设置天线X轴指向 virtual ErrorCode getZeroDopplerAntDirect(SatelliteOribtNode& node);// 获取0多普勒天线方向 virtual ErrorCode getAntnnaDirection( SatelliteOribtNode &node); // 获取天线指向方向 public: virtual double getPt(); virtual double getGri(); virtual void setPt(double Pt); virtual void setGri(double gri); }; /// /// SAR卫星的相关信息 /// 1. 坐标系统为 WGS84,坐标单位是 米,时间单位是: 秒 /// 2. 注意一般来说PRF图像行数相关,Fs 与 图像列数是相关得 /// 3. /// class AbstractSARSatelliteModel { public: // 轨道模型 virtual SatelliteOribtNode getSatelliteOribtNode(double& timeFromStartTime, bool& antAzAngleFlag);// 设置轨道节点, virtual ErrorCode getSatelliteOribtNode(double& timeFromStartTime, SatelliteOribtNode& node, bool& antAzAngleFlag); // 获取轨道节点 virtual ErrorCode getSatelliteAntDirectNormal(SatelliteOribtNode& Rs, Vector3D& Rt, SatelliteAntDirect& antNode); // 计算目标在天线方向图中的位置 virtual void setSatelliteOribtModel(std::shared_ptr model); // 设置轨道模型 public:// 影像成像时间 virtual void setSARImageStartTime(long double imageStartTime);// 成像开始时间 virtual void setSARImageEndTime(long double imageEndTime); // 成像结束时间 virtual double getSARImageStartTime(); virtual double getSARImageEndTime(); virtual double getNearRange(); // 近斜距 -- 快时间门 virtual void setNearRange(double NearRange); virtual double getFarRange(); // 最远斜距 virtual void setFarRange(double FarRange); virtual bool getIsRightLook() ; // 是否右视 virtual void setIsRightLook(bool isR) ; public: // 成像参数 virtual void setCenterFreq(double Freq); // 中心频率 virtual double getCenterFreq(); virtual void setCenterLamda(double Lamda); // 波长 virtual double getCenterLamda(); virtual void setBandWidth(double bandwidth); // 带宽范围 virtual double getBandWidth(); virtual QVector getFreqList(); // 获取频点列表 virtual void setRefphaseRange(double refRange); virtual double getRefphaseRange(); virtual POLARTYPEENUM getPolarType();// 极化类型 virtual void setPolarType(POLARTYPEENUM type); public: // 设置PRF、FS virtual void setPRF(double prf); // 方位向采样频率 virtual double getPRF(); virtual double getFs(); // 距离向采样频率 virtual void setFs(double fs); virtual double getCenterLookAngle() ; virtual void setCenterLookAngle(double angle) ; public:// 天线方向图 virtual void setTransformRadiationPattern(std::shared_ptr radiationPanttern); // 极化发射方向图 virtual void setReceiveRadiationPattern(std::shared_ptr radiationPanttern); // V 极化接收方向图 virtual std::shared_ptr getTransformRadiationPattern();// H 极化发射方向图 virtual std::shared_ptr getReceiveRadiationPattern();// V 极化发射方向图 public: virtual double getPt(); virtual double getGri(); virtual void setPt(double Pt); virtual void setGri(double gri); private: double DopplerParametersReferenceTime; std::vector DopplerCentroidCoefficients; std::vector DopplerRateValuesCoefficients; public: virtual double getDopplerParametersReferenceTime() ; virtual void setDopplerParametersReferenceTime(double time) ; virtual std::vector getDopplerCentroidCoefficients() ; virtual void setDopplerCentroidCoefficients(std::vector DopplerCentroids) ; virtual std::vector getDopplerRateValuesCoefficients() ; virtual void setDopplerRateValuesCoefficients(std::vector DopplerRateValues) ; }; /** 通用函数 ************************************************************************** */ /// /// 从xml文件中读取卫星集合坐标节点 /// /// /// /// ErrorCode ReadSateGPSPointsXML(QString xmlPath, std::vector& nodes); std::vector FilterSatelliteOribtNode(std::vector& nodes, double startTime, double endTime,long minCount=10); std::shared_ptr CreateAbstractRadiationPattern(std::vector antPatternPoints); std::vector ReadGainFile(QString antPatternFilePath); /** 天线方向图文件展示 ********************************************************************** */ /** 多普勒频率计算相关内容 ********************************************************************** */ /** * 参考资料 * 合成孔径雷达成像算法与实现,cumming 洪文译, 第四章 合成孔径的概念 * 雷达信号处理基础,Mark A.Richards,邢孟道译 * 合成孔径雷达成像原理,皮亦鸣 * InSAR原理与应用,刘国祥 * 弹载SAR回波信号仿真研究,林江红 * 星载合成孔径雷达原始回波数据模拟研究,吕辉 * SAR回波仿真信号生成算法的性能比较研究,韦立登 * 星载合成孔径雷达影像正射校正方法研究,陈尔学 * 注:吕辉 多普勒计算公式 与 陈尔学的多普勒计算公式存在差异,中间省略了一些变换过程 * . */ // 多普勒中心频率 double getDopplerCenterFreq(double &lamda,double &R,Vector3D &Rs,Vector3D &Rt,Vector3D &Vs,Vector3D &Vt); // 多普勒调频率(斜率) double getDopplerFreqRate(double& lamda, double& R, Vector3D& Rs, Vector3D& Rt, Vector3D& Vs, Vector3D& Vt,Vector3D &Ast);