V |
您所在的位置:网站首页 › python怎么做机器人 › V |
这是一个V-rep机器人仿真实验,较为简单,适合初学者在入门图像识别、机器学习、机器人学的内容时进行学习与训练。 实验涉及的内容有:V-rep机器人仿真,YOLOV3图像识别,强化学习DDPG,UR5机械臂及RG2机械手,Kinect摄像头。 使用环境:Win10,Pytorch0.4,V-rep 整个实验一共由多篇文章组成,本文是第三部分。 第三部分:python控制机械臂 文章目录 第三部分:python控制机械臂控制程序1.导入相关模块2.常量、变量与句柄2-1.摄像头图像大小2-2.如何控制机械臂2-3. 句柄 3.函数3-1.启动连接与获取句柄3-2.函数 4.图像获取及处理5.控制程序5-1 控制目标5-2 程序5-3 其它 6.为后续做准备7.附录-完整程序 这部分我们主要用python程序控制机械臂运动,并实现下面几个简单的功能: 控制机械臂的各个关节旋转实现RG2的打开与闭合将摄像头拍到的图片导出来以及其它一些小功能 控制程序我们编写robotControl.py程序,程序的完整代码在这篇文章的最后面,我们先解释每一部分是什么意思。 1.导入相关模块 import os import cv2 import sys import math import time import random import string import pygame import vrep import numpy as np(1). 我们引入opencv2来处理图像:import cv2。 (2). 另外我们使用import pygame,pygame是python的一个库,主要用来做游戏,我们暂时用它控制机械臂,以及导出图像。 (3). import vrep:这里的vrep是我们在第二篇文章中加入的vrep.py文件,就是下面这个文件,忘了的话可以回顾上一篇文章。 我们创建一个类:UR5_RG2,它的常量变量如下: class UR5_RG2: resolutionX = 640 resolutionY = 480 joint_angle = [0,0,0,0,0,0] RAD2DEG = 180 / math.pi # Handles information jointNum = 6 baseName = 'UR5' rgName = 'RG2' jointName = 'UR5_joint' camera_rgb_Name = 'kinect_rgb' camera_depth_Name = 'kinect_depth'下面解释每行程序的意思。 2-1.摄像头图像大小resolutionX,resolutionY是摄像头的图像大小,摄像头的图像是640*480,后面我们会把图像导出来,所以现在定义resolutionX = 640、resolutionY = 480。至于为什么图像是640*480,这个是可以设置的,查看方法如下: 在上一篇文章我们设置了一个摄像头,如下图,我们双击图中红框的按钮: joint_angle = [0,0,0,0,0,0]: UR5有六个关节,在这个教程中我们使用下图所示的格式控制UR5: RAD2DEG = 180 / math.pi:将弧度和角度进行转换。 2-3. 句柄(1). 什么是句柄: 我们要找到被控对象的句柄,如果不清楚句柄是什么,可以查找有关资料,简单来说句柄就是控制接口,比如我们上面讲到的[0,45,0,-30,0,0],我们需要将这条数据输入UR5,就是通过UR5的句柄来访问的,通过UR5的句柄将这条数据输入UR5中,以实现控制目标;如果我们想获取UR5当前各个关节的角度,也是通过UR5的句柄获取的。 (2). 如何获取句柄 通过Vrep自带的的APIsimxGetObjectHandle获取句柄,我们后面会提到,simxGetObjectHandle需要一个参数:被控对象的变量名。变量名查看的方法如下图: 完整程序见文章最后,这里先解释各个函数的功能,可以和程序配合着看。 3-1.启动连接与获取句柄函数__init__(self):启动通讯连接并获取句柄: 部分程序作用如下: vrep.simxFinish(-1):关闭当前潜在连接。clientID = simxStart('127.0.0.1', 19999, True, True, 5000, 5): 与V-rep进行通讯,它的六个参数的意义分别是:服务端IP地址(连接当前电脑使用127.0.0.1);端口号(我们在第一篇文章里面用到的那个19999);是否等待服务端开启;连接丢失时是否尝试再次连接;超时时间(ms);数据传输间隔(越小越快) 我们用了while True死循环,程序会不断试图与Vrep进行通讯,直到通讯成功为止,通讯成功返回clientID,clientID后面会频繁用到。获取句柄: 直接举例,看下面这条获取UR5句柄的程序: _, baseHandle = vrep.simxGetObjectHandle(clientID, baseName, vrep.simx_opmode_blocking) vrep.simxGetObjectHandle作用是获取句柄,有三个参数,第一个参数是第2点得到的clientID;第二个参数是被控对象的变量名,还记得刚刚2-3句柄篇章的程序baseName = 'UR5'吧,所以函数返回UR5的句柄,即baseHandle是UR5句柄;第三个参数是通讯方式。 以此类推,我们还得到以下句柄: (1). 机械臂句柄jointHandle:它的格式是我们在2-2篇章中提到的那种形式:[jointHandle1,jointHandle2,jointHandle3,jointHandle4,jointHandle5,jointHandle6] (2). RG2句柄:rgHandle (3). 摄像头RGB图像与深度图像的句柄:cameraRGBHandle,cameraDepthHandle 获取了句柄,接下来就好办了,就可以通过句柄向被控对象输入指令或者获取数据。获取当前机械臂各关节角度: jointConfig = np.zeros((jointNum, 1)) for i in range(jointNum): _, jpos = vrep.simxGetJointPosition(clientID, jointHandle[i], vrep.simx_opmode_blocking) jointConfig[i] = jpos 3-2.函数函数以及功能如下: __del__(self):断开连接。showHandles(self):将句柄print出来。showJointAngles(self):获取机械臂六个关节的当前角度。我们用到V-rep自带APIvrep.simxGetJointPosition,它的功能是获取关节当前角度,它的三个参数分别是:clientID;被控对象的句柄;通讯方式。openRG2(self):控制RG2打开,我们这里用到V-rep自带APIvrep.simxCallScriptFunction,它的功能是调用嵌入式脚本,所以我们还需要写嵌入式脚本,方法如下: 双击红框:![]() ![]() 获取图像这一块内容比较多,所以我们单独用一个篇章来讲。 函数getImageRGB(self): 使用vrep.simxGetVisionSensorImage获取图像数据,但是获取到的数据格式却是下面这样的: 假设RGB图像大小是2*2,三通道,每个像素0-255,如下图:![]() 我们使用pygame模块控制机械臂,由于pygame是一个开发游戏的工具,所以使用pygame可以实现用键盘按键操控机械臂运动。 5-2 程序编写main函数,程序实现的原理如下: 创建一个游戏窗口,游戏窗口显示的内容是摄像头的RGB图像,我们在篇章4图像获取那部分已经用arrayToImage函数得到摄像头图像的图片了,我们只需加载这个图像并在每一帧不断更新便可。 运行效果如图:![]() ![]() 到目前为止,我们的文件夹目录层次结构如下: 我们接下来用YOLOV3做一个目标识别实验,识别对象是一个圆球,如图: |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |