陀螺仪原理,怎么测角度?

陀螺仪原理,怎么测角度?,第1张

陀螺仪测角度的工作原理:

陀螺仪本身与引力有关,因为引力的影响,不均衡的陀螺仪,重的一端将向下运行,而轻的一端向上。在引力场中,重物下降的速度是需要时间的,物体坠落的速度远远慢于陀螺仪本身旋转的速度时,将导致陀螺仪偏重点,在旋转中不断的改变陀螺仪自身的平衡,并形成一个向上旋转的速度方向。

如果陀螺仪偏重点太大,陀螺仪自身的左右互作用力也会失效。而在旋转中,陀螺仪如果遇到外力导致,陀螺仪转轮某点受力。陀螺仪会立刻倾斜,而陀螺仪受力点的势能如果低于陀螺仪旋转时速,这时受力点,会因为陀螺仪倾斜,在旋转的推动下,陀螺仪受力点将从斜下角,滑向斜上角。

而在向斜上角运行时,陀螺仪受力点的势能还在向下运行。这就导致陀螺仪到达斜上角时,受力点的剩余势能将会将在位于斜上角时,势能向下推动。

而与受力点相反的直径另一端,同样具备了相应的势能,这个势能与受力点运动方向相反,受力点向下,而它向上,且管这个点叫“联动受力点”。当联动受力点旋转180度,从斜上角到达斜下角,这时联动受力点,将陀螺仪向上拉动。在受力点与联动受力互作用力下,陀螺仪回归平衡。

扩展资料:

陀螺仪的应用:

1、隧道中心线测量

在隧道等挖掘工程中,坑内的中心线测量一般采用难以保证精度的长距离导线。特别是进行盾构挖掘的情况,从立坑的短基准中心线出发必须有很高的测角精度和移站精度,测量中还要经常进行地面和地下的对应检查,以确保测量的精度。

特别是在密集的城市地区,不可能进行过多的检测作业而遇到困难。如果使用陀螺经纬仪可以得到绝对高精度的方位基准,而且可减少耗费很高的检测作业(检查点最少),是一种效率很高的中心线测量方法。

2、通视障碍时的方向角获取:

当有通视障碍,不能从已知点取得方向角时,可以采用天文测量或陀螺经纬仪测量的方法获取方向角(根据建设省测量规范)。与天文测量比较,陀螺经纬仪测量的方法有很多优越性:对天气的依赖少、云的多少无关、无须复杂的天文计算、在现场可以得到任意测线的方向角而容易计算闭合差。

3、日影计算所需的真北测定:

在城市或近郊地区对高层建筑有日照或日影条件的高度限制。在建筑申请时,要附加日影图。此日影图是指,在冬至的真太阳时的8点到16点为基准,进行为了计算、图面绘制所需要的高精度真北方向测定。使用陀螺经纬仪测量可以获得不受天气、时间影响的真北测量。

参考资料来源:百度百科-陀螺仪原理

参考资料来源:百度百科-陀螺仪(角运动检测装置)

参考资料来源:百度百科-陀螺仪传感器

很简单,角度传感器有模拟和数字之分,模拟型(比如ADXL335,MMA7361)的只需要用AD采集X,Y,X三个方向的电压值值,然后经过公式计算出角度。数字型(比如ADX345L)按照IIC通信协议,可以直接从传感器内部读取出X,Y,Z三个方向的加速度,然后通过相应的公式计算出角度。

给你arduino的卡尔曼滤波融合算法,我只是封装了算法.

另外你这么难的问题应该给点分才厚道啊!

H文件:

/*

* KalmanFilter.h

* Non-original

* Author:x2d

* Copyright (c) 2012 China

*

*/

#ifndef KalmanFilter_h

#define KalmanFilter_h

#include

class KalmanFilter

{

public:

KalmanFilter()

/*

卡尔曼融合计算

angle_m:加速度计测量并通过atan2(ax,ay)方法计算得到的角度(弧度值)

gyro_m:陀螺仪测量的角速度值(弧度值)

dt:采样时间(s)

outAngle:卡尔曼融合计算出的角度(弧度值)

outAngleDot:卡尔曼融合计算出的角速度(弧度值)

*/

void getValue(double angle_m,double gyro_m,double dt,double &outAngle,double &outAngleDot)

private:

double C_0,Q_angle,Q_gyro,R_angle

double q_bias,angle_err,PCt_0,PCt_1,E,K_0,K_1,t_0,t_1

double angle,angle_dot

double P[2][2]

double Pdot[4]

}

CPP文件:

/*

* KalmanFilter.cpp

* Non-original

* Author:x2d

* Copyright (c) 2012 China

*

*/

#include "KalmanFilter.h"

KalmanFilter::KalmanFilter()

{

C_0 = 1.0f

Q_angle = 0.001f

Q_gyro = 0.003f

R_angle = 0.5f

q_bias = angle_err = PCt_0 = PCt_1 = E = K_0 = K_1 = t_0 = t_1 = 0.0f

angle = angle_dot = 0.0f

P[0][0] = 1.0f

P[0][1] = 0.0f

P[1][0] = 0.0f

P[1][1] = 1.0f

Pdot[0] = 0.0f

Pdot[1] = 0.0f

Pdot[2] = 0.0f

Pdot[3] = 0.0f

}

void KalmanFilter::getValue(double angle_m,double gyro_m,double dt,double &outAngle,double &outAngleDot)

{

/*

Serial.print("angle_m = ")

Serial.print(angle_m)

Serial.print("")

Serial.print("gyro_m = ")

Serial.print(gyro_m)

Serial.print("")

*/

angle+=(gyro_m-q_bias) * dt

angle_err = angle_m - angle

Pdot[0] = Q_angle - P[0][1] - P[1][0]

Pdot[1] = -P[1][1]

Pdot[2] = -P[1][1]

Pdot[3] = Q_gyro

P[0][0] += Pdot[0] * dt

P[0][1] += Pdot[1] * dt

P[1][0] += Pdot[2] * dt

P[1][1] += Pdot[3] * dt

PCt_0 = C_0 * P[0][0]

PCt_1 = C_0 * P[1][0]

E = R_angle + C_0 * PCt_0

K_0 = PCt_0 / E

K_1 = PCt_1 / E

t_0 = PCt_0

t_1 = C_0 * P[0][1]

P[0][0] -= K_0 * t_0

P[0][1] -= K_0 * t_1

P[1][0] -= K_1 * t_0

P[1][1] -= K_1 * t_1

angle += K_0 * angle_err

q_bias += K_1 * angle_err

angle_dot = gyro_m-q_bias

outAngle = angle

outAngleDot = angle_dot

/*

Serial.print("angle = ")

Serial.print(angle)

Serial.print("")

Serial.print("angle_dot = ")

Serial.print(angle_dot)

Serial.print("")

*/

}

#endif


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11202164.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存