Q&A

259 阅读20分钟

概述

自动循迹功能是智能车的核心功能之一,我们采用了基于视觉的方案来实现。具体来说,OpenMV Cam模块通过图像处理算法识别路面上的路径标记,然后将偏差数据通过UART通信发送stm32根据偏差数据和预设的PID参数计算出电机的调整量,从而控制车辆沿预定轨迹行驶。这种方案的优点是适应性强,能够在多种环境下工作,且可以通过算法优化提高循迹精度。主要用到了openmv里面的两种算法 颜色识别(ColAor Tracking) : 颜色识别是OpenMV Cam中最基础的算法之一,它可以检测图像中特定颜色的区域。用户可以自定义颜色阈值,通过HSV(色相、饱和度、亮度)颜色空间来实现。

边缘检测(Edge Detection)

边缘检测算法用于识别图像中的边缘,是图像分割和特征提取的常用方法。OpenMV Cam 提供了多种边缘检测算子,如Canny边缘检测。

  1. 噪声降低(Noise Reduction) : Canny算法的第一步是使用高斯滤波器对输入图像进行平滑处理,以减少图像噪声。这是因为边缘检测对噪声非常敏感,噪声会导致边缘检测的准确性下降。高斯滤波是一种低通滤波器,可以有效地去除高频噪声成分。
  2. 梯度计算(Gradient Calculation) : 接下来,算法计算图像的梯度幅度和方向。这通常通过使用Sobel算子或Scharr算子这样的掩模对图像进行卷积来完成。这些算子能够计算图像亮度变化的梯度,从而突出边缘的位置。
  3. 非极大值抑制(Non-Maxima Suppression) : 在这一步,算法沿着梯度方向对梯度值进行非极大值抑制。这意味着,如果一个像素点的梯度值不是其周围局部区域内的最大值,那么这个像素的梯度值将被抑制(设置为0)。这有助于细化边缘,使其更细、更连续。
  4. 滞后阈值处理(Double Thresholding) : Canny算法使用两个阈值,一个高阈值和一个低阈值,来进行边缘连接。首先,高于高阈值的像素被确定为强边缘。然后,这些强边缘点用于确定弱边缘点是否应该被认为是边缘的一部分。如果一个弱边缘点(高于低阈值但低于高阈值)与强边缘点相连,则被认为是边缘的一部分。
  5. 边缘跟踪和封闭(Edge Tracking and Closure) : 最后一步是跟踪边缘并封闭边缘断点。这通过将弱边缘点连接到强边缘上来完成。如果弱边缘点与强边缘点相邻,并且方向一致,它们可以被连接起来形成连续的边缘。这个过程有助于形成完整的边缘轮廓,并且可以进一步处理以封闭任何开放的边缘。

颜色识别

  1. 图像捕获(Image Capture) : 首先,OpenMV Cam从摄像头传感器捕获图像数据。这些数据通常是RGB格式的,因为这是大多数摄像头传感器的原生输出格式。
  2. 颜色空间转换(Color Space Conversion) : 捕获的RGB图像需要转换到HSV颜色空间。HSV颜色空间由三个属性组成:色相(Hue,H),饱和度(Saturation,S),和亮度(Value,V)。色相表示颜色的类型,饱和度表示颜色的强度,亮度表示颜色的明暗程度。OpenMV Cam提供了内置函数来进行这种颜色空间的转换。
  3. 定义颜色阈值(Color Thresholding) : 用户需要定义颜色的阈值来识别所需的颜色。这通常涉及设置HSV值的范围。例如,红色可能在HSV空间中的特定范围内。用户可以手动调整这些值,或者使用OpenMV Cam的自动颜色阈值确定功能。
  4. 颜色区域识别(Color Area Detection) : 使用定义的HSV阈值,算法在图像中搜索匹配的颜色区域。这通常涉及到逐像素地比较HSV值是否在设定的范围内。如果像素值在范围内,它被认为是所需颜色的一部分。
  5. 区域分析(Area Analysis) : 识别出的颜色区域可以进一步分析,例如计算面积、找到颜色区域的边界、确定中心点等。这些信息对于后续的处理,如物体定位或颜色统计非常有用。
  6. 颜色跟踪(Color Tracking) : 如果需要,OpenMV Cam可以持续跟踪颜色区域。这涉及到在连续的帧中检测颜色区域的变化,并对移动的颜色区域进行跟踪。
  7. 结果输出(Result Output) : 最后,识别和跟踪的结果可以输出用于各种目的,如控制机器人、自动化任务或简单地显示在屏幕上。
  8. 优化和调整(Optimization and Adjustment) : 在实际应用中,可能需要根据特定的环境条件和光照变化对颜色识别算法进行优化和调整。这可能包括调整阈值、使用颜色聚类算法或应用图像预处理技术来提高颜色识别的准确性和鲁棒性。

