• 智能车学习(十三)——角度控制


    一、手册代码以及图示

    image

    二、流程说明

    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内进行陀螺仪零点比对
  • 相关阅读:
    MySQL性能优化的最佳20+条经验
    初窥Linux 之 我最常用的20条命令
    Java内存模型
    未能加载文件或程序集“System.Net.Http.Formatting, Version=4.0.0.0, Culture=n
    Nginx 负载均衡之 upstream 参数 和 location 参数
    Nginx 简单配置方法
    关于使用 autoFac 的注入方法
    关于 VS 调用存储过程加载很慢和SQL 执行很快的那些事
    C# 客户端读取共享目录文件
    NodeJS、NPM安装配置步骤
  • 原文地址:https://www.cnblogs.com/BlueMountain-HaggenDazs/p/4947961.html
Copyright © 2020-2023  润新知