带有onrobot_rg2夹爪的ur3机械臂在pybullet中的仿真

本文介绍了如何在Pybullet环境中对ur3机械臂与onrobot_rg2夹爪进行仿真,包括控制夹爪开合与机械臂关节角度。参考了Chen matafela的工作,并详细解释了模拟过程,如添加重力、设置相机视角、导入模型、模拟夹爪的mimic功能等。此外,提供了相关资源链接和代码示例。
摘要由CSDN通过智能技术生成

Simulation of ur3 with onrobot_rg2 by pybullet

本文对带有onrobot_rg2的ur3机械臂在pybullet虚拟世界中进行仿真,能够控制夹爪的张合,机械臂的各关节角度,具体效果如动图所示.

Simulation of ur3 with onrobot_rg2 by pybullet
仿真是在参考Chen matafela的 pybullet_grasp_annotator_robotiq_85.基础上完成的,onrobot_rg2夹爪的urdf模型是我用SW的插件导出的,ur3机械臂的urdf模型可以用xacro文件转换.感谢我的师兄帮我找到了这个资料,让我能够有了进一步的进展.话不多说,直接进入到代码的讲解.

import pybullet as p
import pybullet_data as pd
// connect to engine servers
physicsClient = p.connect(p.GUI)
// add search path for loadURDF
p.setAdditionalSearchPath(pd.getDataPath())

p.connect(p.GUI)用来启动仿真,setAdditionalSearchPath()用来寻找目录中的文件.
接下来,定义虚拟环境中的世界,添加下面这句代码.

// define world
p.setGravity(0,0,-9.8)
p.resetDebugVisualizerCamera(cameraDistance=2,cameraYaw=0,cameraPitch=-40,cameraTargetPosition=[0.5,-0.9,0.5])

p.setGravity(0,0,-9.8)这句代码在虚拟世界中添加重力,调整视窗用p.resetDebugVisualizerCamera (),参数中cameraTargetPosition指摄像机的位置,cameraDistance指相机的焦距的变化,类似变焦.
然后,就是导入机器人模型,robotStartPosrobotStartOrn表示的是机器人起始时的位姿.

robotUrdfPath = "./ur3/ur3_visual_grabbing_with_rg2.urdf"
robotStartPos = [0, 0, 0]
robotStartOrn = p.getQuaternionFromEuler([0, 0, 0])
robotID = p.loadURDF(robotUrdfPath, robotStartPos, robotStartOrn,
                     flags=p.URDF_USE_SELF_COLLISION_EXCLUDE_PARENT)

在虚拟世界中添加一些物体,包括桌子、kinect_v2相机和小方块,用于接下来的视觉抓取.

//load Object
tableUid = p.loadURDF("table/table.urdf",basePosition=[0.5,0,-0.65])
kinect_v2Uid = p.loadURDF("ur3/kinect_v2.urdf",basePosition=[0.4,0,1.57])
objectUid = p.loadURDF("cube_small.urdf",basePosition=[0.7,0,0])
from collections import namedtuple
from attrdict import AttrDict

导入两个python模块,namedtupleAttrDict.namedtuple是继承自tuple的子类.namedtuple创建一个和tuple类似的对象,而且对象拥有可访问的属性.下面代码定义了一个namedtuple类型的jointInfo,并包含id、name、type、lowerLimit、upperLimit、maxForce和maxVelocity属性.
python的Attrdict模块能够像给类对象赋值一样修改dict对应key的value,下面代码创建了一个空的字典joints用来存储各关节的信息.
p.getNumJoints(robotID)用来得到各关节的序号值.

jointTypeList = ["REVOLUTE", "PRISMATIC", "SPHERICAL", "PLANAR", "FIXED"]
numJoints = p.getNumJoints(robotID)
jointInfo = namedtuple("jointInfo",
                       ["id","name","type","lowerLimit","upperLimit","maxForce","maxVelocity"])

joints = AttrDict()
//  get jointInfo
for i in range(numJoints):
    info = p.getJointInfo(robotID, i)
    jointID = info[0]
    jointName = info[1].decode("utf-8")
    jointType = jointTypeList[info[2]]
    jointLowerLimit = info[8]
    jointUpperLimit = info[9]
    jointMaxForce 
  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值