You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

203 lines
7.9 KiB

/*********版权所有C2022武汉高德红外股份有限公司***************************************
* Arith_CoordModule.h
*
* <-> --
*
使
XYZ
-180,180 -90,90
* 3.0
* 04046wcw
* 2022/12/03
*
* *********************************************************************************
* * 2.0
* 04046wcw
* 2020/12/03
* 1.1
*
* 2014923
*****************************************************************************************/
#ifndef Arith_CoordModule_h__
#define Arith_CoordModule_h__
#pragma once
#include "Arith_SysStruct.h"
/*
// 坐标系示意图
y x
-z
// 定义:
NUE
//20220930 04046wcw
*/
// 椭球体定义
const double a = 6378137;
const double f = 1 / 298.257222101;
const double b = ((1 - f)*a);
const double ee = (1 - (1 - f)*(1 - f));
const double epep = (a*a / b / b - 1);
////////////////////////////光电坐标转换统一接口20220930/////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// 从惯性系(建航坐标系)到 像坐标系
POINT32F getImagePosFromStablePole(Pole stablePole,CameraParam cam, ServoParam servoInfo, EulerRPY att, DeviceSetupError err);
// 从像坐标系 到 惯性系(建航坐标系)
Pole getStablePoleFromImagePos(POINT32F imagePos,CameraParam cam, ServoParam servoInfo, EulerRPY att, DeviceSetupError err);
// 在扫描区间判断
BBOOL bTargetInScanFov(ANGLE32F targetPos, Pole scanNueRange1, Pole scanNueRange2);
// 惯性系到设备系
Pole getDevicePoleFromStablePole(Pole stablePole, EulerRPY att,DeviceSetupError err);
// 设备系转像方坐标
POINT32F getImagePosFromDevicePole(Pole devicePole,CameraParam cam, ServoParam servoInfo);
// 像方转设备系
Pole getDevicePoleFromImagePos(POINT32F imagePos,CameraParam cam, ServoParam servoInfo);
// 设备系到惯性系
Pole getStablePoleFromDevicePole(Pole devicePole, EulerRPY att, DeviceSetupError err);
////////////////////////////光电坐标转换统一接口/////////////////////////////////
// // S726二维指向镜版本 by wcw04046 @ 2021/12/03
// Pole getPointMirrorServoPoleFromImageXY(int Col,int Row,int nWidth,int nHeight,
// float fServoA,float fServoB,float fLen,float pxSizeOfum);
// void getPointMirrorImageXYFromServoPole(int* Col,int* Row,int nWidth,int nHeight,float WAlaph,float WBeta,
// float fServoA,float fServoB,float fLen,float pxSizeOfum);
// S731成像模型
// s731_v2相对于v1 伺服方位正方向相反。因此在v1的模型上方位角加负号即可。
// 本质上v1时未理解到设备测试状态与装机状态上下颠倒从而使用了错误了设备坐标系v1伺服也没有理解到正方向也与装机状态相反。v2的伺服改过来了@20240221
// 探测器方面v1 v2状态一致可以说都装反了 设备测试状态下图像应该是倒立的所以V1、V2中对二者都取了像方 Y=-Y
// 总体上v1 v2只有伺服方位正方向改了状态。
// 成像模型反射矩阵 【像方->物方】(含主反、快反)
void PMS_MultiRefMat(float fMainAz, float fMainAPt, float fFSMAz, float fFSMPt, double* refmat);
// 单点投影:像方到物方角度转换
Pole PMS_ProjectPixelToWorld(int x, int y, float fMainAz, float fMainAPt, float fFSMAz, float fFSMPt, float f_px, int cx, int cy);
Pole PMS_ProjectPixelToWorld(int x, int y, double* refmat, float f_px, int cxx, int cy);// 已知矩阵直接转
// 单点投影:像方到物方矢量
//PointXYZ PMS_ProjectPixelToWorldVec(int x, int y, double* refmat, float f_px, int cx, int cy);// 已知矩阵直接转
// 单点投影:从物方角度到像方
PointXYZ PMS_ProjectWorldToPixel(float fAz, float fPt, double* refmat, float f_px, int cx, int cy);// 已知矩阵直接转,大部分时候可以节约计算
// 单点投影:从物方矢量到像方
//PointXYZ PMS_ProjectWorldVecToPixel(PointXYZ worldVec, double* refmat, float f_px, int cx, int cy);
///////////////////////////////////////目标上报//////////////////////////////////////////////////////////
// 光电镜面极坐标 转 平台地理极坐标
Pole getCarNUEPoleFromEOCamPole(Pole targetCamPole, double mYaw,double mPitch,double mRoll,double servoAlpha, double servoBeta);
// 光电镜面直角坐标 转 光电伺服直角坐标
PointXYZ getEOServoXYZFromEOCamXYZ(PointXYZ targetCamXYZ,double alaph, double beta);
// 光电伺服直角坐标 转 光电基准直角坐标
PointXYZ getEOBaseXYZFromEOServoXYZ(PointXYZ targetServoXYZ, double eYaw, double ePitch, double eRoll);
// 光电基准直角坐标 转 平台直角坐标
PointXYZ getCarXYZFromEOBaseXYZ(PointXYZ targetEOBaseXYZ, double deltaX, double deltaY, double deltaZ);
// 平台直角坐标 转 平台地理直角坐标
PointXYZ getCarNUEXYZFromCarXYZ(PointXYZ targetCarXYZ,double mYaw, double mPitch, double mRoll);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////目标导引//////////////////////////////////////////////////////////
Pole getEOServoPoleFromCarNUEPole(Pole targetCarNUEPole, Pole* targetEOCamPole,double mYaw, double mPitch, double mRoll, double servoAlpha, double servoBeta);
// 平台地理直角坐标 转 平台直角坐标
PointXYZ getCarXYZFromCarNUEXYZ(PointXYZ targetCarNUEXYZ, double mYaw, double mPitch, double mRoll);
// 平台直角坐标 转 光电基准直角坐标
PointXYZ getEOBaseXYZFromCarXYZ(PointXYZ targetCarXYZ, double deltaX, double deltaY, double deltaZ);
// 光电基准直角坐标 转 光电伺服直角坐标
PointXYZ getEOServoXYZFromEOBaseXYZ(PointXYZ targetEOBaseXYZ, double eYaw, double ePitch, double eRoll);
// 光电伺服直角坐标 转 光电镜面直角坐标
PointXYZ getEOCamXYZFromEOServoXYZ(PointXYZ targetEOServoXYZ, double alaph, double beta);
/////////////////////////////////////////大地坐标相关///////////////////////////////////////////////////////
//大地坐标转地球空间直角坐标
PointXYZ getXYZFromBLH(PointBLH BLH);
//地球空间直角坐标-->大地坐标
PointBLH getBLHFromXYZ(PointXYZ pointXYZ);
//由NUE直角坐标变换到CGCS直角坐标
PointXYZ getCGCSXYZFromNUEXYZ(PointXYZ targetPointXYZ, PointXYZ selfPointXYZ);
//由CGCS直角坐标变换到NUE直角坐标
PointXYZ getNUEXYZFromCGCSXYZ(PointXYZ targetPointXYZ, PointXYZ selfPointXYZ);
////////////////////////////////////////////////////////////////////////////////
// 直角坐标转极坐标(右手系)
Pole getPoleFromXYZ(PointXYZ targetXYZ);
// 极坐标转直角坐标(右手系)
PointXYZ getXYZFromPole(Pole targetPole);
#endif // Arith_VehicleCoordModule_h__