路径跟踪

  1. 环境感知: 算法的第一步是感知环境,这通常通过摄像头、激光雷达、红外传感器等传感器来实现。这些传感器收集有关路径和周围环境的信息。
  2. 图像处理: 如果是视觉系统,首先需要处理捕获的图像。这可能包括去噪、灰度化、二值化等预处理步骤,以简化后续处理。
  3. 路径识别: 使用图像处理技术来识别路径。这可以是检测道路的边缘、识别道路标记、或者识别特定的路径标记,如线条或符号。
  4. 特征提取: 从图像中提取路径特征,如道路的中心线或边界。这些特征可以是颜色、纹理、形状或其他可区分的属性。
  5. 偏差计算: 计算车辆当前位置与路径中心线的偏差。这通常涉及到确定车辆相对于路径的位置,并计算其与理想路径的偏移。
  6. 控制算法: 根据偏差计算结果,使用控制算法,如PID控制器,来调整车辆的行驶方向和速度。控制算法的目标是减少偏差,使车辆回到路径中心。
  7. 执行器控制: 将控制算法的输出转换为对车辆执行器(如电机)的控制信号,以调整车辆的行驶状态。
  8. 反馈循环: 系统通过一个闭环反馈机制不断监控车辆的行驶状态和路径偏差。实时反馈允许系统动态调整控制信号,以应对环境变化和路径扰动。
  9. 优化和适应: 根据车辆的响应和环境条件,算法可能需要进行优化和适应。这可能包括调整控制参数、改进图像处理算法或增强系统的鲁棒性。
  10. 软件和硬件集成: 将路径跟踪算法集成到车辆的软件和硬件系统中,确保算法可以实时运行并与其他系统组件(如导航系统、传感器融合等)协同工作。

# 位置式PID与增量式PID/Proportional(比例)、Integral(积分)、Differential(微分)

  1. 直观性和易实现:位置式PID控制器更直观,因为它直接计算所需的控制量。在电机控制中,这意味着可以直接设置PWM占空比,从而更容易实现和理解。
  2. 控制精度:位置式PID可以提供精确的控制输出,这对于电机的精确速度和位置控制非常重要。它允许系统直接响应偏差,而不需要考虑之前的状态。
  3. 积分作用:位置式PID控制器的积分项可以帮助消除稳态误差,这对于电机控制中的长期稳定性和精度非常关键。
  4. 简化调试:使用位置式PID控制器可以简化调试过程。工程师可以直接看到控制器输出与偏差的关系,而不需要考虑累加的控制增量。
  5. 直接控制:电机驱动器通常接受的是直接的控制信号(如PWM占空比),位置式PID控制器可以直接输出这种信号,而增量式则需要额外的累加器来计算总的控制量。
  6. 软件和硬件支持:许多电机控制库和硬件平台已经内置了对位置式PID的支持,这使得实现和集成更加方便。
  7. 适用性:位置式PID控制器适用于大多数电机控制应用,特别是当控制需求是直接与偏差相关时。
  8. 避免积分饱和:虽然位置式PID的积分项可能会导致积分饱和,但在电机控制中,可以通过适当的PID调整和饱和处理逻辑来管理这个问题。
  9. 控制策略兼容性:位置式PID控制器更容易与其他控制策略(如前馈控制、自适应控制等)集成,因为它们提供了直接的控制量输出。
  10. 实时性能:在需要快速响应的应用中,位置式PID可以提供更快的实时性能,因为它直接计算所需的控制动作。

