我们了解到无人驾驶是如何去识别颜色的,以及无人车能够跟随颜色目标的演示。回到现实中我们发现,无人车的速度控制是很关键的,这个涉及到安全问题,比如等待红绿灯时,该减速或加速超车等这样很常见的情形,在上节没有体现,这里我们一起来了解下,无人驾驶中是如何自动平稳进行加速和减速的。我们可以先来看一个视频:无人驾驶的速度自动调节

1、实例化摄像头

导入相关的库,然后将摄像头做初始化,如果出现实例化错误的情况,可以查阅:无人车的摄像头的实时捕获图片以及widgets小部件的相关操作

from jetbotmini import Camera
from jetbotmini import bgr8_to_jpeg
from jetbotmini import Robot
import torch
import torchvision
import cv2
import traitlets
import ipywidgets.widgets as widgets
from IPython.display import display
import numpy as npcamera = Camera.instance(width=300, height=300)
global color_lower
global color_upperv
color_lower=np.array([100,43,46])
color_upper = np.array([124, 255, 255])

2、机器人实例化

然后就是将Robot实例化,并导入PID控制算法,用来控制无人车速度快慢的。
关于PID这里再次介绍下:

PID(Proportional-Integral-Derivative)是一种控制器算法,常用于控制工业过程和机器的行为。PID控制器通过测量实际值与期望值之间的差异,并使用比例P、积分I和微分D,这三个系数来计算控制信号,以最小化这个差异。
PID控制器的目的就是通过调整控制信号来使实际输出值与期望输出值保持一致。其中控制信号是通过对误差进行计算得出的,误差是实际输出值与期望输出值之间的差异。

robot = Robot()import PIDfollow_speed = 0.5
turn_gain = 1.7
follow_speed_pid_model = 1
#follow_speed_pid = PID.PositionalPID(3, 0, 0)
follow_speed_pid = PID.PositionalPID(1.5, 0, 0.05)
turn_gain_pid = PID.PositionalPID(0.15, 0, 0.05)

需要注意的是,PID不一定都要出现,可以是PI和PD的组合,也可以只有P这个比例都是可以的,看实际场景来设定。

3、PID算法

我们知道PID是比例,积分与微分,而PID控制器就是通过调整这三者的系数,以平衡响应速度、稳定性和准确性。三者的作用分别如下:

比例系数:调整控制信号的强度,以使系统更快地响应误差。
积分系数:减少系统的稳态误差,使系统更准确地跟踪期望值。
微分系数:用于提高系统的动态性能,使系统更快地响应变化。

在本文将用到的是位置式PID,代码如下:

PID.py

class PositionalPID:def __init__(self, P, I, D):self.Kp = Pself.Ki = Iself.Kd = Dself.SystemOutput = 0.0self.ResultValueBack = 0.0self.PidOutput = 0.0self.PIDErrADD = 0.0self.ErrBack = 0.0#设置PID控制器参数def SetStepSignal(self,StepSignal):Err = StepSignal - self.SystemOutputKpWork = self.Kp * ErrKiWork = self.Ki * self.PIDErrADDKdWork = self.Kd * (Err - self.ErrBack)self.PidOutput = KpWork + KiWork + KdWorkself.PIDErrADD += Errself.ErrBack = Err#设置一阶惯性环节系统  其中InertiaTime为惯性时间常数def SetInertiaTime(self, InertiaTime,SampleTime):self.SystemOutput = (InertiaTime * self.ResultValueBack + SampleTime * self.PidOutput) / (SampleTime + InertiaTime)self.ResultValueBack = self.SystemOutput

还有增量式PID,关于PID的更详细介绍,有兴趣的可以查阅:Jetbotmini中的PID驱动算法控制与代码实现

4、颜色检测与跟踪

这里除了前面移植过来的颜色检测与跟踪之外,还使用了PID控制算法,让无人车对于检测目标的距离来改变车速,当无人车越靠近检测目标速度就会变慢,距离越远速度就会越快,当然这个快也是在一个限速范围内。

