该项目设计针对于“投篮高手”机器人赛道,下面是部分赛道说明,适用于绝大多数目标物体识别、分类,追踪抓取并分类投放,使用openmv识别与stm32控制板通信控制电机麦克纳姆轮小车灵活移动追踪并控制机械臂舵机抓取与投放。
一.系统框架
系统分为两部分,openMV4 H7Plus做视觉处理,STM32F407做控制处理。
1.openMV视觉处理
openmv从图像中识别圆形(蓝色球)并增大识别范围,进行颜色判断后确定是否为要抓取得目标物体(蓝色球),同理,openmv从图像中识别矩形(红色木块)并增大识别范围,进行颜色判断后确定是否为要抓取得目标物体(红色木块),接着进行追踪抓取。
追踪抓取得原理是框选的目标物体会有一个十字中心,再与图像得十字中心反复比对直到满足条件进行抓取,所以当物体离机器人较远时会先控制小车移动靠近目标物体,再细微调整位置,直到机器臂能完美够着目标物体,然后发送指令,机器臂开始抓取。
2.STM32F407控制处理
STM32F407控制板主要控制麦克纳姆轮电机移动和机器臂舵机完成目标物体的抓取与投放,openmv在进行十字中心比对时会将移动的信息通过串口告诉给控制板,在进行机器臂抓取与投放时openmv会根据逆运动学计算每个舵机的运动幅度通过串口与STM32F407通信进行控制。
二.重要代码
1.蓝色球追踪抓取部分代码
def run_trace_grasp(self):#蓝球追踪抓取
#物块中心点
block_cx=self.mid_block_cx
block_cy=self.mid_block_cy
# 获取图像
img = sensor.snapshot()
circles = img.find_circles(threshold=3500, x_margin=10, y_margin=10, r_margin=10, r_min=2, r_max=100, r_step=2)
if circles:
# 取第一个识别到的圆
circle = circles[0]
# 增大识别范围
roi_x = max(0, circle.x() - 20)
roi_y = max(0, circle.y() - 20)
roi_w = min(img.width() - roi_x, circle.r() * 2 + 40)
roi_h = min(img.height() - roi_y, circle.r() * 2 + 40)
# 在新范围内进行蓝色识别
blobs = img.find_blobs([self.blue_threshold], roi=(roi_x, roi_y, roi_w, roi_h), x_stride=5, y_stride=5, pixels_threshold=10)
else :
blobs=0
if blobs:
max_size = 0
max_blob=blobs[0]
for blob in blobs:#寻找最大
if blob[2] * blob[3] > max_size:
max_blob = blob
max_size = blob[2] * blob[3]
img.draw_rectangle((max_blob[0],max_blob[1],max_blob[2],max_blob[3]),color=(255,255,255))
img.draw_cross(max_blob[5], max_blob[6],size=2,color=(255,0,0))
img.draw_string(max_blob[0], (max_blob[1]-10), "blue", color=(255,0,0))
block_cx=max_blob[5]
block_cy=max_blob[6]
2.红色木块追踪抓取部分代码
def run_trace_grasp_box(self):#红盒追踪抓取
#物块中心点
block_cx=self.mid_block_cx
block_cy=self.mid_block_cy
# 获取图像
img = sensor.snapshot()
blobs = img.find_blobs([self.red_threshold],x_stride=5, y_stride=5, pixels_threshold=10 )
if blobs:
max_size = 0
max_blob=blobs[0]
for blob in blobs:#寻找最大
if blob[2] * blob[3] > max_size:
max_blob = blob
max_size = blob[2] * blob[3]
img.draw_rectangle((max_blob[0],max_blob[1],max_blob[2],max_blob[3]),color=(255,255,255))
img.draw_cross(max_blob[5], max_blob[6],size=2,color=(255,0,0))
img.draw_string(max_blob[0], (max_blob[1]-10), "red", color=(255,0,0))
block_cx=max_blob[5]
block_cy=max_blob[6]
3.逆运动学控制部分代码
# 机械臂逆运动
def kinematics_move(self,x:float,y:float,z:float,time1:int)->int:
self.time=time1
if y < 0:
return
# 寻找最佳角度
flag = 0
cnt = 0
for i in range(0, -136, -1):
if isinstance(self.kinematics_analysis(x, y, z, i),str):
if i < cnt:
cnt = i
flag = 1
if flag:
arm_str = self.kinematics_analysis(x, y, z, cnt)
return self.uart.write(arm_str)
return 0
三.比赛现场
最后稳定发挥,取得不错成绩
四.工程文件
完整openmv+stm32工程代码、小车模型(包含精心设计的后斗)、stm32f407控制板立创eda工程文件需要的私!!!