主要道具,星瞳科技的openmv单片机,两个舵机
主要算法,pid控制
代码不难,只要用心结合openmv的官方教程不难看懂,笔者当时从接触openmv,因为这个单片机是要用Python的。所以当时要学的东西太多了。笔者从接触到调出 这个板球系统用了整整一周的时间。
下面给出代码,里面有详细注释的
视频链接(下面的总结我放到b站上,优酷有广告)
http://v.youku.com/v_show/id_XNTA3MTExMTkwMA==.html?x&sharefrom=android&sharekey=4618fd9708d3175cf06e8f28fc44f53d6
openmv官方教程链接(两个结合着看)
https://docs.singtown.com/micropython/zh/latest/openmvcam/index.html
https://book.openmv.cc/quick-starter.html
当时才接触Python,不理解类,所以直接用函数写的pid效果一样的
import sensor, image, time
from pyb import UART #开串口但是没有用上
from pyb import Servo #控制舵机
g_threshold=(41, 65, 60, 85, 0, 65)
blob_res=0 #小球
zhong=0 #剔除一些干扰
#一堆变量和pid有关
setr_x=0.0
actualr_x=0.0
err_x=0.0
last_errx=0.0
kp=0.25
ki=0.02
kd=6
angle_x=0.0
integral_xx=0.0
setr_y=0.0
actualr_y=0.0
err_y=0.0
last_erry=0.0
angle_y=0.0
integral_yy=0.0
#pid
#X轴
def pid_x(x,cxx):
global setr_x
global actualr_x
global err_x
global last_errx
global integral_xx
global kp
global ki
global kd
setr_x=x*1.0
actualr_x=cxx*1.0
err_x=setr_x-actualr_x
integral_xx=integral_xx+err_x
angle_x=kp*err_x+ki*integral_xx+kd*(err_x-last_errx) #核心
last_errx=err_x
return angle_x
#Y轴
def pid_y(y,cyy):
global setr_y
global actualr_y
global err_y
global last_erry
global integral_yy
global kp
global ki
global kd
setr_y=y*1.0
actualr_y=cyy*1.0
err_y=setr_y-actualr_y
integral_yy=integral_yy+err_y
angle_y=kp*err_y+ki*integral_yy+kd*(err_y-last_erry) #核心
last_erry=err_y
return angle_y
#初始化
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False) #自动增益
sensor.set_auto_exposure(False,5000)
sensor.set_auto_whitebal(False,[10,0,0])
clock = time.clock()
se1 = Servo(1) # P7 X轴
se2 = Servo(2) # P8 Y轴
while(True):
clock.tick()
img = sensor.snapshot()
#控制舵机并剔除干扰的代码
blobs=img.find_blobs([g_threshold])
c_xx=0
c_yy=0
print(len(blobs),'ww') #看看一共有几个颜色在阈值之内的物体
if blobs:
for blob1 in blobs:
zhong=10*blob1.roundness()-6 #因为我找的是一个球,所以这一个公式就可去掉干扰
if zhong>0:
blob_res=blob1 #找到目标的球了
zhong=0
if blobs:
img.draw_cross(blob_res.cx(),blob_res.cy()) #开始pid
angle_x=pid_x(78,blob_res.cx())+1
angle_y=pid_y(95,blob_res.cy())+1
angle_x=-int(angle_x)
angle_y=int(angle_y)
se1.angle(angle_x) #控制舵机旋转
se2.angle(angle_y) #控制舵机旋转
print(blob_res.cx(),blob_res.cy(),blob_res.area(),'sssss')
print(angle_x,angle_y,'angle')
你不逼自己一把拥有不知道你有多优秀,只有经历过至暗时刻,才会更加懂得珍惜当下的美好!