基于PID控制算法的自平衡机器人平衡小车设计

文末获取完整源码源文件+配套论文+答辩PPT等

在这里插入图片描述

在这里插入图片描述


随着机器人研究的进一步深入,在工业生产、安防系统、智能家居、物流网等领域的应用更加广泛,在实际应用中,可能遇到复杂的任务环境。相比多轮的轮式机器人,两轮自平衡机器人体积小,运动灵活,能够在比较狭窄、需要大转角的场合中运动。这种机器人两轮共轴,可以通过运动保持自身平衡,能实现前进、后退、转向、原地静止等基本运动功能,由于其结构特殊,能适应不同的地形环境,研究两轮自平衡机器人,具有重要的意义。

本设计以两轮车模为研究平台,以恩智浦公司32位微处理器MK60FX512VLQ15为控制核心。通过加速度传感器和陀螺仪,设计滤波算法,实现了倾角的测量;通过设计MOS电机驱动电路,使用单片机输出PWM,实现了电机速度控制;通过编写控制算法,实现了两轮车模的自平衡功能;通过编码器测量电机转速,对速度进行闭环控制,实现了两轮自平衡机器人的速度控制功能。最终通过无线遥控器,使小车能够在自平衡的基础上,实现自由运动的任务。

关键词: 单片机,PID,倾角测量,MOS驱动,自平衡

1 绪论

1.1研究目的和意义
1.2国内外发展现状
1.3设计内容
使用ARM Cortex-M4内核的Freescale K60单片机为主控制器,对加速度计和陀螺仪的数据进行融合,得到车身倾角最优估计,设计MOS电机驱动电路,编写PID控制算法控制车轮,达到自主直立的目的。利用编码器构成速度反馈回路,使用PID控制算法进行速度和转向的控制,最终使其保持平衡、实现期望的运动。本文将就倾角融合算法、机器人控制算法等问题展开研究,具体内容如下:
1)硬件电路设计:设计制作主控电路板、电机驱动控制板。
2)传感器数据融合:将陀螺仪所测数据和加速度计所测数据进行融合,得到稳定、可靠的倾角值。
3)控制程序设计:通过对状态反馈控制、PID算法等方法和理论的研究,设计控制程序,使小车能够完成直立、前进、后退、转向等运动功能。
4)单片机程序设计:设计单片机程序,使其具备人机交互、控制等功能。

2 总体设计方案

2.1 设计思路

从控制的角度来看,电机是系统唯一的控制对象。车模运动控制任务可以分解成以下三个基本控制任务[5]:
(1) 直立控制任务:车模的倾角作为控制的输入量,使用PD算法,控制车模稳定在平衡位置。
(2) 速度控制任务:直立车模的速度控制与普通的车模速度控制不同,在直立系统中,速度控制是通过改变车模倾角来完成的。具体实施思路是,对电机转速加入干扰,使车身偏离平衡位置,以此刺激直立控制任务,从而达到控制速度的目的,速度控制使用PI算法[6]。
(3) 方向控制任务:通过控制两个电机的差速来达到转向的目的,方向控制使用PD算法,使用X轴的角速度作为微分项的因子,可以极大改善转向的动态性能,避免振荡。

程序设计中,三个控制任务独立进行计算。但是每一个任务的控制对象都是电机,因此它们直接也存在着干扰与耦合。在设计每一个控制任务时,为了便于分析,都假设其他两个任务是稳定的。例如,在进行速度控制程序设计时,车模是能够稳定直立的;在进行方向控制程序设计时,车模的直立控制和速度控制都是稳定的;在进行直立控制时,车模的速度控制和方向控制都是稳定的。
这三个任务中保持车模平衡是最关键的。由于车模同时受到三种控制的影响,从车模平衡控制的角度来看,其它两个控制就成为它的干扰。为了避免影响车模平衡控制,这个车模倾角的改变需要非常缓慢的进行。因此,虽然三个控制任务独立运行,但是它们之间有优先级,即控制应该最优先满足直立的要求,其次是方向控制的要求,最后才是速度控制的要求[7]。

在这里插入图片描述

