PyBullet(八)实时控制机器人手臂参数(以UR5机器人手臂为例)(有需要上传油管的视频)

系列文章目录:
上一篇:
PyBullet(七)在PyBullet中使用VR
下一篇:

系统:Win10
PyBullet:(官方链接)(官方指南


1. 整体思路

没啥思路,直接开整!


2. 代码解析


2.1 代码分步


2.1.1 库

import pybullet as p
import time
import pybullet_data
import math
from collections import namedtuple
from attrdict import AttrDict

最基础的导入包啊,库啊。没有安装的可以自行pip/pip3 install ......


2.1.2 连接物理模拟

physicsClient = p.connect(p.GUI)#or p.DIRECT for non-graphical version
p.setAdditionalSearchPath(pybullet_data.getDataPath()) #optionally
p.setGravity(0,0,-9.81)#设置重力

导入PyBullet模块后,首先要做的是 "连接 "物理模拟。PyBullet是围绕客户端-服务器驱动的API设计的,客户端发送命令,物理服务器返回状态。PyBullet有一些内置的物理服务器。DIRECT和GUI。GUI和DIRECT连接都会在与PyBullet相同的过程中执行物理模拟和渲染。

至于p.setAdditionalSearchPath(pybullet_data.getDataPath())你可以提供你自己的数据文件,也可以使用PyBullet附带的PyBullet_data包。为此,导入 pybullet_data 并使用pybullet.setAdditionalSearchPath(pybullet_data.getDataPath())注册该目录。


2.1.3 “固定视角”

哈哈哈哈哈哈不是不能改变视角,而是在每次启动程序的时候都能是固定视角。

p.resetDebugVisualizerCamera(cameraDistance=2,cameraYaw=0,cameraPitch=-40,cameraTargetPosition=[0.5,-0.9,0.5])#转变视角

2.1.4 加载模型

planeId = p.loadURDF("plane.urdf")
robotId = p.loadURDF("D:/Work/Internship/porject/object/UR5.urdf",useFixedBase = True)

记得要更改模型加载的地址!

模型链接:PyBullet(六)UR5机器人手臂模型


2.1.5 登记各个节点的信息

#记录各个节点类型的列表
jointTypeList = ["REVOLUTE", "PRISMATIC", "SPHERICAL", "PLANAR", "FIXED"]
#得到机器人的节点个数
numJoints = p.getNumJoints(robotId)
#属于提前创造存储节点信息的数据结构
jointInfo = namedtuple("jointInfo",["id","name","type","lowerLimit","upperLimit","maxForce","maxVelocity"])
#另一个数据结构
joints = AttrDict()
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 = info[10]
    jointMaxVelocity = info[11]
    singleInfo = jointInfo(jointID,jointName,jointType,jointLowerLimit,jointUpperLimit,jointMaxForce,jointMaxVelocity)
    joints[singleInfo.name] = singleInfo

可以打印出来看看里面的内容,不会用函数的可以上网查一查,这里就不再赘述了。

print(joints)

2.1.6 添加界面右边的参数

图1

界面示例

#创建空列表
position_control_group = []
#将创建的参数存到空列表中
#参数:["节点名字","可滑动最小的角度","可滑动最大的角度","节点初始角度"]
position_control_group.append(p.addUserDebugParameter('joint0', -math.pi, math.pi, 0))
position_control_group.append(p.addUserDebugParameter('joint1', -2.0 / 3 * math.pi, -1.0 / 3 * math.pi, -0.5 * math.pi))
position_control_group.append(p.addUserDebugParameter('joint2', -0.5 * math.pi, 0.5 * math.pi, 0))
position_control_group.append(p.addUserDebugParameter('joint3', -math.pi, 0, -0.5 * math.pi))
position_control_group.append(p.addUserDebugParameter('joint4', -0.5 * math.pi, 0.5 * math.pi, 0))
position_control_group.append(p.addUserDebugParameter('joint5', -math.pi, math.pi, 0))

2.1.7 代码主体(呈现“参数”)

position_control_joint_name = ["joint0","joint1","joint2","joint3","joint4","joint5"]
print("position_control_group:",position_control_group)
while True:
    time.sleep(0.01)
    parameter = []
    #将添加的参数“读”出来
    for i in range(6):
        parameter.append(p.readUserDebugParameter(position_control_group[i]))
    num = 0
    print("parameter:",parameter)
    for jointName in joints:
        if jointName in position_control_joint_name:
            joint = joints[jointName]
            parameter_sim = parameter[num]
            #机器人手臂的移动
            #可参考[PyBullet (二) 机器人手臂的简单移动]
            #(https://blog.csdn.net/xzs1210652636/article/details/109184775#t11)中的setJointMotorControlArray
            p.setJointMotorControl2(robotId, joint.id, p.POSITION_CONTROL,
                                    targetPosition=parameter_sim,
                                    force=joint.maxForce,
                                    maxVelocity=joint.maxVelocity)
            num = num + 1
    p.stepSimulation()

大家运行的时候可以把“print”删掉,这个是我一开始测试用的。


2.2 代码总体

# -*- coding: utf-8 -*-
"""
Created on Wed Mar 10 10:57:49 2021

@author: 12106
"""


import pybullet as p
import time
import pybullet_data
import math
from collections import namedtuple
from attrdict import AttrDict

physicsClient = p.connect(p.GUI)#or p.DIRECT for non-graphical version
p.setAdditionalSearchPath(pybullet_data.getDataPath()) #optionally
p.setGravity(0,0,-9.81)

p.resetDebugVisualizerCamera(cameraDistance=2,cameraYaw=0,cameraPitch=-40,cameraTargetPosition=[0.5,-0.9,0.5])#转变视角


planeId = p.loadURDF("plane.urdf")
robotId = p.loadURDF("D:/Work/Internship/porject/object/UR5.urdf",useFixedBase = True)

#登记各个节点的信息
jointTypeList = ["REVOLUTE", "PRISMATIC", "SPHERICAL", "PLANAR", "FIXED"]
numJoints = p.getNumJoints(robotId)
jointInfo = namedtuple("jointInfo",["id","name","type","lowerLimit","upperLimit","maxForce","maxVelocity"])
joints = AttrDict()
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 = info[10]
    jointMaxVelocity = info[11]
    singleInfo = jointInfo(jointID,jointName,jointType,jointLowerLimit,jointUpperLimit,jointMaxForce,jointMaxVelocity)
    joints[singleInfo.name] = singleInfo

print(joints)

for jointName in joints:
    print("jointName:",jointName)
    
    
position_control_group = []
position_control_group.append(p.addUserDebugParameter('joint0', -math.pi, math.pi, 0))
position_control_group.append(p.addUserDebugParameter('joint1', -2.0 / 3 * math.pi, -1.0 / 3 * math.pi, -0.5 * math.pi))
position_control_group.append(p.addUserDebugParameter('joint2', -0.5 * math.pi, 0.5 * math.pi, 0))
position_control_group.append(p.addUserDebugParameter('joint3', -math.pi, 0, -0.5 * math.pi))
position_control_group.append(p.addUserDebugParameter('joint4', -0.5 * math.pi, 0.5 * math.pi, 0))
position_control_group.append(p.addUserDebugParameter('joint5', -math.pi, math.pi, 0))

position_control_joint_name = ["joint0","joint1","joint2","joint3","joint4","joint5"]
print("position_control_group:",position_control_group)
while True:
    time.sleep(0.01)
    #p.configureDebugVisualizer(p.COV_ENABLE_SINGLE_STEP_RENDERING)  # 允许机械臂慢慢渲染
    
    parameter = []
    for i in range(6):
        parameter.append(p.readUserDebugParameter(position_control_group[i]))
    num = 0
    print("parameter:",parameter)
    for jointName in joints:
        if jointName in position_control_joint_name:
            joint = joints[jointName]
            parameter_sim = parameter[num]
            p.setJointMotorControl2(robotId, joint.id, p.POSITION_CONTROL,
                                    targetPosition=parameter_sim,
                                    force=joint.maxForce,
                                    maxVelocity=joint.maxVelocity)
            num = num + 1
    p.stepSimulation()


     

3. 效果展示

视频演示(Bilibili)
视频演示(YouTube)(暂无)


4. 总结

这一段代码的目的是为了让我们更加方便的调试机器人上手臂,让我们共同进步!

  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: 肌电控制机器人手臂是一种利用肌电信号控制机器人手臂的技术。肌电信号是肌肉活动时产生的电信号,可以通过肌电传感器采集并转换成控制信号,用于控制机器人手臂的运动。 肌电控制机器人手臂技术的应用领域非常广泛,如康复医疗、残障人士辅助器具、工业自动化等。通过肌电控制技术,残障人士可以使用机器人手臂完成日常生活中的一些动作,康复医疗中也可以用于帮助患者进行肌肉训练。在工业自动化领域,肌电控制机器人手臂可以实现人机协作,提高生产效率。 肌电控制机器人手臂技术目前还存在一些挑战,如信号采集和处理、算法优化等问题,需要继续进行研究和改进。 ### 回答2: 肌电控制机器人手臂是一种通过检测和解读肌肉电信号来实现手臂运动的先进技术。这种技术的发展相对较新,但在医学康复、辅助生活等领域的应用前景广阔。 肌电控制技术主要依托于肌肉电信号的采集和处理。通过将电极安装在患者的皮肤上,可以记录到肌肉收缩所产生的电信号。这些信号经过放大和滤波处理后,可以将其转化为机器人手臂运动的控制指令。 肌电控制机器人手臂的应用十分广泛。在医学康复领域,肌电控制机器人手臂可以帮助恢复肢体功能,提供精确的运动训练和康复治疗。不仅可以恢复肌肉力量和运动协调性,还可以改善患者的日常生活质量。 此外,肌电控制机器人手臂也可以用于辅助生活。例如,对于丧失运动能力的人群,肌电控制机器人手臂可以成为他们生活的延伸,帮助完成日常活动,如吃饭、穿衣和洗漱等。同时,该技术还可以用于危险环境下的搬运和操作,以降低人工操作的风险。 总结而言,肌电控制机器人手臂是一种将肌肉电信号应用于机器人手臂运动控制的先进技术。其广泛的应用领域和潜在的发展前景使其成为医疗康复和辅助生活领域的研究热点。然而,该技术仍面临着一些挑战,如肌电信号检测和处理的精准性和稳定性,以及机器人手臂的设计和操控等问题,需要进一步的研究和改进。 ### 回答3: 肌电控制机器人手臂是一种利用肌电信号(EMG)来实现手部运动控制的技术。肌电信号是指肌肉运动时产生的电化学信号,可通过电极采集和测量。利用肌电控制技术,机器人手臂可以实现与人类手臂相似的运动。 肌电控制机器人手臂的综述可分为以下几个方面: 首先,肌电信号采集和处理是肌电控制机器人手臂的关键技术。通过电极固定在皮肤上,采集到的肌电信号需要进行滤波、放大和可视化处理,以获得有效的控制信号。 其次,肌电控制机器人手臂的运动模式包括单通道和多通道控制。单通道控制使用一个肌电信号来实现手部运动,而多通道控制则利用多个肌电信号来实现更精细的运动控制。 此外,肌电控制机器人手臂的分类可分为表面肌电控制和深部肌电控制。表面肌电控制通过电极贴附在皮肤上来采集肌电信号,适用于一般的手部动作控制。深部肌电控制则通过电极植入到肌肉组织中来采集肌电信号,可以实现更精细的手部运动控制。 最后,肌电控制机器人手臂在医疗康复、辅助生活和工业生产等领域具有广阔的应用前景。例如,在康复领域,肌电控制机器人手臂可以帮助康复患者恢复手部运动功能。在工业生产中,肌电控制机器人手臂可以辅助人类完成高强度、高精度的工作任务。 总之,肌电控制机器人手臂是一项新兴的技术,通过捕捉和利用肌电信号,能够实现精细、自然的手部运动控制。在未来,随着技术的进一步发展和应用的拓展,肌电控制机器人手臂将在各个领域展现出更广泛的应用和潜力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值