首页 > 解决方案 > 如何从一个函数调用中保存变量的值并将其用于下一个函数调用?

问题描述

我正在实现机器人操纵器的笛卡尔控制,您可以在下面看到产生关节速度以执行控制的函数:

def cartesian_control(joint_transforms, b_T_ee_current, b_T_ee_desired,
                      red_control, q_current, q0_desired):
    num_joints = len(joint_transforms)
    dq = numpy.zeros(num_joints)
    
    ee_current_T_b = tf.transformations.inverse_matrix(b_T_ee_current)    
    current_T_desired = numpy.dot(ee_current_T_b, b_T_ee_desired)    
    current_P_desired = tf.transformations.translation_from_matrix(current_T_desired)    
    current_R_desired = current_T_desired[:3,:3]    
    angle, axis = rotation_from_matrix(current_T_desired)
    rot_movement = numpy.dot(angle,axis)
    desired_R_current = tf.transformations.inverse_matrix(current_R_desired)
    
    delta_X = numpy.append(current_P_desired, rot_movement)
    
    # Proportional - Derivative Controller 
    Kp = 5 # Proportional Gain
    Kd = 1 # Derivative Gain
    delta_delta_X = (delta_X - delta_X_prev)/0.01
    
    x_dot = Kp*delta_X + Kd*delta_delta_X
    
    # Scale translational and angular velocities for smoothness    
    for i in range(3):
        if x_dot[i] > 1:
            x_dot[i] = 1
            
    for i in range(3,1,5):
        if x_dot[i] > 0.1:
            x_dot[i] = 0.1
    
    J = numpy.empty((6,0))
    V = numpy.zeros((6,6))
    
    for i in range(num_joints):
        
        b_T_joint = joint_transforms[i]        
        ee_T_joint = numpy.dot(ee_current_T_b, b_T_joint)        
        joint_T_ee = tf.transformations.inverse_matrix(ee_T_joint)        
        ee_R_joint = rotation_matrix(ee_T_joint)        
        joint_P_ee = tf.transformations.translation_from_matrix(joint_T_ee)        
        joint_skew_matrix = S_matrix(joint_P_ee)        
        V[:3,:3] = ee_R_joint
        V[3:6,3:6] = ee_R_joint
        V[:3, 3:6] = numpy.dot(-ee_R_joint, joint_skew_matrix)
        
        J = numpy.column_stack((J, V[:,5]))
        
    J_pseudoinv = numpy.linalg.pinv(J, rcond=0.01)
    dq = numpy.dot(J_pseudoinv, x_dot)
    
    # Scale joint velocities
    for i in range(len(dq)):
        
        if dq[i] > 0.1:
            dq[i] = 0.1

    return dq

如果我只实现一个比例控制器,上述功能可以完美运行,这意味着如果x_dot = Kp*delta_X + Kd*delta_delta_X1我只有x_dot = Kp*delta_X. 但是,我也想实现一个比例微分控制器,但我的问题是如何获得delta_X_prev变量。这意味着我需要找到一种方法来保存delta_X一个函数调用的变量值并在函数调用中使用它。做了一些搜索,我发现multiprocessingpython 模块会有所帮助,但真的没有理解它的整个概念。有没有其他更简单的方法可以做到这一点?

标签: pythonpython-3.xfunctionros

解决方案


推荐阅读