2.2 硬件设计方案
本系统采用一个主控电路板+一个电机驱动电路板的结构,将两者分开设计,一是可以避免电机驱动对主控的影响及电磁干扰,二是出于经济的考虑。
主控电路板主要包括以下部分:微控制器电路、电源管理电路、微控制器接口、按键电路、蜂鸣器电路。其中,电源管理电路分为3.3V电源管理电路和5V电源管理电路,5V管理电路使用LM2940三端线性稳压器,输入7.2V电池电压,输出5V电压。3.3V管理电路使用LM1117三端线性稳压器,输入接LM2940的5V电压,输出3.3V电压。考虑到本系统中器件、传感器较多,因此5V管理电路和3.3V管理电路均使用两个。微控制器接口主要包括:OLED接口、蓝牙接口、MMA7361传感器接口、L3G4200D传感器接口、编码器正交解码接口2个、四通道PWM接口、遥控器解码接口,以及预留IO,方便调试使用。

在这里插入图片描述
2.3 机械结构设计方案

3 硬件电路设计

3.1 单片机最小系统电路
3.2 加速度传感器模块
MMA7361是恩智浦公司(原飞思卡尔)的微型电容式加速度传感器,其功耗低,体积小,价格便宜。内部集成一级低通滤波器,具有温度补偿、自我测试,自由落体检测等功能。运行电压2.2-3.6V,模拟量输出,具有两种不同的灵敏度可选择。正常工作状态下电流消耗400uA,在休眠模式下仅需3uA电流。MMA7361的芯片引脚图如下图3-1所示,引脚排列如下表3.1所示:
在这里插入图片描述

在这里插入图片描述

3.3 陀螺仪模块
3.4 电机驱动模块
单片机要控制电机转动,需要电机驱动电路。电机驱动电路的性能直接关系到车模的性能,进而关系到整个系统的稳定性。常见的电机驱动方案有两种:
(1)采用集成电机驱动芯片;
使用集成电机驱动芯片设计(常用的电机驱动芯片有BTS7970、L298N等),外围电路简单、可靠性高,但是驱动的性能有限。由于本系统车模的电机的内阻小于10毫欧,而集成驱动芯片内部的每个场效应管导通电阻在 120 毫欧以上,这样,电机驱动回路总电阻就太大了,驱动电路的输出功率和发热量都很大,电机性能得不到充分发挥。
(2)采用N沟道场效应管和专用栅极驱动芯片设计。
分立的 N 沟道场效应管的导通电阻很低,一般小于10毫欧,大大减小了电机驱动回路总电阻。另外,专用的栅极驱动芯片可以提高场效应管的开关速度,使PWM控制方式的调制频率提高,从而减少电枢电流脉动[9]。
经过多次试验与调试,我们最终选用大电路电机半桥驱动芯片IR2184,它可以驱动高端和低端两个N沟道场效应管,能提供较大的栅极驱动电流,并具有硬件死区、硬件防同臂导通等功能。使用两片 IR2184型半桥驱动芯片可以组成完整的直流电机 H 桥式驱动电路。其性能优异、价格便宜,所以我们选择它进行设计[10]。

在这里插入图片描述
3.5 电源管理模块

4 软件程序设计

4.1 系统流程图
在这里插入图片描述
4.2 程序初始化

4.3 PID控制算法
4.3.1 PID控制算法介绍
4.3.2 PID控制算法参数整定

4.4 倾角估计算法
要控制车模平衡,首先就需要测量车身倾角。测量倾角主要有两种方法:
1.利用加速度传感器。加速度计静止放置的时候,因为受到重力加速度的影响,三个轴感应到的加速度跟传感器与地平面之间的倾角有关,具体关系如下图所示[20]。
在这里插入图片描述

加速度传感器的值与地面之间的倾角呈三角函数关系:
在这里插入图片描述

然而小车在运动过程中,会产生极大的噪声,取加速度传感器瞬时值计算倾角误差太大。难以获得稳定的倾角数据。
2. 利用陀螺仪测量的角速度进行积分。角速度积分可以得到变化的角度。但是传感器都有误差,陀螺仪也不例外,而且陀螺仪还存在温漂,因此长时间的积分过程,很难保证得到正确的角度[21]。
因此需要一种算法,能够结合陀螺仪的动态性能和加速度传感器的静态精确度,从而得到可靠的倾角数据[22]。

4.4.1 互补滤波法
互补滤波算法,在短时间内采用陀螺仪得到的角度值为最优解,通过加速度传感器的计算结果对角度值进行校正。加速度计要滤掉高频信号,陀螺仪要滤掉低频信号,互补滤波器就是根据传感器的特性不同,通过不同的滤波器(高通、低通),进而得到整个频带的信号。互补滤波器参数少,程序简单,在低成本的INS导航系统中应用广泛[23]。
以下是互补率程序,在使用中,根据实际情况和需要调节K1和dt,直到满意为止。其中,K1是互补滤波中的权值,K1增大,对加速度传感器的信任程度就越大[24]。

 float angle;
