
    <j|                     t    d Z ddlZddlZddlZddlmc mZ ddl	m
Z dZd Zd Zd Zd Zed	k(  r e        yy)
a"  Real self-intersection checker for the SO-100 arm (FK + mesh-mesh collision).

The URDF carries only <visual> geometry, so MuJoCo reports no contacts. This parses the URDF, does
forward kinematics at a set of joint poses, places every visual mesh in the world, and runs true
mesh-mesh collision (trimesh CollisionManager / FCL). Reports colliding part pairs, flagging
SERVO<->SERVO overlaps (always unintended) separately from connector<->holder (intended mates).

Usage: so100_check.py <urdf> [q]   (q applied to all revolute joints; default 0)
    N)Rotationz(/data/cameron/repos/smith300_para_stuff/c                     t        j                  d      }t        j                  d|      j	                         |d dd df<   | |d ddf<   |S )N   xyz   )npeyeRot
from_euler	as_matrix)r   rpyMs      6/data/cameron/repos/smith300_para_stuff/so100_check.pyTr      sN    
q	Auc*446Abqb"1"fIAbqb!eHH    c                 f   g }| j                  d      D ]=  }|j                  d      }|j                  d      j                         D cg c]  }t	        |       }}|j                  d      j                         D cg c]  }t	        |       }}|j                  d      }|6|j                  d      j                         D cg c]  }t	        |       c}ng d}	|j                  |j                  d      |j                  d      j                  d	      |j                  d
      j                  d	      |||	|j                  d      f       @ |D 
ch c]  \  }
}
}}
}
}
}
| }}
}| j                  d	      D cg c]'  }|j                  d      |vs|j                  d      ) }}|D ci c]  }|t        j                  d       }}d}|rd}|D ]  \  }}}}}}	}||v s||vs||   t        ||      z  }|dk(  rt        |t              r|j                  |d      n|}t        j                  d      }t        j                  t        j                  |	      |z        j                         |d dd df<   ||z  }|||<   d} |r|S c c}w c c}w c c}w c c}}
w c c}w c c}w )Njointoriginr   r   axisr   r   r   nameparentlinkchildtyper   TFrevoluteg        r   )findallfindgetsplitfloatappendr   r	   r   
isinstancedictr
   from_rotvecarrayr   )rootqjointsjoxr   r   r   ax_cchildrenlrootsrworldchangedjnpjtr   angRs                           r   fk_worldr;      su   F\\'"FF8!"u!3!3!56!5AuQx!56!"u!3!3!56!5AuQx!56vvf~<@<L 5 5 78 71eAh 78R[quuV}affX&6&:&:6&BAFF7ODWDWX^D_CQUU6]4 	5 # .44V)aAq!QVH4$(LL$8Z$8qAEE&MQY<YQUU6]$8EZ#()5aQq	\5E)G
*0&B1c3BEzaun!Hqc{*#,6q$,?!%%C.QCq	A #s0B C M M OAbqb"1"fIAAa +1  L- 768 5Z)s*   
J?JJJ#J)J)3J.c           	      N   t        j                  t        | z         j                         }t	        ||      }t
        j                  j                         }|j                  d      D ]l  }|j                  d      }||vrt        |j                  d            D ]5  \  }}|j                  d      }	|	|	j                  d      j                         ng dD 
cg c]  }
t        |
       }}
|	|	j                  d      j                         ng dD 
cg c]  }
t        |
       }}
|j                  d      }|j                  d	      |j                  d
      }}||j                  dd      j                         D 
cg c]  }
t        |
       }}
t        j                  t        |j                  d      z   d	      j                         }|j!                  |       |j                  d      j                  d      d   j                  d      d   }n||j                  d      j                         D 
cg c]  }
t        |
       }}
t
        j"                  j%                  |      }|j                  d      }||j                  d      nd
| }n|j'                  ||   t)        ||      z         |j+                  | d| |       8 o |j-                  d      \  }}|D cg c]  \  }}d|v sd|v s||f }}}|D cg c]k  \  }}d|v r-d|v r)|j                  d      d   |j                  d      d   k7  s1d|v r1d|v r-|j                  d      d   |j                  d      d   k7  r||fm }}}||fS c c}
w c c}
w c c}
w c c}
w c c}}w c c}}w )z`q: scalar (all revolute) or dict {joint_name: angle}. Returns (servo_pairs, bridge_servo_pairs).r   r   visualr   r   r   r   geometrymeshboxscalez1 1 1filename)force/.r   size)extentsmaterial:T)return_namesst3215br)ETparseDgetrootr;   trimesh	collisionCollisionManagerr   r   	enumerater   r    r!   loadcopyapply_scalecreationr@   apply_transformr   
add_objectin_collision_internal)urdfr(   r'   r4   mgrr1   r   vivr+   r,   r   r   geomgbscmpartextmathitpairsaservo_pairsbridge_servos                             r   checkrn   7   sR   88AH%%'DT1E



,
,
.C\\&!uuV}uqyy23EBx A>?maeeEl&8&8&:QZ&Z\&Z58&ZC\>?maeeEl&8&8&:QZ&Z\&Z58&ZC\66*%D99V$dii&6qA}()gw(?(E(E(GH(G1eAh(GHLLQUU:%6!6fEJJLb!uuZ(..s3B7==cB1E)*v)<)<)>?)>AuQx)>?$$(((5ffZ(*-/swwvRDzeDkAc3K78NNdV1TF+Q/' 4	 "0 ***=JC&+Oedax1}QAq6eKO', butq!x1}aAGGTWLYZO9[ AI(a-AGGCLOqwwWZ|\]<^ FuL b $$1 ]\ I
 @ Pbs1   NN?N8N0N=NNA0N!c            
         t        t        j                        dkD  rt        j                  d   nd} t        t        j                        dkD  rt        j                  d   nd}d|v r[|j                  d      D ci c]@  }|j                  d      d   j	                         t        |j                  d      d         B c}n
t        |      }t        | |      \  }}t        d| d	t        |       d
t        |              t        |      D ]  \  }}t        d| d|         t        |      D ]  \  }}t        d| d|         |S c c}w )N   zso100_para_connected.urdf   z0.0=,r   zq=z: SERVO-SERVO=z  BRIDGE-thru-OTHER-SERVO=z  SERVO-SERVO  z  <->  z  BRIDGE-SERVO )	lensysargvr    stripr!   rn   printsorted)r]   argkvr(   rl   rm   rk   rc   s           r   mainr|   ]   s.   chh-!+388A;1LDSXX*#((1+CX[_bXbSYYs^T^r#q				!5#q)9#:	:^ThmnqhrA %dAK	BqcK 011KCP\L]K^
_`{#1s'!-. $|$1s'!-. % 	Us   :AE__main__)__doc__ru   numpyr   rR   xml.etree.ElementTreeetreeElementTreerN   scipy.spatial.transformr   r
   rP   r   r;   rn   r|   __name__ r   r   <module>r      sL       " " 3.:#%L
 zF r   