直立车学习笔记(一)

2023-05-16

  直立车是通过两个电机的前后加速度来维持车体保持一定的角度,调直立对于PID的理解有一个质的飞跃,接下来我会不定期更新我学习直立车的成果和调PID的经历,记录一下我的成果,也让其他人学习一下,避免一下我踩过的坑。

  调直立,第一点肯定是让车子立起来,立起来就需要得到车体的姿态信息,就要对车子进行姿态解算。

  智能车的姿态解算不向四轴飞行翼那样麻烦,我们只需要得到车子的俯仰角就可以用来写车子的直立环,初步让它立起来了。姿态角的解算需要用到一个姿态传感器,目前我车上用的是逐飞的Icm20602六轴姿态传感器,集成了三轴加速度计和三轴陀螺仪。

    在Icm20620中,三轴加速度计和三轴陀螺仪的三个轴是相同的。三轴陀螺仪的作用是检测角速度,角速度积分可得角度,拿哪个轴的角速度进行积分就和你的陀螺仪安装位置相关,像我这样安装的话就是拿Y轴角速度进行积分。但是陀螺仪的角速度积分会有积分误差,误差值与积分时间dt成正比。直到电路饱和,得到的角度信息就会变得不可信。三轴加速度计这个检测器件在各个方向的形变情况而采用得到受力数据,传感器输出经转换后的加速度数据。只有重力作用时,三轴加速度计输出的就是重力加速度在各个轴上的分量。通常我们需要的正切角由X轴加速度和Z轴加速度正切而来,但是三轴加速度计不会区分重力加速度和外力加速度,当物体运动时,它会在运动的方向上检测出加速度,所以加速度计对振动之类的噪声会比较敏感。所以单单用加速度计正切出姿态角,那么姿态角的波形会非常抖动,是不能用来控制直立车的。 

   那么我们该如何运用Icm20602得到可用且稳定的姿态角数据呢,其实网上有许多方法,卡尔曼滤波,四元数解算,互补滤波。我用到了其中最为简单的互补滤波,我的实践也证明互补滤波完全可以胜任直立车的控制。

  互补滤波可以看作是低通滤波和高通滤波的结合。通过以上分析可知,加速度计的静止稳定性好,但是运动时他的数据波动会变得不可靠;陀螺仪的数据稳定性好,但是容易积分产生累计误差,导致长期数据不可信。我们需要一个滤波器,使滤出的角度既有陀螺仪数据的稳定性,又有加速度数据的长期可信度。

  低通滤波器:低通滤波的目的是只让长期信号的变化量通过,过滤短期的波动。一种方法是力的变化建立在随后的时间一点一点地通过程序循环。比如:angle = (0.98)*angle + (0.02)*x_acc中,开始是零的角度,加速计突然跳跃10º,角估计的改变像随后的迭代

 如果传感器保持在10º,角度估计将会上升直至在它水平这个值。所花费的时间,达到充分数值既取决于过滤常数(例如0.98和0.02)也取决于采样率的回路(dt)。

  高通滤波器:理论低通滤波器相比这有点难以解释,但作用上它恰恰和低通滤波器相反:它允许短周期信号通过过滤信号而达到稳定这能用来抵消漂移(过滤掉直流成分)

  采样周期:每个程序之间经过循环所需时间的长短。如果采样率是100赫兹,采样周期为0.01秒。时间常数:滤波器的时间常数表现为一个相对持续的信号对于一个低通滤波器,分析了信号的时间常数远比通过信号改变而短于过滤时间常数。对于高通滤波器那就是相反的,这个时间常数,τ是一个低通滤波器。

     互补滤波器: y = (a)*(y) + (1-a)*(x);

  这表示滤波器的两个部分总是合成一部分,输出是一种精度高的值、单位线性估计这样做有意义感觉滤波器准确互补, 但是当时间常数远比采样率大的时候是一个很好的近似(对任何数字控制来说一个必要条件)。

  由以上分析可见,通过互补滤波,我们取合适的滤波系数,在采样频率够高的情况下,就可以得到一个兼具陀螺仪的稳定性和加速度计的可信度的数据。而Icm20602的采样频率可以高达1000Hz,所以作为结果简单,运算速度快的互补滤波成为了我姿态角数据融合的首选。

  接下来我就分享一下我互补滤波的算法


