独轮车成功站立

2023-05-16

真是废了不少力

卡了这么久首要原因就是过于青睐串级PID,串级PID可以自主寻找机械中位的特性实在是太优雅了,但动量轮这种对即使性要求极高的系统似乎不能用串级PID实现。昨天沉下心把串级PID推掉换成并联,波形一下就朝着正常的方向改变,再稍加调参那么三四个小时动量轮就很稳了。

没想到的是减速电机居然比动量轮还难调,O车模整车太重1:19的减速比就不太够用。调来调去电机都只有猛抽一下和静止两种状态,最终虽然平衡了但总体的静态效果还是不太可观。好在比赛只要保持稳定前进就行,静态不稳应该问题不大。

CSDN不支持发视频,那就把平衡代码发出来给大家参考参考吧。

虽然代码可读性和移植性都比较不错,但不建议大家直接拿去用,硬件差异很大。

我的硬件完全是自己搭的,陀螺仪MPU6050,减速电机电压7.4V,减速电机驱动集成H桥A4950,编码器也是自制的霍尔编码器一圈大概340线。

由此也证明了,龙邱逐飞为了利润把智能车市场拉太高了,明明六块钱的软件I2C陀螺仪就够用了他要推六十块的SPI陀螺仪,两块钱的集成H桥也够用了他要推MOS管搭的板子,我自制编码器全程投入不超过五十块而且效果优雅,他总推荐大家用一百多一个的高精度编码器。骄奢淫逸,把智能车搞得愈发商业化。

//X编码器积分限幅
static int range_x_enco(int value)
{
  static const int range_max = 10000;
  //略
}
float x_target_ang = 0;   //x轴目标角度(机械中位)

//X轴角度环PD
static void x_balance_cont(void)
{
  const float bal_kp = 90,bal_kd = 1100;          //PD参数
  int pwm_balance;                //临时存放输出量
  static float last_value;        //上一次的偏差量
  float ang_value = x_target_ang - atti.pitch;    //获取偏差量
  pwm_balance = bal_kp*ang_value + bal_kd*(ang_value - last_value);   //角度环PD
  speed.x1 = pwm_balance;   //输出PWM X1
  speed.x2 = pwm_balance;   //输出PWM X2
  last_value = ang_value;   //保存本次偏差用于下次微分
}
//X轴速度环PI
static void x_speed_cont(void)
{
  const float sp_kp = 9, sp_ki = 3, sp_kd = 12;   //PID参数
  int pwm_speed;                      //临时存放输出量
  int enco_value = enco.x1+enco.x2;   //两个动量轮编码器相加
  static int last_value = 0;
  static long enco_d_value;           //编码器积分
  enco_d_value += enco_value;         //累加出积分
  enco_d_value = range_x_enco(enco_d_value);   //编码器积分限幅
  pwm_speed = -(sp_kp*enco_value + sp_ki*enco_d_value/100 + sp_kd*(enco_value-last_value));    //速度环PID
  speed.x1 += pwm_speed;        //并联直接累加
  speed.x2 += pwm_speed;
  last_value = enco_value;      //记录本次差值用于微分
}

//Y轴角度积分限幅
int range_y_ang(int value)
{
  static const int value_max = 80;
  //略
}
//Y轴编码器积分限幅
int range_y_sp(int value)
{
  static const int value_max = 200;
  //略
}

float y_target_ang = 2.4;   //初始机械中位
float y_target_sp = 0;      //目标速度,要实现前进后退就改这个
//Y轴平衡环
static void y_balance_cont(void)
{
  const float bal_kp = 50,bal_ki = 6, bal_kd = 320;   //平衡环PD参数
  int pwm_balance;                        //临时存储输出量
  static float last_value = 0;            //记录偏差量,微分用
  static int ang_d_value = 0;             //角度积分量
  float ang_value = (y_target_ang - atti.roll);   //获取偏差量
  ang_d_value += ang_value;                       //积分
  ang_d_value = range_y_ang(ang_d_value);         //积分限幅
  if(ang_value > 0)                               //根据输出正负添加电机死区补偿
  {
    pwm_balance = (bal_kp*ang_value) + bal_kd*(ang_value-last_value)+40;   //角度环PD
  }  
  else if(ang_value < 0)
  {
    pwm_balance = (bal_kp*ang_value) + bal_ki*ang_d_value/100 + bal_kd*(ang_value-last_value)-40;
  }
  speed.y = pwm_balance;
  last_value = ang_value;                         //记录偏差量下次微分用
}
//Y轴速度环
static void y_speed_cont(void)
{
  const float sp_kp = 0.015, sp_kd = 0.09;    //速度环PD参数
  static int last_value;                 //记录上次的偏差量
  int sp_value = y_target_sp - enco.y;      //速度环偏差量
  y_target_ang -= (sp_kp*sp_value + sp_kd*(sp_value-last_value));    //速度环PD
  last_value = sp_value;  //保存偏差量用于下次微分
}