float   K=0.08f;               // 对加速度计取值的权重
float   dt=0.003f;             //采样时间
void Yijie_Lvbo(float accel_pro,float gyro_pro)
{
    angle=K * accel_pro+ (1-K) * (angle + gyro_pro * dt);
}

4.4.2 卡尔曼滤波法
卡尔曼滤波法源于匈牙利数学家Rudolf Emil Kalman的论文《A New Approach to Linear Filtering and Prediction Problems》(线性滤波与预测问题的新方法)。卡尔曼滤波算法是一个最优化自回归数据处理算法[25]。对于很多工程问题,它的效率很高,可靠性很高。卡尔曼滤波法广泛应用已经超过了30年,包括控制、制导、导航、通讯等现代工程等,近年来更被应用于计算机图像处理,例如头脸识别,图像分割,图像边缘检测等[26]。

4.5 直立控制程序设计
车模平衡控制需要负反馈,就需要能够测量车体的倾角,构成反馈回路。在能够测量倾角的情况下,设定目标平衡角度,使用PID算法进行闭环控制。因为车体只会在一个的方向上运动,只存在一个维度的倾斜,因此只需要测量一个维度的倾角,然后控制轮子转动,抵消车体在该维度上的倾斜,就可以完成平衡控制[27]。如图2.2.1所示。
在这里插入图片描述
我们对系统进行简单建模,首先,两轮自平衡车可以简化为一个一阶倒立摆模型,假设车体的高度为 L,质量为 m ,在外力作用下,车模产生角加速度为x(t)。如图4.5所示,沿着垂直于底盘的方向进行受力分析,可以得到运动加速度a(t)以及外力干扰加速度x(t)之间的运动方程。

在这里插入图片描述
其中k1,k2分别为比例与微分控制参数。其中微分参数相当于阻尼力,可以有效抑制车模荡[28]。
因此,车模的平衡控制可以简化为测量车模的倾角和倾角速度控制车模车轮的加速度来消除车模的倾角。

在这里插入图片描述
以下是直立控制程序:

void Angle_Calculate()
{
int16_t AngleControlOut_P,AngleControlOut_D;
	angle_Accel = (A_Z-AZ_ZERO);  
	angle_Accel*=0.0039f;
	angle_Accel = asin(angle_Accel);
	angle_Accel*=500;
	Gyro_Now = (T_Y-TY_OFFSET) * TY_Ratio;
	Erjie_Lvbo(angle_Accel,Gyro_Now);
	if(FilterSwitch==0)	myfilter=QingHua_AngleCalaulate;
	else if(FilterSwitch==1)	myfilter=Yijie_Lvbo;
	else if(FilterSwitch==2)	myfilter=Erjie_Lvbo;
	else if(FilterSwitch==3)	myfilter=Kalman_Filter;
	if(FilterSwitch==3)
	{
		myfilter(angle_Accel,Gyro_Now);
		ZL.error=angle_now_kal-(Balance_Point);
	}	
	else
	{
		myfilter(angle_Accel,Gyro_Now);
		ZL.error=angle_now-(Balance_Point);
	}
    AngleControlOut_P=-(int16_t)(ZL.P*ZL.error);
    AngleControlOut_D=-(int16_t)(ZL.D*Gyro_Now);
    if(AngleControlOut_D>500) AngleControlOut_D=500;//对微分项限幅
    else if(AngleControlOut_D<-500) AngleControlOut_D=-500;
    AngleControlOut=AngleControlOut_P+AngleControlOut_D;
    if(AngleControlOut>800) AngleControlOut=800;
    else if(AngleControlOut<-800) AngleControlOut=-800;
}

4.6 速度控制程序设计
4.7 方向控制程序设计

5 开发工具及调试结果

5.1 开发工具介绍
5.2 调试结果
5.2.1 PID算法控制电机调试结果
为了学习和验证PID算法,设计了位置式PID算法在电机空载情况下进行测试,经过大量的参数整定和观察,掌握了PID算法的参数整定方法,以下是调试结果。
在这里插入图片描述
如图所示,黄色代表速度的目标,红色是测量的实际速度。