#define dtt 0.01f // 采样频率1K,采样周期0.01s
#define Cacc 0.0024f 
#define Cgyro 16.4f  

void HuBu_Filtering(RealDate_param_t *p_stRDAT,RealAngleparam_t *p_stRAG)
{

    p_stRDAT->R_acc_x =  icm_acc_x * Cacc ;                 
    p_stRDAT->R_acc_z = icm_acc_z * Cacc ;                   
    p_stRDAT->R_gyro_y = gyro_mean_filter(icm_gyro_y,8) / Cgyro ;//平滑滤波后转换单位

    p_stRAG->anglespeed = p_stRDAT->R_gyro_y;                 
    p_stRAG->angle_acc = atan2f(p_stRDAT->R_acc_z,p_stRDAT->R_acc_x) * 57.3f;          

    p_stRAG->angle_gyro = p_stRAG->angle_Filtering + p_stRAG->anglespeed * dtt;    
    p_stRAG->angle_Filtering = K1 * p_stRAG->angle_acc + (1 - K1) * p_stRAG->angle_gyro;

}

    其中Cacc是加速度转换系数,为9.8/分辨率,我的分辨率是12位,那么就是9.8/4096 = 0.0024,Cgyro是角速度转换系数,跟陀螺仪的灵敏度有关,可以参考Icm20602数据手册,我选用的是满量程2000dps,对应灵敏度为16.4,平滑滤波可要可不要。

  在调滤波参数时可以充分利用上位机,观察波形,这里推荐一个上位机叫VisualCope,比较朴实,算是好实现的。通信代码如下:

void VisualScope_Output(float data1 ,float data2 ,float data3 ,float data4)
{
  int temp[4] = {0};
  unsigned int temp1[4] = {0};
  unsigned char databuf[10] = {0};
  int i;
  unsigned short CRC16 = 0;

  temp[0] = (int)data1;
  temp[1] = (int)data2;
  temp[2] = (int)data3;
  temp[3] = (int)data4;

  temp1[0] = (unsigned int)temp[0];
  temp1[1] = (unsigned int)temp[1];
  temp1[2] = (unsigned int)temp[2];
  temp1[3] = (unsigned int)temp[3];

  for(i=0;i<4;i++)
  {
    databuf[i*2]   = (unsigned char)(temp1[i]%256);
    databuf[i*2+1] = (unsigned char)(temp1[i]/256);
  }


  CRC16 = CRC_CHECK1(databuf, 8);
  databuf[8] = CRC16%256;
  databuf[9] = CRC16/256;
  for(i=0; i<10; i++)
  {
      uart_putchar(UART_0,databuf[i]);
  }
}

void display(float ch1, float ch2, float ch3, float ch4)
{
    float OutData[4];
    OutData[0] = ch1;
    OutData[1] = ch2;
    OutData[2] = ch3;
    OutData[3] =ch4;
    VisualScope_Output(OutData[0],OutData[1] ,OutData[2] ,OutData[3]);
    //delay_ms(1000);
}

unsigned short CRC_CHECK1(unsigned char *Buf, unsigned char CRC_CNT)
{
    unsigned short CRC_Temp;
    unsigned char i,j;
    CRC_Temp = 0xffff;

    for (i=0;i<CRC_CNT; i++){
        CRC_Temp ^= Buf[i];
        for (j=0;j<8;j++) {
            if (CRC_Temp & 0x01)
                CRC_Temp = (CRC_Temp >>1 ) ^ 0xa001;
            else
                CRC_Temp = CRC_Temp >> 1;
        }
    }
    return(CRC_Temp);
}

  好的姿态角波形,波形的跟随性要强,而且要圆滑,跟随性不强会导致车的控制滞后,难以稳定,不圆滑会导致车子剧烈抖动。我的参数波形是这样的,蓝色是加速度数据,黄色是滤波脚数据,波形跟原始数据重合度高,就可以进行下一步直立环的调节了。

   关于姿态解算我就说这么多,接下去还会更新直立车的串级PID的调法和写法,大三了,学业繁忙,更新比较慢,见谅。鄙人才疏学浅,掌握的知识不多,但是有问题也可以在评论区提一下,虽然可能我也不太会,但是我一定尽力解答。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

