前言
各位参赛的同学们,大家好!新的一届智能车又来临了,和往届相比,第二十届智能车大赛的赛项发生了很大的变化。今天,我们将聚焦独轮信标组,由龙邱工程师为大家带来独轮信标组的全面讲解。
写这篇手册是帮助新同学快速的了解充满魅力的智能车大赛。同时,会在这里给大家分享我们独轮信标组的方案与调车心得。我们深知,没有绝对的最优解,但在手册里,我们会毫无保留地分享我们在独轮信标组积累的方案经验与调车心得。希望这些内容能为大家提供一条清晰的探索思路,让大家在备赛过程中少走弯路,更加从容地应对比赛挑战。
本手册分为七个主要部分:组别简介、硬件清单、开发工具、外设基础、通用控制算法、独轮信标赛项分享以及备赛建议与资源推荐。建议读者按照章节顺序阅读,特别是新手同学,可先从硬件清单和开发工具部分入手,逐步深入到控制算法和赛项分享。
如果大家想要探讨智能车相关话题,欢迎加入我们的QQ 讨论群。在这里,无论是智能车的硬件设计、软件编程,还是比赛策略、技术难题,都能展开交流。
1、组别简介
1.1规则信息来源
(1)智能汽车竞赛官网:全国大学生智能汽车竞赛
(2)卓老师 CSDN 博客:《第二十届全国大学生智能汽车竞速比赛规则》 第二十届全国大学生智能汽车竞速比赛规则_20届智能车-CSDN博客
(3)卓老师微信公众号推文及每篇公众号文章的评论区:TsinghuaJoking
1.2赛题要求
1.2.1 规则简介
独轮信标组 的主要任务是定位闪烁的信标并压过灭灯的过程。 关于比赛中的信标, 可以参
见 第二十届智能汽车竞赛信标系统技术规格 在比赛中, 独轮车模通过摄像头来识别信标灯的位置。比赛细则参见 独轮组比赛细则 。
在实际比赛过程中, 信标是单独摆放在空白的场地内。 在调试过程中,它可以和普通赛道公用与一个场地, 只要将信标灯摆放在赛道之外的背景布上。
独轮信标组允许使用UWB 模块辅助进行定位。 如果使用 UWB 模块,限定UWB 模块的基站数量不超过 2 个。 避免过度依赖设备的优势,削弱视觉定位信标的作用。
1.2.2 独轮信标比赛细则
1.2.3 信标系统技术规格
1.3 规则解析
1.3.1 主控平台
独轮信标组可用的微控制器(MCU)型号包括:Infineon AURIX™ 系列:TC212、TC264、TC297、TC364、TC377、TC387。结合处理器性能,片上资源与性价比等关键因素,大家可以使用 Infineon 平台的 TC297, TC377,TC387 芯片。这几款芯片都是 300MHZ 的多核汽车芯片,性能强劲,运行稳定,是独轮 主控的不二之选。
英飞凌芯片的参数:
根据上表参数,我们可以看出,英飞凌提供的这个几个芯片,性能是非常强的,毕竟他们都是汽车级芯片,用在智能车上面,毫无压力,我们从中选择了性价比高的 TC297TX 去完成比赛任务。
英飞凌公司将会公布“第 20 届全国大学智能汽车竞赛-英飞凌芯片支持计划”, 给报名参赛队伍免费提供参赛芯片。
1.3.2 传感器限定
2、硬件清单
2.1 车模
参赛车模可选用往年的小轮版O1 车模,大轮版 O2 车模以及升级版O2 车模(原 O2 车模可通过更换部分配件直接升级)和 Q 车模。
2.2 器件清单
模块名称 | 作用 | 是否必需 | 是否需要自制 |
O / Q 车模 | 独轮车模 | 是 | 否 |
6S 航模锂电池 | 供电电源 | 是 | 否 |
母板 | 稳压电源、外设资源 | 是 | 是 |
核心板 | MCU 最小系统 | 是 | 否 |
神眼摄像头(通红外) | 获取图像 | 是 | 否 |
单路电机驱动 | 驱动行进电机 | 是 | 是 |
行进电机 | 驱动车模行进 | 是 | 否 |
编码器 | 检测行进电机转速 | 是 | 否 |
LSM6DSR 陀螺仪 | 姿态反馈 | 是 | 否 |
屏幕 | 显示图像和数据 | 否 | 否 |
无线串口模块 | 日常调试用,比赛禁用 | 否 | 否 |
飞轮电机 * 2 | 驱动动量轮转动 | 是 | 否 |
动量轮 * 2 | 维持车模平衡、控制车模转向 | 是 | 否 |
飞轮保护罩 * 2 | 防护作用 | 否 | 否 |
摄像头支架 | 摄像头安装 | 否 | 否 |
电池保护支架 | 电池安装 | 否 | 否 |
独轮车翅膀 | 灭灯装置 | 否 | 否 |
2.3 模块详解
2.3.1 独轮组双摄母板
主板是电路连接枢纽,负责分配供电,保障各组件稳定运行。它还能高速传输信号,实现数据交互,配备丰富扩展接口,便于拓展功能,同时具备稳压作用,确保电力输出稳定。
(1)双摄像头接口:支持同时采集两个摄像头的图像,增加了可视角度。
(2)陀螺仪位置优化:陀螺仪居中放置,提升对车模俯仰角和偏航角变化的感知。
(3)SBUS 接口:新增 SBUS 接口,支持直接连接通用 SBUS 接收模块。
(4)无刷驱动接口设计优化:无刷驱动接口放置在主板两侧,方便接线。
(5)电池供电与主板供电之间采用 MOS 隔离控制,增强安全性。
2.3.2 电机驱动
电机应该都比较熟悉,在电机两端施加电压,电机就会旋转,电压越大,转速越快。通过电压越大,转速越快这句话,我们可以想到用PWM 来控制转速,但是直接把电机直接接在核心板 IO 口是不可行的(因为 IO 口电压比较低,而且电流太小),因而就需要电机驱动。
转速控制(PWM 输入):
要控制电机的转速,DRV8701 通过接收一个 PWM 信号 来实现。PWM 信号的占空比)直接影响电机的输入电压,从而控制电机的转速。
PWM 信号的占空比:占空比越大,电机的转速越高;占空比越小,电机转速越低。
频率范围:DRV8701 支持的 PWM 信号频率通常在 20 kHz 至 100 kHz 范围内,以确保电机平稳运行并避免产生过多的噪音。
转向控制(GPIO 引脚)
电机的转向由一个额外的 GPIO 引脚 控制。这个引脚的电平状态(高电平或低电平)决定电机的转向。
GPIO 引脚为高电平:电机按照一个方向(如顺时针)旋转。
GPIO 引脚为低电平:电机按照相反方向(如逆时针)旋转。
电机控制流程
- PWM 信号输入:根据所需的转速,设置一个适当的 PWM 信号,通过 DRV8701 的 PWM 输入引脚(通常标记为 PWM)传递。
- GPIO 电平输入:根据需要的转向,设置 GPIO 引脚为高电平或低电平。
-
DRV8701 控制电机:芯片根据输入的 PWM 信号和 GPIO 电平状态,驱动电机在所需的转速和方向下运行。
驱动接线:
(1)PH-4P 接口:隔离供电以及信号输入。
(2)红色端子:直流电压输入,输入电压 5-28V,一般大小为电机可承受的最大电压。
(3)蓝色端子:直流电压输出,输出电压与输入 PWM 值正相关。
当PWM 波的占空比越大时,蓝色端子输出的电压值与红色端子的电压值越接近,反之则与 0V 越接近。
U 红×脉宽 = U 蓝×周期,两端同时除以周期,得到如下关系式: U 红×占空比 = U 蓝。
例如当红色端子的幅值为 24V,占空比为 50%时,与直流电压 12V 作用到电机上所产生的效果是一模一样的,即速度相同;即 24V×50%=12V。
另外,既然满足这个关系,那PWM 波的频率是不是可以随意了,答案当然不是,频率太低会导致电机运转不畅,振动大,噪音大;频率太高会导致驱动器开关损耗较大,甚至有电机会啸 叫而不转的情况。一般 1k~30k 的 PWM 频率较为普遍,几百Hz 的也有,实际上需要根据电机功率在测试时确定合适的 PWM 频率范围为宜。
可以观察到,输入信号除了供电(3V3、GND)以及PWM 信号,还有一个输入叫“I/O”,这个信号的作用是控制蓝色端子输出正反电压的,这样就可以控制电机进行正反两个方向的旋转。连接并正确使用电机驱动板,其中 2.0mm 间距的白色接口为信号接口,需要连接到主控板,其 VCC 连接主控板电机接口的 VCC,剩余引脚按顺序连接,GND 可以不连接。红色端口为供电端 口,连接主控板上的电池口。蓝色的端口为电机连接口,这里没有正负之分。
驱动板采用GPIO 与 PWM 相结合控制电机转动,其中 GPIO 引脚控制电机转动方向,PWM引脚控制电机转动速度,电机驱动板输出电压(蓝色端子的电压值)。
2.33 摄像头
摄像头作为获取赛道信息的视觉传感器,是所有视觉类赛项最核心的传感器。摄像头我们推荐大家使用神眼摄像头。使用MT9V034 芯片的神眼摄像头,采用了全局快门技术,所有像素点可同时收集光线、同时曝光,能在同一时刻形成完整图像,拍摄运动物体时不会发生形变,适合拍摄快速运动的物体。并且神眼摄像头在不裁剪图像的情况下帧数可达到 260 帧,性能非常强。
2.3.4 姿态传感器
根据竞赛规定,陀螺仪只能选中由ST 公司提供的LSM6DSR 芯片的陀螺仪,这里我们推荐下面的这两款。
LSM6DSR:这个就是根据官方指定的芯片,做的一个陀螺仪模块,采用SPI 读取的方式。
LQ9AGM:这个是在LSM6DSR 的芯片基础上面,串了一个三轴的地磁芯片,构成了一个九轴陀螺仪。
姿态传感器在智能车中的应用:
- 与转向环串级使用,达到更好的控制效果。
- 调整平衡车姿态,使车身平衡且能正常转向和前进。
- 作为角度环闭环控制的输入。
- 积分角度作为元素状态切换条件,例如确定环岛的进环、环内、出环时机。
姿态传感器主要由加速度计与陀螺仪两部分组成,加速度计用于测量物体的加速度,陀螺仪用于测量物体的角速度。通过对加速度和角速度的测量,可以推导出物体的角位移。
陀螺仪的欧拉角是用来描述物体在空间中的姿态(即旋转角度)的一种表示方法,包括滚转角(Roll)、俯仰角(Pitch)和偏航角(Yaw)。
滚转角(Roll)是物体绕X 轴旋转的角度,用来描述物体绕自身左右倾斜的程度。当物体绕 X轴正方向逆时针旋转时,滚转角为正值,绕X 轴负方向顺时针旋转时,滚转角为负值。
俯仰角(Pitch)是物体绕Y 轴旋转的角度,用来描述物体绕自身前后倾斜的程度。当物体绕 Y 轴正方向逆时针旋转时,俯仰角为正值,绕Y 轴负方向顺时针旋转时,俯仰角为负值。
偏航角(Yaw)是物体绕 Z 轴旋转的角度,用来描述物体绕自身旋转的方向。当物体绕 Z 轴正方向逆时针旋转时,偏航角为正值,绕 Z 轴负方向顺时针旋转时,偏航角为负值。
通过测量陀螺仪的角速度,可以积分得到物体的欧拉角。欧拉角的变化可以用来控制物体的姿态,例如在飞行器中,通过调整滚转角、俯仰角和偏航角,可以实现飞行器的稳定控制和导航功能。
需要注意的是,欧拉角表示的是物体在空间中的绝对姿态,而非相对于某个参考物体的姿态。在实际应用中,为了避免欧拉角的奇异性问题,常常使用四元数或旋转矩阵等其他表示方法。
2.3.5 编码器
在智能车中,编码器的主要功能是测量定时器中断周期内的脉冲数,用作速度控制回路中的实际反馈值。通过将此实际值与预设的目标值进行比较,并采用 PID 控制器来调整输出,从而实现精确的速度闭环控制。
编码器发送脉冲信号,定时器引脚接收脉冲信号,通过 AB 信号的差异或者根据方向引脚电平判断是正值还是负值,脉冲信号值会在定时器中累计,直到手动清除,所以每次读取编码器值后需要清除累计值,才可以获得实时速度值。
细心的读者可能会发现,相同转速下编码器值读取大小与读取时间间隔有关,读取时间间隔越大,累计值越大,读取到的值也会越大。
2.3.6 飞轮电机/行进电机
其中飞轮电机需要两个,直接连接到主板上(飞轮电机内置无刷驱动)。行进电机只需要一个,通过单路电机驱动进行控制。
3. 开发工具
3.1 硬件设计软件
熟练掌握至少一种常用的电路设计软件,如 Altium Designer、 立创 EDA 等。了解软件的界面布局、基本操作流程和常用功能模块,如原理图设计、PCB 布局、布线、铺铜、规则检查、生成报表等。
能够使用软件进行简单的电路原理图绘制和 PCB 设计, 包括元件库的创建和管理、原理图的连接和标注、PCB 的布局规划和布线、铺铜等。掌握 PCB 布局和布线的基本技巧和方法,如元件的合理布局、信号线的走向和间距控制、电源线和地线的布线方式、过孔的使用和优化等。
了解 PCB 设计的基本原则和规范,如电气性能要求、信号完整性、电源完整性、电磁兼容性
(EMC)等。能够根据电路的功能和性能要求,进行合理的 PCB 设计,确保 PCB 的电气性能和可靠性满足实际应用的需求。同时,要了解 PCB 制造工艺和生产流程,掌握 PCB 设计文件的输出和制作要求,能够与 PCB 制造商进行有效的沟通和协作,确保 PCB 的制造质量和生产进度。
我司提供的资料中包含 PDF 版原理图、基于 Altium Designer(AD)的原理图封装库和 PCB 封装库。同学们在自己制作 PCB 时可以使用 AD 导入我司提供的封装库文件,参考 PDF 版原理图完成电路板设计。主板原理图中包含了智能车竞赛中常用的外设模块端口,在自己制版时仅需要画出用到的外设接口即可,没有用到的接口不需要引出。
需要注意:自制的电路板需在正面覆铜面展示队伍信息,包括学校名称、队伍名称、制作日期。
3.2 搭建开发环境
3.2.1 安装 ADS 集成开发环境
由于这部分展开来讲有点多,所以这里提供了一个链接,大家可以跳转进去查看教程,新版 ADS 也可以去“龙邱 20 届智能车综合技术交流群”里自行下载,或者向淘宝客服询问链接
ADS 安装教程 https://www.bilibili.com/video/BV1wV411E7PY?from=search
3.2.2 开源库下载
除了在gitee 下载开源库以外,开源库还可以在 QQ 群的群文件里下载,或者询问淘宝客服,客服可以也会给大家提供。
龙邱开源库地址 龙邱科技 (lq-tech) - Gitee.com
3.2.3 点灯程序测试
我们来写一个最简单的点灯程序,来给大家演示一下烧录:
点击这个按钮,自动编译项目并且烧录:
3.2.4 搭建环境时的常见问题
最常见的问题:板子与下载器都连接好了,驱动也没问题但是还是烧录失败?解决方法:先给母板外部供电后,再连接下载器。
导入新工程后记得右击选择“Set Active Project”,来设置活动页面,其他的问题展开就太多了,这里不在列举了。其他问题可以进这个链接查看:
3.3 多功能调试助手
在日常的备赛过程中,上位机或图传等调试助手扮演着至关重要的角色,它能提供实时的数据反馈,帮助研发人员快速定位并解决问题。合理利用工具使得开发者可以更加专注于智能车算法的设计和优化,而不用被琐碎的调试所困扰。从而提高开发效率,使团队能在短时间内完成更复杂的任务。我们准备新推出一款多功能调试助手,包含了串口助手,波形图,无线图传上位机,网络助手。届时软件的获取与介绍请在龙邱 20 届智能车综合技术交流群里下载,同时也会在 gitee 开源。
这个多功能调试助手软件虽然还没有正式和大家见面,但龙邱的工程师们已经日常使用很久了,为了让大家使用顺手,我们内部日常使用反复测试,不断优化升级。
4. 外设基础
在使用外设时,首要步骤是明确这些设备与单片机之间连接的具体引脚。引脚查询方法:
- 查看电路板丝印层的标注。
- 查看电路板设计原理图。
4.1 GPIO 输入输出
GPIO 是通用输入输出(General Purpose Input/Output)端口的简称。通俗来讲就是单片机可控制的引脚,所有的GPIO 引脚都有基本的输入输出功能。
最基本的输出功能是由单片机控制引脚输出高、低电平,实现开关控制,如把 GPIO 引脚接入到 LED 灯,那就可以控制 LED 灯的亮灭,引脚接入到继电器或三极管,那就可以通过继电器或三极管控制外部大功率电路的通断。
最基本的输入功能是检测外部输入电平,如把 GPIO 引脚连接到按键,通过检测电平高低区分按键是否被按下。
此处应用的是引脚的输出功能,常用的引脚的输出模式有以下几种:
-
推挽输出:推挽输出的最大特点是可以真正能真正的输出高电平和低电平,在两种电平下都具有驱动能力。
-
开漏输出:开漏输出最主要的特性就是高电平没有驱动能力,需要借助外部上拉电阻才能真正输出高电平。
补充说明:所谓的驱动能力,就是指输出电流的能力。对于驱动大负载(即负载内阻越小,负载越大)时,例如 IO 输出为 5V,驱动的负载内阻为 10 欧姆,于是根据欧姆定律可以正常情况下负载上的电流为 0.5A(推算出功率为 2.5W)。显然一般的 IO 不可能有这么大的驱动能力,也就是没有办法输出这么大的电流。于是造成的结果就是输出电压会被拉下来,达不到标称的 5V。当然如果只是数字信号的传递,下一级的输入阻抗理论上最好是高阻,也就是只需要传电压,基本没有电流,也就没有功率,于是就不需要很大的驱动能力。
GPIO 输入的输出的演示代码:
4.2 ADC 采集
ADC 是“Analog-to-Digital Converter”的英文简称,能将模拟信号转变为数字信号。通常是将信号采样并保持以后,再进行量化和编码,这两个过程是在转化的同时实现的。具体的转化 步骤在这里就不展开说了,如果是开发者使用,我们应该关注哪些参数:
- 分辨率—表示 AD 对输入信号的分辨能力,及数值部分的精度。一般模拟采样中使用 8 位还是 12 位的 ADC 说的就是分辨率。例如:输入模拟电压的变化范围为 0~3.3 V,输出 12 位二进制数可以分辨的最小模拟电压为 3.3V / 4095 ≈ 0.806mV;
- 工作电压和基准电压(内部或者外部基准):工作电压是 AD 芯片工作的额定电压,关键的是基准电压,又叫参考电压,可以来之芯片内部又或者外部接入,其决定了 AD 的分辨率,所有基准电压一定要稳。
ADC 读取的演示代码:
4.3 定时器中断
定时器中断是一种基于定时器的中断,它允许在特定时间间隔内触发一个事件或一段代码。在智能汽车竞赛中,定时器中断常用于周期性任务,例如定时、传感器数据采集、转向环和速度环控制、编码器计距离或者陀螺仪角度积分。
例如设置中断周期为 5ms,那么就会每 5ms 执行一次中断里的程序。
定时器初始化演示代码:
初始化完成之后,就可以去 irq.c 文件里面找对应的对调函数加入自己的代码了。
4.4 PWM
PWM 是一种用数字信号模拟模拟信号的技术,它通过在一个固定的时间周期内改变信号的脉冲宽度来模拟电压或电流的变化。PWM 信号通常用于控制各种设备,如电机、LED 灯、伺服机构等,以调整它们的输出或工作状态。PWM 信号具有两个主要参数:
1.周期/频率(Period):PWM 信号的一个完整周期持续的时间,通常以微秒或毫秒为单位。电机通常选择 10kHz ~ 20kHz 的 PWM 频率,频率过低会导致电机噪音和发热,频率过高可能超出驱动芯片的响应能力;舵机通常要求 50Hz ~ 333Hz,其角度由高电平脉冲宽度(0.5ms ~ 2.5ms)决定。
2.占空比(Duty Cycle):高电平状态所占整个周期的百分比。它决定了 PWM 信号的平均电压或电流值。
PWM 信号的占空比决定了目标设备的输出特性,例如电机的转速或LED 的亮度。更大的占空比通常表示更高的输出值。在智能车竞赛中,PWM 是实现电机速度控制和舵机转向调节的核心技术。通过调整PWM 信号的占空比,可以精确控制电机的转速和舵机的转向角度。
PWM 输出的演示代码:
4.5 串口通信
单片机中的串口是一种用于数据传输的通信接口,它可以将数据以串行的方式进行传输。串口通常由两个引脚组成,即发送引脚(TX)和接收引脚(RX)。当单片机需要发送数据时,它将数据转换为串行格式,并通过TX 引脚发送出去。接收方通过 RX 引脚接收数据,并将其转换为原始格式,从这里可以知道串口通信在连接时需要将发送引脚(TX)连接接收引脚(RX)。
串口通信可以通过硬件或软件实现,其中硬件串口通常具有更高的速度和可靠性,而软件串口则具有更高的灵活性和可定制性。在单片机中,串口通常用于与其他设备进行通信,例如遥控器、传感器、显示屏、上位机等。
串口协议是指在串行通信过程中,双方之间所遵守的通信规则和约定。UART 串口协议包含以下内容:
- 数据帧格式:UART 串口协议使用包含起始位、数据位(5 至 8 位)、可选的奇偶校验位及 1 或 2 个停止位的数据帧来传输信息。具体格式需双方预先协商确定。
- 波特率:UART 串口协议使用波特率来指定数据传输的速率。波特率表示每秒钟传输的位数。常见的波特率包括 9600、19200、38400、57600 和 115200 等。通信双方必须使用相同的波特率才能正确地接收和发送数据。
- 帧同步:UART 串口协议使用起始位和停止位来标识每个数据帧的开始和结束。起始位是一个低电平信号,用于通知接收端数据帧的开始。停止位是一个高电平信号,用于通知接收端数据帧的结束。
- 错误检测:UART 串口协议利用奇偶校验位检查数据位数量是否符合预期,并通过校验和验证整个数据帧的完整性,以此来发现传输过程中的错误。
- 数据流控制:UART 串口协议支持硬件数据流控制和软件数据流控制。硬件数据流控制使用 CTS 和RTS 信号来控制数据传输。软件数据流控制使用XON(ASCII 码为 0x11)和 XOFF(ASCII 码为 0x13)字符来控制数据传输。
串口通信作为一种基础而强大的技术手段,广泛应用于智能车等自动化领域中,可以实现数据的传输,从而对系统进行实时监控和调试。
串口的初始化和发送演示代码:
5. 通用控制算法
PID 算法是工业应用中最广泛算法之一,是一种常用的反馈控制算法,它是根据系统当前状态与期望状态之间的差异来调整控制器输出的方式。在闭环系统的控制中,可自动对控制系统进行 准确且迅速的校正。PID 算法已经有 100 多年历史,在四轴飞行器,平衡小车、汽车定速巡航、温度控制器等场景均有应用。PID 是 Proportional-Integral-Derivative 的缩写,分别代表比例、积分和微分三个部分。
5.1 位置式 PID
位置式PID 控制器是最经典的 PID 实现方式,它直接计算误差及其积分和微分,并据此输出控制量。其控制公式为
e(t) 为当前时刻的误差(目标值与实际值之差)。 Kp,Ki,Kd 分别为比例、积分和微分增益。
u(t)为控制量输出。
位置式PID 的控制原理:
位置式PID 计算输出时,考虑的是当前的误差、误差的累积和误差变化的速度。其特点是输出的控制量与误差的绝对值、历史累计值以及变化速率相关,适用于系统的稳定控制。
位置PID 的优点:
-
精确控制:能够在给定目标下快速收敛并保持系统稳定。
-
容错能力强:对于系统的扰动具有较强的抵抗能力。位置式PID 的缺点:
-
需要长期累积误差:由于积分项的存在,位置式PID 控制可能会有超调现象。
-
对噪声敏感:微分项对于高频噪声较为敏感,可能导致系统不稳定。
5.2 增量式 PID
增量式PID 是另一种常见的PID 控制方式,其核心思想是通过计算误差的变化量(增量)来调整控制量,而不是直接计算误差本身。其公式为:
e(t) 为当前误差与上一个时刻误差之差(即误差增量)。 u(t)为当前时刻控制量的增量。
增量式PID 的控制原理:
增量式PID 的控制量是基于误差的增量来计算的,也就是说,每次控制输出都与上一时刻的控制输出相对比,更新量为误差的变化量。其核心思想是调整误差变化趋势,而非直接通过误差的绝对值来调整控制量。
增量式PID 的优点:
-
适用于离散系统:增量式PID 在数字控制系统中使用更加广泛,因为它避免了连续的积分运算和微分运算。
-
没有累积误差:由于采用增量控制方式,系统不容易��现位置式PID 中的超调现象。
增量式PID 的缺点:
-
初始误差响应慢:因为增量式PID 需要通过多次调整才能有效改变系统状态。
-
可能需要较多的调节时间才能稳定。
5.3 PID 调参方式
PID 控制算法将比例、积分和微分三个部分的输出进行线性组合,得到最终的控制器输出。通过调整三个部分的权重和参数,可以实现对系统的精确控制。
根据实际系统的特性和需求,调整PID 控制算法中的比例、积分和微分三个部分的权重和参数,以使系统能够以最佳的性能响应和控制的过程,我们一般称之为“调参”。
在调参过程中:
Kp 过大会对误差的变化做出过大的反应,从而导致系统动作幅度过大,容易引起振荡甚至不稳定。过小意味着对误差的调整力度不足,系统达到目标值的速度变慢,响应滞后。
Kp 即使设置得较好,仅靠 Kp 控制仍会存在部分问题:
Kp 控制对持续存在的小误差没有累计作用,无法完全消除系统的稳态误差。这是因为比例控制的输出直接与当前误差成正比,而当误差较小时,调整力度可能不足。需要 Ki(积分)控制来消除这种误差。
Kp 控制对快速变化的误差反应不足,而 Kd(微分)控制可以预测误差变化趋势,帮助提高系统动态性能,避免过冲,减少超调。
总结:
-
位置式PID 是经典的PID 控制方式,适用于精确控制任务。它通过计算误差的绝对值、历史积累值和误差变化率来调节控制量。
-
增量式PID 适用于离散控制系统,其计算方法通过误差的增量来调整控制输��,更适合数字系统,但响应速度较慢。
关于独轮的平衡调参,可以去看去年独轮直播回放中调试平衡的部分,那个非常详细。
【十九届独轮直播回放】 【精准空降到 1:01:33】 https://www.bilibili.com/video/BV1tF4m1V7J3/?share_source=copy_web&vd_source=bf83ee25 219ac6bd7f0473e13c9c5820&t=3693
6. 独轮信标赛项分享
6.1 控制逻辑框图
首先,我们从先通过逻辑框图来了解整体控制算法以及我们需要那些数据。
通过陀螺仪姿态数据可以得到X 轴以及 Y 轴的角度和角速度,我们可以通过将角度信息与期望的平衡角度进行比较,通过串级PID 算法,进而计算出 X 轴、Y 轴平衡环所需的输出(电机速度值),以维持系统的平衡。
因为不同电机之间存在差异,可能相同的占空比值会有不同的转速,为了解决这一问题,我们通过编码器读取当前电机转速,结合平衡环输出的速度值来进行速度闭环控制。
在独轮车可以直立之后加入转向环即可控制独轮车进行转弯。
6.2 独轮平衡控制
独轮车本质为倒立摆系统,其平衡依赖动量守恒原理。当车体向某一方向倾斜时,控制系统需通过动量轮或驱动电机产生反向力矩抵消倾斜力矩。X 轴(侧向)平衡由动量轮控制,Y 轴(前后向)由驱动电机调节,两轴形成正交平衡体系。
PID 有三个可调节参数,分别是比例,积分,微分。实际中只使用一个参数是没有意义的,至少使用两个参数,并且比例相是必须要有的,大多数情况下三个参数并不是都使用,一般会选择 其中两个来组合使用。比如比例与积分相结合用于追求系统稳定性,比例和微分结合用于追求系统的响应速度。
下面结合独轮平衡车,学习 PID 调参。
独轮车的平衡主要包含两个方向,即 X 轴和 Y 轴方向的平衡,我们可以将其称为左右平衡和前后平衡。左右平衡主要通过两个飞轮来控制,根据车身的倾斜角度,利用飞轮以不同方向和速度旋转,使车身保持平衡。前后平衡则通过行进轮控制,与平衡两轮的控制原理相同。在进行平衡调整时,我们需要先调整左右平衡,然后再进行前后平衡的调整。
左右平衡与前后平衡分别占一组串级 PID,对于平衡车而言,需要的是系统响应速度与稳定性并存,所以对于平衡而言,普通的pid 已经无法很好的到达效果,我们选择了串级 PID 。
X 轴平衡环示例代码:
/************************************************************************** X 轴平衡串级PID 控制,
输入参数,中值 目标速度输入参数 串级 pid 的输出
**************************************************************************/ float R_Cascade_Pid_Ctrl(float zhongzhi,int V_AB)
{
static int16_t Pid_t;
Pid_t = Pid_t+2;//时间计时 if(Pid_t % 16 == 0){//最外速度环
Pid_t = 0;
Encoder_A = -ENC_GetCounter(ENC4_InPut_P20_3);//A 电机编码器
Encoder_B = ENC_GetCounter(ENC1_InPut_P33_7); //B 电机编码器 PidLocCtrl(&R_vel_pid,(float)(V_AB + Encoder_A + Encoder_B));//角度环计算
}
if(Pid_t % 4 == 0){//中间角度环
PidLocCtrl(&R_angle_pid,R_vel_pid.out -(Pitch - zhongzhi));//角度环计算
}
//最内角速度环
PidLocCtrl(&R_acc_pid,-gyro[0] + R_angle_pid.out); //角速度环计算 return R_acc_pid.out;//最终输出
}
最内环是角速度环,其输入参数是角度环的输出加上陀螺仪采集的角速度。该环的目的是为了在车模左右晃动时提供阻尼感,以防止车模产生过大的晃动。
中间环是角度环,它是平衡控制的主要输出。其输入参数是陀螺仪采集的角度加上最外环速度环的输出。车模的平衡主要通过该环进行控制。
最外环是速度环,它是一个正反馈系统。当检测到动量轮正转时,它会增加输出,使动量轮转动更快,从而减少系统的响应时间。
这个串级 PID 的输出,最终分别一正,一负得形式,传递给飞轮电机。
Y 轴平衡环示例代码:
/ ************************************************************************* Y 轴平衡PID 控制,角度环
**************************************************************************/
float R_Cascade_Pid_Ctrl(float zhongzhi,int V_AB)
{
static int16_t Pid_t;
Pid_t = Pid_t+2;//时间计时 if(Pid_t % 16 == 0){//最外速度环
Pid_t = 0;
Encoder_A = -ENC_GetCounter(ENC4_InPut_P20_3);//A 电机编码器 Encoder_B = ENC_GetCounter(ENC1_InPut_P33_7); //B 电机编码器 PidLocCtrl(&R_vel_pid,(float)(V_AB + Encoder_A + Encoder_B));//角度环计算
}
if(Pid_t % 4 == 0){//中间角度环
PidLocCtrl(&R_angle_pid,R_vel_pid.out -(Pitch - zhongzhi));//角度环计算
}
//最内角速度环
PidLocCtrl(&R_acc_pid,-gyro[0] + R_angle_pid.out); //角速度环计算 return R_acc_pid.out;//最终输出
}
Y 轴的算法与X 轴相同。
每个环得作用和X 轴都一样,可以参考上面 X 轴每个环得作用。
6.3 独轮转向控制
独轮车要怎么进行转向。观察下面图片可以发现控制两个动量轮的转速差,就可以实现转弯动作。
Z 轴转向的示例代码:
/************************************************************************** Z 轴转向 PID 控制,
输入参数。偏差
**************************************************************************/
float Y_Cascade_Pid_Ctrl(float Error)
{
static int16_t Pid_t; Pid_t = Pid_t+2; if(Pid_t % 12 == 0){
Pid_t = 0; PidLocCtrl(&Y_err_pid,Error); //偏差环
}
if(Pid_t % 4 == 0){
PidLocCtrl(&Y_acc_pid, Y_err_pid.out- gyro[2]); //角速度环
}
return Y_acc_pid.out;
}
传向 PID 得输入参数是转向偏差,他也是一个串级 PID 实现得,和上面平衡不同的是,他是有个环构成。
最内环:角速度环,这个串是把 Z 轴的角速度串了进去,利用角速度,让车模转向的时候,有一个很大的阻尼感。
最外环:偏差环,这个环的作用是,根据偏差的大小,去让两个电机产生差速,从而实现转
向。
最终的输出结果,和X 轴的平衡环输出并在一起,传递给电机。
6.4 循迹算法
本循迹思路主要是通过图像处理的方法,在图像中识别出信标灯的方位。其核心步骤包括对 图像进行二值化处理,将图像转换为只有黑白两种颜色的简单形式,然后遍历处理后的二值图像,找出连续的白色像素点,这些区域就可能是信标灯,最后通过求这些白点的平均横坐标,与理论中线进行对比,即可得到位置偏差,从而确定车模行进的方向。
1. 图像二值化
图像二值化是将图像上的像素点的灰度值设置为 0 或 255,也就是将整个图像呈现出明显的黑白效果。这样做的目的是简化图像信息,便于后续的处理和分析。
2. 遍历全图找连续白点
在二值化后的图像中,信标灯表现为连续的白色像素点区域。通过遍历图像的每一个像素点,依次找到满足条件的所有白色像素点,每找到一个白点便判断其周围的像素点是否也是白色,以 此来确定该坐标是否可信。
3. 记录坐标和数量
对于每个可信的白点,可以记录其坐标。例如,可以通过一个数组来存储每个可信白点的横坐标,用一个变量来记录可信白点的总数量。
4. 求取偏差
遍历完整副图像后,对于数组中存储的可信白点横坐标,进行遍历求和,然后除以数量求得 到平均横坐标。最后用平均横坐标的值与图像理论中线的横坐标作差即可得到转向环的位置偏差。这样就可以解决多灯的问题,因为当灯的距离比较远的时候,他所占用的白色像素点的数量是很少的,平均之后,偏差就会指向近的信标灯。
此外,在遍历全图找连续白点的过程中,对于白点的纵坐标也可以记录,求其平均值可用于远近距离判断。
以上是遍历全图存在可信白点的情况,假设一个可信白点都不存在,那么我们可以给一个固定的转向偏差,使其维持一段时间,直到视野中再次出现可信白点。便可以继续进行循迹。
示例代码:
void Seek_Beacon ()
{
uint8_t tm=0; uint8_t nr=0; //行 uint8_t nc=0; //列
uint8_t dotcnt=0;
for (nr = 1; nr < LCDH - 1; nr++) // 从上往下
for (nc = 1; nc < LCDW - 1; nc++) // 从左往右
{
// 188*120 分辨率下,有两个连续白点,则认为是可能的信标灯(可信)
if ((Pixle[nr - 1][nc] + Pixle[nr + 1][nc] + Pixle[nr][nc + 1] + Pixle[nr][nc - 1] > 1)) // 左右连续白点 或者 上下连续白点 出现至少两个
{
dothang[dotcnt]=nr; // 记录所有的白点水平方向方位,也就是左右偏差 dotlie[dotcnt++]=nc; // 记录所有的白点水垂直向方位,也就是远近
}
}
}
if(dotcnt) // 发现有可信白点
{
sumlie=0,sumhang=0; // 清除上次的结果 for(tm=0;tm<dotcnt;tm++)
{
sumlie+=dotlie[tm]; // 所有白点左右偏差值求和 sumhang+=dothang[tm]; // 所有白点上下偏差值求和,暂时没用到
}
sumlie =sumlie/dotcnt; // 灯的左右中心点 sumhang=sumhang/dotcnt; // 灯的远近中心点,暂时没用到 aroundTime = 0;
}
else // 没有发现可信白点,给固定转向偏差
{
if(aroundFlag == 0)
{
if(++aroundTime > 30)
{
Car_Price.Ture_Error = 60;
amendFlag = 0;
}
else
{
Car_Price.Ture_Error = 0;
}
}
else
{
if(++aroundTime > 30)
{
Car_Price.Ture_Error = -60;
amendFlag = 0;
}
else
{
Car_Price.Ture_Error = 0;
}
}
}
if(dotcnt) // 有可信白点
{
if(Car_Price.speed == 0) // 如果速度是 0,那么就不再做出反应
{
Car_Price.Ture_Error = 0;
Car_Price.Ture_Error_V = 0;
}
else // 如果有速度
{
if(sumhang > 100 && sumhang < 120 && amendFlag == 0) // 太近了
{
amendFlag = 1;
if(aroundFlag == 1) aroundFlag = 0; else aroundFlag = 1;
}
if(sumhang < 40) // 太远了
{
Car_Price.Ture_Error = LCDW/2 - sumlie; // 与中线的差值
}
else // 远近适中
{
if(aroundFlag == 0)
{
Car_Price.Ture_Error = (LCDW-30)/2 - sumlie; // 中线偏左
}
else
{
Car_Price.Ture_Error = (LCDW+30)/2 - sumlie; // 中线偏右
}
}
}
}
return;
}
}
7. 备赛建议与资源推荐
- 学习路径:C 语言 → 单片机基础 → 传感器实验 → 算法移植。
- 团队分工:硬件(电路设计)、软件(算法调试)、机械(车模改装)。
- 学习资源:CSDN、往届技术报告、Gitee、GitHub、B 站学习视频。
- 基础解疑:官方Q 群客服、官方淘宝客服
结语
到这里,这篇手册分享就结束了。智能车大赛的魅力不仅在于追求胜利,更在于探索过程中的每一次自我突破。大家在参考我们方案的同时,别忘了充分发挥自己的创造力,去挖掘更多可能。
祝愿每一位同学都能在比赛中有所收获,享受智能车带来的乐趣。期待在赛场上看到你们的精彩表现,祝大家都能取得理想的成绩,加油!