增量式PID控制器是一种在控制系统中常用的算法,它通过调整控制量来维持系统的输出与期望值一致。PID代表比例(Proportional)、积分(Integral)、微分(Derivative)三个部分。增量式PID则是在传统PID的基础上,通过增量的方式来更新控制量,这样做的好处是可以避免累积误差,并且对于控制量的限制更加灵活。

在自动控制原理中,PID控制器是一种常见的反馈控制器,它通过比例(Proportional)、积分(Integral)和微分(Derivative)三个环节来调整控制器的输出,以达到快速响应、减少超调和消除稳态误差的目的。

PID控制器的参数整定方法:

  1. 临界比例度法:通过逐渐增大比例增益,直到系统出现等幅振荡,此时的比例增益即为临界增益(Kc),振荡周期为临界周期(Tc)。根据Kc和Tc,可以计算PID参数。
  2. 衰减曲线法:通过分析系统的响应曲线,找到系统响应的衰减比,以此来确定PID参数。
  3. 继电器反馈整定法:通过给系统一个方波输入,产生振荡波形,然后从波形中提取临界周期和振荡波形幅值,进而计算PID参数。
  4. Ziegler-Nichols整定法:这是一种经验方法,通过将系统推向振荡边缘,记录下此时的增益和振荡周期,然后应用Ziegler-Nichols的公式来计算PID参数。
  5. Cohen-Coon法:类似于Ziegler-Nichols法,但是它考虑的是临界时间常数和比例带宽,而不是临界增益和周期。
  6. 频率响应法:通过分析系统的频率响应特性来确定PID参数。

参数计算公式:

对于临界比例度法继电器反馈整定法,PID参数可以根据以下公式计算:

  • 比例增益(Kp) :Kp=0.6×Kc
  • 积分时间(Ti) :Ti=Tc/2
  • 微分时间(Td) :Td=Tc/8

其中,KcKc​是临界增益,TcTc​是振荡周期。

实际操作步骤:

  1. 确定控制目标:明确控制系统需要达到的性能指标,如稳态误差、响应时间、超调量等。
  2. 初步设定:先设定一个较小的比例增益,积分和微分增益设置为0。
  3. 逐步调整:逐渐增大比例增益,观察系统的响应,直到系统出现等幅振荡。
  4. 记录参数:记录下出现等幅振荡时的比例增益和振荡周期。
  5. 计算PID参数:使用上述公式计算出PID参数。
  6. 微调参数:根据实际控制效果,微调PID参数,以达到最佳控制性能。
  7. 验证和测试:在实际系统中应用PID参数,验证控制效果,并进行必要的调整。

让我们用一个生活中的实例来说明增量式PID控制器的工作原理:

想象你正在驾驶一辆汽车,你的目标是保持车速恒定在60公里/小时。你可以将汽车看作是一个系统,而车速就是系统的输出。现在,我们用增量式PID控制器来帮助我们实现这个目标。

  1. 比例(P): 你通过观察车速表,发现当前车速是55公里/小时。根据比例控制,你会根据误差(60 - 55 = 5公里/小时)来增加油门。如果比例增益设置得比较高,你可能会增加较大的油门,以快速接近目标速度。

  2. 积分(I): 如果你发现即使调整了油门,车速还是不能稳定在60公里/小时,那么积分控制就会起作用。它会考虑误差随时间的累积,如果车速持续低于目标速度,积分项会逐渐增加,这会导致你进一步增加油门。

  3. 微分(D): 当车速开始接近目标速度时,微分控制会帮助你平滑地调整油门,以避免车速突然超过或低于目标速度。如果车速变化得太快,微分项会减少油门,以减缓车速的上升或下降。

  4. 增量式调整: 与传统PID不同,增量式PID不是直接调整油门的大小,而是计算油门的增量。这意味着,每次调整油门时,你不是直接设定一个新的油门值,而是在当前油门的基础上增加或减少一个小量。这样做的好处是,你可以更精细地控制油门的变化,避免因为油门调整过大而导致车速波动。

