智能车学习(十三)——角度控制
一、手册代码以及图示
二、流程说明
1、角度计算函数说明
//============================================================================
//函数名称:void AngleCalculate(void)
//函数返回:无
//参数说明:无
//功能概要:车身角度计算。
//============================================================================
void AngleCalculate(void)
{
//读取加速度计
MMA8451_Read(); //读取陀螺仪
LS3G4200D_Read(); //取陀螺仪的X轴数据
VOLTAGE_GYRO = Gyro_X; //取加速度读计的Y轴数据
VOLTAGE_GRAVITY = Gray_Y; //陀螺仪零偏跟随
Gyro_Offset_Calculate(); if(VOLTAGE_GRAVITY > 1050) //限制加速度计读数-1050 ~1050
{
VOLTAGE_GRAVITY = 1050;
} if(VOLTAGE_GRAVITY <= -1050)
{
VOLTAGE_GRAVITY = - 1050;
} //加速度计读取的Y轴数值转换为角度
g_fGravityAngle = (VOLTAGE_GRAVITY - GRAVITY_OFFSET) * GRAVITY_ANGLE_RATIO; //陀螺仪提取角速度
g_fGyroscopeAngleSpeed = (VOLTAGE_GYRO - GYROSCOPE_OFFSET) * GYROSCOPE_ANGLE_RATIO; //车身角度计算
g_fCarAngle = g_fGyroscopeAngleIntegral;
fDeltaValue = (g_fGravityAngle - g_fCarAngle) / GRAVITY_ADJUST_TIME_CONSTANT;
g_fGyroscopeAngleIntegral += (g_fGyroscopeAngleSpeed + fDeltaValue) / GYROSCOPE_ANGLE_SIGMA_FREQUENCY;
}
首先是通过加速度计测得重力加速度,然后通过归一化(因为g和角度成正比),计算出角度。然后由于车子运动过程中,车子加速度会产生一定的影响,导致不是正比关系,所以使用陀螺仪进行修正,陀螺仪测得是角速度,积分之后就是角度,然后再和加速度计测得角度进行融合,然后反馈回去,使得系统平衡。
2、陀螺仪零点跟随
/============================================================================
//函数名称:void Gyro_Offset_Calculate()
//函数返回:无
//参数说明:无
//功能概要://陀螺仪三个轴的零点跟随 Cut_Gyro_X为经过处理后的值, Gyro_X为实际的读值,Gyro_X_Offset 为零点
//============================================================================
void Gyro_Offset_Calculate()
{
float Cut_Gyro_X; //减去偏移值得到的实时值
Cut_Gyro_X = Gyro_X - GYROSCOPE_OFFSET; //根据实时值,修改零偏置
if(Cut_Gyro_X>=2)
{
GYROSCOPE_OFFSET += 0.001;
}
else if(Cut_Gyro_X<=-2)
{
GYROSCOPE_OFFSET -= 0.001;
}
else
{
GYROSCOPE_OFFSET = GYROSCOPE_OFFSET * 0.99 + 0.01 * Gyro_X;
}
//开机2秒进行跟随
if (Clocks_Gyro <= 400)
{
GYROSCOPE_OFFSET = GYROSCOPE_OFFSET * 0.5 + 0.5 * Gyro_X;
} }
根据实时值,修改零偏值。
3、其中有一些参数设置:
/***************直立控制*****************/ float g_fGravityAngle = 0; //加速度计转换来的角度
float g_fGyroscopeAngleSpeed = 0; //陀螺仪转换来的角速度
float g_fCarAngle = 0; //车身角度 float VOLTAGE_GYRO = 0; //定义陀螺仪(选X,Y,Z)
float VOLTAGE_GRAVITY = 0; //定义加速度计(选X,Y,Z) float GRAVITY_OFFSET = 27; //加速度计零偏
float GRAVITY_ANGLE_RATIO = (90 /(1050.0 - 27)) ; //加速度计归一化因子 float GYROSCOPE_OFFSET = 0 ; //陀螺仪零偏移
float GYROSCOPE_ANGLE_RATIO = 1.780; //归一化因子 float GRAVITY_ADJUST_TIME_CONSTANT = 2; //陀螺仪加速度计加和的比例因子
float GYROSCOPE_ANGLE_SIGMA_FREQUENCY = 200; //积分的频率 float Clocks_Gyro = 0; //开机2s内进行陀螺仪零点比对
智能车学习(十三)——角度控制的更多相关文章
- 智能车学习(十五)——K60野火2013版例程
一.中断函数注册方法: 1.格式: 配置某个功能的中断 注册中断函数 开启中断 2.一个例子 pit_init_ms(PIT0,);//定时中断初始化 set_vector_handler(PIT0_ ...
- 智能车学习(二十三)——浅谈心得体会
因为毕竟是竞赛,跟学校挂钩,没办法开源代码和算法完成思路,所以不能详细写太多,如果可以等价交换的话,应该还是可以向领导申请一下的. 在厦大信科通信系,参加这个比赛,大家都觉得性 ...
- 智能车学习(二十二)——浅谈速度控制
一.经典PID控制 使用遇限反向PID会比较适合有加减速的车子,使用变速积分适合跑匀速的车子.然后这种方法的条件下,一定要尽可能缩短控制周期.. 二.PID加棒棒控制 针对 ...
- 智能车学习(二十)——浅谈C车硬连接与软连接
一.为何要追求软连接? 车子进行软连接之后,可以达到一种效果,就是在高速过程中,车子如果快要发生侧翻的时候,只会跳一个后轮,且只是轻微,而前轮如果进行的内倾,就可以让前轮最大面积接触,增大 ...
- 智能车学习(十八)——电机学习
一.C车电机选择 1.摘要: 因为C车模在四轮车的优势是有两个电机,可以进行主动差速,劣势是电机太弱了....所以如何选择电机,就是个钱的问题了,电机多一点,就比较好选,但是C车电机跑多了就 ...
- 智能车学习(十七)——舵机学习
一.舵机的结构 舵机简单的说就是集成了直流电机.电机控制器和减速器等,并封装在一个便于安装的外壳里的伺服单元.能够利用简单的输入信号比较精确的转动给定角度的电机系统.舵机安装了一个电位器(或 ...
- 智能车学习(十一)——陀螺仪学习
一.学习说明 感觉就是配置I2C通信,然后直接移植51代码... 二.代码分享: 1.头文件: #ifndef I2C_GYRO_H_ #define I2C_GYRO_H_ /*********** ...
- 智能车学习(六)——OLED屏幕使用
一.代码展示 1.头文件: #ifndef OLED_H_ #define OLED_H_ extern unsigned char Draw[]; extern const unsigned cha ...
- 智能车学习(二)—— GPIO学习
一.概述 使用的是蓝宇的底层,主要有初始化管脚,设置管脚状态,反转管脚状态等. 二.代码重述: 1.头文件gpio.h #ifndef GPIO_H //防止重复定义(gpio_H 开头) #defi ...
随机推荐
- ios swift generator 文章推荐
https://medium.com/swift-programming/sequence-beyond-primitive-iterations-in-swift-80bc2507d8cc /// ...
- cxGrid 速度
在做AdoHelper实用程序的时候,我用了DevExpress的cxGrid控件.在此之前用的是dbgrid,考虑到不能把所有的数据都拉到本地,我用了动态生成的select top 500的命令.这 ...
- 上传文件报错System.Net.ProtocolViolationException: 必须先将 ContentLength 字节写入请求流,然后再调用 [Begin]GetResponse。
在上传文件的时候报错. 错误: System.Net.ProtocolViolationException: 必须先将 ContentLength 字节写入请求流,然后再调用 [Begin]GetRe ...
- AFNetWorking支持解析html的方法
在AFURLResponseSeriallzation.m的226行 手动添加@"text/html" 添加之前解锁文件
- C++与C#对比学习:类初始化
类和柏拉图的理念世界 我们知道面向对象编程中到处是一个个的类,但类只是个概念性的东西,不是个实体,不占内存,你没实例化之前也不能用它.只有把类实例化成一个对象后,它才是一个真正存在的实体.占有内存,能 ...
- 【Git】笔记1
学习廖雪峰Git教程的笔记 Git是什么: Git是目前世界上最先进的分布式版本控制系统 Git与Github的关系:github是一个用git做版本控制的项目托管平台,它为开源项目免费提供Git存储 ...
- 史上最全web.xml配置文件元素详解
一.web.xml配置文件常用元素及其意义预览 <web-app> <!--定义了WEB应用的名字--> <display-name></display-na ...
- C#更新SQLServer中的TimeStamp字段(时间戳) 防止同时修改一行时覆盖更新
C#更新SQLServer中的TimeStamp字段(时间戳) 分类: C#2012-10-24 15:10 1878人阅读 评论(0) 收藏 举报 public partial class Form ...
- supersr--图形上下文的注意点
- (void)test { // 不要自己调用drawRect:方法的原因: // 当系统调用drawRect:方法之前, 会创建一个与当前UIView的layer相关的图形上下文, 这样就可以保证 ...
- 【2016-10-11】Linux系统常用的关机或重启命令shutdown、reboot、halt、poweroff、init 0及init 6的联系与区别
Linux下常用的关机/重启命令一般包括: shutdown.reboot.halt.poweroff等,当然了我们可以使用init 运行等级runlevel 0即halt来关机,或使用init 运行 ...