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

平衡小车从原理到实践 平衡小车从原理到实践 作者:公众号:小白学移动机器人 关于内容:参考很多网上大佬的博客加上自己的理解而成,适合平衡车初学者和想要了解原理的小伙伴。 1、平衡小车控制原理 先记住一句话,直立环和速度环的结合是保持小车长期稳定平衡的前提。相信大家读到最后一定可以明白这句话的含义。 举个例子 大家都玩过的用手控制木棍直立不倒的游戏。这是一个通过眼睛观察木棒的倾角和倾斜趋势(角速度),通过手指的移动去抵消木棒倾斜的角度和倾斜的趋势使木棒能直立不倒的一个过程。典型的负反馈机制。 平衡小车也是如此,小车运动方向与倾 阅读详情

目录

简介

硬件配置资源

原理概括

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源码下载路径:zh-cn/release-notes/OpenHarmony-v3.2-beta1.md · OpenHarmony/docs - Gitee.com

Balance_car文件获取路径:vendor_oh_fun: 基于OpenHarmony开源代码和开发板,打造一系列“ 趣味性、低门槛、成就感 ”的开源项目, 助你重新燃起心中的极客梦想之火!

BearPi-HM Nano(Hi3861)开发板代码烧录参考链接:BearPi-HM_Nano: 小熊派BearPi-HM Nano开发板基于HarmonyOS的源码 - Gitee.com

OpenHarmony知识体系共建开发仓:docs/co-construct_demos/README_zh.md · OpenHarmony-SIG/knowledge - Gitee.com

小熊派开发板学习路径:OpenHarmony样例

OpenHarmony知识体系工作组智慧家居开发样例knowledge_demo_smart_home: ​本仓库的样例都是基于智能家居,从客厅到卧室,从中控到sensor,开发者可以体验各种家居的开发样例,打造自己的家居体验,享受万物互联的快感。

参考资料:

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

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

【鸿蒙OH实战开发】玩转OpenHarmony PID:教你打造两轮平衡车 此次为大家带来的是OpenAtom OpenHarmony(以下简称“OpenHarmony”)系统与PID控制算法相结合并落地的平衡车项目。PID控制算法是一种经典的,并被广泛应用在控制领域的算法。类似于这种:需要将某一个物理量保持稳定的场合,比如维持平衡,稳定温度、转速等,PID都会适用。在四轴飞行器,平衡小车、汽车定速巡航、温度控制器等场景均有应用。通过本样例的学习,开发者能够对OpenHarmony系统设备端开发有进一步的认识,还能够掌握PID控制算法的使用。 阅读详情

相关推荐

OpenHarmony实战——PID:教你打造两轮平衡车

此次为大家带来的是OpenAtom OpenHarmony(以下简称“OpenHarmony”)系统与PID控制算法相结合并落地的平衡车项目。PID控制算法是一种经典的,并被广泛应用在控制领域的算法。类似于这种:需要将某一个物理量保持稳定的场合,比如维持平衡,稳定温度、转速等,PID都会适用。在四轴飞行器,平衡小车、汽车定速巡航、温度控制器等场景均有应用。通过本样例的学习,开发者能够对OpenHarmony系统设备端开发有进一步的认识,还能够掌握PID控制算法的使用。

xianglizaibie的博客 885

三天让车立起来!STM32平衡车入门PID —— 第三天(PID调参)

说明:本文章适用于STM32初学者,想完成一个好玩且有深度的项目但不知道从何下手的同学。 PID调参是平衡车的精髓所在,参数整定的好坏直接影响到平衡车的平衡效果。有的车平衡时来回晃而参数选的好的车就能稳稳地平衡在原地。可见PID调参在PID中是重中之重。我们一定要会调并且有针对性的去调。通过平衡车的例子举一反三,相信我们之后在遇到PID调参时能够从容不迫,非常迅速的找到最合适的值!! 对于一个控制系统,我们期望的响应结果是稳(系统稳定不震荡不发散)、快(系统响应快速)、准(系统静态误差小)。对PID控制器的