直立车学习笔记(一) 的相关文章

  • 平衡小车实现

    平衡小车 1 前期准备 1 1 I2C通讯协议 在与MPU6050进行数据的读取时需要用到I2C通讯协议来进行通信 物理层 IIC一共有只有两个总线 xff1a 一条是双向的串行数据线SDA xff0c 一条是串行时钟线SCL SDA Se
  • 关于STM32CubeMX生成不了Keil代码的解决办法

    关于STM32CubeMX生成Keil代码时弹出but MDK ARM project generation have a problem的问题 有两种可能 xff1a 1 输出路径或文件名包含中文 2 Java环境版本不匹配 下载 xff
  • 2020电赛D题绕组飞行器

    在准备电赛的过程中 xff0c 做了一下去年的题 xff0c 本文将介绍我的方案及部分代码 xff0c 希望可以帮助到大家 一 我的装备 由于初学飞控所以主控用的是匿名的拓空者 xff0c 还有匿名的光流传感器 xff0c 北醒的激光雷达
  • nuxtjs常见问题

    1 在服务器端部署 xff0c 需要再服务器端安装node modules 2 本地忽略 nuxt文件夹 xff0c 这个需要在服务器端上执行npm run build生成 xff0c 然后执行 pm2 start npm name 34
  • Ubuntu学习笔记:sudo:vim:command not found

    Ubuntu学习笔记 xff1a sudo xff1a vim xff1a command not found 完成 xff01
  • Ubuntu学习笔记:查看所有用户

    Ubuntu学习笔记 xff1a 查看所有用户 输入 cat etc passwd cut f 1 d 注意 xff01 结尾有一个 xff1a 效果如下 xff1a
  • Ubuntu学习笔记:cd命令

    Ubuntu学习笔记 xff1a cd命令 命令顺序 xff1a 创建一个名为aaa的文件夹 进入指定文件夹 返回上一级文件夹 进入指定文件夹 返回上一级文件夹 退回上一次操作的文件夹 显示上一次操作的文件夹所在的路径 退回多级文件夹 退回
  • Ubuntu学习笔记:swapon 失败:设备或资源忙

    swapon 失败 xff1a 设备或资源忙 用命令swapoff xff0f 交换分区 将交换分区停止 然后再用swapon命令重新加载即可
  • Ubuntu学习笔记:使用命令查看当前登录系统的用户信息

    Ubuntu学习笔记 xff1a 使用命令查看当前登录系统的用户信息 1 查看当前登录的用户名 2 查看当前登录的用户名 终端类型 时间 IP地址 3 服务器连接的所有用户及正在使用的进程 4 显示系统中有哪些使用者正在上面 xff0c 显
  • Ubuntu学习笔记:使用命令查看系统资源,内存使用情况

    Ubuntu学习笔记 xff1a 使用命令查看系统资源 xff0c 内存使用情况 方法1 打开资源管理器 资源 gnome system monitor 方法2 top命令 方法3 下载htop apt get install htop h
  • Ubuntu学习笔记:使用命令修改 root 用户的密码

    Ubuntu学习笔记 xff1a 使用命令修改 root 用户的密码 Ubuntu 每次开机都有一个随机的新的 root 密码 在不知道密码的情况下 xff0c 要重新修改root密码 方法 xff1a sudo passwd 输入用户登录
  • C语言的特点

    1 语言简洁 紧凑 xff0c 使用方便 灵活 xff1b 2 运算符丰富 xff1b 3 数据类型丰富 xff1b 4 具有结构化的控制语句 xff08 例如if else语句 while语句 do while语句 switch语句和fo
  • Win11 更新绕过TPM2.0 方法 最新最简单 亲测有效 Win11系统更新 DEV方式

    最新的win11内测把不符合硬件规定的人都排除出去了 xff0c 虽然有注册表导入可以挤到DEV通道 xff0c 不过在更新到8 会弹出显示设备不支持提示 xff0c 关闭窗口后升级被取消 因此特在实践后教大家如何绕过TPM2 0 更新的方
  • iview常见问题

    1 radio组 label如果为字符串可以默认选中 xff0c 如果为数字 xff0c 却没有反应 答 xff1a label为数字时 xff0c 需要在label前加 xff1a 来绑定 xff0c 这样就可以实现默认选中了
  • 【通信协议】IIC通信协议详解

    IIC的基本介绍 IIC总线的发展 xff1a 芯片间总线 xff08 Inter Interface Circuit xff0c IIC xff09 xff0c 是应用广泛的芯片间串行扩展总线 目前世界上采用的IIC总线一共有两个规范 x
  • 【通信协议】单总线协议详解——以DHT11为例

    单总线概述 1 单总线的介绍 xff08 1 xff09 单总线也称为1 Wire bus xff0c 它是由美国DALLAS xff08 达尔斯 xff09 公司推出的外围串行扩展总线 单总线系统中配置的各种器件 xff0c 由DALLA
  • 【STM32学习笔记】(4)—— STM32工程文件详解

    STM32工程文件构成 从下图可以看出我们的工程目录是由CORE OBJ STM32F10x FWLib USER SYSTEM以及HARDWARE文件夹组成的 此外还有一个文本文档README TXT 以及一个Windows 批处理文件
  • 【STM32学习笔记】(6)—— 跑马灯实验详解

    跑马灯实验 在前面五篇STM32学习笔记中 xff0c 我们已经初步认识了STM32芯片 xff0c 并且了解STM32的常用寄存器 xff0c 介绍了STM32的GPIO模式 xff0c STM32工程文件 xff0c 以及最终讲解了如何
  • 【STM32学习笔记】(9)——串口通讯(USART)详解

    本文主要参考了野火的零死角玩转STM32和正点原子的STM32F1 开发指南 V1 1 xff08 精英板 库函数版本 xff09 xff0c 文章中大部分知识都是从两本书中提取出来 xff0c 串口通信协议的知识主要参考野火的书籍 xff
  • 【STM32学习笔记】(12)——NVIC(嵌套向量中断控制器)详解

    NVIC xff08 嵌套向量中断控制器 xff09 简介 在讲如何配置中断优先级之前 xff0c 我们需要先了解下 NVIC NVIC 是嵌套向量中断控制器 xff0c 控制着整个STM32芯片中断相关的功能 xff0c 它跟Cortex

