教你10分钟完成智能小车的PID调速

2023-05-16

简介

这是我在CSDN上面的第一篇博客,来分享一下我是如何用最短的时间进行智能小车的PID调速的。在疫情期间比较无聊,在某宝买了一个智能小车底盘和一堆零件,基于Arduino Due和树莓派进行开发,Due负责底层控制,树莓派进行上层控制器开发,比如斯坦利控制器或者模型预测控制器进行轨迹跟踪。
本次采用Simulink工具链完成,小车的所有代码均基于Simulink Target Support Package完成。
在这里插入图片描述

所需要的硬件&软件

1.普通带编码器的直流电机。
2.Arduino Due控制板及数据线(类似dSPACE MAB进行RCP开发,但是性能完全没有可比性,开个玩笑)。
3.Matlab&Simulink R2019b (民间通用版本即可)。
4.电脑一台。

前期准备工作

(1)安装Arduino硬件支持包

这并不是本文的重点,网上有许多这方面的教程,包括MATLAB录制的研讨会均有类似的视频教程。有意的同学可以自行查阅相关资料,十分简单。如下类似教程。
https://blog.csdn.net/u013732401/article/details/70161200

(2)Simulink模型

新建Simulink Model,并且打开Library Browser。找到Simulink Supprot Package for Arduino Hardware
在这里插入图片描述
按照下图搭建模型。其中Tachometer模块在硬件支持包中的Sensor模块里(2019b有,低版本2018a并没有,需要自己通过编码器脉冲的上升沿或者下降沿捕获进行),具体通过高低电平进行捕获的模型在硬件支持包中的DrivePID例程中的Encoder子模块中有搭建。
在这里插入图片描述
可以看到,Tachometer输出量并不是help中讲的RPM,而是脉冲/每分钟。Tachometer模块中设置的即是编码器的单个信号线连接的PIN口(这里用一根信号线就无法测量方向了,请注意编码器信号线是5V电压,本次使用的单片机IO最高容忍3.3V,需要初中知识进行分压电路的搭建,如果使用其他芯片,请查询数据手册该IO口的最高容忍电压),采样时间设置0.05即可。由于我智能小车轮子转一圈采集390个脉冲,轮子直径64毫米。所以简单计算即可得到轮速转一圈行驶的距离,单位m/s。后面经过了一个一阶低通滤波器,这个在网上可以找到关于一阶低通滤波的公式,然后进行搭建,这里就不是赘述了。
接下来进行驱动模块的搭建,关于L298N驱动模块的使用,这里我使用一路电机进行调试,29和27PIN脚设置成高电平和低电平,PIN2设置为ENA。在Arduino 支持包中,PWM模块输入值0-255对应0-100%占空比,PWM频率在Due中驱动模块固定1KHz。
在这里插入图片描述
Step阶跃信号目的在于仿真时间2s时进行阶跃输入,占空比改变至100,我们需要做的就是进行数据记录,记录本次仿真的时间,输入和输出。如何记录呢,那么我们需要在相应的信号线上右键,选择Log Selected Signals。我们需要对Step输出线,低通滤波后的速度进行Datalog。最后设置Arduino外部仿真调试环境。
采样时间设置硬件设备设置
在Set COM port端口中可以手动输入您的硬件串口号如果在上传程序失败的时候。接下来进行在线调试,类似keil软件中的debug模式。在2019b以下版本的同学点击仿真按钮旁边的下拉菜单选择External模式即可。我在使用2018a版本无法进行数据datalog,可以通过串口进行数据传输,具体请查阅相关资料。
在这里插入图片描述
点击按钮开始离线仿真,模型会编译成代码刷写进硬件。前期准备工作完成,相信无论用基于模型设计的方式还是手动写代码的方式,完成以上工作都不会难。接下来就进入本次教程的正题。

正题

数据导出到Workspace