通过这个例子,你可以看到增量式PID控制器如何帮助我们精确地控制车速,使其保持在一个稳定的目标值。同样,这种控制策略也可以应用于其他需要精确控制的场合,比如温度控制、压力控制等。 位置式PID和增量式PID都是PID控制器的两种实现方式,它们在控制算法的实现上有所不同,但目标都是使系统的输出接近或等于期望值。下面是它们之间的主要区别:

  1. 输出更新方式:

    • 位置式PID:直接计算控制量(如电机的转速或者阀门的开度),每次更新都是基于当前误差来计算一个新的控制量值。
    • 增量式PID:计算的是控制量的增量(即控制量的变化量),然后将这个增量加到上一次的控制量上,得到新的控制量。
  2. 累积误差的处理:

    • 位置式PID可能会受到积分项长期累积的影响,导致控制量过大或过小,特别是在控制量有限制的情况下。
    • 增量式PID通过限制每次的增量,可以避免因积分项累积而导致的过冲或稳态误差。
  3. 控制量限制:

    • 位置式PID在更新控制量时,可能不容易考虑到控制量的限制(如阀门只能开到最大或最小位置)。
    • 增量式PID由于每次只更新控制量的增量,更容易实现对控制量上下限的控制,避免超出物理限制。
  4. 实现复杂性:

    • 位置式PID实现起来相对简单,因为它直接输出控制量。
    • 增量式PID需要额外的逻辑来确保控制量的增量不会导致超出期望的范围。
  5. 适用场景:

    • 位置式PID适用于控制量没有严格限制或者对响应速度要求不高的场景。
    • 增量式PID适用于需要精细控制增量,或者控制量有明确上下限的场景。

举个例子来说明这两种PID的不同:

假设你正在调节一个水龙头的出水量,目标是让水流量达到一个恒定的值。

  • 使用位置式PID,你可能会根据当前的流量和目标流量之间的误差,直接调整水龙头到一个新的开度。
  • 使用增量式PID,你会计算出需要调整的开度增量,然后逐步调整水龙头,直到达到目标流量。

在实际应用中,选择哪种PID形式取决于具体的应用场景和系统特性。有时候,两种形式的PID可以结合使用,以满足特定的控制需求。

看门狗

软件看门狗(Software Watchdog)是一种安全机制,用于监控和确保系统在出现故障或数据传输中断时能够安全地进入一种已知的、安全的状态,通常是停车或停止执行当前任务。以下是实现软件看门狗功能的基本步骤:

  1. 初始化看门狗定时器: 在系统启动时,初始化看门狗定时器,并设置一个阈值,这个阈值定义了系统在没有重置看门狗之前允许的最大延迟时间。
  2. 定时器重置: 在正常的操作周期内,系统需要定期重置看门狗定时器,以防止它超时。这通常在程序的主循环或关键操作点完成。
  3. 监控数据传输: 如果系统依赖于数据传输来执行任务(例如,从传感器读取数据或接收外部控制信号),则需要监控这些数据流。
  4. 超时检测: 如果看门狗定时器达到设定的阈值而没有被重置,这表示发生了数据传输中断或其他故障,看门狗将触发一个超时事件。
  5. 安全响应: 一旦检测到超时,系统需要执行预定义的安全响应。在电机控制系统中,这通常意味着立即停止所有电机,防止进一步的动作。
  6. 状态指示: 看门狗超时后,除了执行安全响应外,系统还可以通过指示灯、显示屏或发送报警信号来通知用户发生了故障。
  7. 手动或自动恢复: 在安全停车后,系统可以等待用户干预来手动重置,或者在检测到系统恢复正常后自动重置看门狗并重新启动。
  8. 日志记录: 在某些系统中,看门狗超时事件可能需要被记录在日志中,以便于事后分析故障原因。
  9. 编程实现: 在编程时,可以使用特定的变量来模拟看门狗定时器,例如在Arduino中使用全局变量,并在主循环中递增该变量。如果变量在一定时间内没有增加,就意味着没有重置看门狗,可以触发安全停车。

