日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

上位机软件控制下位机PHP,采用stm32f103CB硬件I2C1/2(自制硬件)中断/DMA访问,四轴开源程序,DMP,PCB外框图纸库文件,USBToVCOM代码下位机...

發布時間:2024/7/5 php 36 豆豆

四軸的ROLL,PITCH,YAW的部分算法程序;

//二階畢卡法

void IMUupdate(float* Roll, float* Pitch, float* Yaw,

float gx, float gy, float gz,

float ax, float ay, float az, float* fusionDt)

{

#ifdef IMUMpu_Set

float delta_2=0;

// float gx, gy, gz, ax, ay, az;

// float Fgx, Fgy, Fgz; // estimated gravity direction

float norm = 0.0f;

// float halfT;

float vx, vy, vz;

float ex, ey, ez;

const static float FACTOR = 0.002;

// 先把這些用得到的值算好

float q0q0 = q0*q0;

float q0q1 = q0*q1;

float q0q2 = q0*q2;

// float q0q3 = q0*q3;

float q1q1 = q1*q1;

// float q1q2 = q1*q2;

float q1q3 = q1*q3;

float q2q2 = q2*q2;

float q2q3 = q2*q3;

float q3q3 = q3*q3;

// getInitMpu(&gx, &gy, &gz, &ax, &ay, &az);

// gx = Gyrox;

// gy = Gyroy;

// gz = Gyroz;

// ax = Accelx;

// ay = Accely;

// az = Accelz;

/*歸一化測量值,加速度計和磁力計的單位是什么都無所謂,因為它們在此被作了歸一化處理*/

//normalise the measurements

// norm = invSqrt(ax*ax + ay*ay + az*az);

norm = sqrt(ax*ax + ay*ay + az*az);

ax = ax / norm;

ay = ay / norm;

az = az / norm;

vx = 2*(q1q3 - q0q2);

vy = 2*(q0q1 + q2q3);

vz = q0q0 - q1q1 - q2q2 + q3q3;

//現在把加速度的測量矢量和參考矢量做叉積,把磁場的測量矢量和參考矢量也做叉積。都拿來來修正陀螺。

// error is sum of cross product between reference direction of fields and direction measured by sensors

ex = (ay*vz - az*vy);

ey = (az*vx - ax*vz);

ez = (ax*vy - ay*vx);

/*

// integral error scaled integral gain

exInt = exInt + ex*Ki;

eyInt = eyInt + ey*Ki;

ezInt = ezInt + ez*Ki;

// adjusted gyroscope measurements

gx = gx + Kp*ex + exInt;

gy = gy + Kp*ey + eyInt;

gz = gz + Kp*ez + ezInt;

*/

// halfT = SysTickUser / 2000;

// *fusionDt = SysTickUser / 1000;

*fusionDt = 0.002;

gx = gx + ex*FACTOR/halfT; //校正陀螺儀測量值 用叉積誤差來做PI修正陀螺零偏

gy = gy + ey*FACTOR/halfT;

gz = gz + ez*FACTOR/halfT;

delta_2=(2*halfT*gx)*(2*halfT*gx)+(2*halfT*gy)*(2*halfT*gy)+(2*halfT*gz)*(2*halfT*gz);

q0 = (1-delta_2/8)*q0 + (-q1*gx - q2*gy - q3*gz)*halfT; // 整合四元數率 四元數微分方程 四元數更新算法,二階畢卡法

q1 = (1-delta_2/8)*q1 + (q0*gx + q2*gz - q3*gy)*halfT;

q2 = (1-delta_2/8)*q2 + (q0*gy - q1*gz + q3*gx)*halfT;

q3 = (1-delta_2/8)*q3 + (q0*gz + q1*gy - q2*gx)*halfT;

/*

// integrate quaternion rate and normalise,四元數更新算法,一階龍格-庫塔法

q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;

q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;

q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;

q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;

*/

// normalise quaternion

// norm = invSqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);

norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);

q0 = q0 / norm; //w

q1 = q1 / norm; //x

q2 = q2 / norm; //y

q3 = q3 / norm; //z

#endif

// 由四元數計算出Pitch Roll Yaw,乘以57.3是為了將弧度轉化為角度,陀螺儀x軸為前進方向

// *Pitch = asin(2 * q2 * q3 + 2 * q0 * q1) * 57.295780; //俯仰角,繞x軸轉動

// *Roll = -atan2(2 * q1 * q3 - 2 * q0 * q2, -2 * q1 * q1 - 2 * q2* q2 + 1) * 57.295780; //滾動角,繞y軸轉動

// *Yaw = atan2(2 * q1 * q2 + 2 * q0 * q3, -2 * q2 * q2 - 2 * q3 * q3 + 1) * 57.295780; //偏航角,繞z軸轉動

*Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)*57.295780; // pitch

*Roll = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)*57.295780; // roll

*Yaw = -atan2(2 * q1 * q2 + 2 * q0 * q3, -2 * q2 * q2 - 2 * q3 * q3 + 1)*57.295780; //偏航角,繞z軸轉動

// *Yaw = 0;

if(*Yaw < -180 ){*Yaw = *Yaw + 360;}

if(*Yaw > 180 ){*Yaw = *Yaw - 360;}

}

總結

以上是生活随笔為你收集整理的上位机软件控制下位机PHP,采用stm32f103CB硬件I2C1/2(自制硬件)中断/DMA访问,四轴开源程序,DMP,PCB外框图纸库文件,USBToVCOM代码下位机...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。