实现功能

可以实现对指定目标的自动搜索夹取工作具体效果
https://www.bilibili.com/video/BV1h64y1h7Yj/

优势和不足

在目标检测中使用的是基于深度学习的yolov4网络训练出来的模型,可以根据要识别的物体训练相应的模型适用范围更广。不足之处是该机械臂 并没有实现对物体角度的检测和调整,以及 6自由度的控制仍然需要进一步完善。同时在夹取过程中没有对夹取力的反馈是个开环控制仍需要改进。

基本结构与硬件选择

机械臂的结构

机械臂的设计选取参考来了淘宝上卖的成品机械臂,购买了舵机支架和串口舵机进行了机械臂的组装。最终成品采用了6个串口舵机组装出了机械臂,淘宝商家都说这是6自由度的机械臂,其实完全不能达到6自由度机械臂的效果但是对于夹取来说完全足够。

主控的选取

由于我使用的目标检测是使用的yolov4的神经网络模型进行检测物体因此对主控的算力要求较高,开始选择了树莓派作为主控,结果发现在进行识别时识别速度太慢,延迟过高。因此选取了算力更加强大的nvidia nx作为主控。在摄像头上选取了普通的720p无畸变的摄像头。

具体实现过程

夹取部分实现

控制基本运动

控制串口舵机来控制机械臂的行动,选取串口舵机的原因是串口舵机占用主控资源较少同时该机械臂为实验机器并不需要夹取太重物体,综合考虑串口舵机较为适合。结合数字舵机的控制设置了串口舵机的串口参数并实现了对单个舵机的控制,为了实时检测舵机的状态,同时给出了可以读取舵机位置的接口。具体程序如下

import serial
import time
class MOVE:def __init__(self,name,rate):  self.command = {"MOVE_WRITE":1, "POS_READ":28, "LOAD_UNLOAD_WRITE": 31}   self.ser = serial.Serial(name,rate)def servoWriteCmd(self,id, cmd, par1 = None, par2 = None):buf = bytearray(b'\x55\x55')try:len = 3   buf1 = bytearray(b'')if par1 is not None:len += 2  buf1.extend([(0xff & par1), (0xff & (par1 >> 8))]) if par2 is not None:len += 2buf1.extend([(0xff & par2), (0xff & (par2 >> 8))])  buf.extend([(0xff & id), (0xff & len), (0xff & cmd)])buf.extend(buf1) sum = 0x00for b in buf:  sum += bsum = sum - 0x55 - 0x55  sum = ~sum  buf.append(0xff & sum)  self.ser.write(buf) except Exception as e:print(e)def readPosition(self,id):self.ser.flushInput() self.servoWriteCmd(id, self.command["POS_READ"]) time.sleep(0.00034)  time.sleep(0.005)  count = self.ser.inWaiting() pos = Noneif count != 0:recv_data = self.ser.read(count) if count == 8: if recv_data[0] == 0x55 :if  recv_data[1] == 0x55 :if recv_data[4] == 0x1c:pos= 0xffff &(recv_data[5]|(0xff00 & recv_data[6] << 8))   return pos
if __name__ =='__main__':move = MOVE(name="/dev/ttyUSB0",rate=115200)while(True):move.servoWriteCmd(2,1,500,0)pos=move.readPosition(1)time.sleep(1)print(pos)

在实现对单个舵机的控制之后发现控制舵机转动不能精确到固定角度,因此写了角度转换的的接口。

def runchange_angel (move,ang,times):for i in range(6):ang[i] = ang[i]*3.7 pos[i] = start[i]+int(ang[i])move.servoWriteCmd(5, 1, pos[4], times)move.servoWriteCmd(3, 1, pos[2], times)move.servoWriteCmd(4, 1, pos[3], times)move.servoWriteCmd(2, 1, pos[1], times)move.servoWriteCmd(1, 1, pos[0], times)move.servoWriteCmd(6, 1, pos[5], times)

在实现对舵机的简单控制之后考虑实现机械臂的基本运动,由于在检测目标时仅仅识别到 二维平面的信息因此只需考虑机械臂在平面上的运动即可,采用极坐标系对夹爪的点进行定位,首先水平转动平台上的舵机来控制角度。该控制直接调用demo即可。对于长度方向上的控制,进行了简单的运动学分析,得出在机械臂伸长时1和2舵机应向相反方向转动相同角度的关系。具体控制代码如下

def extend(move,pos,number,times):pos[1]+=numberpos[2]+=numberif pos[1]>=1000:print("伸长超出范围")pos[1]=1000if pos[2]>=1000:print("伸长超出范围")pos[2]=1000if pos[1]<=0:print("伸长超出范围")pos[1]=0if pos[2]<=0:print("伸长超出范围")pos[2]=0action.run(move,pos,times)return pos

由于高度固定因此在机械臂的下降过程中直接通过实验直接固定了角度调整的参数。

