'How to calculate the matrices A and B of a system model for a robot in mujoco/python

I want to calcultae the matrices A and B (xk+1 = Axk + Buk) from a robot model(kukaiiwa14) while simulation using mujoco_py. I need A and B matrices to compute optimal control on my robot. If someone has an idea how to solve this problem I'll be so grateful.

This is my code:

odel=load_model_from_path("/home/boudhina/.mujoco/mujoco210/kuka/kuka.xml")
sim=MjSim(model)
viewer=MjViewer(sim)

sim.step(1)
t=0
while True:
 ##simulation:
 viewer.render()
 t+=1
 sim.step(1)

 ##Variables:
 nq=sim.model.nq
 nv=sim.model.nv
 #sim.data.qfrc_applied[2]=5
 time=sim.data.time
 qpos=sim.data.qpos
 qvel=sim.data.qvel
 C=sim.data.qfrc_bias
 M=sim.data.qM
 Jc=sim.data.efc_J
 print('constraint Jacobian:',Jc)
 print('Size of constraint Jacobian:',np.shape(Jc))
 def Jacobian(n):
  J = np.zeros((6, nq))
  jacp = np.zeros(nv*3)
  jacr = np.zeros(nv*3)
  mjp.cymj._mj_jac(sim.model, sim.data, jacp, jacr, sim.data.get_body_xpos('iiwa_link_4'), 
sim.model.body_name2id('iiwa_link_4'))
  J[0:3,:] = jacr.reshape(3, nv)
  J[3:6,:] = jacp.reshape(3, nv)
  return J

 J=Jacobian(nq)
 print('Jacobian:',J)
 print('Size of Jacobian:',np.shape(J))
 wdot=np.dot(J,qvel)
 print('wdot:',wdot)
 '''wdot=task space position'''
 #sim.data.qfrc_inverse
 ''' _mj_fullM Convert sparse inertia matrix M into full (i.e. dense) matrix.'''
 def mass_matrix(nv):
  mass_matrix=np.ndarray(shape=(nv ** 2,), dtype=np.float64, order="C")
  mjp.cymj._mj_fullM(sim.model,mass_matrix,M)
  mass_matrix=np.reshape(mass_matrix,(nv,nv))
  return mass_matrix
 ##computed-torque-control:
 t=sim.data.time
 #kp=700
 #kv=400

 def coef_ubertragungsfkt(T1,T2):
  kp=1/(T1*T2)
  kv=(T1+T2)/(T1*T2)
  return kp,kv
 kp,kv=coef_ubertragungsfkt(0.02,0.5)



def coef(T,init_pos,end_pos):
  a_0=init_pos
  a_1=0
  a_3=-(2/(T*T*T))*(end_pos-a_0)
  a_2=-3/2*a_3*T
  return a_0,a_1,a_2,a_3


##trajectory_planning
 a_0,a_1,a_2,a_3=coef(4,1,2)
 #b_0,b_1,b_2,b_3=coef(4,2,3)
 for i in range(1,5,1):
  f=a_0+a_1*i+a_2*i**2+a_3*i**3
  g=a_1+2*a_2*i+3*a_3*i**2
  M1=mass_matrix(nv)
  qsoll=np.array([1,1.5,0,f,0,0,0])
  qvelsoll= np.array([0,0,0,g,0,0,0])
  qacc=kv*(qvelsoll-qvel)+kp*(qsoll-qpos)
  tau=np.dot(M1,qacc)+C

  sim.data.ctrl[1]=tau[0]
  sim.data.ctrl[4]=tau[1]
  sim.data.ctrl[7]=tau[2]
  sim.data.ctrl[10]=tau[3]
  sim.data.ctrl[13]=tau[4]
  sim.data.ctrl[17]=tau[5]
  sim.data.ctrl[20]=tau[6]
 if  t>4:
    break


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source