【睿尔曼-RealMan】基于python的机械臂正逆解接口函数调用例程

l 2024-06-17

一、连接机械臂时调用正逆解接口:

1.正解函数定义(调用时无需关注)

 


def Algo_Forward_Kinematics(cls, joint):
    """
    brief Algo_Forward_Kinematics 正解函数
    param joint 关节1到关节7角度 单位°
    return Pose 目标位姿
    """
    cls.pDll.Algo_Forward_Kinematics.restype = Pose
    joint = (ctypes.c_float * 7)(*joint)
    Pose_ = cls.pDll.Algo_Forward_Kinematics(joint)
    position = Pose_.position
    euler = Pose_.euler
    pose = [position.x, position.y, position.z, euler.rx, euler.ry, euler.rz]
    return pose
 

 

2.函数调用

(1)导入对应的库文件;

 

from robotic_arm_package.robotic_arm import *
import sys
 

 

(2)调用正解函数

 

def demo(robot): #自定义函数,传入'robot'   
 

 

在进行正逆解之前,需要先获取机械臂的当前状态,机械臂安装角度、工作坐标系等。

 

ret1 =robot.Get_Install_Pose()
if ret1 != 0:
    print("当前机械臂安装角度" + str(ret1))
    sys.exit()
ret2 =robot.Get_Current_Work_Frame()
if ret2 != 0:
    print("当前机械臂工作坐标系" + str(ret2))
    sys.exit()
 

 

正解:由机械臂关节角度转换到位姿的过程。

输入关节角度,例:

 

joint = [0, 0, -90, 0, -90, 0]
 

 

将参数传入正解函数,并输出正解结果:

 

# 正解
compute_pose = Arm.Algo_Forward_Kinematics(joint)
print(f'正解结果:{compute_pose}')
 

逆解:由位姿转换成机械臂的关节角度的过程。

 

Algo_Inverse_Kinematics(q_in, q_pose, flag)
 

 

q_in为上一时刻的关节角;

q_out为位姿参数,即x,y,z,rx,ry,rz,注意单位,x,y,z的单位是米,rx,ry,rz的单位是弧度;

flag代表姿态参数类别,0为四元数,1为欧拉角。

 

 # 逆解
 compute_pose =[0.210,0,0.324,3.141,0,0]
 res = Arm.Algo_Inverse_Kinematics(joint, compute_pose, 1)
 print(f'逆解:{res}')
 

 

(3)主函数调用

注册回调函数 mcallback (目前I系列不会调用此接口)

 

if __name__ == "__main__":
    def mcallback(data):
        print('0')
    # 连接机械臂,注册回调函数
    callback = CANFD_Callback(mcallback)
    robot = Arm(RM65, "192.168.1.18", callback)
    # API版本信息
    print(robot.API_Version())
    # 运行示例
    demo7(robot)
    time.sleep(10) #给一定时间,容许页面打印出正逆解结果
    # 断开连接
    robot.RM_API_UnInit()
    robot.Arm_Socket_Close()
    
 

输出结果:

二、不连接机械臂时调用正逆解接口:

1. 在正逆解之前,需要先进行初始化算法依赖,即定义机械臂型号和传感器型号。

2. 需设置机械臂的安装角度和工作坐标系。

以RM65-B为例,进行正逆解接口调用。

# 不连接机械臂的情况下,调用算法接口
dmode = RobotType.RM65
rbt_type = SensorType.B
Arm.Algo_Init_Sys_Data(dmode, rbt_type) #定义机械臂型号为65-B
# 设置算法的安装角度
Arm.Algo_Set_Angle(0, 0, 0)
# 设置算法的工作坐标系
coord_work = FRAME()
coord_work.frame_name.name = "123".encode()
coord_work.pose.position.x = 0
coord_work.pose.position.y = 0
coord_work.pose.position.z = 0
coord_work.pose.euler.rx = 0
coord_work.pose.euler.ry = 0
coord_work.pose.euler.rz = 0
Arm.Algo_Set_WorkFrame(coord_work)
curr_pose = Arm.Algo_Get_Curr_WorkFrame()
print(f"当前工作坐标系:{curr_pose.frame_name.name, curr_pose.pose.position.x, curr_pose.pose.position.y, curr_pose.pose.position.z, curr_pose.pose.euler.rx, curr_pose.pose.euler.ry, curr_pose.pose.euler.rz}")
# 计算正解结果
joint = [0, 0, 90, 0, 90, 0]
compute_pose = Arm.Algo_Forward_Kinematics(joint)
print(f'正解:{compute_pose}')
# 计算逆解
tar = [0.210,0,0.324,3.141,0,0]
q_in = [0, 0, 90, 0, 90, 0]
q_out = Arm.Algo_Inverse_Kinematics(q_in, tar, 1)
print(f'逆解·:{q_out}')
# 断开连接
robot.RM_API_UnInit()
robot.Arm_Socket_Close()
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 条评论

关于作者

l

这家伙很懒,什么也没写!

选择发帖板块
选择发帖板块