#include <stdio.h>
#include <stdlib.h>
#include "CMatrix.h"
#include <windows.h>
#include <math.h>
#define DATA_LENGTH 11600
float large_quad_uncertainty = 0.1;
float large_pos_uncertainty_m = 100.0f;
float large_vel_uncertainty_mps = 10.0f;
float ekf_sigmas_gyro_bias_rps = 0.01;
float ekf_sigmas_accel_bias_mps2 = 0.1;
float ekf_sigmas_quad_process_noise = 0.001;
float ekf_sigmas_pos_process_noise_m = 0.1;
float ekf_sigmas_vel_process_noise_mps = 0.1;
float ekf_sigmas_gyroBias_process_noise_rps = 1e-5;
float ekf_sigmas_accelBias_process_noise_mps2 = 1e-5;
float ekf_sigmas_mag3D_unitVector_meas = 1.0f;
float ekf_sigmas_pos_meas_m = 2.0f;
int main(void)
{
////时间相关
//double run_time;
//LARGE_INTEGER time_start; //开始时间
//LARGE_INTEGER time_over; //结束时间
//double dqFreq; //计时器频率
//LARGE_INTEGER f; //计时器频率
//QueryPerformanceFrequency(&f);
//dqFreq = (double)f.QuadPart;
//传感器数据
float accx[DATA_LENGTH], accy[DATA_LENGTH], accz[DATA_LENGTH];
float gyrox[DATA_LENGTH], gyroy[DATA_LENGTH], gyroz[DATA_LENGTH];
float magx[DATA_LENGTH], magy[DATA_LENGTH], magz[DATA_LENGTH];
float GPS_east_m[DATA_LENGTH], GPS_north_m[DATA_LENGTH], alt[DATA_LENGTH];
float roll_deg_ref[DATA_LENGTH], pitch_deg_ref[DATA_LENGTH], yaw_deg_ref[DATA_LENGTH];
float roll_deg[DATA_LENGTH], pitch_deg[DATA_LENGTH], yaw_deg[DATA_LENGTH];
//读取CSV原始数据
char filename_read[] = ".\\9DOF_DATA.csv";
char filename_write[] = ".\\DATA.csv";
char line[1024];
char *record;
MatDataType data_temp;
FILE *fp_read = NULL;
FILE *fp_write = NULL;
fp_read = fopen(filename_read,"r");
fp_write = fopen(filename_write, "a");
//前两行数据无效
fgets(line, 1024, fp_read);
fgets(line, 1024, fp_read);
fgets(line, 1024, fp_read);
for (int i = 0; i < DATA_LENGTH; i++)
{
fgets(line, 1024, fp_read);
for (int j = 0; j < 12; j++)
{
if (j == 0)
{
record = strtok(line, ",");
data_temp = atof(record);
accx[i] = data_temp * 0.001;
//printf("accx:%lf\t", data_temp);
}
if (j == 1)
{
record = strtok(NULL, ",");
data_temp = atof(record);
accy[i] = data_temp * 0.001;
//printf("accy:%lf\t", data_temp);
}
if (j == 2)
{
record = strtok(NULL, ",");
data_temp = atof(record);
accz[i] = - data_temp * 0.001;
//printf("accz:%lf\t", data_temp);
}
if (j == 3)
{
record = strtok(NULL, ",");
data_temp = atof(record);
gyrox[i] = data_temp * 0.001;
//printf("gyrox:%lf\t", data_temp);
}
if (j == 4)
{
record = strtok(NULL, ",");
data_temp = atof(record);
gyroy[i] = data_temp * 0.001;
//printf("gyroy:%lf\t", data_temp);
}
if (j == 5)
{
record = strtok(NULL, ",");
data_temp = atof(record);
gyroz[i] = data_temp * 0.001;
//printf("gyroz:%lf\t", data_temp);
}
if (j == 6)
{
record = strtok(NULL, ",");
data_temp = atof(record);
magx[i] = data_temp * 0.1;
//printf("magx:%lf\t", data_temp);
}
if (j == 7)
{
record = strtok(NULL, ",");
data_temp = atof(record);
magy[i] = data_temp * 0.1;
//printf("magy:%lf\t", data_temp);
}
if (j == 8)
{
record = strtok(NULL, ",");
data_temp = atof(record);
magz[i] = data_temp * 0.1;
//printf("magz:%lf\t", data_temp);
}
if (j == 9)
{
record = strtok(NULL, ",");
data_temp = atof(record);
roll_deg[i] = data_temp;
//printf("roll_deg:%lf\t", data_temp);
}
if (j == 10)
{
record = strtok(NULL, ",");
data_temp = atof(record);
pitch_deg[i] = data_temp;
//printf("pitch_deg:%lf\t", data_temp);
}
if (j == 11)
{
record = strtok(NULL, ",");
data_temp = atof(record);
yaw_deg[i] = data_temp;
//printf("i:%d yaw_deg:%lf\n",i, yaw_deg[i]);
}
}
//
GPS_east_m[i] = 0.0f;
GPS_north_m[i] = 0.0f;
alt[i] = 3.0f;
}
fclose(fp_read);
//常量
float gravity_mps2 = 9.81; //重力加速度
float mag_declination_deg = 0; //磁偏角
//状态初始值
Mat ekf_xhat; MatCreate(&ekf_xhat, 16, 1);
MatDataType ekf_xhat_init[16] = { 1.0f,0.0f,0.0f,0.0f, 0.0f,0.0f,3.0f, 0.0f,0.0f,0.0f, 0.0f,0.0f,0.0f, 0.0f,0.0f,0.0f };
MatInit(&ekf_xhat, ekf_xhat_init);
//P矩阵初始化
Mat ekf_P; MatCreate(&ekf_P, 16, 16);
MatDataType ekf_P_init[16] = { large_quad_uncertainty,large_quad_uncertainty,large_quad_uncertainty,large_quad_uncertainty,\
large_pos_uncertainty_m , large_pos_uncertainty_m , large_pos_uncertainty_m ,\
large_vel_uncertainty_mps , large_vel_uncertainty_mps , large_vel_uncertainty_mps ,\
ekf_sigmas_gyro_bias_rps , ekf_sigmas_gyro_bias_rps , ekf_sigmas_gyro_bias_rps ,\
ekf_sigmas_accel_bias_mps2 , ekf_sigmas_accel_bias_mps2 , ekf_sigmas_accel_bias_mps2 };
MatDiag(&ekf_P, ekf_P_init, 16);
//MatPrint(&ekf_P);
//Q矩阵初始化
Mat ekf_Q; MatCreate(&ekf_Q, 16, 16);
MatDataType ekf_Q_init[16] = { ekf_sigmas_quad_process_noise,ekf_sigmas_quad_process_noise ,ekf_sigmas_quad_process_noise ,ekf_sigmas_quad_process_noise, \
ekf_sigmas_pos_process_noise_m , ekf_sigmas_pos_process_noise_m , ekf_sigmas_pos_process_noise_m, \
ekf_sigmas_vel_process_noise_mps , ekf_sigmas_vel_process_noise_mps , ekf_sigmas_vel_process_noise_mps, \
ekf_sigmas_gyroBias_process_noise_rps , ekf_sigmas_gyroBias_process_noise_rps , ekf_sigmas_gyroBias_process_noise_rps ,\
ekf_sigmas_accelBias_process_noise_mps2 , ekf_sigmas_accelBias_process_noise_mps2 , ekf_sigmas_accelBias_process_noise_mps2 };
MatDiag(&ekf_Q, ekf_Q_init, 16);
//MatPrint(&ekf_Q);
//R矩阵初始化
Mat ekf_R; MatCreate(&ekf_R, 6, 6);
MatDataType ekf_R_init[6] = {
ekf_sigmas_mag3D_unitVector_meas,ekf_sigmas_mag3D_unitVector_meas,ekf_sigmas_mag3D_unitVector_meas,\
ekf_sigmas_pos_meas_m, ekf_sigmas_pos_meas_m, ekf_sigmas_pos_meas_m
};
MatDiag(&ekf_R, ekf_R_init,6);
MatDataType q0,q1,q2,q3;
MatDataType Pn,Pe,Alt;
MatDataType Vn,Ve,Vd;
MatDataType bwx,bwy,bwz;
MatDataType bax, bay, baz;
//MatPrint(&ekf_R);
for (int i = 0; i < DATA_LENGTH; i++)
{
float dt_s = 0.01;
//Xhat
int nStates = 16;
q0 = MatAt(&ekf_xhat, 0, 0), q1 = MatAt(&ekf_xhat, 1, 0), q2 = MatAt(&ekf_xhat, 2, 0), q3 = MatAt(&ekf_xhat, 3, 0);
Pn = MatAt(&ekf_xhat, 4, 0), Pe = MatAt(&ekf_xhat, 5, 0), Alt = MatAt(&ekf_xhat, 6, 0);
Vn = MatAt(&ekf_xhat, 7, 0), Ve = MatAt(&ekf_xhat, 8, 0), Vd = MatAt(&ekf_xhat, 9, 0);
bwx = MatAt(&ekf_xhat, 10, 0), bwy = MatAt(&ekf_xhat, 11, 0), bwz = MatAt(&ekf_xhat, 12, 0);
bax = MatAt(&ekf_xhat, 13, 0), bay = MatAt(&ekf_xhat, 14, 0), baz = MatAt(&ekf_xhat, 15, 0);
//角速度测量值
float wx = gyrox[i], wy = gyroy[i], wz = gyroz[i];
Mat Wxyz; MatCreate(&Wxyz, 3, 1);
MatDataType Wxyz_data[3] = { wx,wy,wz };
MatInit(&Wxyz, Wxyz_data);
//加表测量值
float fx = accx[i], fy = accy[i], fz = accz[i];
Mat Fxyz; MatCreate(&Fxyz, 3, 1);
MatDataType Fxyz_data[3] = { fx,fy,fz };
MatInit(&Fxyz, Fxyz_data);
//陀螺仪三轴偏置
Mat Bw; MatCreate(&Bw, 3, 1);
MatDataType Bw_data[3] = { bwx,bwy,bwz };
MatInit(&Bw, Bw_data);
//加表三轴偏置
Mat Bf; MatCreate(&Bf, 3, 1);
MatDataType Bf_data[3] = { bax,bay,baz };
MatInit(&Bf, Bf_data);
//重力向量
Mat Gravity; MatCreate(&Gravity, 3, 1);
MatDataType Gravity_data[3] = { 0.0f,0.0f,gravity_mps2 };
MatInit(&Gravity, Gravity_data);
//计算xdot
Mat C_bodyrate2qdot; MatCreate(&C_bodyrate2qdot, 4, 3);
MatDataType C_bodyrate2qdot_data[12] = { -0.5*q1, -0.5*q2, -0.5*q3,\
0.5*q0, -0.5*q3, 0.5*q2,\
0.5*q3, 0.5*q0, -0.5*q1,\
-0.5*q2, 0.5*q1, 0.5*q0 };
MatInit(&C_bodyrate2qdot, C_bodyrate2qdot_data);
//
Mat C_ned2b; MatCreate(&C_ned2b,3,3);
MatDataType C_ned2b_data[9] = { 1-2*(q2*q2 + q3*q3), 2*(q1*q2 + q3*q0), 2*(q1*q3 - q2*q0),\
2*(q1*q2 - q3*q0), 1-2*(q1*q1 + q3*q3), 2*(q2*q3 + q1*q0),\
没有合适的资源?快使用搜索试试~ 我知道了~
纯C语言实现基于EKF算法(16维)的导航解算程序及数据
共60个文件
tlog:13个
ipch:11个
log:5个
需积分: 47 101 下载量 167 浏览量
2018-09-30
13:49:27
上传
评论 12
收藏 41.9MB ZIP 举报
温馨提示
纯C语言实现基于EKF算法(16维)的导航解算程序及数据,内含自编C语言矩阵库,可以直接移植到单片机上
资源推荐
资源详情
资源评论
收起资源包目录
INS_EKF_Quaternion_C_SIM.zip (60个子文件)
INS_EKF_Quaternion_C_SIM
Release
INS_EKF_Quaternion_C_SIM.ipdb 17KB
INS_EKF_Quaternion_C_SIM.pdb 516KB
INS_EKF_Quaternion_C_SIM.iobj 138KB
INS_EKF_Quaternion_C_SIM.exe 33KB
INS_EKF_Quaternion_C_SIM
Release
INS_EKF_Quaternion_C_SIM.Build.CppClean.log 2KB
CMatrix.obj 101KB
INS_EKF_.4791DE77.tlog
INS_EKF_Quaternion_C_SIM.lastbuildstate 230B
CL.write.1.tlog 2KB
INS_EKF_Quaternion_C_SIM.write.1u.tlog 596B
link.command.1.tlog 2KB
CL.read.1.tlog 22KB
CL.command.1.tlog 2KB
link.write.1.tlog 756B
link.read.1.tlog 4KB
vc141.pdb 100KB
INS_EKF_Quaternion_C_SIM.log 6KB
main.obj 174KB
CMatrix.h 2KB
INS_EKF_Quaternion_C_SIM.vcxproj 7KB
INS_EKF_Quaternion_C_SIM.vcxproj.user 165B
INS_EKF_Quaternion_C_SIM.vcxproj.filters 1KB
DATA.csv 1.15MB
Debug
INS_EKF_Quaternion_C_SIM.Build.CppClean.log 2KB
CMatrix.obj 36KB
INS_EKF_.4791DE77.tlog
INS_EKF_Quaternion_C_SIM.lastbuildstate 228B
CL.write.1.tlog 2KB
link.command.1.tlog 2KB
CL.read.1.tlog 22KB
CL.command.1.tlog 2KB
link.write.1.tlog 918B
link.read.1.tlog 4KB
vc141.pdb 108KB
INS_EKF_Quaternion_C_SIM.log 7KB
vc141.idb 267KB
main.obj 66KB
9DOF_DATA.csv 1.02MB
sim_out.m 33B
temp.csv 409B
main.c 24KB
x64
Debug
INS_EKF_Quaternion_C_SIM.log 418B
CMatrix.c 12KB
.vs
INS_EKF_Quaternion_C_SIM
v15
ipch
AutoPCH
b129f3b144e5bdc0
CMATRIX.ipch 320KB
a51de4a2b9046208
CMATRIX.ipch 2.94MB
b49345635fc7c43
MAIN.ipch 38.44MB
f334681c18aadc8b
CSVIO.ipch 3.5MB
eb6ec537a5ac0d40
CMATRIX.ipch 2.75MB
cf4d2d3cc37d3ec0
CMATRIX.ipch 2.75MB
dc8a3a6bf3a4f36b
MAIN.ipch 38.19MB
f345661c18b94c58
CSVIO.ipch 2.63MB
51594f60384339c3
MAIN.ipch 38.94MB
884a3e5b0f3939f9
READCSVFILE.ipch 3.5MB
8868d45b0f53366a
READCSVFILE.ipch 2.88MB
.suo 61KB
Browse.VC.db 32.18MB
v14
.suo 31KB
Debug
INS_EKF_Quaternion_C_SIM.pdb 460KB
INS_EKF_Quaternion_C_SIM.ilk 373KB
INS_EKF_Quaternion_C_SIM.exe 74KB
INS_EKF_Quaternion_C_SIM.sln 1KB
INS_EKF_Quaternion_C_SIM.VC.db 1.78MB
共 60 条
- 1
资源评论
桓琰
- 粉丝: 87
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 三次样条插值的介绍-什么是三次样条插值原理
- http的一些相关介绍-对于我们来说什么是http
- 全卷积网络基于voc2012数据集简单pytorch实现
- pycharm的一些介绍-用于更好的学习python
- 基于C++的程序设计大赛天梯赛L2答案(天梯赛)
- 基于python实现的三次样条插值和均值插值法实现
- Python语言教程2-python批量图片大小处理-多文件夹
- Python语言教程1-python批量图片重命名,将后缀某几个不想要的字去除
- Space Combat Kit 太空战斗套件Unity游戏开发插件资源unitypackage C#
- Universal Device Preview 通用设备预览Unity游戏开发插件资源unitypackage
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功