def decline_catch(move,pos,times):pos[2]=pos[2]-360pos[3]=pos[3]-310   #下降action.run(move,pos,times)pos[5]=pos[5]+250   #夹取action.run(move,pos,times)pos[2]=pos[2]+360pos[3]=pos[3]+310  #抬升  action.run(move,pos,times)return pos

视觉识别

识别过程共采取两种方案一是通过opencv第三方库进行识别但是对比来看该方法的不足是识别不同物体时需要重新对程序进行大量修改,有时受光线的影响较大。但是该方法对主控的算力要求较低。而采用神经网络的方法适用范围广,对主控算力要求高,综合考虑选取了神经网络的方式进行识别,在识别过程中选取了yolov4模型进行视觉的识别,首先收集到大量的目标物体图片(由于实验夹取的物体特征简单因此只标记了200张图片)进行训练并调用摄像头获得图像进行检测最终将识别到的物体中心坐标以参数的形式返回

if __name__ =="__main__":move = mv.MOVE(name="/dev/ttyUSB0",rate=115200)# pos=[500, 511, 484, 800, 390, 276]# action.run(move,pos,1000)# decline_catch(move,pos,1000)# go_home(move,pos,1000)cap = cv2.VideoCapture(0) #读取摄像头cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640);cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480);ret, frame = cap.read()cx=320cy=240+100pos,dets=search(move,[200,800],cap)print(pos,dets)while ret:ret, frame = cap.read()dets,frame = tracking.detector.detect_image(frame,classes=['fy'])      if len(dets) > 0:name,score,bbox = dets[0]x = (bbox[0] + bbox[2]) / 2y = (bbox[1] + bbox[3]) / 2pos,pan_error,tai_error=tracking.pid_move(move,x,y,cx,cy,pos)print(pos)if pan_error==0 and tai_error==0:pos=decline_catch(move,pos,1000)go_home(move,pos,1000)breakcv2.imshow('frame', frame)cv2.waitKey(1)

目标寻找以及PID控制

寻找物体时采用的方式是使机械臂遍历整个区域从而检测目标物,当检测到目标物时在进入PID调节从而快速确定夹爪应在位置。为了快速将夹爪定位到准确位置使用了PID算法进行了控制优化。

import time
from math import pi, isnanclass PID:_kp = _ki = _kd = _integrator = _imax = 0_last_error = _last_derivative = _last_t = 0_RC = 1/(2 * pi * 20)def __init__(self, p=0, i=0, d=0, imax=0):self._kp = float(p)self._ki = float(i)self._kd = float(d)self._imax = abs(imax)self._last_derivative = float('nan')def get_pid(self, error, scaler):tnow = time.clock()dt = tnow - self._last_toutput = 0if self._last_t == 0 or dt > 1000:dt = 0self.reset_I()self._last_t = tnowdelta_time = float(dt) / float(1000)output += error * self._kpif abs(self._kd) > 0 and dt > 0:if isnan(self._last_derivative):derivative = 0self._last_derivative = 0else:derivative = (error - self._last_error) / delta_timederivative = self._last_derivative + \((delta_time / (self._RC + delta_time)) * \(derivative - self._last_derivative))self._last_error = errorself._last_derivative = derivativeoutput += self._kd * derivativeoutput *= scalerif abs(self._ki) > 0 and dt > 0:self._integrator += (error * self._ki) * scaler * delta_timeif self._integrator < -self._imax: self._integrator = -self._imaxelif self._integrator > self._imax: self._integrator = self._imaxoutput += self._integratorreturn outputdef reset_I(self):self._integrator = 0self._last_derivative = float('nan')

得出PID优化后的偏差后不断进行反复调整最终实现了夹爪的快速定位

def pid_move(move,x,y,cx,cy,pos):pan_error = cx-x #左边为负tai_error = cy-y #上边为负print(pan_error,tai_error)if abs(pan_error) < 40:pan_error = 0    if abs(tai_error) < 40:tai_error = 0pan_out=pan_pid.get_pid(pan_error,1)tai_out=tai_pid.get_pid(tai_error,1)pos=catch.turn(move,pos,int(pan_out),15)pos=catch.extend(move,pos,int(tai_out),15)for number in pos:if number<=0:number=0if number>=1000:number=1000return(pos,pan_error,tai_error)

该机械臂是仍是一个十分不成熟的产品,存在诸多问题。若文中出现错误,恳请大佬批评指正!