如图所示,点击Data Inspector
在这里插入图片描述
在这里插入图片描述
分别将左侧数据拖入进对应的框图即可查看数据记录效果,如果您已经有小车并且已经进行开环PWM测速,您需要关注以下的每一步。只要您有相应的PWM和速度值都可以使用以下方法进行PID调速,不仅限于使用Aruduino类似的快速原型开发。如图所示,右键数据,进行导出,导出至Workspace即可。
在这里插入图片描述
在这里插入图片描述
同样的方式将两组数据全部导出,分别是PWM和Speed。
返回Matlab主界面,您会看在工作空间看到如下图所示。
在这里插入图片描述
使用代码即可将数据解析出来,如下图所示。
在这里插入图片描述
再看工作空间内容,即可得到我们熟悉的数据类型。

系统辨识

我们通过输入和输出基于Matlab的System Identification工具箱即可辨识出小车驱动的传递函数,从而进行PID整定。具体方法如下。打开系统辨识工具箱。
在这里插入图片描述
将时域数据导入。
在这里插入图片描述
在这里插入图片描述
导入后,点击导入后的曲线,然后点击Time Plot即可查看曲线。
在这里插入图片描述
然后如图选择系统估计的模式。
在这里插入图片描述
您可以根据您的需要选择辨识的传递函数结构,这里我选择二阶振荡模型
在这里插入图片描述
然后点击Estimate,稍等片刻,可以在工具箱主界面查看我们的辨识结果,高亮辨识后的曲线,点击Model Output,即可查看辨识曲线。我辨识出来后的重合度达到98.2。效果还是可观的。
在这里插入图片描述
这一步的最后,右键上面的辨识曲线,即出现需要的传递函数参数了。
在这里插入图片描述

离线仿真

得到系统的传递函数,那当然是十分愉悦的事情,在学习控制理论的时候总是先给出系统模型,但是在实际项目中模型是需要辨识的,这就是课本和实际的差距。我们得到参数后即可在Simulink环境进行仿真环境的搭建了,将上图的参数输入至Transfer Fcn模块中。在进行仿真前,因为进行的是连续系统仿真,所以将仿真时间改成变步长。看一下仿真效果和实际输出基本一致。
在这里插入图片描述
因为需要PID控制,那么我们可以添加PID控制器模块进行模型的搭建,搭建完如下图所示。简单仿真一下,没有更改PID模块的任何参数,所以结果很差。
在这里插入图片描述
这时我们需要打开PID模块,点击Tune按钮,请求Matlab帮助我们进行自整定!随后自动打开PID Tune的App。
在这里插入图片描述
似乎已经帮您完成了整定功能,您只需要调整Robust to Aggressive横条去看系统的响应,选择您喜欢的位置,然后点击Updata Block参数会更新至您的控制器。
在这里插入图片描述
在这里插入图片描述此时您发下PID模块的参数已经被更改了,那么调整模型,在Step模块设置您期望速度,例如我需要小车行驶速度为1m/s。点击仿真看看效果。在这里插入图片描述

控制器离散化

是不是借助Maltab/Simulink环境很简单就完成了PID的整定了,有同学会问,这有啥用,我需要跑进板子里啊,别急,我们现在研究的是S域,计算机控制器是离散系统,我们需要把控制器从S域转换到Z域去。步骤如下图所示。
2019b用户如下图找到该App,2019b之前的用户在Analysis->Control Design->Model Disretizer找到即可。在这里插入图片描述
您可以选择0阶保持或者1阶保持进行离散化,采样时间我个人设置0.05s。然后点击s->z按钮,最后Store Setting

在这里插入图片描述
在这里插入图片描述
回到模型,您可以看见算法和模型都从S域变成Z域了。在Solver中将采样时间改成定步长,采样时间设置成0.05,再次进行仿真。很不幸模型输出已经振荡!这时您需要重复上述步骤再次在PID tune中进行整定。这里我就不重复步骤,直接给整定后的仿真效果。
在这里插入图片描述
这是最后自整定的PID参数。
在这里插入图片描述

实车效果

仿真效果可以接受,这个时候我们就完成了PID离散控制器的设计了,接下来就需要刷写到板子里。重新改变模型如下图所示。替换传递函数模型,也可以进行对比。将实车速度替换掉传递函数的反馈值。点击外部模式仿真,看一下实车效果如何。
在这里插入图片描述
经过模型自动生成代码刷写到控制器后,实车测试和仿真结果图有如下对比,在超调量上有些区别,但是实际控制器中超调更小。最后都趋于平稳。蓝色是仿真结果,紫色是实际控制器效果
在这里插入图片描述