//定时器中断任务调度
//10ms定时器中断内调用
void tim_it_loop(void) 
{
  const int MAX_ANG = 20;   //安全角度
  glo_time+=10;             //全局时间
  //10ms
  {
    if(atti.pitch<MAX_ANG&&atti.pitch>-MAX_ANG&&atti.roll<MAX_ANG&&atti.roll>-MAX_ANG&&atti.work==1)    
    {//安全角度  MAX_ANG
      x_balance_cont();   //X平衡环
      y_balance_cont();   //Y平衡环
      get_enco_x();       //获取X编码器
      x_speed_cont();     //X速度环
      set_speed(speed.x1, speed.x2, speed.y);   //赋值PWM
    }
    else
    {//超过安全角度停止工作
      set_speed(0, 0, 0);
    }
  }
  //50ms
  if(glo_time%50==0)
  {
    get_enco_y();     //获取Y编码器
    y_speed_cont();   //Y速度环
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

独轮车成功站立 的相关文章

  • C++为什么要学习STL和Boost库

    最近一年我电话面试了数十位 C 43 43 应聘者 xff0c 惯用的暖场问题是 工作中使用过 STL 的哪些组件 xff1f 使用过 Boost 的哪些组件 xff1f 得到的答案大多集中在 vector map 和 shared ptr
  • 树莓派raspberry bullseye扩大虚拟内存

    之前用Ubuntu20 04的时候遇到很多bug xff0c 比如sudo apt update能用但图形界面却提示wifi不可用 xff0c 图形界面卡顿刷新黑屏 xff0c 图形界面没法使用硬件加速 xff0c 以及进入图形界面后无法使
  • 查看新增串口、USB设备

    注意 xff1a 虚拟机环境下的ubuntu默认情况下是不能自动识别的 xff0c 需要在虚拟机窗口右下角点击 34 Prolific USB Serial Controller 34 xff0c 然后选择 34 Connect Disco
  • ROS入门保姆级教程:7-ROS话题通信实现2:自定义消息类型(msg)

    ROS入门往期 xff1a ROS入门保姆级教程 xff1a 1 hello world初体验 ROS入门保姆级教程 xff1a 2 VScode中使用ROS ROS入门保姆级教程 xff1a 3 ROS文件系统 ROS入门保姆级教程 xf
  • Proteus仿真时报错:[SPICE] Too many iterations without convergence

    一 问题 xff1a 在利用Proteus仿真时 xff0c 经常会遇到 SPICE Too many iterations without convergence xff08 太多没有收敛的迭代 xff09 这个提示 xff0c 致使仿真
  • Android.bp编译提示ninja: error: unknown target ‘MODULES-IN-xxx‘终极指南

    Android bp编译提示ninja error unknown target 39 MODULES IN xxx 终极指南 Android bp系列博客 Android bp你真的了解吗 Android bp入门指南之Android m
  • 转折点----------我的IT梦

    干IT这一行快6年了 从来没有留下任何属于自己的一些所谓的阅历 时常去逛逛同行前辈们的空间 总能看到他们留下的心得体会 实则令人羡慕 xff0c 或者自己的卑微 xff0c 或者实在没什么体会 xff0c 写出来会丢人现眼 只是默默的去感受
  • 有了这份程序员面试指南,你离大厂Offer还远吗?| 附推荐书籍

    点击上方蓝色字体 xff0c 关注我 一个在阿里云打工的清华学渣 图by 石头 64 长白山 关于作者 xff1a 程序猿石头 ID tangleithu xff0c 现任阿里巴巴技术专家 xff0c 清华学渣 xff0c 前大疆后端 Le
  • 记录一次harbor的镜像扫描和更新

    前提 已经部署好harbor 192 168 14 16 项目名称 harbor 1 在harbor服务器拉取centos源镜像 root localhost docker pull centos Using default tag lat
  • 关于pixhawk硬件IMU和compass那点事儿

    文章目录 前言一 IMU和compass是什么 xff1f 二 导航坐标系与机体坐标系三 安装IMU xff0c compasss四 hwdef中设置IMU xff0c compass朝向总结 前言 继上一篇讲解了pixhawk的硬件组成
  • ubuntu下ardupilot编译环境搭建与仿真

    文章目录 前言一 ardupilot 源码下载二 编译环境建立仿真经验教训坑1坑2 参考 前言 虽然怒飞老师给出了详细的windows下的开发环境的搭建教程 但是对于开发者而言 xff0c 最好的系统环境还是在Linux系统下 xff0c
  • Ubuntu下MissionPlanner的安装

    文章目录 前言一 安装mono二 下载并使用MissionPlanner三 创建快捷脚本 前言 众所周知 xff0c QGC地面站外观更加好看 xff0c 开发上也是采用跨平台的Qt 在ubuntu上安装十分方便 但是我还是更喜欢用Miss
  • Nmap详解

    Nmap简介 Nmap也就是Network Mapper xff0c 网络发现 xff08 Network Discovery xff09 和安全审计 xff0c 是一款网络连接端扫描软件 xff0c 用来扫描网上电脑开放的网络连接端 确定
  • PX4 自定义bootloader生成

    本文主要是记录一下自己在这方面的学习 xff0c 方便以后回顾 xff0c 也希望对其他朋友有用 本着不重复造轮子的精神 xff0c 这里引文不在复制粘贴 xff0c 直接给出链接 生成bootloader的两种方式 以STM32H7作为主
  • PX4开发中遇到的一些问题和解决方法

    文章目录 前言正文1 仿真出现 FCU Preflight Fail Accel 0 uncalibrated等错误2 添加mavlink数据发送or提高数据发送频率3 PX4在不同硬件下的RC输入4 PX4 参数自定义5 电机输出顺序6
  • PX4自定义混控器

    文章目录 前言混控器简介混控器的启动自定义混控器参考 xff1a 前言 上一篇我对PX4的控制和输出的全流程都进行了较为详尽的分析 xff0c 本来想着之后的研究主要在四旋翼控制算法上 xff0c 不会定义啥新机型 xff0c 混控器的部分
  • 运行VINS,相机模型与参数的准备

    相机模型与参数 对于VINS来说 xff0c 相机的内参的准确是万分重要的 如果参数不对 xff0c 那么100 跑飞 xff0c 没商量 要想VINS可以很好的工作 xff0c 给出良好的相机内参是必须的 对于realsense系列的相机
  • MTF模块 PX4 光流模块详细配置

    对于研究无人机的新手 xff0c 直接飞手动模式 xff0c 可能过于困难 在室内测试时 xff0c 又没有GPS可用 为了安全和方便起见 xff0c 可以考虑选用光流模块 xff0c 降低入手难度 这里我们选择微空科技出品的MTF 01模
  • GNSS系列(3)------GNSS定位漂移讨论

    由于工作需要 xff0c 最近开启了GNSS系列文章的撰写工作 xff0c 发布于公司官网 xff0c 现将其同步至CSDN 原文链接 xff1a http onemo10086 com school article 196 小伙伴们 xf
  • ML302 OpenCPU系列(5)---Log工具的使用

    ML302 OpenCPU系列 xff08 5 xff09 Log工具的使用 一 使用串口助手抓取Log二 使用Coolwatcher抓取AP Log三 查看死机现场 工欲善其事 xff0c 必先利其器 Log是嵌入式开发中最重要的调试手段

随机推荐

  • 2017--就业分享之IT校招现状和面试经历

    在介绍自己整个春季和夏季实习求职经历之前 xff0c 先给大家公布一则新闻 2017届互联网校招薪酬报告 xff1a 先说下对 16 年 17 届校招的总体看法 xff1a 本该是个不大不小的年 xff0c 结果被华为一己之力搞成了个大年
  • Shell判断字符串是否相等,=两边需要有空格

    custom span class token operator 61 span span class token string 34 34 span span class token keyword if span span class
  • 学嵌入式系统设计的人应不应该看模拟电路基础

    我学嵌入式系统设计是首先从数字电路看起的 由于数字电路这门课程在大一的时候就学过 xff0c 所以觉得略看就能看懂 xff0c 也算是把这门课复习了一遍 但是当我看到存储器和可编程控件这一章时 xff0c 里面讲到存储单元主要是由半导体组成
  • 使用Python爬取淘宝两千款套套

    各位同学们 xff0c 好久没写原创技术文章了 xff0c 最近有些忙 xff0c 所以进度很慢 xff0c 给大家道个歉 gt 警告 xff1a 本教程仅用作学习交流 xff0c 请勿用作商业盈利 xff0c 违者后果自负 xff01 如
  • ​揭秘国内首个进入Apache的高校顶级项目——Apache IoTDB

    本文约4200字 xff0c 建议阅读10 43 分钟 本文与你分享有关开源数据库项目成长 开源社区治理 加速赋能企业等方面的观点与见解 近年来 xff0c 随着人工智能 物联网的兴起 xff0c 大数据成为重要的生产资料 xff0c 而时
  • 收藏 | 一张地图带你玩转机器学习(附资源)

    本文来自AI学习与实践平台SigAI 本文共16965字 xff0c 建议阅读20 43 分钟 本文对常用的机器学习和深度学习算法进行了总结 xff0c 整理出它们之间的关系 xff0c 以及每种算法的核心点 xff0c 各种算法之间的比较
  • python代码获取远程电脑IP

    实时的使用邮箱发送IP地址到指定邮箱 使用python代码封装好的软件 xff1a 链接 xff1a https pan baidu com s 1Flz7HHtZM0w3HGDeF 4BhQ pwd 61 yxy2 提取码 xff1a y
  • win11旗舰版安装WSL子系统和环境-3Ubuntu换源

    Wsl2开启 Ubuntu换源 https blog csdn net WPwalter article details 101508601 这个blog是进行系统安装WSL2 的 Linux 第一步 xff1a 启用虚拟机平台和 Linu
  • win11旗舰版安装WSL子系统和环境-12配置SSH(Win远程连接)

    配置SSH Win远程连接 https blog csdn net weixin 43897590 article details 109446339 utm medium 61 distribute pc relevant downloa
  • win11旗舰版安装WSL子系统和环境-17Xshell连接wsl子系统的ssh

    https blog csdn net w4187402 article details 85992013 那么问题找到了 出现这样的问题只能是ip冲突 xff0c 其他同事的服务器占用了我当前服务器的ip地址 xff0c 我现在连接的服务
  • 超好用的word插件-工作和科研

    Word精灵7 0版 可以很好地处理图片 xff0c 转换 xff0c 以及各种批量处理操作 GrammarlyAddInSetup 可以很好地校对英文错误 xff0c 单词以及语法错误 xff0c 但被动语态不太行 链接 xff1a ht
  • Adobe Premiere Pro 2023 SP(未完成)

    需要添加
  • 一个程序员所应该具备的精神

    所谓障碍都是主观上的 如果你想研发什么新的技术 xff0c 只需要在冰箱里放满食物和饮料 xff0c 再有一台便宜的计算机 xff0c 和以之献身的决心 xff0c 你即可拥有任何你想拥有的编程深度 xff01 John Carmack
  • ROS中的多线程

    ROS中的多线程 ROS多线程消息回调处理函数多线程MultiThreadedSpinnerAsyncSpinner callback传参timertimer加参数 C 43 43 中的多线程Python中的多线程 ROS使用master管
  • Linux系统下磁盘分区

    计算机的磁盘分区信息是计算机引导操作系统必须的信息 xff0c 根据引导方式的不同 xff0c 一般分别保存在MBR或者GPT中 其中 xff0c BIOS引导会读取MBR xff08 Main Boot Record xff09 中的磁盘
  • ROS中的tf发布读取转换

    ROS tf 基础使用查看tf信息1 创建link关系图2 在rqt中查看link关系图3 终端中输出tf变换关系4 rviz中查看 程序中使用TransformerTransformBroadcasterTransformListener
  • linux下shell脚本启动其他可执行程序

    linux下shell脚本启动其他可执行程序 零 前言一 C 43 43 代码二 shell脚本三 shell运行效果 零 前言 linux下的项目中经常需要使用shell脚本去启动其他程序的操作 xff0c 下面是自己编写的测试程序 xf
  • 嵌入式面试常见问题

    1 什么是嵌入式 以应用为中心 xff0c 以计算机技术为基础 xff0c 软硬件可裁剪 xff0c 适用于应用系统对功能 可靠性 成本 体积 功耗有严格要求的专用计算机系统 2 字符设备和块设备的区别 xff1f Linux里设备类型分
  • 步进电机和伺服电机的区别你知道吗?

    在许多领域都需要各种电机 xff0c 包括知名的步进电机和伺服电机 但是 xff0c 对于许多用户而言 xff0c 他们不了解这两种电机的主要区别 xff0c 因此他们始终不知道如何选择 那么 xff0c 步进电机和伺服电机之间的主要区别是
  • 独轮车成功站立

    真是废了不少力 卡了这么久首要原因就是过于青睐串级PID 串级PID可以自主寻找机械中位的特性实在是太优雅了 但动量轮这种对即使性要求极高的系统似乎不能用串级PID实现 昨天沉下心把串级PID推掉换成并联 xff0c 波形一下就朝着正常的方