点击上方【凌云驭势 重塑未来】
一起共赴年度科技盛宴!
自动驾驶的视觉感知流程
在自动驾驶系统中,作为识别周边环境的“感官”角色,感知模块是整个系统安全、高效运行的基础,让汽车得以像人类一样看清周围的事物,并去分析和理解所处的世界,进而完成驾驶任务。现有的自动驾驶系统一般含有多种传感器来感受外界信息,其中包括:摄像头、激光雷达、毫米波雷达等。摄像头采集图像信息,经过后续的处理之后,可以得到富有语义信息的真实世界的信息。
Amazon DeepRacer 虚拟赛事和线下赛事已广受好评,但开发人员现在想要其汽车超越赛车联赛。Amazon DeepRacer 是一款基于 Ubuntu 的计算机轮式小车,该装置由我们可以对代码进行开源的机器人操作系统(ROS)提供支持,可以让拥有基本 Linux 编码技能的开发人员能够轻松对其汽车有意思的新用途进行原型开发。Amazon DeepRacer 设备软件现已公开可用,因此,任何拥有汽车和创意的人员均可让其设备的新用途成为现实。在本篇 blog 中,我们将介绍以摄像头为主要传感器的 DeepRacer 自动驾驶视觉感知系统。
Amazon DeepRacer open source
实现机制
Amazon DeepRacer 小车上有一个前置摄像头,可以得到小车前方道路上的信息。此外,小车的系统中也自带了摄像头的驱动,并内置 ROS 节点发出视频信息。在 ROS 系统中,订阅视频发布节点之后,就可以得到小车的摄像头信息,之后对其进行一定处理,就可以得到富含语义的信息。
图1 CV2 调用摄像头展示
DeepRacer 采用 ROS 系统,预装 deepracer-core, 对小车基本操作进行了完好的封装,我们可以使用这些节点或者服务完成对小车的控制。在 aws-deepracer-camera-pkg,原始图像信息会发布2个 topic: /camera_pkg/video_mjpeg 与 /camera_pkg/display_mjpeg。其中 /camera_pkg/video_mjpeg 用于本地的 fusion 与推理,/camera_pkg/display_mjpeg 用于 web console 显示实时图像。在 ROS1 (Ubuntu 16) 的环境中,topic name 是 /video_mjpeg。
图2 Camera node 的 topic, service 列表。
来源:https://github.com/aws-deepracer/aws-deepracer-camera-pkg
自定义车道线识别任务介绍
车道线识别任务是自动驾驶中非常重要的一个任务。小车完成对车道线的识别之后,就可以利用自身和车道线的相对位置信息完成各种任务,比如:车道偏离预警(LDW)、车道保持辅助(LKA)和自动变道辅助等。现实世界中的车道线识别是一个颇有挑战性的任务,需要解决各种环境影响的问题(比如车道线磨损、道路损坏、车辆遮挡等)。但在 Amazon DeepRacer 环境中,场地固定,光照环境也非常理想,所以极大降低了车道线识别的难度。
图3 Amazon 标准 DeepRacer 跑道示意图,黑色部分为跑道,绿色部分为周边环境。
本文中车道线识别的过程可以总结为以下流程图:
获取摄像头数据
和一般 CV2 的处理不同,这里使用 ROS 订阅服务来获取摄像头的信息。注意,在 ROS 传输中,视频帧是以 Image 格式发送的,但是 Opencv 不支持该格式的图片,所以我们需要用 Bridge 库将 Image 格式转换为 Opencv 支持的格式。
from cv_bridge import CvBridge
bridge = CvBridge()
image = bridge.imgmsg_to_cv2(ros_image, encoding="rgb")
左滑查看更多
为了缩减推理时间,还可以使用 Opencv 中 resize 函数,将图片压缩到160*120。
import cv2
image = cv2.resize(image, dsize=(160, 120))
左滑查看更多
透视变化
摄像头获取到的图像信息是将三维世界图像压缩到二维的图片中,这样得到的图像信息与实际世界的信息差距较大,最显著的变化就是两条平行的车道线在图片中会相交。若是用这样的信息直接做处理,必然会影响后续自动驾驶的判断。所以这里我们使用透视变换,来保留这样的信息。Opencv 中提供了 warpPerspective 函数,可以方便我们进行透视变换。这中间涉及的参数(M)在不同设备上会有一定的差异,需要自行调试。
M = cv2.getPerspectiveTransform(src_pt, dst_pt)
img_t = cv2.warpPerspective(img, M, (160, 120), cv2.INTER_LINEAR)
左滑查看更多
HSV 掩码
掩码处理一般需要将原始的 BGR 转换到 HSV 色域,Opencv 中也提供了对应函数方便我们完成这一操作。
img_hsv = cv2.cvtColor(img_t, cv2.COLOR_BGR2HSV)
完成色域转化之后,调试找到合适的阈值即可把视频帧中黄色的中线全部找到,并删去其余无用的信息。
lower_yellow = np.array([0, 76, 163])
upper_yellow = np.array([57, 255, 255])
img_mask = cv2.inRange(img_hsv, lower_yellow, upper_yellow)
左滑查看更多
图形学处理
图片中总是有噪声的,经过上述处理后,在图片上还会残留有部分噪点,虽然说这个只占很小一部分,但对后续处理还是不利,所以这里还进行了一些图形学处理,极大程度地抑制了无关的噪点。
kernel_erode = np.ones((3, 3), dtype=np.uint8)
img_erode = cv2.erode(img_mask, kernel_erode)
左滑查看更多
计算方向,偏移量,
进行速度与转角速度下发
cx = int(M['m10']/M['m00']) # 计算质心
self.err = -cx+self.IMG_WIDTH/2 – 15 计算偏移量
self.ang = 0.026*self.err + 0.02 * (self.err-self.last_err) #根据现有偏移量与历史偏移量计算转角
self.ang = np.clip(self.ang, -0.9, 0.9) #裁剪
self.speed = 0.45-abs(self.ang)*0.06 #计算速度
self.speed = np.clip(self.speed, 0.385, 0.41) #裁剪
self.control.throttle = self.speed #线下运行调整
self.control.angle = self.ang + 0.25 #线下运行调整
self.pub.publish(self.control) #指令下发
左滑查看更多
结果与反思
经过上述处理之后,就可以检测到车道线,并实现小车自动巡线。在下一篇 blog 中,我们将讨论如何在 Amazon DeepRacer 自动巡线的过程中实现二维码识别与变道。
本篇作者
赵安蓓
亚马逊云科技解决方案架构师,负责基于亚马逊云科技云平台的解决方案咨询和设计,尤其在大数据分析与建模领域有着丰富的实践经验。
王熙杰
上海大学电子信息工程系在读学生,2022上海市大学生电子设计竞赛 Amazon DeepRacer 开源创新赛题第一名组长。
2022亚马逊云科技 re:Invent 全球大会
精彩视频现已上线!
点击下方图片立即观看
听说,点完下面4个按钮
就不会碰到bug了!