总结

仿真可以节省我们太多时间,如果您使用STM32,S12K进行手工代码开发,可以通过串口进行数据采集导入Excel,然后导入到Matlab进行模型的系统辨识,将PID控制器生成原子子系统,进行编写数据字典,管理输入输出信号和参数(非常重要),再使用Embedded Coder生成代码,在中断服务函数中调用生成的代码函数,基于模型设计的方法可以加快控制器的开发。这是一次在贵平台分享软件开发的经验。如果有问题可以联系我的qq:664157262,一起进步!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

教你10分钟完成智能小车的PID调速 的相关文章

  • 学习JS基础部分一

    数据类型 分支结构 循环结构 数据类型 简单数据类默认值Number0BooleanfalseString Undefinedundefinednullnull 复杂数据类型默认值Array Object 分支结构 分支语句说明if 条件
  • 来,带你见识一下CT三维重建

    文 xff1a 北京协和医院放射科孙昊 来源 xff1a 从医开始 xff0c 协和八的奇妙临床笔记 相信各位同学在临床工作中 xff0c 已经接触到很多CT三维重建的图像了 xff0c 那么CT三维重建到底是个啥东东 xff1f 这个问题
  • 数组常用方法

    concat span class token keyword let span arr1 span class token operator 61 span span class token punctuation span span c
  • 深拷贝和浅拷贝

    浅拷贝和深拷贝的区别 浅拷贝是复制原数据的数据内容 xff0c 引用原数据的地址 xff1b 当改变复制之后的数据时 xff0c 原数据的数据内容也会被改变 xff0c 因为这是引用原来数据的地址 xff0c 改变的是原数据地址的数据内容
  • Set集合和Map集合

    Set集合 用于存放不重复的数据 xff0c 通过构造函数的形式 参数必须是一个可迭代对象 创建Set对象 span class token keyword const span s1 span class token operator 6
  • js树型结构处理

    span class token comment 获取树形结构并处理 span span class token comment 当child为null时处理 span span class token comment 如果是childre
  • 姿态旋转与坐标变换

    姿态旋转与坐标变换 旋转还是变换 xff1f 坐标旋转 变换矩阵 xff08 Rotation Matrix xff09 等效旋转矢量 xff08 Axis Angle xff09 罗德里格斯公式 xff08 Rodrigues 39 s
  • Gitlab

    Gitlab Gitlab介绍 我们了解了git是以个人为中心 xff0c 但是人人都得数据交互呀 python程序员每天都忙着进行py交易 交互数据的方式 使用github或者码云等公有代码仓库 xff0c 托管代码的地方 xff0c 谁
  • word论文排版和写作04:用MathType和word公式编辑器插入数学公式

    写在前面 插入公式在论文写作中是一个常见的操作 xff0c 本文作为补充 xff0c 主要介绍如何规范和方便地在word中插入公式 主要的方式有两种 xff0c 一种是使用MathType xff0c 一种是使用word自带的公式编辑器 关
  • Jetson Nano ros melodic+realsense+aruco

    一 realsense SDK和realsense ros安装 参考链接 xff1a Ubuntu18 04 43 ROS melodic 安装使用 RealSenseD435i Lynn mg的博客 CSDN博客 ubuntu18安装re
  • ROS同步订阅realsense的彩色图和深度图(python实现)

    首先要保证realsense ros功能包的正常使用 xff0c 具体安装使用如下 xff1a Jetson Nano ros melodic 43 realsense 43 aruco 杰杰 xff01 的博客 CSDN博客 1 创建订阅
  • 用opencv的aruco库生成二维码marker标记

    用opencv的aruco库生成二维码marker标记 代码来源于官方提供的完整的工作实例create marker cpp 在opencv源码中的位置为opencv contrib 4 4 0 modules aruco samples
  • 树莓派上手实战之SSH下配置VNC服务器实现远程桌面(可以实现开机自启动vncserver)

    VNC是linux下面常用的远程桌面 xff0c 用它可以在windows或者unix主机上方便的通过网络操作远程主机而不需要一个额外的显示器 xff0c 非常实用 这篇教程将会详细讲解安装配置VNC服务器开启远程桌面服务的全部过程 首先
  • minikube搭建kubernetes

    系统环境 deepin15 11 安装virtualbox虚拟机 xff1a 应用商店就有安装minikube aizhao 64 aizhao hellonode curl Lo minikube https storage google
  • 安装软件时出现Command “python setup.py egg_info“ failed with error code 1 in /tmp的解决方案

    问题出现 pip3 install paramiko Collecting paramiko Downloading https pypi doubanio com packages be 6f f0ec5f5fb00d270ebd8094
  • flask基础总结(一)——从最简单的例子做起

    Flask是一个用Python编写的Web应用程序框架 xff0c 基于Werkzeug WSGI工具包和Jinja2模板引擎 下面从一个最简单的flask例子说起 span class token keyword from span fl
  • 为什么不建议对Intel Realsense的D400 Series和T265进行标定(Calibration)

    若非特殊情况或有专业设备 xff0c 不建议对相机进行标定 xff01 xff01 xff01 D400 Series 我就是在标定之后才发现 xff0c 标定就是个坑 xff01 xff01 xff01 我在标定后出现问题了才去问的售后
  • NVIDIA Xavier NX的Intel Realsense双目相机(T265+D435i)环境搭建

    文章目录 一 硬件部分二 环境配置1 安装ROS2 编译realsense xff08 1 xff09 查看版本 xff08 2 xff09 编译librealsense xff08 3 xff09 编译realsense ros xff0
  • 启动IntelRealsense的D435i没有数据输出的解决方法

    我在NVIDIA的NX上调试双相机的VIO时 xff0c 出现了一个问题 xff0c 在启动D435i后 xff0c 查看话题频率发现出现no new message的字样 我在包括github上寻找了很多资料和别人的解决方法 xff0c
  • windows下PX4飞行日志文件ulog转csv流程

    确保ulg文件可以使用FlightPlot等分析软件正常打开查看安装pyulog包 xff0c 开源地址 先安装anaconda xff0c 下载地址打开anaconda prompt 运行 pip install pyulog可通过在an

