|
|
|
|
|
/*********版权所有(C)2020,武汉高德红外股份有限公司***************************************
|
|
|
* 文件名称: Arith_VehicleCoordModule.h
|
|
|
* 文件标识: 车载坐标转换模块标准化
|
|
|
* 内容摘要: 图像坐标系 <-> 平台地理坐标系,基于北-天-东 轴序
|
|
|
* 其它说明:
|
|
|
* 当前版本:2.0
|
|
|
* 创建作者:04046wcw
|
|
|
* 创建日期:2020/12/03
|
|
|
* 包含关系:
|
|
|
* *********************************************************************************
|
|
|
* 以前版本:1.1
|
|
|
* 作 者:陈毅
|
|
|
* 完成日期:2014年9月23日
|
|
|
*****************************************************************************************/
|
|
|
#ifndef Arith_VehicleCoordModule_h__
|
|
|
#define Arith_VehicleCoordModule_h__
|
|
|
|
|
|
|
|
|
/*
|
|
|
// 坐标系示意图
|
|
|
y x(车体前进方向)
|
|
|
▕
|
|
|
▕ ╱
|
|
|
▕ ╱
|
|
|
▕-——————————z
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
// 标定参数:安装误差
|
|
|
extern double g_YawBias;
|
|
|
extern double g_PitchBias;
|
|
|
extern double g_RollBias;
|
|
|
extern double g_XBias;
|
|
|
extern double g_YBias;
|
|
|
extern double g_ZBias;
|
|
|
|
|
|
|
|
|
// 椭球体定义
|
|
|
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);
|
|
|
|
|
|
|
|
|
#ifndef _ARITH_GLOBAL_
|
|
|
#define ANGLE(x) (x / 3.141592653589793 * 180)
|
|
|
#define RADIAN(x) (x / 180 * 3.141592653589793)
|
|
|
#define ABS(x) ((x) < 0 ? -(x) : (x)) //取x的绝对值
|
|
|
#define MIN(a, b) ((a) < (b) ? (a) : (b)) //取a、b两者中的最小值
|
|
|
#define MAX(a, b) ((a) > (b) ? (a) : (b)) //取a、b两者中的最大值
|
|
|
#endif
|
|
|
|
|
|
#ifndef _POINTXYZ_
|
|
|
#define _POINTXYZ_
|
|
|
// 空间直角坐标系,也可以看做向量
|
|
|
typedef struct tgPointXYZ {
|
|
|
double X;
|
|
|
double Y;
|
|
|
double Z;
|
|
|
}PointXYZ;//单位:米
|
|
|
#endif
|
|
|
|
|
|
|
|
|
#ifndef _POLE_
|
|
|
#define _POLE_
|
|
|
//极坐标系
|
|
|
typedef struct tgPointPole {
|
|
|
double alpha; // 俯仰角
|
|
|
double beta; // 方位角
|
|
|
double distance; // 极径
|
|
|
}Pole;//单位:°
|
|
|
#endif
|
|
|
|
|
|
#ifndef _RPY_
|
|
|
#define _RPY_
|
|
|
//RPY姿态角
|
|
|
typedef struct tgEulerRPY {
|
|
|
double fRoll;//横滚角
|
|
|
double fPitch;//俯仰角
|
|
|
double fYaw;//方位角
|
|
|
}EulerRPY;//单位:°
|
|
|
#endif
|
|
|
|
|
|
|
|
|
#ifndef _POINTBLH_
|
|
|
#define _POINTBLH_
|
|
|
typedef struct tgPointBLH
|
|
|
{
|
|
|
double B; // 纬度
|
|
|
double L; // 经度
|
|
|
double H; // 高程
|
|
|
}PointBLH; // 地理坐标系 //单位:°
|
|
|
#endif
|
|
|
|
|
|
|
|
|
void Coord_Test();
|
|
|
|
|
|
|
|
|
// 设置标定参数
|
|
|
void setBiasPara(double YawBias, double PitchBias, double RollBias, double deltaX, double deltaY, double deltaZ);
|
|
|
|
|
|
// 获取当前标定参数
|
|
|
void getBiasPara(double *YawBias, double *PitchBias, double *RollBias, double *deltaX, double *deltaY, double *deltaZ);
|
|
|
|
|
|
|
|
|
|
|
|
// 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);
|
|
|
|
|
|
|
|
|
|
|
|
// IR370A-H补充接口
|
|
|
|
|
|
//光电镜面直角坐标 转 平台地理直角坐标 的 旋转矩阵。如果考虑平移需引入齐次坐标,不方便使用,这里简化处理
|
|
|
void getCarNUEXYZFromEOCamXYZ_Mat(double mYaw,double mPitch,double mRoll,double servoAlpha, double servoBeta,double* Mat);
|
|
|
|
|
|
// 相机坐标Z轴正方向(平行于图像X方向)在大地系下的偏转角度
|
|
|
Pole getCamZaxisNUERota(double mYaw,double mPitch,double mRoll,double servoAlpha, double servoBeta);
|
|
|
|
|
|
///////////////////////////////////////目标上报//////////////////////////////////////////////////////////
|
|
|
// 光电镜面极坐标 转 平台地理极坐标
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 矩阵乘法
|
|
|
void MultiMat(double *A, double *B, double *AB, int m, int n, int p);
|
|
|
// M1(3*3) * M2(3*3)
|
|
|
void MultiMat33(double *A, double *B, double *AB);
|
|
|
// M1(3*3) * M2(3*3) * M3(3*3)
|
|
|
void MultiMat333(double *A, double *B, double *C, double *ABC);
|
|
|
|
|
|
// 坐标(矢量)旋转: M1(3*3) * M2(3,1)
|
|
|
PointXYZ RtPoint(double *M, PointXYZ Point);
|
|
|
|
|
|
// 坐标(矢量)归一化
|
|
|
PointXYZ NormPoint(PointXYZ Point);
|
|
|
|
|
|
|
|
|
// 绕X轴旋转矩阵
|
|
|
void Rx(double omega, double *Opp);
|
|
|
|
|
|
// 绕Y轴旋转矩阵
|
|
|
void Ry(double omega, double *Opp);
|
|
|
|
|
|
// 绕Z轴旋转矩阵
|
|
|
void Rz(double omega, double *Opp);
|
|
|
|
|
|
// 镜面反射矩阵
|
|
|
void RMirror(PointXYZ normalVec, double *Opp);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif // Arith_VehicleCoordModule_h__
|
|
|
|
|
|
|