image_widget = widgets.Image(format='jpeg', width=300, height=300)display(widgets.VBox([widgets.HBox([image_widget]),
]))width = int(image_widget.width)
height = int(image_widget.height)def execute(change):global follow_speedglobal turn_gainglobal follow_speed_pidtarget_value_speed = 0#-------------颜色识别处理------------------------------frame = camera.valueframe = cv2.resize(frame, (300, 300))frame_=cv2.GaussianBlur(frame,(5,5),0)             hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)mask=cv2.inRange(hsv,color_lower,color_upper)mask=cv2.erode(mask,None,iterations=2)mask=cv2.dilate(mask,None,iterations=2)mask=cv2.GaussianBlur(mask,(3,3),0)   cnts=cv2.findContours(mask.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2]#-------------------------------------------------------# 检测到目标if len(cnts)>0:cnt = max (cnts,key=cv2.contourArea)(color_x,color_y),color_radius=cv2.minEnclosingCircle(cnt)if color_radius > 10:# 将检测到的颜色标记出来cv2.circle(frame,(int(color_x),int(color_y)),int(color_radius),(255,0,255),2)#控制将机器人向前移动,并控制成比例的目标与中心的x距离center = (150 - color_x)/150#跟随速度PID调节follow_speed_pid.SystemOutput = 90000 * (color_radius/200)follow_speed_pid.SetStepSignal(10000)follow_speed_pid.SetInertiaTime(0.2, 0.1)#转向增益PID调节turn_gain_pid.SystemOutput = centerturn_gain_pid.SetStepSignal(0)turn_gain_pid.SetInertiaTime(0.2, 0.1)#将转向增益限制在有效范围内target_value_turn_gain = 0.2 + abs(turn_gain_pid.SystemOutput)if target_value_turn_gain < 0:target_value_turn_gain = 0elif target_value_turn_gain > 2:target_value_turn_gain = 2#将输出电机速度保持在有效行驶范围内target_value_speed = 0.8 + follow_speed_pid.SystemOutput / 90000target_value_speedl = target_value_speed - target_value_turn_gain * centertarget_value_speedr = target_value_speed + target_value_turn_gain * centerif target_value_speedl<0.3:target_value_speedl=0elif target_value_speedl>1:target_value_speedl = 1if target_value_speedr<0.3:target_value_speedr=0elif target_value_speedr>1:target_value_speedr = 1robot.set_motors(target_value_speedl, target_value_speedr)# 没有检测到目标else:robot.forward(float(follow_speed))#robot.stop()# 更新图像显示至小部件image_widget.value = bgr8_to_jpeg(frame)execute({'new': camera.value})

这里的实现原理就是当检测目标距离越远的时候,标注的圆圈就变小了,也就是半径小了,同理,当距离越近的时候,圆圈就变得越大,圆圈半径就越大,就是根据这个半径的大小来控制车速,如下图:

5、实时更新

然后使用camera.observe来调用execute这个回调函数,实时的更新画面,这样就做到了跟踪颜色目标的效果了。

camera.unobserve_all()
camera.observe(execute, names='value')

需要断开摄像头与停止机器人的时候,执行下面代码即可:

import time
camera.unobserve_all()
time.sleep(1.0)
robot.stop()

从上面我们可以看到,和前面的比较,我们的优化是加了一个关键应用,增加了PID控制方法,在本文是使用了位置式PID(Positional PID),其余代码跟上节是一样的。这样就会让无人车在行驶过程中,遇到障碍等都会平稳减速,另外需要加速也不会突然加速,这样乘坐体验会好很多。