基于深度学习的自动识别夹取机械臂相关推荐

  1. 基于深度学习的旋翼无人机机械臂抓取

    基于深度学习的旋翼无人机机械臂抓取 摘要:随着空中机器人技术的快速发展与日益成熟,无人机在越来越多的领域得到了广泛的应用.而多旋翼无人机作为最常用的无人机之一,以其体积小.运动灵活.定点悬停等优势广泛 ...

  2. 【论文笔记】基于强化学习的连续型机械臂自适应跟踪控制

    文章目录 摘要 关键词 0 引言 1 空间连续型机器人动力学模型 1.1 场景假设 (1) 环境假设 (2) 模型假设 1.2 公式分析 2 空间连续型机器人滑模控制器 3 基于强化学习的滑模控制器 ...

  3. 【实战+源码】基于RGB-D(深度视觉)的具有机械臂抓取功能的自主规划移动服务机器人的设计与实现(一)——准备工作

    目录 一,实物or仿真 1,实物或仿真的利弊 2,从哪些角度去考虑是选择实物还是仿真 二,环境准备 1,首推ROS 2,其他环境 三,理论学习 四,实物搭建 一,实物or仿真 我想这个问题是在开发之前 ...

  4. 2021-06-21基于深度学习的智能机械故障诊断的部分域适应方法阅读笔记

    文章目录 基于深度学习的智能机械故障诊断的部分域适应方法 一.提出的方法 二.网络优化 1.源域监督损失 2.实验比较 总结 基于深度学习的智能机械故障诊断的部分域适应方法 无监督的目标域训练数据不会 ...

  5. 【大咖说Ⅲ】谢娟英教授:基于深度学习的野外环境下蝴蝶物种自动识别

    欢迎来到2022 CCF BDCI 大咖说系列专题报告 听顶级专家学者围绕特定技术领域或选题,讲述自身成果的研究价值与实际应用价值 便于广大技术发烧友.大赛参赛者吸收学术知识,强化深度学习 每周一.三 ...

  6. 物体抓取位姿估計算法綜述_基于深度学习的物体抓取位置估计

    主讲题目:基于深度学习的物体抓取位置估计 主要内容:机械臂抓取技术简介与入门方法 主讲嘉宾:东北大学研究生,主要研究物体六自由度位姿估计,机械臂抓取. 知乎视频​www.zhihu.com 往期干货资 ...

  7. 【论文笔记】基于深度学习的视觉检测及抓取方法

    目录 摘要 关键词 1 目标检测 1.1 YOLO-V3 模型 1.2 算法优化 2 抓取位姿估计 2.1 五维抓取框 2.2 抓取位姿估计模型 2.3 角度优化 3 实验结果与分析 3.1 目标检测 ...

  8. 滴普技术荟:基于深度学习的云边一体化OLED屏缺陷自动光学检测技术

    作者:阎胜利 中科院博士 助理研究员,从事光电成像系统总体及算法研究,现为滴普科技 2048事业部 技术品牌专家 一.要解决的主要问题 OLED (Organic Light-Emitting Dio ...

  9. 【论文笔记】基于深度学习的机器人抓取虚拟仿真实验教学系统

    文章目录 摘要 关键词 0 引言 1 基于深度学习的机器人抓取实验原理 2 机器人抓取虚拟仿真实验设计方案 2.1 虚拟仿真实验系统总体设计 2.2 机器人抓取实验教学过程 3 实验教学考核与管理 4 ...

最新文章

  1. springboot整合mybatis和mybatis-plus
  2. 重新挂载linux分区添加硬盘
  3. nginx File not found 错误(转)
  4. StackExchange.Redis 命令扩展
  5. 微软正在开发基于Rust的安全编程语言
  6. java 反射 类变量_java反射机制取出model类的所有变量,以及value
  7. comps电磁场模拟软件_什么样配置的电脑可以适合用于电磁仿真?
  8. C#对Windows服务组的启动与停止
  9. windows内核驱动
  10. html doc全称,html标签全称和功能介绍.doc
  11. css响应式布局及分辨率(PC端、H5端)
  12. 【每日一题】电话号码
  13. 怎样的年轻化法则,让这个品牌四年净利润复合增速达30%
  14. android 数据图标的刷新通知流程
  15. 施工企业选择智慧工地的有效方法
  16. 浙大计算机专业博士后,博士后 - 浙江大学系统医学研究中心
  17. 30天搞定spark源码系列-RDD番外篇-shuffledRDD
  18. js 地理位置查询经纬度定位地图
  19. 智慧景区无线AP覆盖方案的成本计算
  20. JavaWeb(引用-->狂神学习笔记)2021-08

热门文章

  1. 解套操作的主要技巧谈
  2. android和ios传文件怎么打开方式,安卓怎么给iPhone传文件?文件互传教程
  3. win下连编socket时[Linker error] undefined reference to XXX
  4. 计算机图形和游戏技术专业,宾夕法尼亚大学计算机图形和游戏技术学理学硕士研究生申请要求及申请材料要求清单...
  5. 用不起!中国移动首个5G套餐确认,最低消费118元!
  6. android 短视频编辑,短视频编辑制作大师
  7. 苹果手机打不开html,苹果手机打不开app是怎么回事(苹果app异常解决方法)
  8. 微软准备再次裁员2850人 一年之内完成
  9. 移动广告业务发展现状分析
  10. it转正述职报告_IT试用期转正工作总结