V

您所在的位置:网站首页 python怎么做机器人 V

V

2023-09-09 04:15| 来源: 网络整理| 查看: 265

这是一个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文件,就是下面这个文件,忘了的话可以回顾上一篇文章。

2.常量、变量与句柄

我们创建一个类: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,这个是可以设置的,查看方法如下: 在上一篇文章我们设置了一个摄像头,如下图,我们双击图中红框的按钮: 得到下图,我们可以查看摄像头的图像大小,也可以根据需要修改:

2-2.如何控制机械臂

joint_angle = [0,0,0,0,0,0]: UR5有六个关节,在这个教程中我们使用下图所示的格式控制UR5: 这里面的六个参数分别代表UR5六个关节的旋转角度,举个例子: 如果我们想要UR5的第二个关节正转45°,第四个关节反转30°,那我们应该这样写:[0,45,0,-30,0,0],然后将这个数据输入vrep的UR5接口,便可实现控制目标,具体细节我们后面还会讲到。

RAD2DEG = 180 / math.pi:将弧度和角度进行转换。

2-3. 句柄

(1). 什么是句柄: 我们要找到被控对象的句柄,如果不清楚句柄是什么,可以查找有关资料,简单来说句柄就是控制接口,比如我们上面讲到的[0,45,0,-30,0,0],我们需要将这条数据输入UR5,就是通过UR5的句柄来访问的,通过UR5的句柄将这条数据输入UR5中,以实现控制目标;如果我们想获取UR5当前各个关节的角度,也是通过UR5的句柄获取的。 (2). 如何获取句柄 通过Vrep自带的的APIsimxGetObjectHandle获取句柄,我们后面会提到,simxGetObjectHandle需要一个参数:被控对象的变量名。变量名查看的方法如下图: 图中被红框框起来的就是它们的变量名,所以下面的代码意思就很明显了:被控对象变量名

baseName = 'UR5' rgName = 'RG2' jointName = 'UR5_joint' camera_rgb_Name = 'kinect_rgb' camera_depth_Name = 'kinect_depth' 3.函数

完整程序见文章最后,这里先解释各个函数的功能,可以和程序配合着看。

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,它的功能是调用嵌入式脚本,所以我们还需要写嵌入式脚本,方法如下: 双击红框: 脚本程序如下,有两个函数:rg2Close与rg2Open,分别用于控制RG2的关闭与打开, openRG2函数中的vrep.simxCallScriptFunction便调用了脚本rg2Open。 rg2Close = function(inInts,inFloats,inStrings,inBuffer) local v = -motorVelocity sim.setJointForce(motorHandle,motorForce) sim.setJointTargetVelocity(motorHandle,v) return {},{v},{},'' end rg2Open = function(inInts,inFloats,inStrings,inBuffer) local v = motorVelocity sim.setJointForce(motorHandle,motorForce) sim.setJointTargetVelocity(motorHandle,v) return {},{v},{},'' end function sysCall_init( ) motorHandle=sim.getObjectHandle('RG2_openCloseJoint') motorVelocity=0.05 -- m/s motorForce=20 -- N rg2Open({}, {}, {}, '') end closeRG2(self):控制RG2闭合,原理与上面一样,vrep.simxCallScriptFunction调用嵌入式脚本rg2Close。rotateAllAngle(self, joint_angle):控制机械臂各关节旋转到joint_angle设定的角度。joint_angle格式:[0,0,0,0,0,0]。举个例子,joint_angle=[0,45,0,-30,0,0],得到的结果是:UR5第二个关节正转45°,第四个关节反转30° 这里用到两个函数: vrep.simxSetJointTargetPosition(clientID,关节句柄,旋转角度,通讯方式):控制关节旋转到参数3设定的角度。 vrep.simxPauseCommunication(clientID, True/False):暂停通信。主要用法:先暂停通讯,存储所有控制命令,再启动通讯一起发送控制命令。rotateCertainAnglePositive(self, num, angle):将第num个关节正转angle度,该函数与第6点的区别在于: rotateAllAngle是关节旋转到某个角度,而rotateCertainAnglePositive是在当前角度的基础上再正转某个角度。举个例子,当前第二个关节的角度是45°,使用rotateAllAngle([0,30,0,0,0,0])得到的结果:第二个关节转到30°,即第二个关节的角度为30°;使用rotateCertainAnglePositive(2,30)的结果:第二个关节在45°的基础上正转30°,即第二个关节的角度为75°rotateCertainAngleNegative(self, num, angle):与第7点类似,将第num个关节反转angle度。 4.图像获取及处理

