Files
rag_agent/RAG-TEST-TOOLS/PrjAttCtrlMng/AttPosGet.c

1250 lines
36 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* Created: 2022/11/4 11:02:40
* Author: wangzk zhengmengxing
*/
#include "..\PrjCommon\CommonDef.h"
#include "AttMath.h"
#include "AttCtrlMain.h"
//#include "../PrjTaskMng/TaskMng.h"
/************************************************
说明:定姿算法初始化,在最开始调用一次,进行常量的初始化动作
输入:
返回:
************************************************/
void ZKPGInit(void)
{
sAttPriData *tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
sAttDeterPara_t *pDeter =NULL;
// tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
if(NULL == tmpAtt)
{return;}
pDeter=&tmpAtt->sDeterPara;
pDeter->AttDeter_Type =0;
#ifdef MINMODULE_TYPE
//对日太阳角
memset(pDeter->SunVecb,0.0,3*sizeof(TYPE_CAL));
memset(pDeter->AngToSun,0.0,3*sizeof(TYPE_CAL));
pDeter->AngToSun_ValidFlg=0x55; //星敏本体系太阳矢量可用标志
pDeter->CalAngToSun_Source=0;
//闭环姿态角
memset(pDeter->CLPAttAng,0.0,3*sizeof(TYPE_CAL));
pDeter->CLPAttValid = POSE_OK;
#else
//对日太阳角
memset(pDeter->SunVecb,0.0,3*sizeof(TYPE_CAL));
memset(pDeter->AngToSun,0.0,3*sizeof(TYPE_CAL));
pDeter->AngToSun_ValidFlg=0x55; //星敏本体系太阳矢量可用标志
pDeter->CalAngToSun_Source=0;
//轨道系姿态
memset(pDeter->Qo,0.0,4*sizeof(TYPE_CAL));
memset(pDeter->AttRateOrb,0.0,3*sizeof(TYPE_CAL));
memset(pDeter->AttAngTar,0.0,3*sizeof(TYPE_CAL));
memset(pDeter->AttAngOrb,0,3*sizeof(TYPE_CAL));
memset(pDeter->SunVeco,0.0,3*sizeof(TYPE_CAL));
pDeter->AttOrb_Vld = POSE_OK; //卫星轨道系姿态有效标志
//目标参考系姿态
memset(pDeter->AttAngTarRe,0,3*sizeof(TYPE_CAL));
//memset(pDeter->AttRateTarRe,0.00873,3*sizeof(TYPE_CAL));
pDeter->AttRateTarRe[0] = 0.00873f;
pDeter->AttRateTarRe[1] = 0.00873f;
pDeter->AttRateTarRe[2] = - 0.00873f;
pDeter->AttTarRe_Vld = POSE_OK;
//轨控参考系姿态
memset(pDeter->AttAngOrbCtrl,0,3*sizeof(TYPE_CAL));
memset(pDeter->AttRateOrbCtrl,0,3*sizeof(TYPE_CAL));
pDeter->AttOrbCtrl_Vld = POSE_OK;
//闭环姿态角
memset(pDeter->CLPAttAng,0,3*sizeof(TYPE_CAL));
pDeter->CLPAttValid = POSE_OK;
#endif
}
/***********************************************
说明:陀螺选择
***********************************************/
void Gyro_AttChoice(void)
{
UINT8 i =0;
sAttPriData *tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
//AttCtrlConst_t *tmpConst;
GyroPara_t *PGyro[GYRO_NUM];
sAttDeterPara_t *pDeter =NULL;
//tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
if(NULL == tmpAtt)
{return;}
//tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
PGyro[0] = &tmpAtt->sPerPara.GyroPara[0];
PGyro[1] = &tmpAtt->sPerPara.GyroPara[1];
PGyro[2] = &tmpAtt->sPerPara.GyroPara[2];
pDeter=&tmpAtt->sDeterPara;
//if((PGyro[0]->Gyro_AvailableFlg + PGyro[1]->Gyro_AvailableFlg + PGyro[2]->Gyro_AvailableFlg)==0x55)//单陀螺可用
if( ((POSE_OK == PGyro[0]->Gyro_AvailableFlg)&&(POSE_NO == PGyro[1]->Gyro_AvailableFlg )&&(POSE_NO == PGyro[2]->Gyro_AvailableFlg))||
((POSE_NO == PGyro[0]->Gyro_AvailableFlg)&&(POSE_OK == PGyro[1]->Gyro_AvailableFlg )&&(POSE_NO == PGyro[2]->Gyro_AvailableFlg))||
((POSE_NO == PGyro[0]->Gyro_AvailableFlg)&&(POSE_NO == PGyro[1]->Gyro_AvailableFlg )&&(POSE_OK == PGyro[2]->Gyro_AvailableFlg)))//单陀螺可用
{
for(i=0;i<3;i++)
{
if(POSE_OK == PGyro[i]->Gyro_AvailableFlg)
{
memcpy(pDeter->Wi, PGyro[i]->Gyro_Wi, 3*sizeof(TYPE_CAL));//输出角速度
pDeter->Wi_Vld=POSE_OK;
pDeter->AttDeter_Type= pDeter->AttDeter_Type | (0x01<<i) ;
break;
}
}
}
//else if((PGyro[0]->Gyro_AvailableFlg + PGyro[1]->Gyro_AvailableFlg + PGyro[2]->Gyro_AvailableFlg)==0xAA)//两陀螺可用
else if(((POSE_OK == PGyro[0]->Gyro_AvailableFlg)&&(POSE_OK == PGyro[1]->Gyro_AvailableFlg )&&(POSE_NO == PGyro[2]->Gyro_AvailableFlg))||
((POSE_OK == PGyro[0]->Gyro_AvailableFlg)&&(POSE_NO == PGyro[1]->Gyro_AvailableFlg )&&(POSE_OK == PGyro[2]->Gyro_AvailableFlg))||
((POSE_NO == PGyro[0]->Gyro_AvailableFlg)&&(POSE_OK == PGyro[1]->Gyro_AvailableFlg )&&(POSE_OK == PGyro[2]->Gyro_AvailableFlg)))
{
pDeter->Wi_Vld=POSE_OK;
if ((POSE_OK == PGyro[0]->Gyro_AvailableFlg)&&(POSE_OK == PGyro[1]->Gyro_AvailableFlg))
{
if (PGyro[0]->GyroPrior >= PGyro[1]->GyroPrior)
{
memcpy(pDeter->Wi, PGyro[0]->Gyro_Wi, 3*sizeof(TYPE_CAL));//输出角速度
pDeter->AttDeter_Type= pDeter->AttDeter_Type | 0x01;
}
else
{
memcpy(pDeter->Wi, PGyro[1]->Gyro_Wi, 3*sizeof(TYPE_CAL));//输出角速度
pDeter->AttDeter_Type= pDeter->AttDeter_Type | 0x02;
}
}
else if ((POSE_OK == PGyro[0]->Gyro_AvailableFlg)&&(POSE_OK == PGyro[2]->Gyro_AvailableFlg))
{
if (PGyro[0]->GyroPrior >= PGyro[2]->GyroPrior)
{
memcpy(pDeter->Wi, PGyro[0]->Gyro_Wi, 3*sizeof(TYPE_CAL));//输出角速度
pDeter->AttDeter_Type= pDeter->AttDeter_Type | 0x01;
}
else
{
memcpy(pDeter->Wi, PGyro[2]->Gyro_Wi, 3*sizeof(TYPE_CAL));//输出角速度
pDeter->AttDeter_Type= pDeter->AttDeter_Type | 0x04;
}
}
else
{
if (PGyro[1]->GyroPrior >= PGyro[2]->GyroPrior)
{
memcpy(pDeter->Wi, PGyro[1]->Gyro_Wi, 3*sizeof(TYPE_CAL));//输出角速度
pDeter->AttDeter_Type= pDeter->AttDeter_Type | 0x02;
}
else
{
memcpy(pDeter->Wi, PGyro[2]->Gyro_Wi, 3*sizeof(TYPE_CAL));//输出角速度
pDeter->AttDeter_Type= pDeter->AttDeter_Type | 0x04;
}
}
}
else if((POSE_OK == PGyro[0]->Gyro_AvailableFlg)&&(POSE_OK == PGyro[1]->Gyro_AvailableFlg )&&(POSE_OK == PGyro[2]->Gyro_AvailableFlg))//三陀螺可用
{
pDeter->Wi_Vld=POSE_OK;
if ((PGyro[0]->GyroPrior == PGyro[1]->GyroPrior)&&(PGyro[0]->GyroPrior == PGyro[2]->GyroPrior))
{
memcpy(pDeter->Wi, PGyro[0]->Gyro_Wi, 3*sizeof(TYPE_CAL));//输出角速度
pDeter->AttDeter_Type= pDeter->AttDeter_Type | 0x01;
}
else
{
if (PGyro[0]->GyroPrior >= PGyro[1]->GyroPrior)
{
if (PGyro[0]->GyroPrior >= PGyro[2]->GyroPrior)
{
memcpy(pDeter->Wi, PGyro[0]->Gyro_Wi, 3*sizeof(TYPE_CAL));//输出角速度
pDeter->AttDeter_Type= pDeter->AttDeter_Type | 0x01;
}
else
{
memcpy(pDeter->Wi, PGyro[2]->Gyro_Wi, 3*sizeof(TYPE_CAL));//输出角速度
pDeter->AttDeter_Type= pDeter->AttDeter_Type | 0x04;
}
}
else
{
if (PGyro[1]->GyroPrior >= PGyro[2]->GyroPrior)
{
memcpy(pDeter->Wi, PGyro[1]->Gyro_Wi, 3*sizeof(TYPE_CAL));//输出角速度
pDeter->AttDeter_Type= pDeter->AttDeter_Type | 0x02;
}
else
{
memcpy(pDeter->Wi, PGyro[2]->Gyro_Wi, 3*sizeof(TYPE_CAL));//输出角速度
pDeter->AttDeter_Type= pDeter->AttDeter_Type | 0x04;
}
}
}
}
else{;}
for(i=0;i<3;i++)
{
tmpAtt->sPerPara.Gyro_ATTWi[i] = pDeter->Wi[i];
}
}
/***********************************************
说明:只用陀螺定姿
***********************************************/
void Gyro_AttDeter(void)
{
sAttPriData *tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
AttCtrlConst_t *tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
GyroPara_t *PGyro[GYRO_NUM];
sAttDeterPara_t *pDeter =NULL;
//tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
//tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
if((NULL==tmpAtt) || (NULL==tmpConst))
{return;}
PGyro[0] = &tmpAtt->sPerPara.GyroPara[0];
PGyro[1] = &tmpAtt->sPerPara.GyroPara[1];
PGyro[2] = &tmpAtt->sPerPara.GyroPara[2];
pDeter=&tmpAtt->sDeterPara;
//if ((PGyro[0]->Gyro_AvailableFlg + PGyro[1]->Gyro_AvailableFlg + PGyro[2]->Gyro_AvailableFlg) >= 0x55)
if ((POSE_OK == PGyro[0]->Gyro_AvailableFlg) || (POSE_OK == PGyro[1]->Gyro_AvailableFlg)||(POSE_OK == PGyro[2]->Gyro_AvailableFlg))
{
Gyro_AttChoice();
}
else if (POSE_OK == tmpAtt->sPerPara.GyroIn_Comb)
{
memcpy(pDeter->Wi, tmpAtt->sPerPara.GyroIn_CombWi, 3*sizeof(TYPE_CAL));//输出角速度
pDeter->Wi_Vld=POSE_OK;
pDeter->AttDeter_Type= pDeter->AttDeter_Type | 0x08;
}else{;}
if(POSE_OK == pDeter->QiPre_Vld)//前次姿态有效
{
AttLongKutaCal(pDeter->WiPre, pDeter->QiPre, pDeter->Qi);//积分算四元数
pDeter->Qi_Vld=POSE_OK;
pDeter->AttDeter_Type= pDeter->AttDeter_Type | 0x10;
if (pDeter->GyroINT_Time<60000)
{
pDeter->GyroINT_Time++;
}
if (pDeter->GyroINT_Time > (tmpConst->GyroINT_TLimt*2) )
{
pDeter->Qi_Vld=POSE_NO;
pDeter->AttDeter_Type= pDeter->AttDeter_Type & 0xEF;
}
}
else//前次姿态无效
{
pDeter->Qi_Vld=POSE_NO;
pDeter->AttDeter_Type= pDeter->AttDeter_Type & 0xEF;
pDeter->GyroINT_Time= 0;
}
}
/***********************************************
说明:星敏差分计算角速度
输入:星敏四元数,上周期四元数
输出:角速度
***********************************************/
void QuatDiffCal(TYPE_CAL * pQ_now, TYPE_CAL * pQ_pre, TYPE_CAL * pW)
{
TYPE_CAL tmpDeltQ[4] ={0.0};
TYPE_CAL tmpMatQuat[12] ={0.0};
TYPE_CAL tmpMatDeltQ[4] ={0.0};
UINT8 i =0;
if(CalPFlag(pQ_now[3])==CalPFlag(pQ_pre[3]))
{
for(i=0;i<4;i++)
{tmpDeltQ[i] = pQ_now[i] - pQ_pre[i];}
}
else//应该不会出现这种情况吧
{
for(i=0;i<4;i++)
{tmpDeltQ[i] = -pQ_now[i] - pQ_pre[i];}
}
tmpMatQuat[0] = -pQ_pre[0];
tmpMatQuat[1] = pQ_pre[3];
tmpMatQuat[2] = pQ_pre[2];
tmpMatQuat[3] = -pQ_pre[1];
tmpMatQuat[4] = -pQ_pre[1];
tmpMatQuat[5] = -pQ_pre[2];
tmpMatQuat[6] = pQ_pre[3];
tmpMatQuat[7] = pQ_pre[0];
tmpMatQuat[8] = -pQ_pre[2];
tmpMatQuat[9] = pQ_pre[1];
tmpMatQuat[10] = -pQ_pre[0];
tmpMatQuat[11] = pQ_pre[3];
tmpMatDeltQ[0] = tmpDeltQ[3] / ATTPERIOD_S;
tmpMatDeltQ[1] = tmpDeltQ[0] / ATTPERIOD_S;
tmpMatDeltQ[2] = tmpDeltQ[1] / ATTPERIOD_S;
tmpMatDeltQ[3] = tmpDeltQ[2] / ATTPERIOD_S;
MatrixPlusVectorN(tmpMatQuat, tmpMatDeltQ, pW, 3, 4);
for (i = 0; i < 3; ++i)
{
pW[i] *= 2.0f;
}
}
/***********************************************
说明:使用陀螺确定角度,陀螺不可用,使用星敏差分的方式计算角度
***********************************************/
void SsGyro_AngDeter(void)
{
sAttPriData *tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
GyroPara_t *PGyro[GYRO_NUM];
sAttDeterPara_t *pDeter =NULL;
// tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
if(NULL == tmpAtt)
{return;}
PGyro[0] = &tmpAtt->sPerPara.GyroPara[0];
PGyro[1] = &tmpAtt->sPerPara.GyroPara[1];
PGyro[2] = &tmpAtt->sPerPara.GyroPara[2];
pDeter=&tmpAtt->sDeterPara;
//if ((PGyro[0]->Gyro_AvailableFlg + PGyro[1]->Gyro_AvailableFlg + PGyro[2]->Gyro_AvailableFlg) >= 0x55)
if ((POSE_OK == PGyro[0]->Gyro_AvailableFlg) || (POSE_OK == PGyro[1]->Gyro_AvailableFlg)||(POSE_OK == PGyro[2]->Gyro_AvailableFlg))
{
Gyro_AttChoice();
}
else if (POSE_OK == tmpAtt->sPerPara.GyroIn_Comb)
{
memcpy(pDeter->Wi, tmpAtt->sPerPara.GyroIn_CombWi, 3*sizeof(TYPE_CAL));//输出角速度
pDeter->Wi_Vld=POSE_OK;
pDeter->AttDeter_Type= pDeter->AttDeter_Type | 0x08;
}
else if(POSE_OK == pDeter->QiPre_Vld)//前次姿态有效
{
QuatDiffCal(pDeter->Qi, pDeter->QiPre, pDeter->Wi);//差分计算角速度
pDeter->Wi_Vld = POSE_OK;
pDeter->AttDeter_Type= pDeter->AttDeter_Type | 0x10;
}
else
{
//pDeter->Wi_Vld = POSE_NO;
//pDeter->AttDeter_Type= pDeter->AttDeter_Type & 0xEF;
;
}
}
/***********************************************
说明:星敏陀螺定姿
输入:星敏,陀螺单元数据
输出:惯性系四元数/角速度,惯性系四元数/角速度有效标志
***********************************************/
void SsGyro_AttDeter(void)
{
UINT8 i =0;
TYPE_CAL tmpRbi[9] ={0.0};
sAttPriData *tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
AttCtrlConst_t *tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
GyroPara_t *PGyro[GYRO_NUM];
SsPara_t *PStar[STAR_NUM];
sAttDeterPara_t *pDeter =NULL;
AttIMPTPara_t *pImpt =NULL;
sAttModPara_t *pWMod =NULL;
PPUPara_t *PPPU =NULL;
//tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
//tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
if((NULL==tmpAtt) || (NULL==tmpConst))
{return;}
PGyro[0] = &tmpAtt->sPerPara.GyroPara[0];
PGyro[1] = &tmpAtt->sPerPara.GyroPara[1];
PGyro[2] = &tmpAtt->sPerPara.GyroPara[2];
PStar[0] = &tmpAtt->sPerPara.SsPara[0];
PStar[1] = &tmpAtt->sPerPara.SsPara[1];
PStar[2] = &tmpAtt->sPerPara.SsPara[2];
pDeter=&tmpAtt->sDeterPara;
pImpt=&tmpAtt->sIMPTPara;
pWMod =&tmpAtt->sModePara;
PPPU = &tmpAtt->sPerPara.PPUPara;
//记录前次结果
pDeter->QiPre_Vld=pDeter->Qi_Vld;
memcpy(pDeter->QiPre,pDeter->Qi,4*sizeof(TYPE_CAL));
memcpy(pDeter->WiPre,pDeter->Wi,3*sizeof(TYPE_CAL));
//初始化
pDeter->Qi_Vld=0;
pDeter->Wi_Vld=0;
memset(pDeter->Qi, 0, 4*sizeof(TYPE_CAL));
memset(pDeter->Wi, 0, 3*sizeof(TYPE_CAL));
pDeter->AttDeter_Type=0;
//获取星敏优先级
PStar[0]->ssPrior=tmpConst->SSUsePrior[0];
PStar[1]->ssPrior=tmpConst->SSUsePrior[1];
PStar[2]->ssPrior=tmpConst->SSUsePrior[2];
#ifdef MINMODULE_TYPE
//判断星敏ABC是否可用
for(i=0;i<STAR_NUM;i++)
{
PStar[i]->ssAvailableFlg=POSE_NO;
if((pImpt->SSUseState[i]==POSE_OK) && (PStar[i]->ssIn_AttVld==POSE_OK) )
{PStar[i]->ssAvailableFlg=POSE_OK;}
}
#else
//判断星敏ABC是否可用
for(i=0;i<STAR_NUM;i++)
{
PStar[i]->ssAvailableFlg=POSE_NO;
if((pImpt->SSUseState[i]==POSE_OK) && (PStar[i]->ssIn_AttVld==POSE_OK) && (PStar[i]->ssCrCheckFlg!=CC_ERROR))
{PStar[i]->ssAvailableFlg=POSE_OK;}
}
#endif
//获取陀螺优先级
PGyro[0]->GyroPrior=tmpConst->GyroUsePrior[0];
PGyro[1]->GyroPrior=tmpConst->GyroUsePrior[1];
PGyro[2]->GyroPrior=tmpConst->GyroUsePrior[2];
#ifdef MINMODULE_TYPE
//判断陀螺是否可用
for(i=0;i<GYRO_NUM;i++)
{
PGyro[i]->Gyro_AvailableFlg=POSE_NO;
if((pImpt->GyroUseState[i]==POSE_OK)&&(PGyro[i]->GyroIn_AttVld==POSE_OK))
{PGyro[i]->Gyro_AvailableFlg=POSE_OK;}
}
#else
//判断陀螺是否可用
for(i=0;i<GYRO_NUM;i++)
{
PGyro[i]->Gyro_AvailableFlg=POSE_NO;
if((pImpt->GyroUseState[i]==POSE_OK)&&(PGyro[i]->GyroIn_AttVld==POSE_OK)&&(PGyro[i]->GyroCrCheckFlg!=CC_ERROR))
{PGyro[i]->Gyro_AvailableFlg=POSE_OK;}
}
#endif
//if((PStar[0]->ssAvailableFlg + PStar[1]->ssAvailableFlg + PStar[2]->ssAvailableFlg)==0)//无星敏可用
if((POSE_NO == PStar[0]->ssAvailableFlg)&&(POSE_NO == PStar[1]->ssAvailableFlg)&&(POSE_NO == PStar[2]->ssAvailableFlg))//无星敏可用
{
//if ((PGyro[0]->Gyro_AvailableFlg + PGyro[1]->Gyro_AvailableFlg + PGyro[2]->Gyro_AvailableFlg) >= 0x55 ||( POSE_OK == tmpAtt->sPerPara.GyroIn_Comb)) //陀螺可用
if (((POSE_OK == PGyro[0]->Gyro_AvailableFlg) || (POSE_OK == PGyro[1]->Gyro_AvailableFlg) || (POSE_OK == PGyro[2]->Gyro_AvailableFlg)) ||( POSE_OK == tmpAtt->sPerPara.GyroIn_Comb)) //陀螺可用
{
//只用陀螺定姿
Gyro_AttDeter();
}
else
{
//星敏陀螺均不可用
pDeter->Qi_Vld=0;
pDeter->Wi_Vld=0;
pDeter->AttDeter_Type=0;
}
}
//else if((PStar[0]->ssAvailableFlg + PStar[1]->ssAvailableFlg + PStar[2]->ssAvailableFlg)==0x55)//单星敏可用
else if(((POSE_OK == PStar[0]->ssAvailableFlg)&&(POSE_NO == PStar[1]->ssAvailableFlg)&&(POSE_NO == PStar[2]->ssAvailableFlg))||
((POSE_NO == PStar[0]->ssAvailableFlg)&&(POSE_OK == PStar[1]->ssAvailableFlg)&&(POSE_NO == PStar[2]->ssAvailableFlg))||
((POSE_NO == PStar[0]->ssAvailableFlg)&&(POSE_NO == PStar[1]->ssAvailableFlg)&&(POSE_OK == PStar[2]->ssAvailableFlg)))//单星敏可用
{
pDeter->GyroINT_Time = 0;
//输出姿态四元数
for(i=0;i<3;i++)
{
if(POSE_OK == PStar[i]->ssAvailableFlg)
{
memcpy(pDeter->Qi, PStar[i]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(pDeter->Wi, PStar[i]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Qi, PStar[i]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Wi, PStar[i]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
pDeter->Qi_Vld=0x55;
pDeter->Wi_Vld=0x55;
pDeter->AttDeter_Type= pDeter->AttDeter_Type |(0x20<<i) ;
break;
}
}
SsGyro_AngDeter();//确定角速度
}
//else if((PStar[0]->ssAvailableFlg + PStar[1]->ssAvailableFlg + PStar[2]->ssAvailableFlg)==0xAA)//两星敏可用
else if (((POSE_OK == PStar[0]->ssAvailableFlg)&&(POSE_OK == PStar[1]->ssAvailableFlg)&&(POSE_NO == PStar[2]->ssAvailableFlg))||
((POSE_OK == PStar[0]->ssAvailableFlg)&&(POSE_NO == PStar[1]->ssAvailableFlg)&&(POSE_OK == PStar[2]->ssAvailableFlg))||
((POSE_NO == PStar[0]->ssAvailableFlg)&&(POSE_OK == PStar[1]->ssAvailableFlg)&&(POSE_OK == PStar[2]->ssAvailableFlg)))//两星敏可用
{
pDeter->GyroINT_Time = 0;
pDeter->Qi_Vld=0x55;
pDeter->Wi_Vld=0x55;
if ((POSE_OK == PStar[0]->ssAvailableFlg)&&(POSE_OK == PStar[1]->ssAvailableFlg))
{
if (PStar[0]->ssPrior >= PStar[1]->ssPrior)
{
memcpy(pDeter->Qi, PStar[0]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(pDeter->Wi, PStar[0]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Qi, PStar[0]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Wi, PStar[0]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
pDeter->AttDeter_Type= pDeter->AttDeter_Type |0x20 ;
}
else
{
memcpy(pDeter->Qi, PStar[1]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(pDeter->Wi, PStar[1]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Qi, PStar[1]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Wi, PStar[1]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
pDeter->AttDeter_Type= pDeter->AttDeter_Type |0x40 ;
}
}
else if ((POSE_OK == PStar[0]->ssAvailableFlg)&&(POSE_OK == PStar[2]->ssAvailableFlg))
{
if (PStar[0]->ssPrior >= PStar[2]->ssPrior)
{
memcpy(pDeter->Qi, PStar[0]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(pDeter->Wi, PStar[0]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Qi, PStar[0]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Wi, PStar[0]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
pDeter->AttDeter_Type= pDeter->AttDeter_Type |0x20 ;
}
else
{
memcpy(pDeter->Qi, PStar[2]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(pDeter->Wi, PStar[2]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Qi, PStar[2]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Wi, PStar[2]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
pDeter->AttDeter_Type= pDeter->AttDeter_Type |0x80 ;
}
}
else
{
if (PStar[1]->ssPrior >= PStar[2]->ssPrior)
{
memcpy(pDeter->Qi, PStar[1]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(pDeter->Wi, PStar[1]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Qi, PStar[1]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Wi, PStar[1]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
pDeter->AttDeter_Type= pDeter->AttDeter_Type |0x40 ;
}
else
{
memcpy(pDeter->Qi, PStar[2]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(pDeter->Wi, PStar[2]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Qi, PStar[2]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Wi, PStar[2]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
pDeter->AttDeter_Type= pDeter->AttDeter_Type |0x80 ;
}
}
SsGyro_AngDeter();//确定角速度
}
//else if((PStar[0]->ssAvailableFlg + PStar[1]->ssAvailableFlg + PStar[2]->ssAvailableFlg)==0xFF)//三星敏可用
else if((POSE_OK == PStar[0]->ssAvailableFlg)&& (POSE_OK == PStar[1]->ssAvailableFlg)&& (POSE_OK == PStar[2]->ssAvailableFlg))//三星敏可用
{
pDeter->GyroINT_Time = 0;
pDeter->Qi_Vld=0x55;
pDeter->Wi_Vld=0x55;
if ((PStar[0]->ssPrior == PStar[1]->ssPrior)&&(PStar[0]->ssPrior == PStar[2]->ssPrior))
{
memcpy(pDeter->Qi, PStar[0]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(pDeter->Wi, PStar[0]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Qi, PStar[0]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Wi, PStar[0]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
pDeter->AttDeter_Type= pDeter->AttDeter_Type |0x20 ;
}
else
{
if (PStar[0]->ssPrior >= PStar[1]->ssPrior)
{
if (PStar[0]->ssPrior >= PStar[2]->ssPrior)
{
memcpy(pDeter->Qi, PStar[0]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(pDeter->Wi, PStar[0]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Qi, PStar[0]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Wi, PStar[0]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
pDeter->AttDeter_Type= pDeter->AttDeter_Type |0x20 ;
}
else
{
memcpy(pDeter->Qi, PStar[2]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(pDeter->Wi, PStar[2]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Qi, PStar[2]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Wi, PStar[2]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
pDeter->AttDeter_Type= pDeter->AttDeter_Type |0x80 ;
}
}
else
{
if (PStar[1]->ssPrior >= PStar[2]->ssPrior)
{
memcpy(pDeter->Qi, PStar[1]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(pDeter->Wi, PStar[1]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Qi, PStar[1]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Wi, PStar[1]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
pDeter->AttDeter_Type= pDeter->AttDeter_Type |0x40 ;
}
else
{
memcpy(pDeter->Qi, PStar[2]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(pDeter->Wi, PStar[2]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Qi, PStar[2]->ssExpose_Qbi, 4*sizeof(TYPE_CAL));
memcpy(tmpAtt->sPerPara.Ss_Wi, PStar[2]->ssExpose_Wbi, 3*sizeof(TYPE_CAL));
pDeter->AttDeter_Type= pDeter->AttDeter_Type |0x80 ;
}
}
}
SsGyro_AngDeter();//确定角速度
}else{;}
//#ifdef MINMODULE_TYPE
//;
//#else
#ifndef MINMODULE_TYPE
GetTime(pDeter->SatTime);
//计数轨控推力器加速度
if((POSE_OK == pDeter->Qi_Vld)&& (ATTMOD_ORBITCTL == pWMod->WorkMode ) &&(0x01 == PPPU->PPUIn_FIREOK))
{
Q2Att(pDeter->Qi, tmpRbi);
MatrixProductHL(tmpRbi, tmpConst->AccThru_Up, pDeter->Ai, 3, 3, 1);
pDeter->PPUVld = POSE_OK;
}
else
{
pDeter->Ai[0] = 0;
pDeter->Ai[1] = 0;
pDeter->Ai[2] = 0;
pDeter->PPUVld = POSE_NO;
}
#endif
}
/***********************************************
说明:利用星敏+模拟太敏,计算卫星+Xb\+Yb\-Zb轴对日太阳角
***********************************************/
void Cal_AngToSun(void)
{
TYPE_CAL tmpRbi[9] ={0.0};
sAttPriData *tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
//AttCtrlConst_t *tmpConst;
sAttDeterPara_t *pDeter= NULL;
sAttModPara_t *pWMod= NULL;
sAttDataPrePara_t *pDataPre= NULL;
sAttOrbitGetPara_t *pOrbit = NULL;
//tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
if(tmpAtt==NULL)
{return;}
//tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
pDeter=&tmpAtt->sDeterPara;
pWMod=&tmpAtt->sModePara;
pDataPre=&tmpAtt->sPerPara ;
pOrbit = &tmpAtt->sOrbitPara;
//初始化
if((POSE_OK == pDeter->Qi_Vld)&&(POSE_OK == pOrbit->MJCLv)) //使用星敏且星敏可用
{
Q2Att(pDeter->Qi, tmpRbi);
MatrixProductHL(tmpRbi, tmpAtt->sEnvPara.SunVecI, pDeter->SunVecb, 3, 3, 1);
pDeter->CalAngToSun_Source=0x55;
pDeter->AngToSun_ValidFlg=0x55;
}
else if ((POSE_OK == pDataPre->AssPara.Ass_SunVecVld)&&(CC_ERROR!= pDataPre->AssPara.AssCrCheckFlg))//太敏可用
{
memcpy(pDeter->SunVecb, pDataPre->AssPara.Ass_SunVecb, 3*sizeof(TYPE_CAL));
pDeter->CalAngToSun_Source=0xAA;
pDeter->AngToSun_ValidFlg=0x55;
}
else
{
pDeter->CalAngToSun_Source=0x00;
pDeter->AngToSun_ValidFlg=0;
}
if (ATTMOD_MagTOSUN == pWMod->WorkMode)
{
if ((POSE_OK !=pWMod->WModSadaOpen))
{
//计算-Z轴对日太阳角
if (POSE_OK == pDeter->AngToSun_ValidFlg)
{
pDeter->AngToSun[0]= -POSE_ATAN2F(pDeter->SunVecb[1],-pDeter->SunVecb[2]);
pDeter->AngToSun[1]= POSE_ATAN2F(pDeter->SunVecb[0],-pDeter->SunVecb[2]);
pDeter->AngToSun[2]=0.0f;
}
else
{
pDeter->AngToSun[0]=0.0f;
pDeter->AngToSun[1]=0.0f;
pDeter->AngToSun[2]=0.0f;
}
}
else
{
//计算+Y轴对日太阳角
if (POSE_OK == pDeter->AngToSun_ValidFlg)
{
pDeter->AngToSun[0]= -POSE_ATAN2F(pDeter->SunVecb[2],pDeter->SunVecb[1]);
pDeter->AngToSun[1]=0.0f;
pDeter->AngToSun[2]= POSE_ATAN2F(pDeter->SunVecb[0],pDeter->SunVecb[1]);
}
else
{
pDeter->AngToSun[0]=0.0f;
pDeter->AngToSun[1]=0.0f;
pDeter->AngToSun[2]=0.0f;
}
}
}
else if (ATTMOD_WhlTOSUN == pWMod->WorkMode)
{
if ((POSE_OK!= pWMod->WModSadaOpen))
{
//计算-Z轴对日太阳角
if (POSE_OK ==pDeter->AngToSun_ValidFlg)
{
pDeter->AngToSun[0]= -POSE_ATAN2F(pDeter->SunVecb[1],-pDeter->SunVecb[2]);
pDeter->AngToSun[1]= POSE_ATAN2F(pDeter->SunVecb[0],-pDeter->SunVecb[2]);
pDeter->AngToSun[2]=0.0f;
}
else
{
pDeter->AngToSun[0]=0.0f;
pDeter->AngToSun[1]=0.0f;
pDeter->AngToSun[2]=0.0f;
}
}
else
{
//计算X轴对日太阳角
if (POSE_OK == pDeter->AngToSun_ValidFlg)
{
pDeter->AngToSun[0]= 0.0f;
pDeter->AngToSun[1]= POSE_ATAN2F(pDeter->SunVecb[2],pDeter->SunVecb[0]);
pDeter->AngToSun[2]=- POSE_ATAN2F(pDeter->SunVecb[1],pDeter->SunVecb[0]);
}
else
{
pDeter->AngToSun[0]=0.0f;
pDeter->AngToSun[1]=0.0f;
pDeter->AngToSun[2]=0.0f;
}
}
}
else if (ATTMOD_UNCTL == pWMod->WorkMode)
{
//计算-Z轴对日太阳角
if (POSE_OK == pDeter->AngToSun_ValidFlg)
{
pDeter->AngToSun[0]= -POSE_ATAN2F(pDeter->SunVecb[1],-pDeter->SunVecb[2]);
pDeter->AngToSun[1]= POSE_ATAN2F(pDeter->SunVecb[0],-pDeter->SunVecb[2]);
pDeter->AngToSun[2]=0.0f;
}
else
{
pDeter->AngToSun[0]=0.0f;
pDeter->AngToSun[1]=0.0f;
pDeter->AngToSun[2]=0.0f;
}
}else{;}
}
/***********************************************
说明:本体系磁场强度计算
***********************************************/
//磁场计算系磁场强度
void DertCalcBb(void)
{
UINT8 i =0;
UINT32 tmpCNT = 0;
sAttPriData *tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
//AttCtrlConst_t *tmpConst;
MagPara_t *pMag =NULL;
MtPara_t *pMt =NULL;
sAttEnvPara_t *pEnv =NULL;
sAttModPara_t *pWMod =NULL;
AttIMPTPara_t *pImpt =NULL;
//tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
if(tmpAtt==NULL)
{return;}
//tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
pMag=&tmpAtt->sPerPara.MagPara;
pMt=&tmpAtt->sPerPara.MtPara;
pEnv = &tmpAtt->sEnvPara;
pWMod=&tmpAtt->sModePara;
pImpt=&tmpAtt->sIMPTPara;
//判断磁强计是否可用
for(i=0;i<MAG_NUM;i++)
{
pMag->MagAvailableFlg[i]=POSE_NO;
if((pImpt->MagUseState[i]==POSE_OK) && (pMag->MagIn_Valid[i] ==POSE_OK) && (pMag->MagCrCheckFlg[i]!=CC_ERROR))
{pMag->MagAvailableFlg[i]=POSE_OK;}
}
//tmpCNT = pMt-> MTCtrlTime % tmpConst->MTCtrlClc;
tmpCNT = pMt-> MTCtrlTime % 10;
if ((1 == tmpCNT)||(0x88 == pMag->MagUseSwich))
{
memcpy(pMag->Mag_BbPre, pMag->Mag_Bb, 3*sizeof(TYPE_CAL));
pMag->Mag_UsePre = pMag->Mag_Use;
}
#ifdef MINMODULE_TYPE
if ( POSE_OK == pMag->MagAvailableFlg[0])
{
if (1 == tmpCNT)
{
memcpy(pMag->Mag_Bb, pMag->Mag_Bb_MeaAB[0], 3*sizeof(TYPE_CAL));
}
pMag->Mag_Use =POSE_OK;
pMag->MagUseSwich = 0x11;
}
else if (POSE_OK == pMag->MagAvailableFlg[1])
{
if (1 == tmpCNT)
{
memcpy(pMag->Mag_Bb, pMag->Mag_Bb_MeaAB[1], 3*sizeof(TYPE_CAL));
}
pMag->Mag_Use =POSE_OK;
pMag->MagUseSwich = 0x22;
}
else if (POSE_OK == pMag->MagIn_Valid[2])
{
if (1 == tmpCNT)
{
memcpy(pMag->Mag_Bb, pMag->Mag_Bb_MeaZH, 3*sizeof(TYPE_CAL));
}
pMag->Mag_Use =POSE_OK;
pMag->MagUseSwich = 0x44;
}
else
{
memset(pMag->Mag_Bb,0.0,3*sizeof(TYPE_CAL));
pMag->Mag_Use =POSE_NO;
pMag->MagUseSwich =POSE_NO;
}
#else
if ((ATTMOD_RATEDMP == pWMod->WorkMode)|| (ATTMOD_MagTOSUN == pWMod->WorkMode))
{
if ( POSE_OK == pMag->MagAvailableFlg[0])
{
if (1 == tmpCNT)
{
memcpy(pMag->Mag_Bb, pMag->Mag_Bb_MeaAB[0], 3*sizeof(TYPE_CAL));
}
pMag->Mag_Use =POSE_OK;
pMag->MagUseSwich = 0x11;
}
else if (POSE_OK == pMag->MagAvailableFlg[1])
{
if (1 == tmpCNT)
{
memcpy(pMag->Mag_Bb, pMag->Mag_Bb_MeaAB[1], 3*sizeof(TYPE_CAL));
}
pMag->Mag_Use =POSE_OK;
pMag->MagUseSwich = 0x22;
}
else if (POSE_OK==pMag->MagIn_Valid[2])
{
if (1 == tmpCNT)
{
memcpy(pMag->Mag_Bb, pMag->Mag_Bb_MeaZH, 3*sizeof(TYPE_CAL));
}
pMag->Mag_Use =POSE_OK;
pMag->MagUseSwich = 0x44;
}
else if (POSE_OK == pEnv->fvIn_Valid)
{
memcpy(pMag->Mag_Bb, pEnv->fvBb, 3*sizeof(TYPE_CAL));
pMag->Mag_Use =POSE_OK;
pMag->MagUseSwich = 0x88;
}
else
{
memset(pMag->Mag_Bb,0.0,3*sizeof(TYPE_CAL));
pMag->Mag_Use =POSE_NO;
pMag->MagUseSwich =POSE_NO;
}
}
else
{
if (POSE_OK == pEnv->fvIn_Valid)
{
memcpy(pMag->Mag_Bb, pEnv->fvBb, 3*sizeof(TYPE_CAL));
pMag->Mag_Use =POSE_OK;
pMag->MagUseSwich = 0x88;
}
else if (POSE_OK == pMag->MagAvailableFlg[0])
{
if (1 == tmpCNT)
{
memcpy(pMag->Mag_Bb, pMag->Mag_Bb_MeaAB[0], 3*sizeof(TYPE_CAL));
}
pMag->Mag_Use =POSE_OK;
pMag->MagUseSwich = 0x11;
}
else if (POSE_OK == pMag->MagAvailableFlg[1])
{
if (1 == tmpCNT)
{
memcpy(pMag->Mag_Bb, pMag->Mag_Bb_MeaAB[1], 3*sizeof(TYPE_CAL));
}
pMag->Mag_Use =POSE_OK;
pMag->MagUseSwich = 0x22;
}
else if (POSE_OK==pMag->MagIn_Valid[2])
{
if (1 == tmpCNT)
{
memcpy(pMag->Mag_Bb, pMag->Mag_Bb_MeaZH, 3*sizeof(TYPE_CAL));
}
pMag->Mag_Use = POSE_OK;
pMag->MagUseSwich = 0x44;
}
else
{
memset(pMag->Mag_Bb,0.0,3*sizeof(TYPE_CAL));
pMag->Mag_Use =POSE_NO;
pMag->MagUseSwich =POSE_NO;
}
}
if (POSE_OK == pMag->Mag_Use)
{
for(i=0; i<3; i++)
{pMag->Mag_UBb[i] = pMag->Mag_Bb[i] ;}
unitary( &pMag->Mag_UBb[0], 3 ); // 归一化
}
#endif
}
/***********************************************
说明:计算轨道系下姿态、角速度、太阳矢量
***********************************************/
void AttDeterOrb(void)
{
TYPE_CAL tmpRbi[9] ={0.0}, tmpRoi[9] ={0.0}, tmpRio[9] ={0.0}, tmpRbo[9] ={0.0};
TYPE_CAL tmpWoi[3] ={0.0};
TYPE_CAL tmpWbo[3] ={0.0};
sAttPriData *tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
sAttDeterPara_t *pDeter =NULL;
sAttOrbitGetPara_t *pOrbitIn =NULL;
// tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
if(tmpAtt==NULL)
{return;}
pDeter=&tmpAtt->sDeterPara;
pOrbitIn=&tmpAtt->sOrbitPara;
if((0 == pDeter->Qi_Vld)||(0 == pOrbitIn->OrbitVld))
{
pDeter->AttOrb_Vld=0;
return;
}
pDeter->AttOrb_Vld=0x55;
//计算轨道系姿态角
Q2Att(pDeter->Qi, tmpRbi);
CalTransMatrix_IO(pOrbitIn->JPos, pOrbitIn->JVel, tmpRoi);
MatrixTransposeHL(tmpRoi, tmpRio, 3, 3);
MatrixProductHL(tmpRbi, tmpRio, tmpRbo, 3, 3, 3);
Matrix2Eul312A(tmpRbo, pDeter->AttAngOrb);
//计算卫星轨道系四元素
Eul312A2Quat(pDeter->AttAngOrb, pDeter->Qo);
//计算轨道系太阳矢量
MatrixProductHL(tmpRoi, tmpAtt->sEnvPara.SunVecI, pDeter->SunVeco, 3, 3, 1);
if(0 == pDeter->Wi_Vld)
{
return;
}
//计算姿态角速度
AglSpdOofICal(pOrbitIn->JPos, pOrbitIn->JVel, tmpWoi);
//pDeter->OrbAttRate_Wo = tmpWoi[1];
MatrixProductHL(tmpRbo, tmpWoi, tmpWbo, 3, 3, 1);
tmpWbo[0]=pDeter->Wi[0]-tmpWbo[0];
tmpWbo[1]=pDeter->Wi[1]-tmpWbo[1];
tmpWbo[2]=pDeter->Wi[2]-tmpWbo[2];
memcpy(pDeter->AttRateOrb,tmpWbo,3*sizeof(TYPE_CAL));
}
/***********************************************
说明:计算轨控参考系姿态
***********************************************/
void AttDeterOrbCtrl(void)
{
TYPE_CAL tmpRbo[9] ={0.0},tmpRCo[9] ={0.0},tmpRoC[9] ={0.0},tmpRbc[9] ={0.0};//轨道系到轨道系欧拉角,旋转矩阵
sAttPriData *tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
sAttOrbitCtlInfo_t *pOrb =NULL;
sAttDeterPara_t *pDeter =NULL;
//tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
if(NULL == tmpAtt)
{return;}
pOrb=&tmpAtt->sOrbitInp;
pDeter=&tmpAtt->sDeterPara;
pDeter->AttOrbCtrl_Vld=0;
memset(pDeter->AttAngOrbCtrl,0.0,3*sizeof(TYPE_CAL));
memset(pDeter->AttRateOrbCtrl,0.0,3*sizeof(TYPE_CAL));
//如果当前工作模式不为轨控调姿0X66或轨控0X77或轨控后0X8退出
//如卫星轨道系姿态有效标志为无效
if((ATTMOD_ATTAJUSTPRE!= tmpAtt->sModePara.WorkMode)&&(ATTMOD_ORBITCTL!= tmpAtt->sModePara.WorkMode))
{return;}
if (0x55 == pDeter->AttOrb_Vld)
{
pDeter->AttOrbCtrl_Vld=0x55;
}
else
{
pDeter->AttOrbCtrl_Vld = 0x00;
return;
}
//获取卫星目标调姿姿态
memcpy(pDeter->AttAngTar,pOrb->OrbCtrlPackCur.OrbCtrAng,3*sizeof(TYPE_CAL));
//由卫星轨道系四元数Qbo得到转换矩阵Rbo
Q2Att(pDeter->Qo, tmpRbo);
//轨道系到轨控调整角转移矩阵RCo
Att2M(pDeter->AttAngTar, tmpRCo);
MatrixTransposeHL(tmpRCo, tmpRoC, 3, 3);
//轨控参考系转换矩阵
MatrixProductHL(tmpRbo, tmpRoC, tmpRbc, 3, 3, 3);
//轨控参考系姿态角
Matrix2Eul312A(tmpRbc, pDeter->AttAngOrbCtrl);
//卫星轨控参考系角速度即为卫星轨道系角速度
memcpy(pDeter->AttRateOrbCtrl,pDeter->AttRateOrb,3*sizeof(TYPE_CAL));
}
/***********************************************
说明:计算目标参考系姿态
***********************************************/
void AttDeterTarRe(void)
{
sAttPriData *tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
sAttDeterPara_t *pDeter =NULL;
sAttModPara_t *pWMod =NULL;
sAttTARCCtlInfo_t *pTAR =NULL;
//sAttOrbitCtlInfo_t *pOrb;
//tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
if(tmpAtt==NULL)
{return;}
pDeter=&tmpAtt->sDeterPara;
pWMod=&tmpAtt->sModePara;
pTAR=&tmpAtt->sTARCInp;
//pOrb=&tmpAtt->sTARCInp;
TYPE_CAL tmpRbo[9] ={0.0},tmpRCo[9] ={0.0},tmpRoC[9] ={0.0},tmpRbc[9] ={0.0};//轨道系到目标系欧拉角,旋转矩阵
memset(pDeter->AttAngTarRe,0.0,3*sizeof(TYPE_CAL));
memset(pDeter->AttRateTarRe,0.0,3*sizeof(TYPE_CAL));
pDeter->AttTarRe_Vld = 0x00;
//如果当前工作模式为目标定向调姿0X99或目标定向0XAA进行以下计算否则退出。
if((pWMod->WorkMode!=ATTMOD_ATTAJUST)&&(pWMod->WorkMode!=ATTMOD_ONLTOTAR))
{return;}
//如卫星轨道系姿态有效标志为无效,置卫星轨控参考系姿态有效标志为无效,并退出;否则,置标志为有效
if (POSE_OK == pDeter->AttOrb_Vld)
{
pDeter->AttTarRe_Vld = 0x55;
}
else
{
pDeter->AttTarRe_Vld = 0x00;
return;
}
//获取目标调姿姿态
memcpy(pDeter->AttAngTar,pTAR->TARCtrlPackCur.TARCtrAng,3*sizeof(TYPE_CAL));
//由卫星轨道系四元数Qbo得到转换矩阵Rbo
Q2Att(pDeter->Qo, tmpRbo);
//轨道系目标角转移矩阵RCo
Att2M(pDeter->AttAngTar, tmpRCo);
MatrixTransposeHL(tmpRCo, tmpRoC, 3, 3);
//目标参考系转换矩阵
MatrixProductHL(tmpRbo, tmpRoC, tmpRbc, 3, 3, 3);
//目标参考系姿态角
Matrix2Eul312A(tmpRbc, pDeter->AttAngTarRe);
//卫星目标参考系角速度即为卫星轨道系角速度
memcpy(pDeter->AttRateTarRe,pDeter->AttRateOrb,3*sizeof(TYPE_CAL));
}
/***********************************************
说明:闭环姿态确定
输入:模式
输出:闭环姿态,闭环姿态角
***********************************************/
void LoopAttDeter(void)
{
sAttPriData *tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
sAttDeterPara_t *pDeter =NULL;
sAttModPara_t *pWMod =NULL;
MagPara_t *pMag =NULL;
//tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
if(NULL ==tmpAtt)
{return;}
pDeter=&tmpAtt->sDeterPara;
pWMod=&tmpAtt->sModePara;
pMag=&tmpAtt->sPerPara.MagPara;
pDeter->CLPAttValid=0;
memset(pDeter->CLPAttAngRatPre,0.0,3*sizeof(TYPE_CAL));
memcpy(pDeter->CLPAttAngRatPre, pDeter->CLPAttAngRat, 3*sizeof(TYPE_CAL));
memset(pDeter->CLPAttAng, 0.0, 3*sizeof(TYPE_CAL));
memset(pDeter->CLPAttAngRat, 0.0, 3*sizeof(TYPE_CAL));
#ifdef MINMODULE_TYPE
switch (pWMod->WorkMode)
{
case ATTMOD_RATEDMP:
case ATTMOD_MagTOSUN:
if (POSE_OK == pMag->Mag_Use )
{
pDeter->CLPAttValid= 0x55;
memcpy(pDeter->CLPAttAngRat, pDeter->Wi, 3*sizeof(TYPE_CAL));
}
break;
default:
break;
}
#else
switch (pWMod->WorkMode)
{
case ATTMOD_UNCTL:
case ATTMOD_NOCOLL:
if (0x55 == pDeter->Wi_Vld )
{
pDeter->CLPAttValid= 0x55;
memcpy(pDeter->CLPAttAngRat, pDeter->Wi, 3*sizeof(TYPE_CAL));
}
break;
case ATTMOD_RATEDMP: //zmx20231007
case ATTMOD_MagTOSUN:
if (POSE_OK == pMag->Mag_Use)
{
pDeter->CLPAttValid= 0x55;
memcpy(pDeter->CLPAttAngRat, pDeter->Wi, 3*sizeof(TYPE_CAL));
}
break;
case ATTMOD_WhlTOSUN:
if(0x55 == pDeter->Wi_Vld)
{
pDeter->CLPAttValid=0x55; //zmx20231009
memcpy(pDeter->CLPAttAngRat, pDeter->Wi, 3*sizeof(TYPE_CAL));
if (pDeter->AngToSun_ValidFlg==0x55)
{
//pDeter->CLPAttValid=0x55;
pDeter->CLPAttAng[0]=pDeter->AngToSun[0];
pDeter->CLPAttAng[1]=pDeter->AngToSun[1];
pDeter->CLPAttAng[2]=pDeter->AngToSun[2];
}
}
break;
case ATTMOD_ONLTOEARTH:
case ATTMOD_WHEELTOEARTH:
if(0x55 == pDeter->AttOrb_Vld)
{
pDeter->CLPAttValid=0x55;
memcpy(pDeter->CLPAttAng, pDeter->AttAngOrb, 3*sizeof(TYPE_CAL));
memcpy(pDeter->CLPAttAngRat, pDeter->AttRateOrb, 3*sizeof(TYPE_CAL));
}
break;
case ATTMOD_ATTAJUST:
case ATTMOD_ONLTOTAR:
if(0x55 == pDeter->AttTarRe_Vld)
{
pDeter->CLPAttValid=0x55;
memcpy(pDeter->CLPAttAng, pDeter->AttAngTarRe, 3*sizeof(TYPE_CAL));
memcpy(pDeter->CLPAttAngRat, pDeter->AttRateTarRe, 3*sizeof(TYPE_CAL));
}
break;
case ATTMOD_ATTAJUSTPRE:
case ATTMOD_ORBITCTL:
if(0x55 == pDeter->AttOrbCtrl_Vld)
{
pDeter->CLPAttValid=0x55;
memcpy(pDeter->CLPAttAng, pDeter->AttAngOrbCtrl, 3*sizeof(TYPE_CAL));
memcpy(pDeter->CLPAttAngRat, pDeter->AttRateOrbCtrl, 3*sizeof(TYPE_CAL));
}
break;
default:
break;
}
#endif
}
/************************************************
说明:定姿算法接口,每周期调用一次定姿处理,包括数据预处理以及定姿计算
输入wbi:陀螺惯性系姿态角速度 rad/s
startFlag:定姿算法启动标志
返回 :定姿模式1算法惯性系角速度 rad/s
************************************************/
void ZKPGAct(void)
{
#ifdef MINMODULE_TYPE
//姿态变量初始化
ZKPGInit();
//星敏陀螺定姿
SsGyro_AttDeter();
//磁场计算系磁场强度
DertCalcBb();
//计算卫星-Zb轴对日太阳角
Cal_AngToSun();
//闭环姿态确定
LoopAttDeter();
#else
//姿态变量初始化
ZKPGInit();
//星敏陀螺定姿
SsGyro_AttDeter();
//磁场计算系磁场强度
DertCalcBb();
//计算卫星-Zb轴对日太阳角
Cal_AngToSun();
//printf("ZL0\n");
//计算轨道系姿态
AttDeterOrb();
//printf("ZL1\n");
//目标参考系姿态
AttDeterTarRe();
//printf("ZL2\n");
//计算轨控惯性系姿态
AttDeterOrbCtrl();
//printf("ZL3\n");
//闭环姿态确定
LoopAttDeter();
#endif
}