GuYH的博客 3万+

OpenHarmony软总线实战:手把手教你实现Wi-Fi/BLE双模设备发现(附避坑指南)

本文深入解析OpenHarmony软总线在Wi-Fi/BLE双模设备发现中的工程实践与性能优化,涵盖协议适配、策略决策和安全校验等关键技术。通过实战案例和避坑指南,帮助开发者提升智能家居设备的互联体验与可靠性,特别适用于智能门锁、智能音箱等场景。

weixin_29202213的博客 398

平衡小车调试总结及心得

这里所说的电机也就是通过电机驱动控制电机,电机驱动我们使用的是tb6612,一定要用tb6612的芯片,国产做的兼容板子质量太差,钽电容很脆,一不注意就炸了,比如我当时就差点当场去世,前期调试不建议使用,虽然便宜一半,但是为了系统的稳定和安全,还是用tb6612吧,但是调试完成后可以换成兼容板。软件PWM的配置过程不再详解,具体可参考正点原子的用户手册,这里讲解一下代码中的Load(Moto1,Moto2)加载到电机的函数,加载的值实际是占空比CCRX的值,也就是通过控制占空比达到控制速度的效果。

qq_39071574的博客 1万+

OpenHarmony软总线:深入解析Wi-Fi与BLE设备发现机制

本文深入解析OpenHarmony软总线中的Wi-Fi与BLE设备发现机制,详细介绍了多协议融合、智能功耗管理和安全前置设计等创新点。通过实战案例和代码示例,展示了如何优化设备发现流程,提升用户体验和系统性能,适用于智能家居、物联网等场景。

weixin_33686714的博客 398

深入OpenHarmony沙箱:从‘小黑屋’设计哲学到innerapi_tags的权限控制艺术

本文深入解析OpenHarmony沙箱机制的设计哲学与技术实现,从资源隔离、权限最小化到innerapi_tags的精细控制,展现其如何通过‘小黑屋’模型和标签系统实现安全与功能的完美平衡。特别适合开发者理解沙箱机制在系统安全中的关键作用。

weixin_29251567的博客 401

基于OpenHarmony的平衡车PID控制实战指南

PID控制作为工业自动化领域的经典算法,通过比例(P)、积分(I)、微分(D)三个环节的协同作用,实现对系统的精确控制。其核心价值在于将复杂的动态系统控制转化为可量化的参数调节问题,广泛应用于机器人、无人机、工业设备等场景。在嵌入式开发中,结合OpenHarmony操作系统的轻量级内核和分布式能力,能够构建更高效的实时控制系统。以两轮平衡车为例,通过三环PID架构(直立环、速度环、转向环)的设计实现,展示了如何利用Hi3861开发板的硬件浮点单元优化算法执行效率,同时借助MPU6050传感器实现精确的姿态检

weixin_34049948的博客 343

避坑指南:在OpenHarmony上玩转Modbus RTU,RS-485接线和libmodbus配置那些事儿

本文详细解析了在OpenHarmony系统中实现Modbus RTU通信的避坑指南,涵盖RS-485硬件连接、libmodbus配置及工业设备数据读取的关键技巧。通过真实案例,揭示物理层接线、终端电阻设置和UART参数调优等常见问题,帮助开发者高效稳定地实现工业设备数据采集与控制。

weixin_42570484的博客 210

OpenHarmony启动链路与分区规划实战:从Bootloader到用户态

操作系统从按下电源键到进入桌面,背后依赖一条环环相扣的启动链路与精心规划的分区体系。任何一环缺失或配置错误,都可能导致黑屏、卡死或反复重启。本文从通用启动原理切入,梳理Bootloader加载、内核引导、init进程接管等关键阶段,结合OpenHarmony标准系统的实际分区表,深入解析各分区(如boot、system、vendor、userdata)在启动中的职责,并分享基于串口日志和fastboot命令的排障方法。通过理解分区表与启动流程的强耦合关系,开发者可以快速定位分区缺失、根文件系统挂载失败、分区

