写点什么

玩转 OpenHarmony PID:教你打造两轮平衡车

  • 2022-12-16
    上海
  • 本文字数:2608 字

    阅读完需:约 9 分钟

玩转OpenHarmony PID:教你打造两轮平衡车

简介

此次为大家带来的是 OpenAtom OpenHarmony(以下简称“OpenHarmony”)系统与 PID 控制算法相结合并落地的平衡车项目。


PID 控制算法是一种经典的,并被广泛应用在控制领域的算法。类似于这种:需要将某一个物理量保持稳定的场合,比如维持平衡,稳定温度、转速等,PID 都会适用。在四轴飞行器,平衡小车、汽车定速巡航、温度控制器等场景均有应用。



通过本样例的学习,开发者能够对 OpenHarmony 系统设备端开发有进一步的认识,还能够掌握 PID 控制算法的使用。本样例使用 OpenHarmony 3.2 Beta1 操作系统,硬件平台采用小熊派 BearPi-HM Nano(Hi3861)开发板。本样例效果动图:



硬件配置资源

两轮平衡小车主要硬件资源:

主控 CPU:小熊派 BearPi-HM Nano(Hi3861)开发板;

陀螺仪:MPU6050 六轴陀螺仪传感器;

左右轮:带有霍尔传感器的直流电机;

小车平台及结构件资源可以自行在相关网站获得。


原理概括


小时候都玩过上图游戏吧:木杆立在手指上,尽量保持木杆直立不倒。


当木杆向前倾斜时,我们会往前行走,以用来抵消木杆的前倾;往后倾斜时,我们会往后倒退。对的!没错!你猜对了。平衡车的控制原理就是这样:


PID 算法介绍

平衡车的控制离不开对 PID 算法的应用。那么什么是 PID 算法?它能解决什么问题?


PID 算法:就是“比例(proportional)、积分(integral)、微分(derivative)”,是一种常见的“保持稳定”控制算法。



结合两轮平衡车的场景,对 PID 参数的认识如下:


P 比例参数:该参数能够快速让小车达到平衡状态,但是由于控制是滞后的,以及是惯性系统,容易带来超调,即小车会出现前后摇摆的现象。所以 P 参数不能太大;


I 积分参数:小车由于摩擦力或者风阻力,并且 P 不能太大,只靠 P 控制有可能达不到稳定状态,所以需要加入 I 积分参数,消除稳态误差;


D 微分参数:平衡小车维持的是倾斜角度要为平衡角度,由于 PI 参数使小车振荡,小车会出现前后摇摆现象,加入 D 微分参数能够消除小车的振荡。


两步搭建样例工程

在 OpenHarmony 源码基础上,两步构建平衡小车代码。(OpenHarmony 源码下载路径及 BearPi-HM Nano(Hi3861)开发板代码烧录,请参考文章末尾相关链接)


第一步:拷贝 Balance_car 文件夹到源码路径下:\device\board\bearpi\bearpi_hm_nano\app\ (Balance_car 文件获取路径,请参考文章末尾相关链接)如图文件夹目录:


第二步:修改 BUILD.gn,在源码路径下:\device\board\bearpi\bearpi_hm_nano\app\BUILD.gn 添加编译依赖:"Balance_car:balance_car",如下图:


关键算法讲解

两轮平衡车的控制主要涉及三个 PID 环的串联使用,它们分别是直立环(平衡控制)、速度环(速度控制)、转向环(方向控制)。三个控制效果合成,控制轮子运行。



直立环控制算法:

直立环控制算法是平衡小车维持平衡的主要算法。直立环采用了 PD 算法环节,即只有比例与微分环节。


倾斜角度大小以及角加速度大小决定了轮子的速度大小。可以理解为倾斜角度越大,控制轮子顺着倾斜的方向的速度越大;倾斜的角加速度越大,控制轮子速度也要越大。


