Mixly PID循线编程

        对于循线来说,PID算法是非常好的方法,可以根据车相对黑线的位置自动调整轮子的速度,达到丝滑循线目的。网上也有很多关于PID的教程,但大多数都是用Arduino IDE 编程的,对于不会C语言的小白来说是有点困难的。Mixly 作为一个模块化编程软件,为广大爱好者提供了非常方便的环境,但现在网上关于用Mixly现实PID算法的教程比较少,所以对于会用Mixly但不太会C语言的小白来说,想用Mixly来实现PID控制是比较困难的。本人也是小白一个,喜欢用Mixly来编程,一开始也是不懂PID算法,还好,我会一点C语言(起码能看大概个明白),在网上看了很多关于PID的算法后,决定自己用Mixly来编一个PID算法。

        PID 算法在这里就不作详细介绍,网上有很多,可以去找,关于PID算法控制的理解,可以看看这个,理解他说循线原理可以了,其他不用管。

        乐高EV3 pid 巡线讲解01 -李航作品_哔哩哔哩_bilibili

驱动模块及接线

        本次使用的是L298N驱动模块,如图:

               

                                          图1                                                          图2

        两个都是L298N模块,我使用的是第二个,因为第二个接口多一点,还带有开关,当然也贵一点。

        根据L298N逻辑表,有两种方法实现PWM驱动

        第一种:

 

         拔掉A、B使能管的接帽,用ENA、ENB的使能管接PWM管脚控制调速,IN1、IN2、IN3、IN4用高低电平控制方向,这种接法最少只要两个PWM管脚,但要用到的接口就要6个,本来UNO的接口不多,所以我没有用这种。

        Mixly编程如图:

 

       第二种:

 

        A、B使能帽接上,IN1、IN2、IN3、IN4接上PWM管脚5、6、9、10,可以控制方向和调速。这种接法只要4个管脚,但4个都要PWM管脚。

        Mixly编程如图:

 

PID变量

        首先声明定义一些变量:kp,ki,kd 三个变量是控制P,I,D大小的系数。

        P是误差比例,即后面的error,用来控制两个电机的速度。

        I是积分,一般用于大转弯,弯度越大ki系数应越大,ki*I就会变大,电机的速度变大,顺利过弯。

        D是微分,是对接下来的路线的预判,具体赋值是连续两次误差的差如:上次误差是1,这次误差是1,两次的差是0,说明路线没有偏,两个电机的速度不用改变。

        error 是传感器识别黑线的位置,不同的位置财赋予不同的值,就需要调整两个电机的速度,两个电机有了不同的速度就形成误差。

        last_error 是记录上一次的误差,只要用于形成D。

        speed 为基础速度(自己设的)

由传感器得用的不用error 值

        这里用了三个灰度传感器,不同的情况赋予error不同的误差值。左右两边用正和负表示,至于是正还是负都可以,如左边为正,右边就为负,相反,左边为负,那右边就为正。对于不同的路线来说,急弯多的话传感器越多越好。

 

        010 没有偏离,error赋值为0 ,两个电机速度不用改变。

        100 中度右偏,error赋值为2 ,右电机中度加速,左电中度机减速。

        110 轻度右偏,error赋值为1 ,右电机轻度加速,左电机轻度减速。

        011 轻度左偏,error赋值为-1 ,右电机轻度减速,左电机轻度加速。

        001 中度右偏,error赋值为-2 ,右电机中度减速,左电机中度加速。

        000 脱线了,有可以是右偏后脱线,也有可以是左偏后脱线。  

             如果原来error为2 说明是右偏脱线,error赋值为3,右电机重度加速,左电重度机减速。

             如果原来error为-2 说明是左偏脱线,error赋值为-3,右电机重度减速,左电重度机加速。

PID 公式

        输出速度=P*kp + I*k i+ D*kd

 

        定义一个有返回值的函数:PID 最后输出 output_speed

        用传感器得到的值(error)赋值给P

        I 不断的累积每次的error,如果在急弯,这个I会积累得很快,一边轮子的速度试会增加得很快,面另一边的轮子则减少得很快,从而顺利过弯。

        D 为连续两次error的差

        根据公式,最终输出output_speed

电机速度调整,最终两电机输出不同的速度

 

  定义一个电机函数

        右电机速度:基础速度+上面的PID输出速度(speed+PID)

        左电机速度:基础速度-上面的PID输出速度(speed-PID)

        再设一个速度范围50-150

        最后执行就可以了。

 

        kp,ki,kd 这三个系数的调整,网上有关于它位的调整,还有口诀,不过个人觉得还是上面的视频讲的简单,弯度不大,整体路线比较圆滑的ki和kd都可以为0,如何直线摆动较大,增加一点kd,如果急弯较多可以增加一点ki,当然不同的路线要不同的数值,具体还是要根据路线一点一点地调整。

        最后放Mixly的整体图

 

  • 9
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
衰减曲线法是一种常用的 PID 参数整定方法,可以通过 MATLAB 编程来实现自动调整 PID 参数。下面是一个基于衰减曲线法的 PID 参数自整定程序,你可以参考一下。 ```matlab % PID参数自整定程序(基于衰减曲线法) % 作者:AI算法工程师 % 清空工作区 clear all; close all; clc; % 设置PID控制器的初始参数值 Kp = 1; Ki = 0.1; Kd = 0.1; % 设置仿真时间 t = 0:0.01:10; % 初始化输入信号和输出信号 u = ones(size(t)); y = zeros(size(t)); % 计算系统的传递函数 s = tf('s'); G = 1/(s*(s+1)); % 计算系统的单位阶跃响应 step_response = step(G); % 计算系统的衰减曲线 damping_curve = abs(step_response)./max(abs(step_response)); % 计算系统的峰值时间和峰值幅值 [peak_value, peak_index] = max(damping_curve); peak_time = t(peak_index); % 计算系统的上升时间和调节时间 rise_time = t(find(damping_curve>=0.9,1))-t(1); settling_time = t(find(abs(step_response-1)<=0.02,1))-t(1); % 输出系统的性能指标 disp(['峰值时间:' num2str(peak_time)]); disp(['峰值幅值:' num2str(peak_value)]); disp(['上升时间:' num2str(rise_time)]); disp(['调节时间:' num2str(settling_time)]); % 调整PID参数 Kp = 0.6*Kp; Ki = 1.2*Ki; Kd = 0.075*Kd; % 重新计算系统响应 for i = 2:length(t) error = u(i-1)-y(i-1); integral = integral + error; derivative = error - error_previous; u_PID = Kp*error + Ki*integral + Kd*derivative; y(i) = sim_system(u_PID); error_previous = error; end % 绘制系统响应曲线 plot(t, y); xlabel('Time (s)'); ylabel('Output'); title('PID Parameter Tuning using Damping Curve Method'); ``` 在这个程序中,我们首先初始化了 PID 控制器的初始参数值,并设置了仿真时间。然后,我们计算了系统的传递函数和单位阶跃响应,并据此计算了系统的衰减曲线。根据衰减曲线,我们可以计算出系统的峰值时间、峰值幅值、上升时间和调节时间等性能指标。接下来,我们根据性能指标,对 PID 参数进行调整,并重新计算系统的响应曲线。 需要注意的是,这个程序只是一个简单的示例,仅供参考。在实际应用中,需要根据具体的系统和控制要求,进行相应的修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值