pid巡线

简介: “【5月更文挑战第25天】”

这段代码是一个使用PID控制算法的简单示例,它用于控制两个马达(M1和M2)以实现机器人的巡线功能。PID代表比例(Proportional)、积分(Integral)、微分(Derivative),这是一种广泛应用于控制系统的反馈控制算法。下面是对代码的详细解释:

  1. 导入模块

    import rcu
    

    这行代码导入了rcu模块,这个模块可能是用来与硬件通信的库,例如控制电机和读取传感器数据。

  2. 定义全局变量
    这些变量用于存储速度、偏差值、PID控制器的参数(比例系数Kp、积分系数Ki、微分系数Kd)、光电传感器的读数、积分和微分项以及转弯速度。

    VAR_Speed = 0
    VAR_offset = 0
    VAR_Kp = 0
    VAR_Ki = 0
    VAR_Kd = 0
    VAR_light = 0
    VAR_I = 0
    VAR_E = 0
    VAR_D = 0
    VAR_turn = 0
    VAR_LE = 0
    
  3. 定义任务函数 task1
    这个函数包含了PID控制算法的实现。

  4. 设置PID参数
    while循环之外,设置了速度、光电传感器的目标值、比例系数、积分系数和微分系数。

    VAR_Speed = 30 # 设定速度
    VAR_offset = 2000 # 光电传感器目标值
    VAR_Kp = 0.007 # 设定比例系数
    VAR_Ki = 0.002 # 设定积分系数
    VAR_Kd = 0.002 # 设定微分系数
    
  5. PID控制循环
    while True: 循环是一个无限循环,它不断执行PID控制逻辑。

  6. 读取传感器数据

    VAR_light = rcu.GetLightSensor(1) # 光电传感器数值
    

    这行代码从光电传感器读取当前的数值。

  7. 计算偏差

    VAR_E = (VAR_light - VAR_offset) # 计算偏差值
    

    偏差值(Error)是传感器读数与目标值之间的差。

  8. 积分项

    VAR_I = (VAR_I + VAR_E) # 积分:累计偏差值
    

    积分项(Integral)是偏差值随时间的累加,用于消除稳态误差。

  9. 微分项

    VAR_D = (VAR_E - VAR_LE) # 微分:计算偏差值变化率
    

    微分项(Derivative)是偏差值变化率,用于预测偏差的未来趋势并提供超前控制。

  10. 计算PID输出

    VAR_turn = (((VAR_Kp * VAR_E) + (VAR_Ki * VAR_I)) + (VAR_Kd * VAR_D)) # 计算转弯速度
    

    PID输出是通过比例、积分和微分项的加权和计算得出的,用于控制机器人的转向。

  11. 设置马达速度

    rcu.SetMotor(1,(30 + VAR_turn)) # M1马达最终速度
    rcu.SetMotor(2,(30 - VAR_turn)) # M2马达最终速度
    

    根据PID输出设置两个马达的速度,使机器人向目标线靠近或远离,实现巡线功能。

  12. 更新偏差值

    VAR_LE = VAR_E # 将此时的偏差值记录为上一次偏差值
    

    更新偏差值,为下一次循环的微分项计算做准备。

这个PID控制算法的目的是使机器人能够沿着预定的线路行驶。通过调整光电传感器的目标值(VAR_offset),可以控制机器人在线路的哪一侧行驶。PID参数(Kp、Ki、Kd)需要根据实际情况进行调整,以达到最佳的控制效果。

import rcu

VAR_Speed = 0
VAR_offset = 0
VAR_Kp = 0
VAR_Ki = 0
VAR_Kd = 0
VAR_light = 0
VAR_I = 0
VAR_E = 0
VAR_D = 0
VAR_turn = 0
VAR_LE = 0

def task1():
  global VAR_Speed,VAR_offset,VAR_Kp,VAR_Ki,VAR_Kd,VAR_light,VAR_I,VAR_E,VAR_D,VAR_turn,VAR_LE
  VAR_Speed = 30 #设定速度
  VAR_offset = 2000 #光电传感器目标值
  VAR_Kp = 0.007 #设定比例系数
  VAR_Ki = 0.002 #设定积分系数
  VAR_Kd = 0.002 #设定微分系数
  while True:
    VAR_light = rcu.GetLightSensor(1) #光电传感器数值
    VAR_E = (VAR_light - VAR_offset) #计算偏差值
    VAR_I = (VAR_I + VAR_E) #积分:累计偏差值
    VAR_D = (VAR_E - VAR_LE) #微分:计算偏差值变化率
    VAR_turn = (((VAR_Kp * VAR_E) + (VAR_Ki * VAR_I)) + (VAR_Kd * VAR_D)) #计算转弯速度
    rcu.SetMotor(1,(30 + VAR_turn)) #M1马达最终速度
    rcu.SetMotor(2,(30 - VAR_turn)) #M2马达最终速度
    VAR_LE = VAR_E #将此时的偏差值记录为上一次偏差值

task1()
目录
相关文章
|
传感器 JSON 监控
Springboot + oshi 实现对服务器硬件的监控
OSHI是一个免费的基于JNA的(本机)Java操作系统和硬件信息库。它不需要安装任何额外的本地库,旨在提供跨平台实现来检索系统信息,如操作系统版本、进程、内存和CPU使用情况、磁盘和分区、设备、传感器等。
1391 0
|
存储 算法
pid控制
这篇文章详细介绍了PID控制算法的理论基础、组成部分、不同形式的算法(位置式和增量式PID),以及参数调试的步骤和技巧,旨在帮助读者理解和应用PID控制器进行有效的系统控制。
664 2
pid控制
|
11月前
|
传感器 存储 监控
基于Arduino的线性循迹小车
基于Arduino的线性循迹小车
292 0
|
存储 物联网 编译器
详解【C语言】类型转换--整型提升,算术
详解【C语言】类型转换--整型提升,算术
244 0
|
关系型数据库 MySQL API
用Python一键艺龙酒店各个城市数据存入mysql
用Python一键艺龙酒店各个城市数据存入mysql
136 0
|
C++
C++如何进行sort的使用——C++如何进行排序
C++如何进行sort的使用——C++如何进行排序
359 0
|
存储 索引
STM32实战项目—停车计费系统
本文详细介绍了一个停车计费系统的任务要求,实现思路。最后,给出了详细的程序设计和测试结果。
422 2
STM32实战项目—停车计费系统
|
运维 小程序 API
STM32实战项目—WIFI远程开关灯
本文介绍了如何利用正点原子ESP8266和STM32F103C8T6连接腾讯云,利用舵机实现远程开关灯。给出了详细的腾讯云配置和调试步骤,给出了部分程序设计。
505 1
STM32实战项目—WIFI远程开关灯
|
算法 C语言 智能硬件
stm32单片机实现电机的PID控制
stm32单片机实现电机的PID控制
445 0
|
存储 编解码 算法
基于STM32的开源简易示波器项目
基于STM32的开源简易示波器项目
283 0