亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」

本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于树莓派的自动驾驶小皮卡

发布时间:2021-08-23
分享到:

基于树莓派的自动驾驶小皮卡

发布时间:2021-08-23
分享到:

近年来,自动驾驶汽车成为越来越受关注的话题,因为许多公司正在积极开发相关的硬件和软件技术,来实现无需人工干预的全自动驾驶能力。

深度神经网络(DNN)已成功应用于各种感知和控制任务,它们也是自动驾驶汽车的重要工作负载。

什么是 Deep Pi Car?

Deep Picar 是 NVIDIA 名为 DAVE-2 的真正自动驾驶汽车的小规模复制品。使用 Deep Picar,我们分析了 Raspberry Pi 的计算能力,支持基于端到端深度学习的自动驾驶汽车实时控制。

项目理念:

通过从人工驾驶切换到自动驾驶来控制车辆。

零件清单:

  • PiCar-S 树莓派智能机器人车载套件
  • 树莓派 3
  • Google Edge TPU 协处理器
  • 微型 SD 卡 16GB
  • 广角 USB 摄像头 1.3 兆像素,带 170 度鱼眼镜头
  • 适配器 HDMI 90 度角
  • 电池 18650
  • 充电器

第 1 步:集齐所有零部件

PiCar-S 树莓派智能机器人车载套件
https://www.banggood.com/SunFounder-PiCar-S-Raspbe...

树莓派 3
https://ar.banggood.com/Raspberry-Pi-3-Model-B+-.....

Google Edge TPU 协处理器
https://saudi.desertcart.com/products/125589101-go...

广角 USB 摄像头 1.3 兆像素,带 170 度鱼眼镜头
https://etqan.sa/product/usb-camera/?gclid=CjwKCAi...

适配器 HDMI 90 度角
https://www.banggood.com/Ug​​reen-HD112-HDMI-Male-to...

电池 18650
https://etqan.sa/product/18650-battery-3-7v-recha...

充电器
微型 SD 卡 16GB

第 2 步:关于 Google Edge TPU 加速器

Coral USB Accelerator 是目前现有 Linux 系统带有强大机器学习功能的演算机器。USB Accelerator 采用 Edge TPU(一种由 Google 设计和制造的小型 ASIC),可通过 USB 3.0 接口以低功耗提供高性能机器学习演算。
Edge TPU 主要优点:

  • - 高速 Tensor Flow Lite 
  • - 低电量
  • - 占地面积小

特点:Google Edge TPU ML 加速器协处理器 USB 3.0 Type-C 插座支持主机 CPU 上的 Debian Linux 模型使用 Tensor Flow 构建。尽管可以自定义架构,但完全支持 Mobile Net 和 Inception 架构 与 Google Cloud 兼容。

Coral 是 Google 的一个拓展功能,通过本地 AI 平台帮助构建智能想法。

第 3 步:树莓派设置

要对 Raspberry Pi 进行设置,您需要:

  • 微型 SD 卡
  • 微型 USB 数据线
  • 键盘
  • 鼠标
  • HDMI 显示器
  • HDMI线

设置步骤:

连接好micro SD卡后,开始从树莓派官网https://www.raspberrypi.org/downloads/下载obrution系统,使用NOBBS软件,通过copping下载到micro SD卡上面的所有文件。之后,将 micro SD 卡插入树莓派并插入所有电缆,所有选项都会在屏幕上看到。

第 4 步:组装和安装

使用说明书,我们开始安装 PiCar 套件,该套件包含:

  • 说明书
  • 皮卡车的主体
  • 直流电机
  • 直流电机驱动器(TRA9118A)
  • 降压DC-DC转换器模块
  • 伺服电机
  • 带调制模块的脉冲 (PWM PCA9685)
  • 调节器
  • USB摄像头
  • USB模块
  • 电池 18650 (3.7V)
  • 电池盒
  • 车轮 (4)
  • 电线
  • 螺丝刀(不同种类的)
  • 螺丝

注 1:在开始安装之前,请确保套件的每个电子部件都能正常工作,分别进行测试。