weixin_34161083的博客 289

剖析OpenHarmony应用孵化器appspawn:从服务注册到进程创建的完整链路

本文深入解析OpenHarmony应用孵化器appspawn的核心机制,从服务注册到进程创建的完整链路。详细剖析了appspawn作为权限管控中枢、资源隔离屏障和生命周期哨兵的关键角色,以及其与samgr框架的协作机制、消息处理核心链路和进程孵化技术内幕。通过实际案例和性能优化实践,帮助开发者深入理解OpenHarmony应用启动过程。

weixin_29212867的博客 417

STM32 2轮PID智能小车第一章驱动电机让小车动起来

文章目录前言一、LM298N二、驱动电机模块电机的正转、反转、停转二、cubeMX配置三、程序代码编写总结 前言 本篇文章正式带大家学习STM32智能小车。这篇文章先带大家了解一下如何让小车动起来。 一、LM298N 1.LM298N模块接线原理图。 根据下图可知一个LM298N可以控制两个电机模块。 12V输入需要接入电源,电源地接GND。单片机IO口接到STM32的GPIO口。 2.LM298N和STM32接线图及LM298N和电机接线图 将电机接到LM298N上,LM298N接到STM32上,通过

m0_49476241的博客 1万+

OpenHarmony RK3568刷机全流程:SD卡与eMMC及单分区详解

在嵌入式Linux与OpenHarmony开发中,系统烧录是连接硬件与软件的关键环节。RK3568作为主流平台,其启动链路涉及Loader、U-Boot、内核及根文件系统,而存储介质(如SD卡与eMMC)的差异决定了烧录方式的根本不同。单分区方案将内核、设备树与根文件系统整合,大幅简化调试流程,适合快速验证启动链路。而正确的设备树选择是避免黑屏、panic等问题的基础。理解这些原理后,无论是通过SD卡灵活调试,还是用eMMC固化产品,都能高效定位并解决刷机问题。

weixin_34050005的博客 235

两轮自平衡车控制程序及库文件.zip_dealqj2_helper_3dmath.h_两轮平衡车_平衡车控制程序;Arduino

基于重心检测的两轮自平衡小车控制程序,采用陀螺仪和加速度传感器进行检测。

Flutter与OpenHarmony手势识别与碰撞检测实践

手势识别与碰撞检测是现代交互式应用开发中的核心技术,尤其在跨平台开发框架如Flutter中显得尤为重要。手势识别通过处理触摸屏原始数据,将其转换为语义动作,而碰撞检测则确保游戏开发、AR应用等场景中的交互准确性。在OpenHarmony环境下,结合Flutter的GestureDetector与自定义算法,可以实现低延迟的手势响应和高性能的碰撞检测系统。本文深入探讨了在OpenHarmony的LiteOS内核特性下,如何优化手势识别与碰撞检测算法,以适应工业级应用场景的需求。通过实际项目验证,展示了如何实现

weixin_29574585的博客 238

基于DSP28335的Matlab/Simulink代码生成实验七:A/D采样

实验七:讲解如何使用DSP的ADC模块,通过代码生成技术控制DSP进行电流采样,是后续实现电机闭环控制的重要环节。通过简单的实验来熟悉代码生成的过程。最终实现复杂算法代码自动生成,进行高性能电机控制!

m0_73869369的博客 4724

cs188Inference in Bayes Nets(贝叶斯网络的推理)

cs188Inference in Bayes Nets贝叶斯网络的推理Question1(3 points):Bayes Net StructureQuestion2(1 points):Bayes Net ProbabilitiesQuestion 3(5 points):Join FactorsQuestion4(4 points):EliminateQuestion5(4 points):NormalizeQuestion 6(4 points):Variable EliminationQuesti

weixin_46582817的博客 1673
上一篇: OpenHarmony社区运营报告(2022年11月)
下一篇: 带你玩转OpenHarmony AI:基于Seetaface2的人脸识别
OpenHarmony开发者
博客等级 码龄5年 626粉丝 221原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值