controllable_joints = [i for i inrange(p.getNumJoints(robotId)) if p.getJointInfo(robotId, i)[2] != p.JOINT_FIXED]
#################初始化角度############################## zero_vec = [0.0] * len(controllable_joints) kp = 1.0 kv = 1.0 p.setJointMotorControlArray( robotId, controllable_joints, p.POSITION_CONTROL, targetPositions=q1, targetVelocities=zero_vec, positionGains=[kp] * len(controllable_joints), velocityGains=[kv] * len(controllable_joints) ) for _ inrange(100): # to settle the robot to its position p.stepSimulation()
joint_state = p.getJointStates(robotId,controllable_joints) joint_theta = [i[0] for i in joint_state] joint_velocity = [i[1] for i in joint_state] joint_torque = [i[3] for i in joint_state] #########################################################
该部分代码完成了模型加载、重力设置、遍历可运动关节、设置当前角度为q1并计算关节角及其一阶二阶导
controllable_joints = [i for i in range(p.getNumJoints(robotId)) if p.getJointInfo(robotId, i)[2] != p.JOINT_FIXED]是常用的遍历可运动关节的操作
while n < q.shape[0]: joint_states = p.getJointStates(robotId,controllable_joints) q_actual = np.array([state[0] for state in joint_states]) qd_actual = np.array([state[1] for state in joint_states])
q_e = q[n] - q_actual qd_e = qd[n] - qd_actual
aq = qdd[n] + 400 * q_e + 40 * qd_e
tau = p.calculateInverseDynamics(robotId,list(q_actual),list(qd_actual),list(aq)) p.setJointMotorControlArray(robotId,controllable_joints,p.TORQUE_CONTROL, forces = tau, ) p.stepSimulation() print(tau) time.sleep(dt) n += 1