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

254 lines
9.3 KiB
C++
Raw Permalink Normal View History

#include "sensor_star.h"
#include "orbit_info.h"
#include "GNCFunction.h"
#include "libconvert.h"
#include "liblog.h"
#include <math.h>
// #include <time.h>
// #include <stdio.h>
// #include <stdlib.h>
double Star1QuatInstall[4] = { 0.454717549603582 ,0.541041969225232 ,0.454793640506779 ,-0.541911692228529 };
double Star2QuatInstall[4] = { 0.454717962112787 ,-0.541835255189012 ,0.453848239109489 ,0.541911346092208 };
void GetStar1Meas(double MeasStar1[4], int* Star1Flag, double Star1QuatInstall[4], double QuatECI[4], double AttiVelECI[3]);
void GetStar2Meas(double MeasStar2[4], int* Star2Flag, double Star2QuatInstall[4], double QuatECI[4], double AttiVelECI[3]);
/// @brief 生成星敏1遥测帧
/// @param frame:生成的遥测帧数据
/// @return
uint8_t generate_star_1_frame(uint8_t *frame, double QuatECI[4], double AttiVelECI[3])
{
CAK_TLM_1_STRUCT star;
memset(frame,0,CAK_TLM_1_Info_Length);
memset((uint8_t *)&star.FRAME_HEAD,0,CAK_TLM_1_Info_Length);
double MeasStar1[4]; int Star1Flag = 0;
GetStar1Meas(MeasStar1, &Star1Flag, Star1QuatInstall, QuatECI, AttiVelECI);
//printf("MeasStar1 is %10.3f \t %10.3f \t %10.3f \t %10.3f\r\n", MeasStar1[0], MeasStar1[1], MeasStar1[2], MeasStar1[3]);
//printf("Star1Flag is %10.3d\r\n", Star1Flag);
spdlog::info("MeasStar1为:{1:10.6f},{2:10.6f},{3:10.6f},{4:10.6f},星敏有效标志为{5:d}",__FUNCTION__,
MeasStar1[0], MeasStar1[1], MeasStar1[2], MeasStar1[3],Star1Flag);
star.FRAME_HEAD = 0xA18A;
star.TLM_FRAME_ID = 0;
star.q0 = htonl((int32_t)(MeasStar1[0] *2147483647.5));
star.q1 = htonl((int32_t)(MeasStar1[1] *2147483647.5));
star.q2 = htonl((int32_t)(MeasStar1[2] *2147483647.5));
star.q3 = htonl((int32_t)(MeasStar1[3] *2147483647.5));
star.STAR_NUM_D = 100;
star.WD_CNT = 12;
star.STAR_NUM_T = 23;
star.para1 = 0x91;
uint8_t checksum = 0;
uint8_t *buffer = (uint8_t *)&star.FRAME_HEAD;
for(int kc = 0;kc<CAK_TLM_1_Info_Length-1;kc++)
checksum += buffer[kc];
star.SUM = checksum;
memcpy(frame,(uint8_t *)&star.FRAME_HEAD,CAK_TLM_1_Info_Length);
spdlog::info("函数{0}STAR数据帧长度为:{1:2d} 校验和为:{2:2x}",__FUNCTION__,
sizeof(CAK_TLM_1_STRUCT),frame[CAK_TLM_1_Info_Length-1]);
return 1;
}
/// @brief 生成星敏2遥测帧
/// @param frame:生成的遥测帧数据
/// @return
uint8_t generate_star_2_frame(uint8_t *frame, double QuatECI[4], double AttiVelECI[3])
{
CAK_TLM_1_STRUCT star;
memset(frame,0,CAK_TLM_1_Info_Length);
memset((uint8_t *)&star.FRAME_HEAD,0,CAK_TLM_1_Info_Length);
double MeasStar2[4]; int Star2Flag = 0;
GetStar2Meas(MeasStar2, &Star2Flag, Star2QuatInstall, QuatECI, AttiVelECI);
// printf("MeasStar2 is %10.3f \t %10.3f \t %10.3f \t %10.3f\r\n", MeasStar2[0], MeasStar2[1], MeasStar2[2], MeasStar2[3]);
// printf("Star2Flag is %10.3d\r\n", Star2Flag);
spdlog::info("MeasStar2为:{1:10.6f},{2:10.6f},{3:10.6f},{4:10.6f},星敏有效标志为{5:d}",__FUNCTION__,
MeasStar2[0], MeasStar2[1], MeasStar2[2], MeasStar2[3],Star2Flag);
star.FRAME_HEAD = 0xA18A;
star.TLM_FRAME_ID = 0;
star.q0 = htonl((int32_t)(MeasStar2[0] *2147483647.5));
star.q1 = htonl((int32_t)(MeasStar2[1] *2147483647.5));
star.q2 = htonl((int32_t)(MeasStar2[2] *2147483647.5));
star.q3 = htonl((int32_t)(MeasStar2[3] *2147483647.5));
star.STAR_NUM_D = 100;
star.WD_CNT = 12;
star.STAR_NUM_T = 23;
star.para1 = 0x91;
uint8_t checksum = 0;
uint8_t *buffer = (uint8_t *)&star.FRAME_HEAD;
for(int kc = 0;kc<CAK_TLM_1_Info_Length-1;kc++)
checksum += buffer[kc];
star.SUM = checksum;
memcpy(frame,(uint8_t *)&star.FRAME_HEAD,CAK_TLM_1_Info_Length);
spdlog::info("函数{0}STAR数据帧长度为:{1:2d} 校验和为:{2:2x}",__FUNCTION__,
sizeof(CAK_TLM_1_STRUCT),frame[CAK_TLM_1_Info_Length-1]);
return 1;
}
/* 星敏感器1测量模拟 */
void GetStar1Meas(double MeasStar1[4], int* Star1Flag, double Star1QuatInstall[4], double QuatECI[4], double AttiVelECI[3]) {
/* 星敏感器1测量模拟模块 */
/* 输入量 */
/* QuatECI 惯性系下姿态四元数qbi */
/* AttiVelECI 角速度Wbi */
/* Star1QuatInstall 星敏感器1总安装四元数从本体到真实 */
/* 输出量 */
/* MeasStar1 星敏感器1输出值Wgi_meas */
/* Star1Flag 星敏感器1有效标志位 */
double StarBias_axis, StarBias_plane, StarNoise_axis, StarNoise_plane, AttiVelECI_norm, ii;
double AttiVelECI_deg[3], MeasErr[3], q_sr_i_true_1[4], e_sr_i_err_1[3], q_sr_i_err_1[4], q_sr_i_meas_1[4], CrossMatrixQuatECI[4][4], CrossMatrixQ_sr_i_true_1[4][4];
double StarMeasErr[3][4] = { {60.0,5.0,0.0,0.0},{170.0,28.0,0.0,0.0},{250.0,50.0,0.0,0.0} };
AttiVelECI_deg[0] = AttiVelECI[0] * 180.0 / 3.1415926535;
AttiVelECI_deg[1] = AttiVelECI[1] * 180.0 / 3.1415926535;
AttiVelECI_deg[2] = AttiVelECI[2] * 180.0 / 3.1415926535;
AttiVelECI_norm = sqrt(pow(AttiVelECI_deg[0], 2) + pow(AttiVelECI_deg[1], 2) + pow(AttiVelECI_deg[2], 2));
if (AttiVelECI_norm == 0)
{
StarNoise_axis = StarMeasErr[0][0] / 3600.0;
StarNoise_plane = StarMeasErr[0][1] / 3600.0;
StarBias_axis = StarMeasErr[0][2] / 3600.0;
StarBias_plane = StarMeasErr[0][3] / 3600.0;
}
else if ((0 < AttiVelECI_norm) && (AttiVelECI_norm < 0.5))
{
StarNoise_axis = StarMeasErr[1][0] / 3600.0;
StarNoise_plane = StarMeasErr[1][1] / 3600.0;
StarBias_axis = StarMeasErr[1][2] / 3600.0;
StarBias_plane = StarMeasErr[1][3] / 3600.0;
}
else if (0.5 <= AttiVelECI_norm)
{
StarNoise_axis = StarMeasErr[2][0] / 3600.0;
StarNoise_plane = StarMeasErr[2][1] / 3600.0;
StarBias_axis = StarMeasErr[2][2] / 3600.0;
StarBias_plane = StarMeasErr[2][3] / 3600.0;
}
//生成随机误差量
for (int i = 0; i < 3; i++)
{
MeasErr[i] = (rand() / ((double)RAND_MAX)) * 2.0 - 1.0;
}
//计算q_sr_i_true_1
qleft(CrossMatrixQuatECI, QuatECI);
mtxMtp((double*)q_sr_i_true_1, (double*)CrossMatrixQuatECI, 4, 4, (double*)Star1QuatInstall, 4, 1);
ii = -1.0;
if (q_sr_i_true_1[0] < 0) {
mtxMtp((double*)q_sr_i_true_1, (double*)q_sr_i_true_1, 4, 1, &ii, 1, 1);
}
e_sr_i_err_1[0] = StarBias_axis + StarNoise_axis * MeasErr[0];
e_sr_i_err_1[1] = StarBias_plane + StarNoise_plane * MeasErr[1];
e_sr_i_err_1[2] = StarBias_plane + StarNoise_plane * MeasErr[2];
euler2qua(q_sr_i_err_1, e_sr_i_err_1);
qleft(CrossMatrixQ_sr_i_true_1, q_sr_i_true_1);
mtxMtp((double*)q_sr_i_meas_1, (double*)CrossMatrixQ_sr_i_true_1, 4, 4, (double*)q_sr_i_err_1, 4, 1);
if (q_sr_i_meas_1[0] < 0) {
mtxMtp((double*)q_sr_i_meas_1, (double*)q_sr_i_meas_1, 4, 1, &ii, 1, 1);
}
MeasStar1[0] = q_sr_i_meas_1[0];
MeasStar1[1] = q_sr_i_meas_1[1];
MeasStar1[2] = q_sr_i_meas_1[2];
MeasStar1[3] = q_sr_i_meas_1[3];
*Star1Flag = 1;
}
/* 星敏感器2测量模拟 */
void GetStar2Meas(double MeasStar2[4], int* Star2Flag, double Star2QuatInstall[4], double QuatECI[4], double AttiVelECI[3]) {
/* 星敏感器1测量模拟模块 */
/* 输入量 */
/* QuatECI 惯性系下姿态四元数qbi */
/* AttiVelECI 角速度Wbi */
/* Star2QuatInstall 星敏感器2总安装四元数从本体到真实 */
/* 输出量 */
/* MeasStar2 星敏感器2输出值Wgi_meas */
/* Star2Flag 星敏感器2有效标志位 */
double StarBias_axis, StarBias_plane, StarNoise_axis, StarNoise_plane, AttiVelECI_norm, ii;
double AttiVelECI_deg[3], MeasErr[3], q_sr_i_true_2[4], e_sr_i_err_2[3], q_sr_i_err_2[4], q_sr_i_meas_2[4], CrossMatrixQuatECI[4][4], CrossMatrixQ_sr_i_true_2[4][4];
double StarMeasErr[3][4] = { {60.0,5.0,0.0,0.0},{170.0,28.0,0.0,0.0},{250.0,50.0,0.0,0.0} };
AttiVelECI_deg[0] = AttiVelECI[0] * 180.0 / 3.1415926535;
AttiVelECI_deg[1] = AttiVelECI[1] * 180.0 / 3.1415926535;
AttiVelECI_deg[2] = AttiVelECI[2] * 180.0 / 3.1415926535;
AttiVelECI_norm = sqrt(pow(AttiVelECI_deg[0], 2) + pow(AttiVelECI_deg[1], 2) + pow(AttiVelECI_deg[2], 2));
if (AttiVelECI_norm == 0)
{
StarNoise_axis = StarMeasErr[0][0] / 3600.0;
StarNoise_plane = StarMeasErr[0][1] / 3600.0;
StarBias_axis = StarMeasErr[0][2] / 3600.0;
StarBias_plane = StarMeasErr[0][3] / 3600.0;
}
else if ((0 < AttiVelECI_norm) && (AttiVelECI_norm < 0.5))
{
StarNoise_axis = StarMeasErr[1][0] / 3600.0;
StarNoise_plane = StarMeasErr[1][1] / 3600.0;
StarBias_axis = StarMeasErr[1][2] / 3600.0;
StarBias_plane = StarMeasErr[1][3] / 3600.0;
}
else if (0.5 <= AttiVelECI_norm)
{
StarNoise_axis = StarMeasErr[2][0] / 3600.0;
StarNoise_plane = StarMeasErr[2][1] / 3600.0;
StarBias_axis = StarMeasErr[2][2] / 3600.0;
StarBias_plane = StarMeasErr[2][3] / 3600.0;
}
//生成随机误差量
for (int i = 0; i < 3; i++)
{
MeasErr[i] = (rand() / ((double)RAND_MAX)) * 2.0 - 1.0;
}
//计算q_sr_i_true_1
qleft(CrossMatrixQuatECI, QuatECI);
mtxMtp((double*)q_sr_i_true_2, (double*)CrossMatrixQuatECI, 4, 4, (double*)Star2QuatInstall, 4, 1);
ii = -1.0;
if (q_sr_i_true_2[0] < 0) {
mtxMtp((double*)q_sr_i_true_2, (double*)q_sr_i_true_2, 4, 1, &ii, 1, 1);
}
e_sr_i_err_2[0] = StarBias_axis + StarNoise_axis * MeasErr[0];
e_sr_i_err_2[1] = StarBias_plane + StarNoise_plane * MeasErr[1];
e_sr_i_err_2[2] = StarBias_plane + StarNoise_plane * MeasErr[2];
euler2qua(q_sr_i_err_2, e_sr_i_err_2);
qleft(CrossMatrixQ_sr_i_true_2, q_sr_i_true_2);
mtxMtp((double*)q_sr_i_meas_2, (double*)CrossMatrixQ_sr_i_true_2, 4, 4, (double*)q_sr_i_err_2, 4, 1);
if (q_sr_i_meas_2[0] < 0) {
mtxMtp((double*)q_sr_i_meas_2, (double*)q_sr_i_meas_2, 4, 1, &ii, 1, 1);
}
MeasStar2[0] = q_sr_i_meas_2[0];
MeasStar2[1] = q_sr_i_meas_2[1];
MeasStar2[2] = q_sr_i_meas_2[2];
MeasStar2[3] = q_sr_i_meas_2[3];
*Star2Flag = 1;
}