float g_middleAngle = 1.0;//平衡角度float g_kpBalance = -85800.0;float g_kdBalance = -400;
static int ControlBalance(float angle, short gyro){ int outpwm = 0; float angleBias = 0.0; float gyroBias = 0.0; float tempAngle = 0.0; float tempGyro = 0.0;
tempAngle = 0 - angle;//极性控制 tempGyro = 0 - gyro;
angleBias = g_middleAngle - tempAngle; gyroBias = 0 - tempGyro; outpwm = (g_kpBalance / 100 * angleBias + g_kdBalance * gyroBias / 100);
return outpwm;}
复制代码


速度环控制算法:速度环控制的目的是让机器以恒定速度前进或后退,该恒定速度可以为 0 速度,即要让平衡车静止。速度环采用了 PI 环控制,只有比例与积分环节。


float g_kpSpeed = 95800.0;float g_kiSpeed = 200;
static int ControlSpeed(long int left, long int right){ int outpwm = 0; int speedBias = 0; int speedBiasLowpass = 0; static int speed_i = 0; float a = 0.68; static int speedBiasLast = 0;
speedBias = 0 - left - right; speedBiasLowpass = (1 - a) * speedBias + a * speedBiasLast; speedBiasLast = speedBiasLowpass;
speed_i += speedBiasLowpass; speed_i = limit_data(speed_i, SPEED_H, SPEED_L);
outpwm = (g_kpSpeed * speedBiasLowpass / 100 + gkiSpeed * speed_i / 100);
return outpwm;}

复制代码


转向环控制算法:转向环的目的是控制小车以恒定速度转向。在本次场景为了控制小车平衡静止,所以只做了限制转向的操作。

static int ControlTurn(short gyro){  int outpwm;
outpwm = g_kpTurn * gyro; return outpwm;}
复制代码


以上详细代码,请参考文章末尾的相关链接(Balance_car 文件获取路径)。


总结

本文呈现了两轮平衡小车的大致原理。简单介绍了一下 PID 算法的效果:P 比例参数,能够快速让系统达到稳定值,但是 P 太大容易超调,带来振荡;I 积分参数,消除稳态误差,让系统达到稳定值;D 积分参数,能消除振荡,但是会使系统时效性变慢。开发者可以根据现场情况,合理调节 PID 三个参数。


本样例是 OpenHarmony 知识体系工作组(相关链接在文章末尾)为广大开发者分享的样例。同时知识体系工作组结合日常生活,给开发者规划了各种场景的 Demo 样例,如智能家居场景、影音娱乐场景、运动健康场景等;欢迎广大开发者一同参与 OpenHarmony 的开发,更加完善样例,相互学习,相互进步。

相关链接

OpenHarmony 源码下载路径:https://gitee.com/openharmony/docs/blob/master/zh-cn/release-notes/OpenHarmony-v3.2-beta1.md

Balance_car 文件获取路径:https://gitee.com/openharmony-sig/vendor_oh_fun

BearPi-HM Nano(Hi3861)开发板代码烧录参考链接:https://gitee.com/bearpi/bearpi-hm_nano/tree/master/applications/BearPi/BearPi-HM_Nano/docs/quick-start

OpenHarmony 知识体系共建开发仓:https://gitee.com/openharmony-sig/knowledge/blob/master/docs/co-construct_demos/README_zh.md

小熊派开发板学习路径:https://growing.openharmony.cn/mainPlay/learnPathMaps?id=19

OpenHarmony 知识体系工作组智慧家居开发样例https://gitee.com/openharmony-sig/knowledge_demo_smart_home


参考资料:

第七届全国大学生“飞思卡尔”杯智能汽车竞赛

电磁组直立行车参考设计方案


用户头像

OpenHarmony开发者官方账号 2021-12-15 加入

OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代,基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展

评论

发布
暂无评论
玩转OpenHarmony PID:教你打造两轮平衡车_OpenHarmony_OpenHarmony开发者_InfoQ写作社区