注 2:如果您使用的是树莓派 3 及以上版本,则无需安装天线,因为r aspberry 具有内部 Wifi 和蓝牙。

零件的组装经过几个阶段:

  • 从背面组装亚克力板和车轮
  • 在车的主体上安装电机
  • 在树莓派上进行伺服校准

注意:由于舵机在后部,因此需要进行一些配置以进行保护。我们需要在安装时使舵机旋转到 90 度,这样旋转范围才能与汽车中的应用相匹配。否则可能会损坏舵机。

  • 从正面组装亚克力板和车轮
  • 电气模块组装
  • 电路连接

安装相关视频:

安装#1 - YouTube
安装#2 - YouTube
安装#3 - YouTube
安装#4 - YouTube

picar说明书.pdf

第 5 步:手工制作模型

制作交通标志并与项目配合使用的手工艺品很少。

我们使用的标志:

  • 红色交通灯
  • 绿色交通灯
  • 停止标志
  • 速度标志
  • 人(我们用的是乐高玩具)

此步骤的相关视频:

第 6 步:使用 Raspberry Pi 设置 Picar

对于 Google Edge TPU Accelerator,将设置所需的所有计算机视觉和深度学习软件。我们使用的主要软件工具是 Python、OpenCV(一个强大的计算机视觉包)和 Tensor Flow(谷歌流行的深度学习框架)。注意:我们在这里使用的所有软件都是免费和开源的。

  • 树莓派操作系统设置
  • 设置远程访问(IP 地址/sudo/SSH/VNC)
  • 设置远程文件访问
  • 安装 USB 摄像头
  • 获取源代码,直接从 Github 下载源代码到您的 PC 上:https://github.com/sunfounder/Sunfounder_Smart_Vid...
  • 安装 Python 软件,访问 Python 网站www.python.org,找到最新的 Python 3 并安装。安装完成后,重新启动计算机,然后按照说明书上的说明继续安装。
  • 运行 cali_client
  • 开始校准
  • 马达调整
  • 车削调整
  • 安装调整

现在我们有了一个可以通过 Python 控制的正在运行的机器人汽车。下面是我开源的代码和文件仅供参考:

setup.py

camera.py

i2cHelper.py

第 7 步:机器学习和实践

在我们运行程序之前,我们应该给 picar 一个视觉处理(相机和 OpenCV)和一个计算处理(Tensor Flow),所以我们必须首先遵循:

  • 用于计算机视觉的 OpenCV
  • 安装 Open CV 和相关库
  • 为 Edge TPU 安装张量流

在这一步中,我们将使用单次射击多盒物体检测和迁移学习等深度学习技术来教 DeepPiCar 检测道路上的各种(微型)交通标志和行人。然后我们将教它在红灯和停车标志处停车,绿灯行驶,停车等待行人通过,并根据张贴的限速标志更改其限速,并为 Picar 进行大量练习。

下面是一些机器学习和实践的相关视频:

第 8 步:最终产品演示

在这一步中,我们展示了最终产品,一个无需人工干预即可控制车辆的仿真模型。下面是源代码仅供参考:

import logging
import picar
import cv2
import datetime
from hand_coded_lane_follower import HandCodedLaneFollower
from objects_on_road_processor import ObjectsOnRoadProcessor
import time
_SHOW_IMAGE = True


