简介
此次为大家带来的是 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…
Balance_car 文件获取门路:https://gitee.com/openharmony…
BearPi-HM Nano(Hi3861)开发板代码烧录参考链接:https://gitee.com/bearpi/bear…
OpenHarmony 常识体系共建开发仓:https://gitee.com/openharmony…
小熊派开发板学习门路:https://growing.openharmony.c…
OpenHarmony 常识体系工作组智慧家居开发样例 https://gitee.com/openharmony…
参考资料:
第七届全国大学生“飞思卡尔”杯智能汽车比赛
电磁组直立行车参考设计方案