5.2.1 互补滤波法调试结果
互补滤波主要调节的是对于加速度计的比重K,K越大,则跟踪速度越快,但滤波效果越差。根据需要,选择适合系统的K系数。下面两幅图分别为K=0.01,和K=0.05时的滤波效果。红色代表加速度计数据,黄色代表陀螺仪数据,蓝色代表最终融合数据。当K=0.01时,滤波效果更明显,平滑度很高。当K=0.05时,跟踪效果好,平滑度差。
在这里插入图片描述
5.2.1 卡尔曼滤波法调试结果
以下是卡尔曼滤波法的滤波效果,滤波效果明显,收敛速度快,本系统使用卡尔曼滤波法作为倾角估计的方法。
在这里插入图片描述

6 总结与展望


点击下方小卡片,那边对话框发送“资源”两个字

获取完整源码源文件+配套论文+答辩PPT等

一、平衡小车原理: 自平衡小车是利用模自身动力使小车保持相对的平衡,是一个动态平衡的过程。维持平衡的动力来自轮的运动,由两个直流电机驱动。对模的控制可以分解为三个控制任务: 1、控制小车平衡:通过控制小车轮正反转使小车保持直立平衡。 2、控制小车速度:通过控制小车的倾角实现小车前后运动和速度的控制,其实最终的仍是通过控制电机的转速实现。 3、控制小车方向:通过控制小车两个电机之间的转速差来实现转向控制。 分解为三个控制任务显得相对简单一点,但是在最终的控制过程中都归结为对一个控制量的控制,这样三个任务之间就会存在耦合,会相互干扰。三个任务中控制平衡是关键,所以对小车的速度和方向控制应该尽量的平滑。 二、硬件方案设计 小车的硬件分为三个部分,分别是主控部分、小车姿态获取部分以及电机驱动部分。主控板采用目前常用的arduino UNO,同时也可以使用其他arduino通用控制板做主控。 小车姿态获取可以有很多方案,使用最多的就是通过加速度计和陀螺仪获取小车姿态。理论上只需要两轴加速度计(垂直方向Z轴和沿小车运动方向X轴)和一个单轴陀螺仪(沿小车轮轴方向,获取绕小车轮轴的角速度)。陀螺仪通过角度积分可以获得小车角度,但是经过积分会产生累计误差,并且会越来越大,X轴与Z轴加速度计的值也可以算出小车的倾角,但是加速度计的瞬时误差较大,所以结合陀螺仪和加速度计两者获得的角度做数据融合可得真实角度。我们使用一个集成了三轴加速度计和三轴陀螺仪的集成芯片MPU6050,这样极大的简化了我们的传感器电路。 小车通过两个直流电机驱动轮运动来获得动力,直流电机的驱动电路设计关系到整个系统的稳定性,因为电机反转时会产生反向电动势会干扰到电源系统内其他设备的运行。我们选用L298P做电机驱动器,它内部包含4通道逻辑驱动电路,可同时驱动两个直流电机,输出电流可达2.5A。 三、软件设计小车姿态获取---卡尔曼滤波 在开始之前应该对MPU6050进行设置,主要设置角速度以及加速度的量程,加速度量程有±2g、±4g±8g与±16g,角速度量程分别为±250、±500、±1000与±2000°/sec (dps),可准确的追踪快速动作与慢速动作。在使用之前先设置好量程以便后面的换算。我们小车轮轴与传感器Y轴平行,即绕Y轴旋转则有: 那竖直方向弧度计算公式为: angle = atan2(x, z) //结果以弧度表示并介于 -pi 到 pi 之间(不包括 -pi) 如果要换算成具体角度: angle = atan2(x, z) *(180/3.14) 陀螺仪获取角速度积分得到角度公式为:anglen = anglen-1 + gyronn*dt ,式中anglen 为第N次采样的角度值,anglen-1 为第N-1次的角度值,gyronn为两次采样值之间的角速度值,dt为两次采样之间的时间。然后将换算后的两个角度数据进行卡尔曼滤波融合,可获得小车真实角度,也可以采用更简单的互补滤波算法。 注意加速度计所得角度与陀螺仪积分角度的方向。 四、软件设计小车姿态调整---PID参数整定 小车的姿态获取最终结果是一个角度,就是小车偏离平衡位置的倾角。通过以小车的这个倾角为变量进行PID控制,输出用于控制轮转速的PWM值,那么相当于小车只有一个角度反馈环路,虽然能使小车平衡,但是增加了控制难度,所以通常会使用带测速的电机,再加入一个小车速度反馈环路,这样使得小车更容易控制。关于PID的有下面一个简单易懂的描述: 假设我们想把一个小球稳定在一个光滑的坡顶,这显然是一个不平衡的系统,稍有扰动小球就会滚下来。假设恰好平衡的位置坐标是L,我们可以测量到小球的位置是x,那么怎么给小球施加f(x)的力反馈,让它能够平衡呢? 最直观的想法就是f(x) =Kp*(L-x),简单的说就是你在左边我就向右推,你在右边我就向左推,这就是比例因子P; 现在考虑两种情况,同样是在x位置,小球静止和小球具有速度V这两种情况。很明显,如果V>0,我们只需要施加更小的力,因为小球自身的惯性会让它运动向平衡位置。所以可以修正f(x) = Kp*(L-x) – Kd*V。因为速度一般不容易测量,我们常常用位置的变化Δx除以测量的时间差Δt来计算速度,所以这就是微分因子D; 情况继续发生变化,上面考虑的是斜坡静止的情况,如果这个变态的斜坡是移动的怎么办呢?(例如两轮平衡机器人实际上是可以运动的,对于静止的磁悬浮来说,不需要考虑这个参数)这时候我们需要不断的累加并平均x值,来计算平衡位置的L,这个就是积分因子I; 当PID用在我们自平衡小车中时,我们使用角度PD环与速度PI环进行控制。 pwm=angle*k1+angle_dot*k2+range*k3+wheel_speed*k4; PID参数整定步奏如下: 1、将k1,k2,k3,k4均设为0; 2、逐步增大k1,使得小车刚好能够来回摆动。 3、再逐步增大k2,使得小车相对平稳,太大会使小车发生抖动; 4、增大k3,使得小车能够来回走动(不是摆动也不是抖动); 5、增大k4,使得小车能稳定自平衡。 具体参数调整过程比较繁琐,需要自己体会每个参数的作用。
### 使用 GPS 和 IMU 实现小车的定位导航与路径追踪 #### 1. 系统架构概述 为了实现基于 GPS 和 IMU 的小车定位导航与路径追踪,整个系统可以分为几个主要模块:传感器数据融合、坐标转换、地图构建、路径规划和控制执行。 #### 2. 数据融合提高定位精度 通过 `ekf_localization` 包能够有效地将来自 Odometry(里程计)、IMU(惯性测量单元)以及 GPS 的多源异构传感信息进行最优估计[^1]。这种扩展卡尔曼滤波器方法不仅提高了静态条件下的绝对位置准确性,而且增强了动态环境中的鲁棒性和可靠性。 #### 3. 坐标变换支持全局感知 利用 `navsat_transform` 工具可完成从地理空间坐标系 (WGS84) 到机器人本地坐标系 (UTM 或者其他平面直角坐标系) 的无缝切换操作。这一步骤对于确保后续的地图匹配及运动指令下发至关重要。 #### 4. 地图创建与维护 借助于 `GMapping` 库可以在已知环境中快速建立二维栅格地图的同时自动识别固定障碍物的存在范围;而在未知场景下,则可通过 SLAM 技术逐步完善地图结构并更新内部状态表示。 #### 5. 自主导航能力开发 采用 `move_base` 组件作为核心框架来负责整体的任务调度逻辑设计,包括但不限于目标设定、路线选择策略制定及其对应的轨迹生成机制等重要环节。此外,在具体实施过程中还需要考虑诸如碰撞规避措施在内的多种安全防护手段的应用。 #### 6. 控制层面的技术细节 针对两轮差速驱动型移动平台而言,“实时姿态获取(位置,速度,航向)、路径规划、路径跟踪(mpc)”构成了其基本工作流程的关键要素[^2]。特别是模型预测控制器(Model Predictive Control),凭借对未来一段时间内可能发生的动作序列做出预判的能力而成为当前最流行的一种先进控制算法之一。 ```python import rospy from nav_msgs.msg import Odometry from sensor_msgs.msg import Imu from geometry_msgs.msg import PoseStamped def gps_imu_callback(gps_data, imu_data): # 处理GPS和IMU的数据融合 pass rospy.init_node('gps_imu_fusion') sub_gps = message_filters.Subscriber('/fix', NavSatFix) sub_imu = message_filters.Subscriber('/imu/data', Imu) ts = message_filters.ApproximateTimeSynchronizer([sub_gps, sub_imu], queue_size=10, slop=0.1) ts.registerCallback(gps_imu_callback) rospy.spin() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶绿体不忘呼吸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值