随机推荐

  • 【STM32学习笔记】(15)——窗口看门狗(WWDG)详解

    窗口看门狗 WWDG 概述 窗口看门狗通常被用来监测 xff0c 由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障 除非递减计数器的值在T6位变成0前被刷新 xff0c 否则看门狗电路在达到预置的时间周期时 x
  • 【元器件学习笔记—电阻】(6)——电阻并联电路

    电阻串联和并联电路 任何复杂的电路经过各种等效和简化后都可以归纳为两种电路 xff1a 一是串联电路 xff0c 二是并联电路 电阻并联电路 并联电路与串联电路是完全不同的电路 xff0c 它们之间不能相互等效 xff0c 并联电路的一些特
  • 【元器件学习笔记—电阻】(7)——电阻串并联电路

    电阻串并联电路 电阻串并联电路是电阻串联电路与电阻并联电路的组合电路 下图所示是由 3 只电阻器构成的电阻器串并联电路 电路中的电阻 R1 和 R2 并联 xff0c 然后再与电阻 R3 串联 xff0c 这就是纯电阻的串并联电路 纯电阻器
  • 【元器件学习笔记—电阻】(8)——电阻分压电路

    电阻分压电路 电阻分压电路工作原理 下图所示是典型的电阻分压电路 xff08 没有接入负载电路 xff09 xff0c 电阻分压电路由 和 两只电阻构成 电路中有电压输入端和电压输出端 1 电路结构 输入电压 加在电阻 和 上 xff0c
  • 小程序验证手机号和身份证号码

    if isPhone params mobile Toast content 39 请填写正确的手机号 39 type 39 error 39 return false var idCardMsg 61 identityIDCard par
  • 神州战神笔记本清灰+换硅脂-记录

    文章目录 Introduction拆清灰涂抹硅脂安装开机测试 Introduction 笔记本购买于2020年4月份左右 xff0c 至今已使用2年半时间 CPU是i7 9750H xff0c 基准频率是2 6GHz 用control ce
  • 【PADS VX2.4下载与安装】

    PADS VX2 4下载与安装 电脑 xff1a Windows10 64bit 一 下载地址 链接 xff1a https pan baidu com s 1yTAU5Hymrc1i8MhALwbsrA 提取码 xff1a hljd 二
  • 【FreeRTOS】详细讲解FreeRTOS中消息队列并通过示例讲述其用法

    讲解FreeRTOS中消息队列及其用法 使用消息队列的原因消息队列函数解析示例遇到的问题 使用消息队列的原因 在裸机系统中 xff0c 两个程序间需要共享某个资源通常使用全局变量来实现 xff1b 但在含操作系统 下文就拿FreeRTOS举
  • 【FreeRTOS】详细讲解FreeRTOS里中断管理并通过示例讲述其用法

    文章目录 中断函数解析FreeRTOS中断使用示例 中断 大家看到中断后 xff0c 有没有想到一个名词 异常呢 xff1f 若大家想到了 xff0c 但是记不起相关概念 xff1b 或者是 xff0c 大家没想到这个名词 xff0c 没关
  • 【嵌入式软件开发实习】个人面试记录及其总结(一)

    文章目录 问题一 xff1a 使用宏定义完成两个数据的交换问题二 xff1a 制作一个函数接口判断函数参数输入是否符合要求 xff0c 如果符合要求就返回部分输入 xff0c 如果不符合就返回no result问题三 xff1a 什么是结构
  • 嵌入式经典通信总线协议——RS232和RS485

    UART 通信的不足 注意 xff1a TTL电平信号通信距离应该 lt 61 1 5米 两种电平标准 RS232协议 因为控制器一般使用 TTL 电平标准 xff0c 所以常常会使用 MA3232 芯片对 TTL 及 RS 232电平的信
  • 把所阅读的文章背景/主题变成白色

    今天在CSDN找SVD分解的资料 xff0c 找到了一篇写的很好的文章 xff0c 但是它的主题是黑色的 xff0c 是黑色的 xff01 作为黑色主题深恶痛绝人士 xff0c 于是我便想把这篇文章的主题改成白色 我们作为读者似乎并没有这个
  • 计算机保研专业课必备之数据结构

    数据结构保研面试准备 算法的五大特征 有穷性 有限的步骤确定性 不可二义性可行性 每一步都是通过执行有限次数完成的输入 零个或多个输入输出 至少有一个或多个输出 O n 的大O是什么意思 xff1f 什么是时间复杂度 大O表示的是最坏情况下
  • Go语言快速的一键生成一个gRPC服务

    目录 前言 介绍 使用命令行工具 micro 生成 gRPC 服务 安装 xff1a 创建项目 xff1a 安装 protobuf 和依赖项 xff1a 构建并运行服务 xff1a 总结 前言 由于近期因为一些事情很久没更了今天带来一个Go
  • 编程实现在str1中查找str2的初始位置

    问题描述 有两个字符串str1和str2 xff0c 它们的长度都不超过100个字符 请编程实现在str1中查找str2的初始位置 输入形式 有两行输入 xff0c 第一行输入字串str1 xff0c 第二行输入字串str2 输出形式 一个
  • 数据挖掘Java——KNN算法的实现

    一 KNN算法的前置知识 k 近邻 xff08 kNN k NearestNeighbor xff09 是在训练集中选取离输入的数据点最近的k个邻居 xff0c 根据这个k个邻居中出现次数最多的类别 xff08 最大表决规则 xff09 x
  • thinkPHP生成微信支付平台证书

    1 先安装微信支付V3版本 xff1b 2 在目录 vendor wechatpay wechatpay下执行以下代码 xff1b 3 在本地VScode编辑器的终端运行命令行 xff0c 执行以下代码 xff1a composer exe
  • 数据挖掘Java——DBSCAN算法的实现

    一 DBSCAN算法的前置知识 DBSCAN算法 xff1a 如果一个点q的区域内包含多于MinPts个对象 xff0c 则创建一个q作为核心对象的簇 然后 xff0c 反复地寻找从这些核心对象直接密度可达的对象 xff0c 把一些密度可达
  • 数据挖掘Java——Kmeans算法的实现

    一 K means算法的前置知识 k means算法 xff0c 也被称为k 平均或k 均值 xff0c 是一种得到最广泛使用的聚类算法 相似度的计算根据一个簇中对象的平均值来进行 算法首先随机地选择k个对象 xff0c 每个对象初始地代表
  • 直立车学习笔记(一)

    直立车是通过两个电机的前后加速度来维持车体保持一定的角度 xff0c 调直立对于PID的理解有一个质的飞跃 xff0c 接下来我会不定期更新我学习直立车的成果和调PID的经历 xff0c 记录一下我的成果 xff0c 也让其他人学习一下 x