位置和位姿

乐白机器人LM3为六轴(六个关节)机器人,每个关节的旋转量组成关节位置描述(简称关节位置)。
以机器底座为基坐标,乐白机器人末端的笛卡尔空间位置和姿态(简称空间位置或位姿)形成的坐标描述,这里称之为笛卡尔坐标位置。

正解

  • 方法:cart = lebai.kinematics_forward(jpose)
    通过机器人正向运动学将关角度坐标转成笛卡尔位置和姿态表达的坐标。
  • 返回值:dict 类型。返回笛卡尔空间位置和姿态
  • 使用示例:
import lebai_sdk
lebai_sdk.init()
import nest_asyncio
nest_asyncio.apply()
robot_ip = "192.168.4.118" 
lebai = lebai_sdk.connect(robot_ip, False) 

joint_pose =  [0, -0.7853981633974483, 1.5707963267948966, -0.7854940371966911, 1.5707963267948966, 0] #关节数据
cartesian_pose = {'x' : -0.465, 'y' : -0.121, 'z' : 0.13, 'rz' : -1.57, 'ry' : 0, 'rx' : 1.57}#目标位姿笛卡尔数据
cart = lebai.kinematics_forward(joint_pose)
print(cart) #笛卡尔坐标位置

反解

  • 方法:joints = lebai.kinematics_inverse(pose,joints )
    通过机器人逆向运动学反解,将笛卡尔位置和姿态转换成关节角度。计算结果与当前 TCP 设置和当前关节位置有关。

    参数类型说明
    posedict笛卡尔位置和姿态
    jointslist反解参考的关节位置。可选,默认为当前反馈关节位置。当反解出现多解时,会取距离参考关节位置joints 最近的一个解。
  • 返回值:list 类型。返回关节位置

  • 使用示例:
import lebai_sdk
lebai_sdk.init()
import nest_asyncio
nest_asyncio.apply()
robot_ip = "192.168.4.118" 
lebai = lebai_sdk.connect(robot_ip, False) 

joint_pose =  [0, -0.7853981633974483, 1.5707963267948966, -0.7854940371966911, 1.5707963267948966, 0] #参考点关节数据
cartesian_pose = {'x' : -0.465, 'y' : -0.121, 'z' : 0.13, 'rz' : -1.57, 'ry' : 0, 'rx' : 1.57}#位姿笛卡尔数据
joints = lebai.kinematics_inverse(cartesian_pose , joint_pose )
print(joints) #关节位置

位姿特征坐标系转换

  • 方法:c = lebai.pose_trans(a, b)
    a 为一个相对机器人底座世界坐标系变换后的新坐标系 {A},b 是相对于坐标系 {A} 的位姿描述。最后返回b相对于机器人世界坐标系的位姿描述。

    参数类型说明
    adict位姿 A
    bdict位姿 B
  • 返回值:dict 类型。返回位姿 C=AB,是b相对于机器人世界坐标系的位姿描述,

位姿的逆

  • 方法:c = lebai.pose_inverse(a)
    用于求位姿 a 对应的齐次矩阵 A,A的逆的位姿描述。可用于求解位姿方程。
  • 返回值:dict 类型。返回A的逆矩阵对应的笛卡尔位置和位姿,
  • 使用示例:
    • 已知用户坐标系位姿 a(可以为某个示教点),然后示教出另一个点 b,用该方法可以求出 b 相对于 a 的描述。
    • 计算出该结果之后,当用户坐标系发生改变,但示教点相对位置不变时,无需重新示教。
    • AX=B → X=A^−1B
  • 使用示例
import lebai_sdk
lebai_sdk.init()
import nest_asyncio
nest_asyncio.apply()
robot_ip = "192.168.4.118" 
lebai = lebai_sdk.connect(robot_ip, False) 

cartesian_pose1 = {'x' : 0.3, 'y' : 0, 'z' : 0.36, 'rz' : 0, 'ry' : 0, 'rx' : 1.57} 
cartesian_pose2 = {'x' : 0.35, 'y' : 0, 'z' : 0.36, 'rz' : 0, 'ry' : 0, 'rx' : 1.57} 
inverse_a = lebai.pose_inverse(cartesian_pose1)
offset_position = lebai.pose_trans(inverse_a, cartesian_pose2) #计算cartesian_pose2 相对于cartesian_pose1 的位姿描述
print('offset_position',offset_position)
# 输出 相当于b点在a点x轴方向0.05m处
# offset_position {'x': 0.04999999999999999, 'y': 0.0, 'z': -1.5986561033298763e-16, 'rx': -2.96059473233375e-16, 'ry': -0.0, 'rz': 0.0}

