树莓派小车

这里给大家带来一个借助角蜂鸟实现的基于物体识别控制的树莓派小车。

硬件清单参考如下:

  • 角蜂鸟
  • 树莓派3b + 小车配件

构思

1-1

在角蜂鸟内置的模型中,为我们提供了 Mobilenet-SSD 模型,我们将使用这个模型实现物体检测的功能。大概的处理逻辑如下:

1-2

具体实现

首先我们需要将小车组装起来,虽然购买到的树莓派小车的可能不同,但组装过程大同小异,实际上都是通过 GPIO 控制驱动板,进而控制电机转动。

安装好小车、固定好角蜂鸟之后,就可以配置树莓派以及 SungemSDK 的运行环境了。树莓派的图形界面不太友好,本着要优雅的原则,可以使用 pycharm 进行远程开发调试,具体配置过程可询问谷哥和度娘。

这里需要说明的是,树莓派的USB接口有电流限制,最高只能达到600mA,可能当多个IO输出的时候,会造成工作不稳定。这里可以考虑为USB提供额外的供电,飞根线或者采用外源HUB。

2-2

主要流程实现直接上代码:

#!/usr/bin/env python3
# coding=utf-8

import sys
sys.path.append("../../SungemSDK-Python")
import hsapi as hs
import drive
from video import VideoProcessor


def process(ret):
    bicycles = [x for x in ret[1] if x[0] in {1}]  # 1 bicycle
    if len(bicycles) > 0:  # 当检测到自行车时
        bike = bicycles[0]
        x_mid = (bike[2] + bike[4]) / 2 / ret[0].shape[1]
        if x_mid < 0.4:  # 目标在左前方
            return drive.Direction.left
        elif x_mid > 0.6:  # 目标在右前方
            return drive.Direction.right
        else:  # 目标在正前方
            return drive.Direction.up
    else:
        return drive.Direction.stop


if __name__ == '__main__':
    t_driver = drive.DriveThread()  # 小车驱动线程
    t_video = VideoProcessor(("192.168.50.201", 10700))  # socket线程传输视频到远端

    try:
        net = hs.ObjectDetector(zoom=True, verbose=0, threshSSD=0.2)
        t_driver.start()
        t_video.start()

        while True:
            result = net.run()  # 读取角蜂鸟返回的结果
            t_driver.direction = process(result)
            image = net.plot(result)
            if t_video.has_client():
                t_video.input_queue.put(image)  # 传输视频到远端
    finally:
        drive.cleanup()

展示

3-1

当检测到目标物体(自行车)时,根据目标物体在视野中的位置,驱动小车发生移动。 3-2