C语言roll程序,惯性导航C语言程序

该博客详细介绍了如何使用C语言编写惯性导航系统的程序,包括初始化、传感器采样、角速度和加速度计算、四元数更新、姿态矩阵和位置计算等多个关键步骤。通过对陀螺仪和加速度计数据的处理,实现了姿态和位置的实时解算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "stm32f10x_lib.h"

#include "stdlib.h"

#include "stdio.h"

#include "math.h"

#define w_ie 7.29212e-5

#define g 9.78

#define R 6371000

#define RAD 3.1415926/180

#define D 180/3.1415926

#define T 0.01

#define PI 3.1415926

void solve_init(void);

void IMU_sample(void);

void calw_nie(void);

void calw_nen(void);

void calw_nin(void);

void calc_nb(void);

void calw_bin(void);

void calw_bnb(volatile float w_bnb[3],volatile float

w_bib[3]);

void updateQ(void);

void updatec_bn(void);

void cal_angl(void);

void convacce(void);

void updateV(void);

void initC(void);

void updateC(void);

void calPOS(void);

void calvelocity(void);

void jiaozheng(void);

volatile float w_nie[3],w_nen[3],w_nin[3],w_bin[3];

volatile double L_ins,lamda_ins;

volatile float h_ins,v_ins[3],angl[3],v_ins_r[3];

volatile float w_bib1[3],w_bib2[3],w_bib3[3];

volatile float w_bnb1[3],w_bnb2[3],w_bnb3[3];

volatile float c_bn[3][3],c_nb[3][3];

volatile float q[4];

volatile float pitch_ins,roll_ins,yaw_ins;

volatile float f_b[3],f_n[3];

volatile float cc[3][3];

volatile float POS[3];

volatile float v;

volatile float v_ins1[3];//用于位置更新

float tempfhi_cbn[3][3];

float mulitc_bn[3][3];

int I=0;

extern volatile float gx,gy,gz,ax,ay,az;

extern volatile double X[4][1];

extern float pitch0,roll0,yaw0;

extern long smile;

extern int kalman_flag;

extern volatile float L_GPS,lamda_GPS,H_GPS;

extern volatile int jiaozhen;

void cuduizhun(void) //初始对准,用模块输出的三个角求姿态矩阵c_bn的初始值

{

c_bn[0][0]=cos(pitch0)*cos(yaw0);

//北西天

c_bn[0][1]=sin(pitch0)*cos(yaw0)*sin(roll0)-sin(yaw0)*cos(roll0);

c_bn[0][2]=sin(pitch0)*cos(yaw0)*cos(roll0)+sin(yaw0)*sin(roll0);

c_bn[1][0]=cos(pitch0)*sin(yaw0);

c_bn[1][1]=sin(pitch0)*sin(yaw0)*sin(roll0)+cos(yaw0)*cos(roll0);

c_bn[1][2]=sin(pitch0)*sin(yaw0)*cos(roll0)-cos(yaw0)*sin(roll0);

c_bn[2][0]=-sin(pitch0);

c_bn[2][1]=cos(pitch0)*sin(roll0);

c_bn[2][2]=cos(pitch0)*cos(roll0);

q[0]=sqrt(fabs(1+c_bn[0][0]+c_bn[1][1]+c_bn[2][2]))/2;

//求初始四元数

if((c_bn[2][1]-c_bn[1][2])>=0)

q[1]=sqrt(fabs(1+c_bn[0][0]-c_bn[1][1]-c_bn[2][2]))/2;

else

q[1]=-sqrt(fabs(1+c_bn[0][0]-c_bn[1][1]-c_bn[2][2]))/2;

if((c_bn[0][2]-c_bn[2][0])>=0)

q[2]=sqrt(fabs(1-c_bn[0][0]+c_bn[1][1]-c_bn[2][2]))/2;

else</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值