项目缘由与总结

手机上的Timberman游戏被朋友挑战,无奈只能达到300多分,突发奇想做一个自动化的系统来替代人进行操作,反超朋友记录
Timberman游戏规则简单,应该很轻松就能做出一套系统来实现自动化操作,况且机器毕竟是机器,依赖于算法做出的判断基本不会出错。
但是实践下来,遇到了不少问题,最终这套系统没有按照理想的情况运行下去,原因如下

  1. 树莓派处理速度不够理想,无法瞬间得出运算结果
  2. 手里只有盛辉MG995型舵机,实在是大材小用,树莓派也不能很好的进行驱动,也没有单独为他购置一套设备
  3. 常规电容笔的工作是依赖于传递人手的电容进行工作的
  4. 准备着手准备毕业设计,这个小东西只能暂时搁置了
    等将来入手性能更加强大的树莓派2之后,再重启这个小项目吧,下面简单记录一下这个小东西

设备图片

Alt text

实现思路

  1. 获取图像
  2. 切割
  3. 灰度化
  4. 与标准图进行对比
  5. 判断相似度
  6. 做出响应

工具

  • 树莓派及摄像头
  • 一个稳定的支撑平台
  • Python Imaging Library 库(简称pil库)

源代码

源代码十分简单,都是直接调用pil库的函数直接运行,舵机因为硬件问题调试的不是很完美,等着以后有了新装备再来完善

#!/usr/bin/python
#coding: utf8
import math
import os
import operator
import time
import signal
import atexit
#import cv2.cv as cv
import RPi.GPIO as GPIO
from PIL import Image

atexit.register(GPIO.cleanup)
servopin = 11
GPIO.setmode(GPIO.BOARD)
GPIO.setup(servopin, GPIO.OUT, initial=False)
p = GPIO.PWM(servopin,50) #50HZ

while (True):
    os.system('fswebcam -r 320×240 -d /dev/video0 -p yuyv -S 5 /root/timberman/testpictire.jpg')
    time.sleep(0.5) 
    takeimg = Image.open('testpictire.jpg')#打开图片
    region = (50,50,150,220) #设置切割接线
    
    ctake = takeimg.crop(region) #切割
    Lctake = ctake.convert('L') #灰度化
    Lctake.save('fintest.jpg')

    standimage = Image.open('Lstand.jpg')

    h1 = Lctake.histogram()
    h2 = standimage.histogram()

    rms = math.sqrt(reduce(operator.add,  list(map(lambda a,b: (a-b)**2, h1, h2)))/len(h1) )

    if rms<1000:
        #p = GPIO.PWM(servopin,50) #50HZ
        p.start(0)
        for i in range(0,181,5):
            p.ChangeDutyCycle(2.5 + 10 * i / 180) #设置转动角度
            time.sleep(0.02)                      #等该20ms周期结束
            p.ChangeDutyCycle(0)                  #归零信号

    else:
        #p = GPIO.PWM(servopin,50) #50HZ
        p.start(0)
        for i in range(181,0,-5):
            p.ChangeDutyCycle(2.5 + 10 * i / 180) #设置转动角度
            time.sleep(0.02)                      #等该20ms周期结束
            p.ChangeDutyCycle(0)                  #归零信号

后期需要改进项

  • 优化代码
  • 调整舵机可控性
  • 针对不同场景建立大量标准图,对各个场景进行优化,增加判断准确度
  • 提高程序运行响应速度甚至考虑通过Arduino控制将项目移植到电脑上,通过PC进行运算
  • 研究一下如何优雅的让电容笔工作