class DeepPiCar(object):

    __INITIAL_SPEED = 0
    __SCREEN_WIDTH = 340 #__SCREEN_WIDTH = 320
    __SCREEN_HEIGHT = 240

    def __init__(self):
        """ Init camera and wheels"""
        logging.info('Creating a DeepPiCar...')

        picar.setup()

        logging.debug('Set up camera')
        #self.camera = cv2.VideoCapture(-1)
        self.camera = cv2.VideoCapture(0)
        self.camera.set(3, self.__SCREEN_WIDTH)
        self.camera.set(4, self.__SCREEN_HEIGHT)

        self.pan_servo = picar.Servo.Servo(1)
      #  self.pan_servo.offset = -30  # calibrate servo to center
        self.pan_servo.offset = 0
        self.pan_servo.write(90)

        self.tilt_servo = picar.Servo.Servo(2)
       # self.tilt_servo.offset = 20  # calibrate servo to center
        self.tilt_servo.offset = 0
        self.tilt_servo.write(90)

        logging.debug('Set up back wheels')
        self.back_wheels = picar.back_wheels.Back_Wheels()
        self.back_wheels.speed = 0  # Speed Range is 0 (stop) - 100 (fastest)
        ###self.back_wheels.forward()
        logging.debug('Set up front wheels')
        self.front_wheels = picar.front_wheels.Front_Wheels()
        #self.front_wheels.turning_offset = -25  # calibrate servo to center
        self.front_wheels.turning_offset = 0
        self.front_wheels.turn(90)  # Steering Range is 45 (left) - 90 (center) - 135 (right)

        self.lane_follower = HandCodedLaneFollower(self)
        self.traffic_sign_processor = ObjectsOnRoadProcessor(self)
        # lane_follower = DeepLearningLaneFollower()

        self.fourcc = cv2.VideoWriter_fourcc(*'XVID')
        datestr = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
        self.video_orig = self.create_video_recorder('../data/tmp/car_video%s.avi' % datestr)
        self.video_lane = self.create_video_recorder('../data/tmp/car_video_lane%s.avi' % datestr)
        self.video_objs = self.create_video_recorder('../data/tmp/car_video_objs%s.avi' % datestr)

        logging.info('Created a DeepPiCar')

    def create_video_recorder(self, path):
        return cv2.VideoWriter(path, self.fourcc, 20.0, (self.__SCREEN_WIDTH, self.__SCREEN_HEIGHT))
        #return cv2.VideoWriter(path, self.fourcc, 20.0, (self.__SCREEN_WIDTH, self.__SCREEN_HEIGHT))
    def __enter__(self):
        """ Entering a with statement """
        return self

    def __exit__(self, _type, value, traceback):
        """ Exit a with statement"""
        if traceback is not None:
            # Exception occurred:
            logging.error('Exiting with statement with exception %s' % traceback)

        self.cleanup()

    def cleanup(self):
        """ Reset the hardware"""
        logging.info('Stopping the car, resetting hardware.')
        self.back_wheels.speed = 0
        self.front_wheels.turn(90)
        self.camera.release()
        self.video_orig.release()
        self.video_lane.release()
        self.video_objs.release()
        cv2.destroyAllWindows()

    def drive(self, speed=__INITIAL_SPEED):
        """ Main entry point of the car, and put it in drive mode

        Keyword arguments:
        speed -- speed of back wheel, range is 0 (stop) - 100 (fastest)
        """

        logging.info('Starting to drive at speed %s...' % speed)
        self.back_wheels.speed = speed

        self.back_wheels.forward()
        i = 0
        while self.camera.isOpened():
            _, image_lane = self.camera.read()
            image_objs = image_lane.copy()
            i += 1
            self.video_orig.write(image_lane)

            image_objs = self.process_objects_on_road(image_objs)
            self.video_objs.write(image_objs)
            show_image('Detected Objects', image_objs)

            image_lane = self.follow_lane(image_lane)
            self.video_lane.write(image_lane)
            show_image('Lane Lines', image_lane)

            if cv2.waitKey(1) & 0xFF == ord('q'):
                self.cleanup()
                break

    def process_objects_on_road(self, image):
        image = self.traffic_sign_processor.process_objects_on_road(image)
        return image

    def follow_lane(self, image):
        image = self.lane_follower.follow_lane(image)
        return image


############################
# Utility Functions
############################
def show_image(title, frame, show=_SHOW_IMAGE):
    if show:
        cv2.imshow(title, frame)


def main():
    with DeepPiCar() as car:
        car.drive(17)


if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG, format='%(levelname)-5s:%(asctime)s: %(message)s')
    
    main()<br>

deep_pi_car.py

driver_main.py

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论