位姿的加

  • 方法:pose = lebai.pose_add(base, delta, frame)
    从base位置,往frame方向移动delta后的位姿。

    参数类型说明
    basedict起始位姿
    posedict位姿偏移量
    framedict位姿偏移量方向,仅姿态部分有效。可空,默认基座方向
  • 返回值:dict 类型。返回移动后的位姿

  • 使用示例:
import lebai_sdk
lebai_sdk.init()
import nest_asyncio
nest_asyncio.apply()
robot_ip = "192.168.4.118" 
lebai = lebai_sdk.connect(robot_ip, False) 
    
#如果想让当前位置姿态,以某个坐标系,进行姿态变换。例如相对于基座坐标系,沿着基座z轴增加0.1
base = lebai.get_kin_data()['actual_tcp_pose'] #当前末端坐标
print(base)
delta = {'x' : 0, 'y' :0, 'z' : 0.1, 'rz' :0, 'ry' : 0, 'rx' : 0}  #沿着frame坐标系z轴方向移动0.1m
frame  ={'x' : 0, 'y' :0, 'z' : 0, 'rz' :0, 'ry' : 0, 'rx' : 0}  #基座坐标系 位姿偏移量方向,仅姿态部分{'rz' :0, 'ry' : 0, 'rx' : 0}有效。
pose = lebai.pose_add(base, delta, frame)
print('pose',pose)

#  基座坐标的绕y轴旋转45°,使z轴斜向上 的新坐标系,沿着基座z轴增加0.1
base = lebai.get_kin_data()['actual_tcp_pose'] #当前末端坐标
delta = {'x' : 0, 'y' :0, 'z' : 0.1, 'rz' :0, 'ry' : 0, 'rx' : 0}  #沿着frame坐标系z轴方向移动0.1m
frame  ={'x' : 0, 'y' :0, 'z' : 0, 'rz' :0, 'ry' :-0.78, 'rx' : 0}  #绕y轴旋转45°,使z轴斜向上 的新坐标系, 仅姿态部分{'rz' :0, 'ry' : -0.78, 'rx' : 0}有效。
pose = lebai.pose_add(base, delta, frame)
print('pose',pose)

从资源库加载路点位姿

  • 方法:pose = lebai.load_pose(name, dir)

    参数类型说明
    namestring位置名称
    dirstring位置所在文件名称。可选,默认根目录
  • 返回值:list 类型。返回对应位置库里的关节位置信息。

  • 使用示例:
import lebai_sdk
lebai_sdk.init()
import nest_asyncio
nest_asyncio.apply()
robot_ip = "192.168.4.118" 
lebai = lebai_sdk.connect(robot_ip, False) 
pose = lebai.load_pose('test_pose')
print(pose)

保存路点位姿到资源库中

  • 方法:lebai.save_pose(name,pose,dir)

    参数类型说明
    namestring位置名称
    posedict笛卡尔位姿坐标,不能是关节角坐标
    dirstring位置所在文件名称。可选,默认根目录
  • 返回值:无返回值。

  • 使用示例:
import lebai_sdk
lebai_sdk.init()
import nest_asyncio
nest_asyncio.apply()
robot_ip = "192.168.4.118" 
lebai = lebai_sdk.connect(robot_ip, False) 
status_dic = lebai.get_kin_data()  #获取手臂当前运动数据,返回一个字典,具体官网有详细说明。 其中 actual_joint_pose 和 actual_tcp_pose 分别是关节角坐标表达的位置和笛卡尔坐标表达的位置

target_tcp_pose = status_dic['target_tcp_pose']
print(target_tcp_pose)
lebai.save_pose('target_tcp_pose',target_tcp_pose )

{'x': -0.3495884820302103, 'y': -0.11473633482509966, 'z': 0.012462786119221903, 'rx': 1.4486401649447256, 'ry': -0.016160481436128617, 'rz': -1.5246867274317424}