精华内容
下载资源
问答
  • 自平衡小车是利用车模自身动力使小车保持相对的平衡,是一个动态平衡的过程。维持车模平衡的动力来自车轮的运动,由两个直流电机驱动。对车模的控制可以分解为三个控制任务: 1、控制小车平衡:通过控制小车车轮正反...
  • 平衡小车的原理和硬件设计

    千次阅读 2019-09-17 17:20:53
    自平衡小车是利用车模自身动力使小车保持相对的平衡,是一个动态平衡的过程。维持车模平衡的动力来自车轮的运动,由两个直流电机驱动。对车模的控制可以分解为三个控制任务: 1、控制小车平衡:通过控制小车车轮正反...

    这里写自定义目录标题


    一、平衡小车原理:

    自平衡小车是利用车模自身动力使小车保持相对的平衡,是一个动态平衡的过程。维持车模平衡的动力来自车轮的运动,由两个直流电机驱动。对车模的控制可以分解为三个控制任务:
    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=anglek1+angle_dotk2+rangek3+wheel_speedk4;

    PID参数整定步奏如下:
    1、将k1,k2,k3,k4均设为0;
    2、逐步增大k1,使得小车刚好能够来回摆动。
    3、再逐步增大k2,使得小车相对平稳,太大会使小车发生抖动;
    4、增大k3,使得小车能够来回走动(不是摆动也不是抖动);
    5、增大k4,使得小车能稳定自平衡。
    具体参数调整过程比较繁琐,需要自己体会每个参数的作用。

    展开全文
  • 平衡小车从原理到实践

    千次阅读 多人点赞 2020-08-30 14:13:01
    关于内容:参考很多网上大佬的博客加上自己的理解而成,适合平衡车初学者和想要了解原理的小伙伴。 1、平衡小车控制原理 先记住一句话,直立环和速度环的结合是保持小车长期稳定平衡的前提。相信大家读到最后一定...

    平衡小车从原理到实践

    作者:公众号:小白学移动机器人

    关于内容:参考很多网上大佬的博客加上自己的理解而成,适合平衡车初学者和想要了解原理的小伙伴。

    1、平衡小车控制原理

    先记住一句话,直立环和速度环的结合是保持小车长期稳定平衡的前提。相信大家读到最后一定可以明白这句话的含义。

    举个例子

    大家都玩过的用手控制木棍直立不倒的游戏。这是一个通过眼睛观察木棒的倾角倾斜趋势(角速度),通过手指的移动去抵消木棒倾斜的角度倾斜的趋势使木棒能直立不倒的一个过程。典型的负反馈机制。

    img

    img

    平衡小车也是如此,小车运动方向与倾斜方向一致,通过测量小车的倾角倾角速度,进而通过控制小车车轮的加速度消除小车的倾角倾角速度,这样理论上不考虑电机极限的情况下,小车就可以平衡。

    直立环的引出

    理想情况下,控制电机的加速度和小车倾角成正比,可以让小车保持平衡,就是小车向倾斜的方向运动,倾斜角度越大,小车运动越快。
    a=kpθ a=kp*θ
    但实际上,小车刚体绕轴旋转时具有惯性,当小车到达倾角为零时,a输出零,因为惯性的存在,小车还是会向另一个方向倒去。如此反复,小车将一直振荡无法静止。

    image-20200829082243144

    如何消除小车绕轴转动的惯性,也就是消除小车的转动惯量,使小车尽可能的静止呢?

    首先分析转动惯量,公式如下:
    I=imiri2 I=\sum_{i}m_i{r_i}^2
    其中m是质量,r是质点到转轴的垂直距离,m和r都无法为零,所以转动惯量客观存在。

    既然不能使转动惯量为零,换个角度,是不是可以抵消转动惯量呢?

    这里分析一下单摆模型吧。

    image-20200829160002148

    由于重力的作用,单摆受到和单摆角度成正比与运动方向相反的回复力;类比电机的加速度

    由于空气的作用,单摆又受到和单摆运动速度成正比与运动反向相反的阻尼力,使单摆最终平衡下来。

    有没有启发,为了让小车能近似静止,还需要一个阻尼力,这个阻尼力和小车的倾角速度成正比。

    所以,小车的平衡控制算法改写为:
    a=kpθ+kdθ a=kp*θ+kd*θ^·
    一个是角度偏差,另一个是角度偏差的变化率,也就是角速度。为了简化控制,a的输出直接作为直流减速电机的PWM替代。这里引入PID,关于PID的理论就不讲了,网上大佬巨多。上面的公式就是一个位置式离散PD控制器。负反馈机制。

    image-20200829162542548

    关于直立PD控制器的参数整定,也就公式中角度和角速度的参数整定,这里根据公式原理也可以得到一些调试技巧。

    比例控制:回复力

    微分控制:阻尼力抵消转动惯量

    微分系数与转动惯量有关,根据转动惯量和力矩的公式:
    I=imiri2 I=\sum_{i}m_i{r_i}^2

    M=iFiLi M=\sum_iF_iL_i

    小车质量M固定的情况下,重心越高(r、L越大),需要的回复力F越小,所以比例系数kp变小;转动惯量I变大,所以微分系数kd变大。

    小车重心(r、L)固定的情况下,质量M增大,需要回复力增大,所以比例系数kp增大;转动惯量I变大,所以微分系数kd变大。

    速度环的引出

    往往,我们只使用直立环,小车只能短暂的平衡几秒,然后就朝着一个方向倒去了。

    具体原因要从具体的平衡控制结构来分析。我们使用的传感器是单一的MPU6050,通过DMP库获取数据,输出的是角度以及角速度信号,而我们控制的是电机,不考虑电机的感受(也就是电机的速度幅值),只要求平衡车的角度能够保持绝对平衡。

    只有直立环的平衡小车会倒下的原因:

    那么假如小车现在平衡状态,控制闭环出现了微小的干扰,平衡车就会有一个方向的加速度,而此时小车角度平衡,小车平移速度没有限制,这样就可能超过PWM的幅值,导致电机无法加速了,也就没有了有效的回复力,所以小车就倒了。

    所以速度环出现了,在小车平衡的同时,尽量让小车保持静止,就是小车速度为零。也就是对小车平移速度进行限制

    平衡小车速度环的原理:

    根据经验知道,小车的运行速度和小车的倾角是相关的,比如小车前倾,是不是直立环要使小车向前加速,让小车保持平衡,此时小车不就有速度了嘛。如果对着速度进行闭环控制,那么这个环不就是速度环了嘛。如果将速度环的目标设置为0,小车不就可以长期稳定平衡了嘛。

    大家之前了解的电机速度PID基本上都是负反馈,但是在以直立为主的平衡车系统中,负反馈的速度控制将会导致小车加速到下。这里我们通过让小车保持一定的角度,用小车平衡的过程,表示速度闭环的控制。我们可以通过串级PID的方式,如下图所示:

    image-20200829215624218

    根据上面的原理图,我们把速度和直立两个控制器串联起来,速度环的输出作为直立环的输入,直立环的输出就是系统的输出,这样就可以保持平衡。

    公式如下:
    a1=kp1e(k)+ki1e(k) a_1=kp_1*e(k)+ki_1*\sum{e(k)}
    a=kp(θa1)+kdθ a=kp*(θ-a_1)+kd*θ^·

    这样把速度控制系统输出看做是一个角度,原本要保持角度为零就变成保持一个小的角度a1,也就是上面说过的平衡小车速度环的原理。

    所以我们就有了一个这样的算法,两个式子合并。
    a=kpθ+kdθkp[kp1e(k)+ki1e(k)] a=kp*θ+kd*θ^·-kp[kp_1*e(k)+ki_1*\sum{e(k)}]
    进行转化演变:

    image-20200829222238435

    将上面的算法,转化成为:一个单独的负反馈的直立环 + 一个单独的正反馈的速度环,也就是大家常说的平衡车的速度环是正反馈的由来。

    2、制作一个平衡小车

    如果大家看完上面的内容已经跃跃欲试了,下面的图帮你整理了制作一个平衡小车需要准备什么硬件?需要完成具体的任务?软件实现步骤?

    image-20200809155126672

    关于初级玩具平衡小车的主控部分的电路模块有以下参考,图片来源淘宝。

    image-20200827222454296

    如果对硬件不是很感冒的同学,完全可以购买配件组装,或者买个成品车,重在学习控制算法嘛。

    3、平衡小车-PD直立环

    假如现在你已经拥有一辆平衡小车了,在完成电机的PWM控制、编码器测速、MPU6050数据读取之后,我们就开始了平衡小车PD直立环的设计。如果没完成可以看我之前的文章。

    之前的文章链接

    电机的PWM控制:

    电机编码器测速:

    MPU6050数据读取:

    单独PD直立环最终效果:使小车能够稳定一小段时间。原因上面讲过,电机速度存在极限。

    PD直立环的代码:

    /**************************************************************************
    函数功能:直立环PD控制
    入口参数:角度、角速度
    返回  值:直立控制PWM
    **************************************************************************/
    int balance(float Angle,float Gyro)//roll(横滚角)(回复力)、角速度(阻尼力)
    {  
    	float Bias;
    	float Balance_Kp=700,Balance_Kd=2.0;//600   kp(0 - 720) kd( 0 - 2 )
    //	float Balance_Kp=0,Balance_Kd=0;           //===调试用
    	int balance;
    	Bias=Angle-ZHONGZHI;                       //===求出平衡的角度中值 和机械相关
    	balance=Balance_Kp*Bias+Gyro*Balance_Kd;   //===计算平衡控制的电机PWM  PD控制   kp是P系数 kd是D系数 
    	return balance;
    }
    

    PD直立环参数:

    Kp增加回复力的响应速度

    Kp过小,响应太慢,不能达到直立。

    Kp过大,会出现大幅度低频振荡。

    Kd消除Kp过大带来的低频振荡。

    Kd过大,会出现高频抖动。

    入口参数:

    int balance(float Angle,float Gyro)
    

    如果小车是绕MPU6050的x轴旋转,Angle是roll值(横滚角), Gyro是对应的角速度

    如果小车是绕MPU6050的y轴旋转,Angle是pitch值(横滚角),Gyro是对应的角速度

    机械中值:

    需要调整,每辆车因为机械原因,可能都不一样

    机械中值也就是代码中参数ZHONGZHI,这个值根据自己MPU6050的安装位置而定。

    如果小车是绕MPU6050的x轴旋转,ZHONGZHI是前倾和后仰临界点的roll值(横滚角)

    如果小车是绕MPU6050的y轴旋转,ZHONGZHI是前倾和后仰临界点的pitch值(俯仰角)

    直立环的Kp范围确定:

    如果你的电机PWM=7200为满幅,即占空比100%。

    如果kp=720,角度偏差10度,电机就到达满转了。我们不会容忍小车偏差10度以上,所以kp的范围(0 - 720),但是具体情况具体分析。

    直立环的kp极性确定:

    这个和自己的PWM设定方向、角度方向有关,但是我们可以不考虑这些。

    我们直接看现象,如果设定kp=-500,小车加速倒下,那么kp的极性为负,当kp=500的时候,可以尽可能维持平衡。

    直立环的kp大小确定:

    首先,将直立环kd和速度环、转向环的参数设置为0。

    然后,试凑法+二分法,从小到大调到小车出现大幅度低频振动,确定kp。不用纠结参数调试,有一个感觉好的就用,找到最好的很不容易,浪费时间。

    直立环的kd极性确定:

    这个和自己的PWM设定方向、角速度方向有关,但是我们可以不考虑这些。

    我们直接看现象,如果设定kp=0,设置kd=-2,小车加速倒下,那么kd的极性为负,当kd=2的时候,可以尽可能维持平衡。

    直立环的kd大小确定:

    在之前直立kp的基础上,试凑法+二分法,从小到大调试kd大小,一直到小车出现高频的剧烈抖动

    根据工程经验,将直立环的kp和kd同时乘以0.6,就是我们最终要的直立环的参数。

    4、平衡小车-PI速度环

    PD直立环+PI速度环的效果:使小车长期的平衡下来。

    终极效果:几乎静止不动,但是没必要花时间调试,重在学习理论和实践过程。

    根据上面的控制理论,我们将小车的控制系统划分为负反馈的PD直立环+正反馈的PI速度环

    平衡小车,顾名思义平衡为主,其他为辅,为了让直立环处于主导地位,对速度环进行适当的低通滤波处理,也就是上面理论部分的公式,对速度环的kp处理。

    PI速度环的代码:

    /**************************************************************************
    函数功能:速度环PI控制 修改前进后退速度
    入口参数:左轮编码器、右轮编码器
    返回  值:速度控制PWM
    **************************************************************************/
    int velocity(int encoder_left,int encoder_right)
    {  
    	static float Velocity=0,Encoder_Least=0,Encoder=0,Movement=0;
    	static float Encoder_Integral=0;
    
    	float Velocity_Kp=-180,Velocity_Ki=Velocity_Kp/200.0;//-185 -0.925
    //	float Velocity_Kp=0,   Velocity_Ki=Velocity_Kp/200.0;            //===调试用
    	//=============速度PI控制器=======================//	
    	Encoder_Least =(encoder_left + encoder_right)-0;                 //===获取最新速度偏差==测量速度(左右编码器之和)-目标速度(此处为零) 
    	Encoder *= 0.8;		                                             //===一阶低通滤波器       
    	Encoder += Encoder_Least*0.2;	                                 //===一阶低通滤波器    
    	Encoder_Integral +=Encoder;                                      //===积分出位移 积分时间:5ms
    	Encoder_Integral=Encoder_Integral-Movement;                      //===接收遥控器数据,控制前进后退
    	if(Encoder_Integral>10000)  Encoder_Integral=10000;              //===积分限幅
    	if(Encoder_Integral<-10000)	Encoder_Integral=-10000;             //===积分限幅	
    	Velocity = Encoder*Velocity_Kp+Encoder_Integral*Velocity_Ki;     //===速度控制	
    	return Velocity;
    }
    

    入口参数:

    int velocity(int encoder_left,int encoder_right)
    

    首先,encoder_left、encoder_right代表的是左右电机速度量的意义。

    实际上,encoder_left、encoder_right为单位时间内(比如5ms),左右电机编码器分别的变化量,通过定时器编码器模式采集,可正可负。

    Encoder_Least =(encoder_left + encoder_right)-0;  
    

    上面一句代码是算法中求速度偏差的,有些同学不理解为什么是encoder_left + encoder_right表示当前小车速度。关于小车速度有这样一个公式
    speed=(leftSpeed+rightSpeed)/2 speed=(leftSpeed+rightSpeed)/2
    这里只是没有除以2而已,仔细想想,有必要除以2吗?当然是没有必要,我们调试的最终参数是参与量化的。

    速度环的Kp范围确定:

    通过实验测得,小车满速时,单位时间内(5ms)小车的左右编码器变化之和可达100,(不同的电机可能不一样),假定速度偏差达到50%电机满转。

    100/2=50,7200/50=144,也就是kp最大144,但是这里假设速度偏差达到50%电机满转的情况,所以具体情况具体分析。

    速度环的Kp极性确定:

    正反馈的效果,是把情况变得更剧烈。

    这里先关闭直立环和转向环,设置kp=-80,用手转动一侧电机,如果两个电机开始向相同的方向加速,即为正反馈过程,若不是kp为正值。

    速度环的kp大小确定:

    首先,打开之前调好的直立环。

    试凑法+二分法,从小到大调整kp,(公式中提到ki=kp/200),直到使得小车的响应迅速又稳定,此时,平衡小车的第一部分就调试结束了,小车可以长期稳定的直立了。

    5、总结

    到这里,极简版的直立平衡小车的理论和实践部分就结束了,个人感觉,这篇文章不像其他的文章只介绍如何实现一个平衡小车。这里从始至终都在向大家传达直立环、速度环的原理、内在机制,这样就可以更好的了解一个系统。

    关于为什么将平衡小车代码缩减到最少,这里只留下了直立环和速度环,主要是便于理解和学习。

    关于极简版工程代码,在公众号,发送:平衡小车极简版,即可获得。

    关于遥控、转向环,下面会陆续发布,尽请期待。

    如果你感觉,我的文章比较适合你,关注我,给你不一样的惊喜。

    稿定设计导出-20200810-205521
    在这里插入图片描述

    展开全文
  • 直立代码分析__两轮平衡小车原理

    千次阅读 多人点赞 2019-04-06 11:16:32
    究竟什么是平衡小车,不过这个平衡小车实现的原理其实是在人们生活中的经验 得来的。如果通过简单的练习,一般人可以通过自己的手指把木棒直立而不倒的 放在指尖上,所以练习的时候,需要学会的两个条件:...

    本文依据网上资源整理而来,适用于初学直立车者。

    一、原理

    平衡小车是通过两个电机运动下实现小车不倒下直立行走的多功能智能小

    车,在外力的推拉下,小车依然保持不倒下。这么一说可能还没有很直观的了解

    究竟什么是平衡小车,不过这个平衡小车实现的原理其实是在人们生活中的经验

    得来的。如果通过简单的练习,一般人可以通过自己的手指把木棒直立而不倒的

    放在指尖上,所以练习的时候,需要学会的两个条件:一是放在指尖上可以移动

    二是通过眼睛观察木棒的倾斜角度和倾斜趋勢(角速度)。通过手指的移动去抵

    消木棒倾斜的角度和趋势,使得木棒能直立不倒。这样的条件是不可以缺一的,

    实际上加入这两个条件,控制过程中就是负反馈机制。

    而世界上没有任何一个人可以蒙眼不看,就可以直立木棒的,因为没有眼睛

    的负反馈,就不知道笔的倾斜角度和趋势。这整个过程可以用一个执行式表达:

     

     

     

     

     

     

     

     

     

    二、平衡代码

    balance.c

    #include "Balance.h"
    
    S_FLOAT_XYZ 
    	GYRO_Real,		// 陀螺仪转化后的数据
    	ACC_Real,		// 加速度计转化后的数据
    	Attitude_Angle,	// 当前角度
    	Last_Angle,		// 上次角度
    	Target_Angle;	// 目标角度
    	
    
    S_INT16_XYZ
    	GYRO,			// 陀螺仪原始数据
    	GYRO_Offset,	// 陀螺仪温飘
    	GYRO_Last,		// 陀螺仪上次数据
    	ACC, 			// 加速度计数据
    	ACC_Offset,		// 加速度计温飘
    	ACC_Last;		// 加速度计上次数据
    S_INT32_XYZ
    	Tar_Ang_Vel,	// 目标角速度
    	Tar_Ang_Vel_Last;	// 上次目标角速度
    
    int32 
    	Speed_Now = 0,	// 当前实际速度
    	Speed_Min = 0,	// 左右最小速度
    	Speed_Set = 0, 	// 目标设定速度
    	Theory_Duty = 0,// 理论直立占空比
    	Vel_Set = 0,	// 目标转向角速度
    	Direct_Parameter = 0,// 转向系数
    	Direct_Last = 0,
    	Radius = 0;		// 目标转向半径倒数
    
    uchar Point = 80;
    int32 Difference = 0;
      
    	  			/* 各种标志位,放定时器中进行时序控制 */
    char Speed_Flag, Angle_Flag, Ang_Velocity_Flag, DMP_Flag;
    /********************************************************/
    
    /********************* 串级平衡控制 *********************/ 
    // 频率控制在定时器中设置
    void Balance_Control(void)
    {
    	if (Ang_Velocity_Flag)	// 直立角速度环	2ms
    	{
    		Ang_Velocity_Flag = 0;
    		
    		MPU6050_GetData(&GYRO, &ACC);	// 读取陀螺仪数据
    		Data_Filter();					// 对原始数据滑动滤波												
    												/* 角速度环作为最内环控制直立 */
    		Theory_Duty += PID_Increase(&Ang_Vel_PID, Ang_Vel, (int32)(GYRO_Real.Y*10),  (int32)(Tar_Ang_Vel.Y));	// 计算直立PWM  (int32)(Tar_Ang_Vel.Y)
    		Theory_Duty = range_protect(Theory_Duty, -950, 950);
    			
    //		if (System_OK)       
    //		{													//Speed_Min
    //			Direct_Parameter = PID_Realize(&Direct_PID, Direct, (int32)(GYRO_Real.Z*100), Radius*Speed_Min);// 转向环左正右负
    //			Direct_Parameter = range_protect(Direct_Parameter, -1200, 1200);
    //		}
    //		
    //		Direct_Last = Direct_Last*0.3 + Direct_Parameter*0.7;	// 更新上次角速度环结果
    		
    		MOTOR_Duty_Left  =Theory_Duty ;	// 左右电机根据转向系数调整差速- Direct_Last
    		MOTOR_Duty_Right =Theory_Duty ;       //+ Direct_Last	
    
    //		if (Run_Flag)
    //		{
    			MOTOR_Control(MOTOR_Duty_Left, MOTOR_Duty_Right);	// 控制左右电机
    //		}
    //		else
    //		{
    //			if (Stop_Flag)
    //			{
    //				if (Speed_Now > 20)
    //				{
    //					MOTOR_Control(-350, -350);
    //				}
    //				else
    //				{
    //					MOTOR_Control(0, 0);
    //				}
    //			}
    //
    //			else
    //			{
    //				MOTOR_Control(0, 0);
    //			}
    //		}
    		Get_Attitude();
    		mpu_dmp_get_data(&Attitude_Angle.Y, &Attitude_Angle.X, &Attitude_Angle.Z);	// 使用DMP直接读取欧拉角
    	        
            }       
    	
                   
    	if (Angle_Flag)		// 直立角度环	10ms
    	{
    		Angle_Flag = 0;	
                    Speed_Measure();// 获取当前速度/* 角度环加到角速度环上串级控制 */
    		Tar_Ang_Vel.Y = PID_Realize(&Angle_PID, Angle, (int32)(Attitude_Angle.Y*100), (int32)Target_Angle.Y);	// 结果为放大10倍的目标角速度	(int32)Target_Angle.Y
    //		Tar_Ang_Vel.Y = range_protect(Tar_Ang_Vel.Y, -1500, 1500);	// 注意正负号
    	}
    	if (Speed_Flag)		// 速度环	100ms
    	{
    		Speed_Flag = 0;
    		Target_Angle.Y = PID_Realize(&MOTOR_PID, MOTOR, Speed_Now, Speed_Set);	// 结果为放大100倍的目标角度
    		Target_Angle.Y += Zero_Angle*100;	// 目标角度叠加在零点上	
     //               Target_Angle.Y = range_protect((int32)Target_Angle.Y, 1000, 4000);	// -44 22
    
    		Speed_Min = Speed_Min * 0.1 + Speed_Now * 0.9;
    		if (Speed_Min < 40)
    		{
    			Speed_Min = 40;
    		}
    	}
    }
    
    /* 初始化用到的一些变量 */
    void Balance_Init(void)
    {
    	Attitude_Angle.Y = 0;
    	Target_Angle.Y = 0;
    	Tar_Ang_Vel.Y = 0;
    	Tar_Ang_Vel.Z = 0;
    }
    
    

     balance.h

    #ifndef __BALANCE_H__
    #define __BALANCE_H__
    #include "common.h"
    #include "include.h"
    
    #define Zero_Angle -37.8f	// 蓝色电池-3.8  
    //#define Zero_Angle 22.0f	// 白色电池
    
    extern S_FLOAT_XYZ 
    	GYRO_Real,		// 陀螺仪转化后的数据
    	ACC_Real,		// 加速度计转化后的数据
    	Attitude_Angle,	// 当前角度 
    	Last_Angle,		// 上次角度
    	Target_Angle;	// 目标角度
    	
    
    extern S_INT16_XYZ
    	GYRO,			// 陀螺仪原始数据
    	GYRO_Offset,	// 陀螺仪温飘
    	GYRO_Last,		// 陀螺仪上次数据
    	ACC, 			// 加速度计数据
    	ACC_Offset,		// 加速度计温飘
    	ACC_Last;		// 加速度计上次数据
    extern S_INT32_XYZ
    	Tar_Ang_Vel,	// 目标角速度
    	Tar_Ang_Vel_Last;	// 上次目标角速度
    
    extern int32 
    	Speed_Now,		// 当前实际速度
    	Speed_Min,		// 左右最小速度
    	Speed_Set, 		// 目标设定速度
    	Vel_Set,		// 目标转向角速度
    	Direct_Parameter,
    	Radius;
    
    extern uchar Point;
    extern int32 Difference;
    
    extern char Speed_Flag, Angle_Flag, Ang_Velocity_Flag, DMP_Flag;
    //extern float Zero_Angle ;
    void Balance_Control(void);
    void Balance_Init(void);
    
    #endif
    

     

    展开全文
  • 这么一说可能还没有很直观的了解 究竟什么是平衡小车,不过这个平衡小车实现的原理其实是在人们生活中的经验 得来的。如果通过简单的练习,一般人可以通过自己的手指把木棒直立而不倒的 放在指尖上,所以练习的时候...
  • 这是平衡小车原理图、PCB与程序,可自行打板,程序有纯保持平衡的程序和蓝牙遥控程序,支持手机APP遥控(APP包含在内),具体讲解在我发表的一系列文章中。
  • 如果 在保持物理平衡的前提下改变轮子的大小和位置,虽然其功能 不会受到影响,但在整体造型中,轮子起到的装饰作用就会被 削弱或夸大,造成视觉上的不平衡。 图151是一个对称设计的花器,本身...

    2.视觉平衡

    与平面构图相近,产品结构的视觉平衡就是要寻求一种立体的视觉稳定感和平衡感,有时候结构的物理平衡是没有问题的,但视觉上却不够稳定,结构构图就不太理想。

    图150所示的长几,其造型源于独轮手推车的形态。如果 在保持物理平衡的前提下改变轮子的大小和位置,虽然其功能 不会受到影响,但在整体造型中,轮子起到的装饰作用就会被 削弱或夸大,造成视觉上的不平衡。

    ea62ca4522210b0757ce34f0bad0a244.png

    图151是一个对称设计的花器,本身并没有什么视觉平衡 问题。尽管花枝也很轻,无论怎么摆放都能保持花皿的物理平 衡,但改变花枝的摆放方向在视觉效果上会产生较大的变化。

    2027ee97c1ca6a2a2c8da40507cf94fa.png

    图152展示的木制小椅,是一件充满叛逆色彩的作品。作者试图通过不寻常的造型方式来表达自己对结构平衡性的独特 理解,寻求一种超常规的创意和视觉上的冲击。

    2086d5df4c998f852a0183747453c3d2.png
    97882a226a586b48ff177e30cd6460ee.png

    想 学 U G 产 品 设 计、U G 模 具 设 技、U G 数 控 编 程 联 系 1 8 8 1 9 1 0 6 2 7 6 ( 微 信 同 号 )

    展开全文
  • 遥控平衡小车经验

    万次阅读 多人点赞 2017-09-12 11:58:09
    目前可以做到遥控行走了,也遇到过很多坑,就说一点吧,不过我理解的也不是很深入,有不足的欢迎指出1、平衡车的重心越低,平衡效果越好2、平衡车前进的原理是,把小车保持平衡的角度前倾,小车为了保持这个倾角,会...
  • 实践 基于Arduino 平衡车

    万次阅读 多人点赞 2018-01-21 18:46:12
    完成后能基本保持平衡,但太大力去推容易倒 平衡原理  通过负反馈实现平衡,车体会在轮子滚动方向上发生倾斜。控制轮子转动,抵消在一个维度上倾斜趋势便可以保持车体平衡了。根据这个原理,通过...
  • 平衡小车详细源码.rar

    2020-01-13 20:36:37
    这么一说可能还没有很直观的了解 究竟什么是平衡小车,不过这个平衡小车实现的原理其实是在人们生活中的经验 得来的。如果通过简单的练习,一般人可以通过自己的手指把木棒直立而不倒的 放在指尖上,所以练习的时候...
  • 平衡车直立PID调节总结

    万次阅读 多人点赞 2018-09-25 22:38:59
    苦战一周,终于使平衡小车站了起来,PID无疑是我从学习板子至今遇到最困难东西了,并不是说它原理有多么... 平衡车是一个闭环控制系统,要保持直立静止需要两级PID,直立环PD调节器依据IMU(惯性测量单元我使用...
  • 类比到平衡小车中,同理想让小车保持平衡,同样需要一个负反馈机制,让小车角度回正,理想情况下,我们只需要控制电机加速度和小车倾角成正比就可保持平衡。 问题 然而随着角度变小,a逐渐变为0,此时电机虽然...
  • 陀螺稳定装置是一种以陀螺为 敏感元件或执行元件,使被稳定对象在干扰因素作用下能相对大地坐标系保持 方位不变或者在指令力矩作用下使其按照给定规律相对惯性空间转动陀螺 装置。 陀螺稳定装置按照陀螺力矩在...
  • 电动平衡车GB/T34668-2017质检报告费用,GB/T34667质检报告费用电动平衡车,又叫体感车、思维车、摄位车等。市场上主要有独轮和双轮两类。其运作原理主要是建立在一种被称为“动态稳定”(Dynamic Stabilization)...
  • <总目录> 一、直立PID 1.1、直立环作用 直立环顾名思义意思就是是小车两轮保持直立状态,能够平衡直立...也就是说车子向一个方向倾斜时候,小车就猛向这个方向移动,使车身保持平衡。 从原理上我们可以...
  • 一、直立行走任务分解 1、任务分解 (1) 控制车模平衡:通过控制两个电机正反向运动保持车模直立平衡状态 (2) 控制车模速度:通过调节车模倾角来实现车模速度控制,实际上最后还是演变成通过控制电机转速来...
  • 本项目自平衡双轮小车的原理,其实就是靠小车前后来回运动保持平衡,原来考虑“来来回回”文艺一点可以称为“徘徊”,但是后来某网友看完视频之后有一给力的评语——忐忑,加上这也是近来网络流行语,同时也确实能够...
  • 免费滤波器是模拟运算放大器,而用于电机调速和平衡的PID控制器都是Arduino中的所有软件。有一个现有的Arduino的PID库,但我不得不修改它。我也写了一个第一阶低通滤波器库函数。是的,如果采样率足够慢,Arduinos...
  • 通过车载倾角传感器对跷跷板倾角高精度测量,实时向控制系统反馈倾斜状态,系统根据跷跷板状态做出前进或后退动作,使跷跷板保持平衡及实现所要求其他功能。为保证小车在板上平稳行使,以及从地面任意位置找到...
  • 总之PID主要就是控制某一个量“保持平衡一种算法。 我这里举一个常规例子你大概就能够明白了: 我们想煮一壶60℃水,你会怎么做呢? 这个答案不是很简单嘛。就当他低于60℃时候加热,超过60
  • 能够修复旧电池、延长新电池循环使用寿命一倍以上,它就是【美卡得】变频脉冲充电器,它为什么能做到这些呢,首先我们来了解一下【美卡得】变频脉冲充电器的原理:它是一种变频脉冲充电器,包括有单端反激式开关电源...
  • 静态平衡相对简单,一个姿势正确与否看他是否能保持平衡就知道了,与平衡相关属性就是"重心"以及"支撑点",比如一个侧踢,脚往前,身体自然往后稍倾,以达到重心平衡. 动态平衡就比较复杂,但了解基本属性时也很...
  • matlab神经网络30个案例分析

    千次下载 热门讨论 2011-06-01 20:06:07
    不但能够高准确率预测训练集而且要合理预测测试集,使得测试集分类准确率也维持在一个较高水平,即使得得到SVM分类器学习能力和推广能力保持一个平衡,避免过学习和欠学习状况发生。 第14章 SVM回归...
  • 假如花在汉堡包上钱或者时间增加,而其它替代品却保持不变,那么,就连汉堡包最热心老主顾也将无可奈何地去买其它替代品。当价格增加时,消费者购买汉堡包要比价格低时减少。消费者购买力忠实地遵守价格与...
  • 在训练过程中使用 Focal Loss,解决了传统一阶段检测器存在前景背景类别不平衡的问题,进一步提高了一阶段检测器的精度。 MS-COCO 基于ResNet 50 mAP (0.50: 0.95) = 36% YOLOv3 速度和精度均衡的目标检测网络,...
  • 16.1.2 安全性和可用性之间的平衡 16.1.3 安全监视 16.1.4 基本方法 16.2 识别所面临威胁 16.2.1 访问或修改敏感数据 16.2.2 数据丢失或破坏 16.2.3 拒绝服务 16.2.4 恶意代码注入 16.2.5 服务器被攻破 16.3了解与...
  • PHP和MySQL Web开发第4版

    热门讨论 2014-08-13 15:32:15
    16.1.2 安全性和可用性之间的平衡 16.1.3 安全监视 16.1.4 基本方法 16.2 识别所面临威胁 16.2.1 访问或修改敏感数据 16.2.2 数据丢失或破坏 16.2.3 拒绝服务 16.2.4 恶意代码注入 16.2.5 服务器被攻破 16.3了解与...

空空如也

空空如也

1 2
收藏数 31
精华内容 12
关键字:

平衡车保持平衡的原理