获取图像这一块内容比较多,所以我们单独用一个篇章来讲。

函数getImageRGB(self): 使用vrep.simxGetVisionSensorImage获取图像数据,但是获取到的数据格式却是下面这样的: 假设RGB图像大小是2*2,三通道,每个像素0-255,如下图: 则vrep.simxGetVisionSensorImage返回的格式是:1,5,9,2,6,10,3,7,11,4,8,12 所以对数据进行如下处理: (1). 将1,5,9,2,6,10,3,7,11,4,8,12每隔3个数提取出来,组成[1,2,3,4],[5,6,7,8],[9,10,11,12] (2). 将[1,2,3,4],[5,6,7,8],[9,10,11,12]分别转成矩阵形式 (3). 使用opencv2将矩阵转成图像形式 (4). 到这一步,我们得到的是翻转后的图像,所以还要使用opencv2将图像再翻转回来 到这一步,我们才获取到了正确的图像数据,函数getImageDepth(self)类似。函数arrayToImage(self)和arrayToDepthImage(self): 将图像数据保存成图片,保存地址分别为文件夹imgTemp和文件夹imgTempDep 5.控制程序 5-1 控制目标

我们使用pygame模块控制机械臂,由于pygame是一个开发游戏的工具,所以使用pygame可以实现用键盘按键操控机械臂运动。

5-2 程序

编写main函数,程序实现的原理如下:

创建一个游戏窗口,游戏窗口显示的内容是摄像头的RGB图像,我们在篇章4图像获取那部分已经用arrayToImage函数得到摄像头图像的图片了,我们只需加载这个图像并在每一帧不断更新便可。 运行效果如图: 可以看到,V-rep的图像已经在我们创建的游戏窗口中显示出来了;同理,修改程序也可以获取深度图像: pygame模块有按键事件功能。通过按键事件我们实现以下功能: (1). Q键/W键:机械臂关节1正/反转。实现原理:使用3-2篇章讲到的rotateCertainAnglePositive函数,按下Q键,关节1正转一定的角度,我们设置这个角度angle=1,即按Q键一次,关节1正转1° (2). 以此类推,实现以下功能: Q键/W键:机械臂关节1正/反转 A键/S键:机械臂关节2正/反转 Z键/X键:机械臂关节3正/反转 E键/R键:机械臂关节4正/反转 D键/F键:机械臂关节5正/反转 C键/V键:机械臂关节6正/反转 Y键/T键:打开/关闭RG2 P键:退出程序 L键:重置机械臂关节并修改angle的值 空格键:保存摄像头图像,保存地址在文件夹saveImg中 5-3 其它

到目前为止,我们的文件夹目录层次结构如下: 更多API可以参考 V-rep python函数库:Remote API functions (Python)

6.为后续做准备

我们接下来用YOLOV3做一个目标识别实验,识别对象是一个圆球,如图: 我们已经可以用键盘控制机械臂了,而且有保存摄像头图像的功能,保存地址在文件夹saveImg中,于是我们便可以控制机械臂去采集图像,制作成训练集。如图,这是部分训练集: 具体细节我们会在后面的文章中说明。

7.附录-完整程序 #-*- coding:utf-8 -*- """ keyboard Instructions: robot moving velocity:


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3