随机推荐

  • Windows平台对PX4源码进行编译的步骤

    主要使用到的工具就是PX4 Toolchain 1 首先去github上下载Toolchain安装包 xff0c 是一个 msi文件 xff0c 然后直接照着官网教程双击安装这个文件 注意最后的安装完成页有一个clone the PX4 r
  • ros多传感器融合

    转 xff1a http www rosclub cn post 1030 html 最近实验室老师在做一个多传感器数据采集实验 xff0c 涉及到了消息同步 所以就学习了ROS官网下的消息同步工具message filters http
  • 几种嵌入式RTOS的分析与比较

    1 4种操作系统的介绍 1 1 VxWorks VxWorks是美国WindRiver公司的产品 xff0c 是目前嵌入式系统领域中应用很广泛 xff0c 市场占有率比较高的嵌入式操作系统 VxWorks实时操作系统由400多个相对独立 短
  • 【python】python的命名规范:啥时候用驼峰啥时候用下划线啥时候用大写

    类属性 类方法 xff1b 私有属性 公有属性 xff1b 私有方法 公有方法 xff1b 静态属性 静态方法 xff1b python的命名规范 xx xx xx xff08 自用笔记 xff09
  • 修改Linux启动Logo(总结)

    修改Linux 启动Logo 完美 总结 1 修改启动Logo xff0c 换成自定义的图片 目的 xff1a 开机后显示自定义的图片 xff0c 替代小企鹅 xff08 1 xff09 准备一张 png 图片 xff08 2 xff09
  • 搞懂408数据结构中的结构体的定义

    对于一些跨考408的同学来说 xff0c 是不是经常会出现看见一些结构体的定义却不懂是什么意思 xff0c 或者让你定义一个节点类型时 xff0c 不懂各个部分的具体含义 希望这篇文章能够让你搞懂结构体到底是什么 xff0c 各个部分是什么
  • 无人机集群控制方案

    无人机集群控制方案 集群控制简介 多机器人群体控制系统一般分为集中式控制结构和分布式控制结构 集中式控制结构 xff1a 一个主控单元 xff0c 集中掌握了环境中全局信息和所有机器人的信息 xff0c 进行集中式处理任务与资源分配由主控单
  • 谷粒学院学习知识点汇总-------01

    前言 谷粒学院视频的系列首先先是学习一波理论知识 xff0c 最后跟着视频敲一遍整个项目 xff0c 到部署项目上线 xff0c 给自己定个flag xff0c 一个月之内完成项目部署上线 一 事务 1 1事务是数据库操作最基本单元 xff
  • Ubuntu下vscode的简单配置C/C++环境

    下载vscode并安装 方法1 在ubuntu软件中搜索 vscode下载 xff0c 但是我失败了 方法2 直接去官网下载https code visualstudio com Download xff0c 下载Linux版本的并安装 方
  • ubuntu zip和unzip命令

    zip span class token operator span r myfile span class token punctuation span zip test span class token operator span un
  • 一、ROS2简介

    ros2相关简介 ROS2的前身是ROS xff0c ROS即机器人操作系统 xff08 Robot Operating System xff09 但是ROS本身并不是一个操作系统 xff0c 而是一个软件库和工具集 Ros的出现解决了机器
  • 二、ROS2基本操作

    ROS2节点 ROS2的节点讲究分工合作 xff0c 每个节点负责一个单独的模块化功能 举一个激光雷达的例子 xff0c 一个节点负责获取激光雷达的扫描数据 xff0c 一个节点负责处理激光雷达数据 xff0c 还有一个节点负责控制车轮转动
  • 六、ROS2通信机制(服务)

    一 服务介绍 客户端发送请求给服务端 xff0c 服务端可以根据客户端的请求做一些处理 xff0c 然后返回结果给客户端 这里与话题的主要区别就是 xff1a 话题是没有返回的 xff0c 适用于单向或大量的数据传递 而服务是双向的 xff
  • 作业4-8-5:HBase Shell插入数据:学生表、课程表、选课表

    现有以下关系型数据库中的表和数据 xff0c 要求将其转换为适合于HBase存储的表并插入数据 xff1a 学生表 xff08 Student xff09 keyRow 学号 xff08 S No xff09 姓名 xff08 S Name
  • 树莓派4B连接PCF8591模块

    1 PCF8591是8位的数模 模数转换集成芯片 xff0c 如图 1 xff08 详细介绍可以点击参考 xff09 图 1 PCF8591 2 AIN0 AIN3接模拟输入 xff0c 比如气体传感器 xff0c 能外接三个通道的模拟输入
  • “指定的网络名不再可用”解决办法

    主机操作系统 xff1a win10 linux操作系统 xff1a ubuntu22 04 在Windows下安装ubuntu xff08 wsl xff09 时 xff0c 出现 指定的网络名不再可用 xff0c 解决办法如下 xff1
  • Jetson xavier nx 安装CUDA10.2,和cudnn8.0

    2022 6 16更新 现在Jetson xavier nx 安装CUDA和CUDNN不需要下面那么复杂了 xff0c 可以直接通过刷机将其安装到设备上 在官网下载SDK Manager可以直接将CUDA烧录进设备 xff08 特别注意如果
  • 关于return用法时,return报错。

    在for循环里面return想要跳出全部循环时 xff0c 会报语法错误SyntaxError return outside function 原因是return只能写在def函数里面 没有def n span class token op
  • 联邦卡尔曼滤波

    联邦Kalman滤波 利用Kalman滤波技术对多传感器数据进行最优融合有两种途径 集中式Kalman滤波和分散化滤波 集中式Kalman滤波利用一个滤波器来集中处理所有子系统的信息 分散化滤波利用子滤波器处理子系统的信息通过全局滤波器实现
  • 教你10分钟完成智能小车的PID调速

    简介 这是我在CSDN上面的第一篇博客 xff0c 来分享一下我是如何用最短的时间进行智能小车的PID调速的 在疫情期间比较无聊 xff0c 在某宝买了一个智能小车底盘和一堆零件 xff0c 基于Arduino Due和树莓派进行开发 xf