0
0
Files
build/sensor/source/sensor_thrust.cpp

236 lines
13 KiB
C++
Raw Permalink 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.

#include "sensor_thrust.h"
#include "liblog.h"
#include <math.h>
#include <time.h>
#include <stdlib.h>
#include "GNCFunction.h"
//static double ImpCost = 0.0; /* ImpCost 从仿真开始起,推力器累计冲量消耗 */
void GetThrustMeas(double ThrustForce[3], double ThrustTorque[3], double* SatMass, double SatMtxI[3][3], double JetPWMPlan[12], double JetPWMPeriod, double JetPos[3][12], double JetDir[3][12],
double ThrustIsp, double InitGasMass, double DryMassData[5], double GasMassPos[3], double DryMassPosData[3][5], int Cmd, double InitGasMtxI[3][3], double DryMtxIData[3][15]);
void GetJetForce(double JetForce[12], double JetPWMPlan[12], double JetPWMPeriod);
void Jet2Thrust(double ThrustForce[3], double ThrustTorque[3], double JetForce[12], double JetPos[3][12], double JetDir[3][12], double SatMassPos[3]);
void SatMassProperty(double* SatMass, double SatMassPos[3], double SatMtxI[3][3], double InitGasMass, double DryMassData[5], double GasMassPos[3], double DryMassPosData[3][5], double GasCost, int Cmd, double InitGasMtxI[3][3], double DryMtxIData[3][15]);
//输出:ThrustForce[3], ThrustTorque[3],
// SatMass, SatMtxI[3][3],
//输入: JetPWMPlan[12]
void sensor_ThrustMeas(double ThrustForce[3], double ThrustTorque[3], double* SatMass, double SatMtxI[3][3], double JetPWMPlan[12])
{
double JetPWMPeriod, JetPos[3][12], JetDir[3][12], ThrustIsp, SatMassTemp1;
/*喷口PWM调制周期即GNC控制周期与控制程序周期相同*/
JetPWMPeriod = 1;
/*比例系数*/
ThrustIsp = 343.0;
/*本体系下的喷口安装位置,列向量 * 12m*/
JetPos[0][0] = -0.233; JetPos[0][1] = -0.233; JetPos[0][2] = 0.383; JetPos[0][3] = 0.383; JetPos[0][4] = 0.18; JetPos[0][5] = -0.18; JetPos[0][6] = 0.18; JetPos[0][7] = -0.18; JetPos[0][8] = 0; JetPos[0][9] = 0; JetPos[0][10] = 0; JetPos[0][11] = 0;
JetPos[1][0] = 0; JetPos[1][1] = 0; JetPos[1][2] = 0; JetPos[1][3] = 0; JetPos[1][4] = -0.183; JetPos[1][5] = -0.183; JetPos[1][6] = 0.183; JetPos[1][7] = 0.183; JetPos[1][8] = 0.156; JetPos[1][9] = -0.156; JetPos[1][10] = 0.156; JetPos[1][11] = -0.156;
JetPos[2][0] = 0.147; JetPos[2][1] = -0.147; JetPos[2][2] = 0.147; JetPos[2][3] = -0.147; JetPos[2][4] = 0; JetPos[2][5] = 0; JetPos[2][6] = 0; JetPos[2][7] = 0; JetPos[2][8] = -0.323; JetPos[2][9] = -0.323; JetPos[2][10] = 0.323; JetPos[2][11] = 0.323;
/*本体系下的推力方向,列向量 * 12单位方向矢量*/
JetDir[0][0] = 1; JetDir[0][1] = 1; JetDir[0][2] = -1; JetDir[0][3] = -1; JetDir[0][4] = 0; JetDir[0][5] = 0; JetDir[0][6] = 0; JetDir[0][7] = 0; JetDir[0][8] = 0; JetDir[0][9] = 0; JetDir[0][10] = 0; JetDir[0][11] = 0;
JetDir[1][0] = 0; JetDir[1][1] = 0; JetDir[1][2] = 0; JetDir[1][3] = 0; JetDir[1][4] = 1; JetDir[1][5] = 1; JetDir[1][6] = -1; JetDir[1][7] = -1; JetDir[1][8] = 0; JetDir[1][9] = 0; JetDir[1][10] = 0; JetDir[1][11] = 0;
JetDir[2][0] = 0; JetDir[2][1] = 0; JetDir[2][2] = 0; JetDir[2][3] = 0; JetDir[2][4] = 0; JetDir[2][5] = 0; JetDir[2][6] = 0; JetDir[2][7] = 0; JetDir[2][8] = 1; JetDir[2][9] = 1; JetDir[2][10] = -1; JetDir[2][11] = -1;
/*平台结构变化指令1舱门关闭默认2舱门开启3左载荷先发射4右载荷先发射5载荷全发射*/
int Cmd = 1;
/*初始推进剂质量kg*/
double InitGasMass = 3.55;//6.5 * 0.7692;
/*平台质量kg5种工况1 * 5*/
double DryMassData[5] = { 48.381, 48.381, 46.013, 45.898, 43.53 };//{ 34.99881, 34.99881, 32.312115, 32.22625, 29.535285 };
/*推进剂质心卫星位置m推力器布局坐标系*/
double GasMassPos[3] = { -25 * 1e-3, 0.0, -201.44 * 1e-3 };
/*平台质心位置m推力器布局坐标系5种工况3 * 5*/
double DryMassPosData[3][5] = { {8.39 * 0.001, 8.03 * 0.001, 10.29 * 0.001, 10.19 * 0.001, 12.96 * 0.001},
{ -8.92 * 0.001, -7.94 * 0.001, -15.98 * 0.001, 0.19 * 0.001, -8.00 * 0.001},
{ -4.72 * 0.001, -4.72 * 0.001, 0.25 * 0.001, 1.30 * 0.001, 7.50 * 0.001} };
/*初始推进剂转动惯量kg·m3取决于推进剂质心且对齐到推力器布局坐标系*/
double InitGasMtxI[3][3] = { {0.0571059330000000, 0, -0.00222918000000000},
{0, 0.0319816850000000, 0},
{-0.00222918000000000, 0, 0.0678860230000000} };
/*平台转动惯量kg·m3取决于平台质心且对齐到推力器布局坐标系5种工况3* (3 * 5)*/
double DryMtxIData[3][15] = { {1.86687640893600, 0.0286157968140000, -0.439427130912000, 1.89572816175600, 0.0409105154700000, -0.437885017878000, 1.87455028889500, 0.0482311009420000, -0.445634256610000, 1.90556951219600, 0.0362650204340000, -0.452313634868000, 1.89121192802100, 0.0438251188440000, -0.462662149911000},
{0.0286157968140000, 2.3271403853280, -0.0114310573740000, 0.0409105154700000, 2.31908819868000, -0.0163531346220000, 0.0482311009420000, 2.29461077938400, -0.00115876103900000, 0.0362650204340000, 2.32061908341600, -0.0323862321540000, 0.0438251188440000, 2.29928834970900, -0.0167186100900000},
{-0.439427130912000, -0.0114310573740000, 1.20621470673000, -0.437885017878000, -0.0163531346220000, 1.22701427290200, -0.445634256610000, -0.00115876103900000, 1.17827923915600, -0.452313634868000, -0.0323862321540000, 1.19281841776200, -0.462662149911000, -0.0167186100900000, 1.14977779874100} };
GetThrustMeas(ThrustForce, ThrustTorque, &SatMassTemp1, SatMtxI, JetPWMPlan, JetPWMPeriod, JetPos, JetDir,
ThrustIsp, InitGasMass, DryMassData, GasMassPos, DryMassPosData, Cmd, InitGasMtxI, DryMtxIData);
*SatMass = SatMassTemp1;
//printf("ThrustForce is %10.5f \t %10.5f \t %10.5f\r\n", ThrustForce[0], ThrustForce[1], ThrustForce[2]);
//printf("ThrustTorque is %10.5f \t %10.5f \t %10.5f\r\n", ThrustTorque[0], ThrustTorque[1], ThrustTorque[2]);
//spdlog::info("函数{0} ThrustForce为:{1:.6f}, {2:.6f}, {3:.6f},ThrustTorque为:{4:.6f}, {5:.6f}, {6:.6f}",__FUNCTION__,
// ThrustForce[0], ThrustForce[1], ThrustForce[2],
// ThrustTorque[0], ThrustTorque[1], ThrustTorque[2]);
spdlog::info("函数{0} ThrustForce为:{1:.6f}, {2:.6f}, {3:.6f},{4:.6f}, {5:.6f}, {6:.6f}, {7:.6f}", __FUNCTION__,
ThrustForce[0], ThrustForce[1], ThrustForce[2],
ThrustTorque[0], ThrustTorque[1], ThrustTorque[2],
*SatMass);
}
/* 获得微推力器三轴推力、力矩以及气体消耗 */
void GetThrustMeas(double ThrustForce[3], double ThrustTorque[3], double* SatMass, double SatMtxI[3][3], double JetPWMPlan[12], double JetPWMPeriod, double JetPos[3][12], double JetDir[3][12],
double ThrustIsp, double InitGasMass, double DryMassData[5], double GasMassPos[3], double DryMassPosData[3][5], int Cmd, double InitGasMtxI[3][3], double DryMtxIData[3][15]) {
/* 微推力器模拟模块 */
/* 输入量 */
/* FullTankForceStd 充气后推力器推力标称值 */
/* NullTankForceStd 触发充气推力器推力标称值 */
/* TankForceDscPara 推力下降系数N/(N*s) */
/* TankGasTime 二级储箱充气时长 */
/* JetPWMPlan 喷口PWM调制指令值即GNC输出的推力器指令 */
/* JetPWMPeriod 喷口PWM调制周期即GNC控制周期 */
/* tNowSec 仿真时刻s */
/* JetPos 本体系下的喷口安装位置,列向量*12m */
/* JetDir 本体系下的推力方向,列向量*12单位方向矢量 */
/* SatMassPos 二级储箱充气时长 */
/* ThrustIsp 比例系数 */
/* 输出量 */
/* ThrustForce 推力器合力 */
/* ThrustTorque 合力矩*/
/* GasCost 储气消耗*/
static double ImpCost = 0.0; /* ImpCost 从仿真开始起,推力器累计冲量消耗 */
double JetForce[12], SatMassPos[3], GasCost, SatMassTemp;
GetJetForce(JetForce, JetPWMPlan, JetPWMPeriod);
for (int i = 0; i < 12; i++)
{
ImpCost += JetForce[i];
}
GasCost = ImpCost / ThrustIsp;
SatMassProperty(&SatMassTemp, SatMassPos, SatMtxI, InitGasMass, DryMassData, GasMassPos, DryMassPosData, GasCost, Cmd, InitGasMtxI, DryMtxIData);
*SatMass = SatMassTemp;
Jet2Thrust(ThrustForce, ThrustTorque, JetForce, JetPos, JetDir, SatMassPos);
}
/* 推力器12喷口推力输出模拟 */
void GetJetForce(double JetForce[12], double JetPWMPlan[12], double JetPWMPeriod) {
/* 推力器12喷口推力输出模拟模块 */
/* 输入量 */
/* FullTankForceStd 充气后推力器推力标称值 */
/* NullTankForceStd 触发充气推力器推力标称值 */
/* TankForceDscPara 推力下降系数N/(N*s) */
/* TankGasTime 二级储箱充气时长 */
/* JetPWMPlan 喷口PWM调制指令值即GNC输出的推力器指令 */
/* JetPWMPeriod 喷口PWM调制周期即GNC控制周期 */
/* tNowSec 仿真时刻s */
/* ImpCost 从仿真开始起,推力器累计冲量消耗 */
/* 输出量 */
/* JetForce 推力器12喷口推力输出值1s内平均推力 */
/*充气后推力器推力标称值*/
double FullTankForceStd = 40 * 1e-3; //45 * 1e-3;
// 当前二级储箱压力(推力)
double TankForce = FullTankForceStd;
for (int ii = 0; ii < 12; ii++) {
JetForce[ii] = TankForce * (JetPWMPlan[ii] / JetPWMPeriod);
}
}
/* 获得本体系三轴推力和力矩 */
void Jet2Thrust(double ThrustForce[3], double ThrustTorque[3], double JetForce[12], double JetPos[3][12], double JetDir[3][12], double SatMassPos[3]) {
/* 推力器合力和合力矩模拟模块 */
/* 输入量 */
/* JetForce 推力器12喷口推力输出值1s内平均推力 */
/* JetPos 本体系下的喷口安装位置,列向量*12m */
/* JetDir 本体系下的推力方向,列向量*12单位方向矢量 */
/* SatMassPos 二级储箱充气时长 */
/* 输出量 */
/* ThrustForce 推力器合力 */
/* ThrustTorque 合力矩*/
double iiJetForceVec[3], iiJetPosVec[3], iiJetTorque[3], ThrustForceTemp[3], ThrustTorqueTemp[3];
ThrustForceTemp[0] = 0.0; ThrustForceTemp[1] = 0.0; ThrustForceTemp[2] = 0.0;
ThrustTorqueTemp[0] = 0.0; ThrustTorqueTemp[1] = 0.0; ThrustTorqueTemp[2] = 0.0;
for (int ii = 0; ii < 12; ii++) {
for (int j = 0; j < 3; j++) {
iiJetForceVec[j] = JetForce[ii] * JetDir[j][ii];
}
for (int j = 0; j < 3; j++) {
iiJetPosVec[j] = JetPos[j][ii] - SatMassPos[j];
}
//iiJetTorque = cross( iiJetPosVec,iiJetForceVec );
iiJetTorque[0] = iiJetPosVec[1] * iiJetForceVec[2] - iiJetPosVec[2] * iiJetForceVec[1];
iiJetTorque[1] = iiJetPosVec[2] * iiJetForceVec[0] - iiJetPosVec[0] * iiJetForceVec[2];
iiJetTorque[2] = iiJetPosVec[0] * iiJetForceVec[1] - iiJetPosVec[1] * iiJetForceVec[0];
/*mtxAdd((double*)ThrustForceTemp, (double*)ThrustForceTemp, (double*)iiJetForceVec, 3, 1);
mtxAdd((double*)ThrustTorqueTemp, (double*)ThrustTorqueTemp, (double*)iiJetTorque, 3, 1);*/
for (int j = 0; j < 3; j++) {
ThrustForceTemp[j] += iiJetForceVec[j];
ThrustTorqueTemp[j] += iiJetTorque[j];
}
}
mtxCpy((double*)ThrustForce, (double*)ThrustForceTemp, 3, 1);
mtxCpy((double*)ThrustTorque, (double*)ThrustTorqueTemp, 3, 1);
}
/* 追踪星质量特性 */
void SatMassProperty(double* SatMass, double SatMassPos[3], double SatMtxI[3][3], double InitGasMass, double DryMassData[5], double GasMassPos[3], double DryMassPosData[3][5], double GasCost, int Cmd, double InitGasMtxI[3][3], double DryMtxIData[3][15]) {
/* 推力器合力和合力矩模拟模块 */
/* 输入量 */
/* InitGasMass 初始推进剂质量kg */
/* DryMassData 平台质量kg5种工况1*5 */
/* GasMassPos 推进剂质心卫星位置m推力器布局坐标系 */
/* DryMassPosData 平台质心位置m推力器布局坐标系5种工况3*5 */
/* GasCost 累积冲量消耗质量kg*/
/* Cmd 平台结构变化指令1舱门关闭默认2舱门开启3左载荷先发射4右载荷先发射5载荷全发射*/
/* 输出量 */
/* SatMassPos 整星质心位置m,推力器布局坐标系 */
//推进剂剩余质量
double GasMass = InitGasMass - GasCost;
//卫星平台质量,根据指令选择
int ii = Cmd - 1;
double DryMass = DryMassData[ii];
//整星质量
*SatMass = DryMass + GasMass;
//卫星平台质心位置,根据指令选择
double DryMassPos[3] = { DryMassPosData[0][ii], DryMassPosData[1][ii], DryMassPosData[2][ii] };
for (int i = 0; i < 3; i++)
{
SatMassPos[i] = (GasMass * GasMassPos[i] + DryMass * DryMassPos[i]) / *SatMass;
}
//推进剂转动惯量,与剩余质量成正比
double GasMtxI[3][3], DryMtxI[3][3], dGasPos[3], dDryPos[3], dGasPosMtx[3][3], dDryPosMtx[3][3], temp1[3][3], temp2[3][3];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
GasMtxI[i][j] = (GasMass / InitGasMass) * InitGasMtxI[i][j];
}
}
//卫星平台转动惯量,根据指令选择
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
DryMtxI[i][j] = DryMtxIData[i][3 * Cmd - 3 + j];
}
}
//整星转动惯量计算
mtxSub((double*)dGasPos, GasMassPos, (double*)SatMassPos, 3, 1);
mtxSub((double*)dDryPos, DryMassPos, (double*)SatMassPos, 3, 1);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
dGasPosMtx[i][j] = dGasPos[i] * dGasPos[j] * GasMass;
dDryPosMtx[i][j] = dDryPos[i] * dDryPos[j] * GasMass;
}
}
mtxAdd((double*)temp1, (double*)GasMtxI, (double*)dGasPosMtx, 3, 3);
mtxAdd((double*)temp2, (double*)DryMtxI, (double*)dDryPosMtx, 3, 3);
mtxAdd((double*)SatMtxI, (double*)temp1, (double*)temp2, 3, 3);
}