软件介绍

首先是自动循迹,智能车能够根据路面图像识别路径并自动调整行驶方向;其次是颜色识别,车辆能够识别特定颜色的对象并作出相应动作,如识别并戳破气球;再次是实时数据监控,通过OLED显示屏实时显示车辆状态和环境参数;最后是自动化控制,系统可以根据预设条件自动调整电机运行状态,实现无人驾驶。此外,系统还包括了软件看门狗功能,确保在数据传输中断时能够安全停车,防止意外发生。

硬件介绍

微控制器选用了STM32,因其丰富的库支持和社区资源,功能强大,然后根据赛题的要求我们要自己设计一块最小系统板,引出芯片引脚,接上各个模块来进行开发。图像处理和颜色识别由OpenMV Cam模块承担,它具有高效的图像处理能力和多种视觉算法,通过串口通信。显示系统采用OLED显示屏,通过IIC通信提供清晰的数据显示。电机控制方面,我们采用了专用的电机驱动模块,因为电机的电压要求较高,所以还有一块专门的电源电压转换为电机所需的12V工作电压,确保电机运行平稳且响应迅速。此外,系统还包括了高精度的传感器阵列,如用于检测环境参数的DHT22温湿度传感器,以及用于路径识别的光电传感器。还引出了蜂鸣器接GPIO用作调试,有的硬件组件通过精确的布局和布线集成在板子上,有些通过端子或者杜邦线链接,确保了系统的稳定性和可靠性。

SOCKET套接字编程

Socket编程是一种网络编程方法,它允许程序之间通过套接字(socket)进行通信。套接字是网络通信的端点,可以是客户端或服务器端。以下是进行Socket编程的基本步骤:

  1. 包含头文件:首先,需要包含进行Socket编程所需的头文件,通常是<sys/socket.h><netinet/in.h><arpa/inet.h>
  2. 创建套接字:使用socket()函数创建一个新的套接字。这个函数需要指定通信的协议族(如IPv4的AF_INET)、套接字类型(如流式套接字SOCK_STREAM)和协议(通常使用默认的0,让系统选择)。
  3. 配置套接字地址:为套接字配置IP地址和端口号。这通常涉及到一个struct sockaddr_in结构体,需要设置其sin_familysin_portsin_addr字段。
  4. 绑定套接字(仅服务器端):使用bind()函数将套接字绑定到特定的IP地址和端口上,以便服务器可以监听来自客户端的连接请求。
  5. 监听连接(仅服务器端):使用listen()函数让服务器端套接字进入监听状态,等待客户端的连接请求。
  6. 接受连接(仅服务器端):使用accept()函数接受客户端的连接请求,创建一个新的套接字用于与客户端通信。
  7. 连接到服务器(仅客户端):使用connect()函数让客户端连接到服务器的IP地址和端口。
  8. 数据传输:一旦建立了连接,就可以使用send()recv()(或write()read())函数在客户端和服务器之间进行数据传输。
  9. 关闭连接:通信完成后,使用close()函数关闭套接字,释放相关资源。
  10. 错误处理:在Socket编程过程中,应该适当地处理可能出现的错误,例如使用errno来获取错误代码,并根据错误代码进行相应的错误处理。