无人驾驶中识别颜色并跟踪的优化(加入PID算法控制)相关推荐

  1. 无人驾驶中如何识别颜色并跟踪的具体应用

    摄像头对于颜色的识别,我们在上一篇文章中有具体的介绍,并介绍了OpenCV中的一些常见知识点,这里我们来对颜色识别在无人驾驶中,做一个具体应用. 有兴趣的可以先看下本人拍摄的一个视频:无人车识别颜色并 ...

  2. 【杂谈】有三AI秋季划火热进行中,如何深入学习模型优化,人脸算法,图像质量等研究方向...

    文/编辑 | 言有三 这是我们最后一次CV季划,关于春季划和夏季划的说明,大家可以阅读往期文章. 这个春天,有三最后一月的学习"季划"招生 最后24小时,有三AI夏季划报名即将截止 ...

  3. 基于PID算法控制车辆跟踪圆形轨迹 MATLAB代码

    clear all; close all; clc;%% 参数 ts=0.1; t=30; d=1.45; p=-0.6;%% 初始状态 x(1)=0; y(1)=0; xita(1)=0; v=3; ...

  4. PID算法在ROS仿真环境中的理论及应用(ROS_F1TENTH)

    一.需求: 在F1TENTH 仿真环境simulator中,使用PID算法实现无人车沿墙走wall_following 源码链接:https://github.com/Grizi-ju/ros_pro ...

  5. python红色的颜色表达式_50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)...

    目前计算机视觉(CV)与自然语言处理(NLP)及语音识别并列为人工智能三大热点方向,而计算机视觉中的对象检测(objectdetection)应用非常广泛,比如自动驾驶.视频监控.工业质检.医疗诊断等 ...

  6. 50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)

    目前计算机视觉(CV)与自然语言处理(NLP)及语音识别并列为人工智能三大热点方向,而计算机视觉中的对象检测(objectdetection)应用非常广泛,比如自动驾驶.视频监控.工业质检.医疗诊断等 ...

  7. python 颜色识别_在python中构建颜色识别器

    python 颜色识别 In this post, I will show you how to build your own color recognizer using Python. This ...

  8. 使用OpenCV-python实现颜色特征跟踪视频中的物体

    用颜色特征跟踪视频中的物体 文章目录 问题背景和基本思路 核心代码 完整代码和运行效果 问题背景和基本思路 这里模拟提取图片中的手机壳. 发现手机壳有一个显著的特征,就是颜色基本都是蓝色. 所以这里尝 ...

  9. python如何实现图像中特定颜色的种类识别及特定颜色的占比代码

    使用Python实现图像中特定颜色的种类识别及特定颜色的占比代码,首先可以使用OpenCV库对图像进行处理,然后使用特定的函数来识别图像中特定颜色的种类,最后使用统计学方法来计算特定颜色在图像中的占比 ...

最新文章

  1. 8. 进制转化的函数
  2. 16.编译错误Unknown CMake command “check_symbol_exists“解决
  3. 刨根问底——Handler
  4. 【C/C++】运算结果出现1.#Q0问题分析
  5. Android里监视数据库的变化
  6. 程序员过关斩将--论系统设计的高可扩展性
  7. wpf treeview调整子菜单间距_完全由C编写,高度可移植,超级牛逼的菜单架构!...
  8. 第一篇:NSOperation的概念
  9. aehyok.com的成长之路一——开篇
  10. flex module 弹出窗问题
  11. CSS的一些基本样式的简单介绍
  12. 前端监控和前端埋点方案设计
  13. 算法(一):二分查找
  14. scala入门学习之类的使用
  15. Exadata X8发布
  16. 51单片机仿真——蜂鸣器
  17. cc2530单片机是几位单片机_cc2530中单片机的通用I/O接口
  18. 使用Tensorflow Lite在Android上进行AI危害检测
  19. 金士顿U盘量产根据PS2136_UP10_v1.81.00.rar
  20. ubuntu安装搜狗输入法,并解决输入框一直显示在左下角的问题

热门文章

  1. JavaEE 和 JavaSE的区别
  2. Intel突然补刀:PC电脑又悲催了
  3. 高效能人士的七个习惯-第五章-阅读
  4. 速通C语言第一站 一篇博客带你初识C语言
  5. C#委托与Lambda表达式
  6. 开年迎喜讯:比格云与中信银行签订战略合作协议
  7. Enhanced Deep Residual Networks for Single Image Super-Resolution
  8. twisted reactor 实现源码解析
  9. python出现Twisted Trial in xxx原因及解决办法
  10. C语言中clrscr()是什么意思