class_docstr: Class to denote a body-orienter.
docstr: Body orientation takes this coordinate system through three
  successive simple rotations.
  
  Body fixed rotations include both Euler Angles and
  Tait-Bryan Angles, see https://en.wikipedia.org/wiki/Euler_angles.
  
  Parameters
  ==========
  
  angle1, angle2, angle3 : Expr
      Three successive angles to rotate the coordinate system by
  
  rotation_order : string
      String defining the order of axes for rotation
  
  Examples
  ========
  
  >>> from sympy.vector import CoordSys3D, BodyOrienter
  >>> from sympy import symbols
  >>> q1, q2, q3 = symbols('q1 q2 q3')
  >>> N = CoordSys3D('N')
  
  A 'Body' fixed rotation is described by three angles and
  three body-fixed rotation axes. To orient a coordinate system D
  with respect to N, each sequential rotation is always about
  the orthogonal unit vectors fixed to D. For example, a '123'
  rotation will specify rotations about N.i, then D.j, then
  D.k. (Initially, D.i is same as N.i)
  Therefore,
  
  >>> body_orienter = BodyOrienter(q1, q2, q3, '123')
  >>> D = N.orient_new('D', (body_orienter, ))
  
  is same as
  
  >>> from sympy.vector import AxisOrienter
  >>> axis_orienter1 = AxisOrienter(q1, N.i)
  >>> D = N.orient_new('D', (axis_orienter1, ))
  >>> axis_orienter2 = AxisOrienter(q2, D.j)
  >>> D = D.orient_new('D', (axis_orienter2, ))
  >>> axis_orienter3 = AxisOrienter(q3, D.k)
  >>> D = D.orient_new('D', (axis_orienter3, ))
  
  Acceptable rotation orders are of length 3, expressed in XYZ or
  123, and cannot have a rotation about about an axis twice in a row.
  
  >>> body_orienter1 = BodyOrienter(q1, q2, q3, '123')
  >>> body_orienter2 = BodyOrienter(q1, q2, 0, 'ZXZ')
  >>> body_orienter3 = BodyOrienter(0, 0, 0, 'XYX')
docstr_tok: ["Body","orientation","takes","this","coordinate","system","through","three","successive","simple","rotations",".","Body","fixed","rotations","include","both","Euler","Angles","and","Tait-Bryan","Angles",",","see","https",":","\/\/en.wikipedia.org\/wiki\/Euler_angles",".","Parameters","==========","angle1",",","angle2",",","angle3",":","Expr","Three","successive","angles","to","rotate","the","coordinate","system","by","rotation_order",":","string","String","defining","the","order","of","axes","for","rotation","Examples","========",">",">",">","from","sympy.vector","import","CoordSys3D",",","BodyOrienter",">",">",">","from","sympy","import","symbols",">",">",">","q1",",","q2",",","q3","=","symbols","(","'q1","q2","q3","'",")",">",">",">","N","=","CoordSys3D","(","'N","'",")","A","'Body","'","fixed","rotation","is","described","by","three","angles","and","three","body-fixed","rotation","axes",".","To","orient","a","coordinate","system","D","with","respect","to","N",",","each","sequential","rotation","is","always","about","the","orthogonal","unit","vectors","fixed","to","D.","For","example",",","a","'123'","rotation","will","specify","rotations","about","N.i",",","then","D.j",",","then","D.k",".","(","Initially",",","D.i","is","same","as","N.i",")","Therefore",",",">",">",">","body_orienter","=","BodyOrienter","(","q1",",","q2",",","q3",",","'123","'",")",">",">",">","D","=","N.orient_new","(","'D","'",",","(","body_orienter",",",")",")","is","same","as",">",">",">","from","sympy.vector","import","AxisOrienter",">",">",">","axis_orienter1","=","AxisOrienter","(","q1",",","N.i",")",">",">",">","D","=","N.orient_new","(","'D","'",",","(","axis_orienter1",",",")",")",">",">",">","axis_orienter2","=","AxisOrienter","(","q2",",","D.j",")",">",">",">","D","=","D.orient_new","(","'D","'",",","(","axis_orienter2",",",")",")",">",">",">","axis_orienter3","=","AxisOrienter","(","q3",",","D.k",")",">",">",">","D","=","D.orient_new","(","'D","'",",","(","axis_orienter3",",",")",")","Acceptable","rotation","orders","are","of","length","3",",","expressed","in","XYZ","or","123",",","and","can","not","have","a","rotation","about","about","an","axis","twice","in","a","row",".",">",">",">","body_orienter1","=","BodyOrienter","(","q1",",","q2",",","q3",",","'123","'",")",">",">",">","body_orienter2","=","BodyOrienter","(","q1",",","q2",",","0",",","'ZXZ","'",")",">",">",">","body_orienter3","=","BodyOrienter","(","0",",","0",",","0",",","'XYX","'",")"]
code: def __init__(self, angle1, angle2, angle3, rot_order):
      """
      Body orientation takes this coordinate system through three
      successive simple rotations.
  
      Body fixed rotations include both Euler Angles and
      Tait-Bryan Angles, see https://en.wikipedia.org/wiki/Euler_angles.
  
      Parameters
      ==========
  
      angle1, angle2, angle3 : Expr
          Three successive angles to rotate the coordinate system by
  
      rotation_order : string
          String defining the order of axes for rotation
  
      Examples
      ========
  
      >>> from sympy.vector import CoordSys3D, BodyOrienter
      >>> from sympy import symbols
      >>> q1, q2, q3 = symbols('q1 q2 q3')
      >>> N = CoordSys3D('N')
  
      A 'Body' fixed rotation is described by three angles and
      three body-fixed rotation axes. To orient a coordinate system D
      with respect to N, each sequential rotation is always about
      the orthogonal unit vectors fixed to D. For example, a '123'
      rotation will specify rotations about N.i, then D.j, then
      D.k. (Initially, D.i is same as N.i)
      Therefore,
  
      >>> body_orienter = BodyOrienter(q1, q2, q3, '123')
      >>> D = N.orient_new('D', (body_orienter, ))
  
      is same as
  
      >>> from sympy.vector import AxisOrienter
      >>> axis_orienter1 = AxisOrienter(q1, N.i)
      >>> D = N.orient_new('D', (axis_orienter1, ))
      >>> axis_orienter2 = AxisOrienter(q2, D.j)
      >>> D = D.orient_new('D', (axis_orienter2, ))
      >>> axis_orienter3 = AxisOrienter(q3, D.k)
      >>> D = D.orient_new('D', (axis_orienter3, ))
  
      Acceptable rotation orders are of length 3, expressed in XYZ or
      123, and cannot have a rotation about about an axis twice in a row.
  
      >>> body_orienter1 = BodyOrienter(q1, q2, q3, '123')
      >>> body_orienter2 = BodyOrienter(q1, q2, 0, 'ZXZ')
      >>> body_orienter3 = BodyOrienter(0, 0, 0, 'XYX')
  
      """
      # Dummy initializer for docstrings
      pass
  
imports: from sympy.core.basic import Basic
  from sympy.core.sympify import sympify
  from sympy.functions.elementary.trigonometric import cos, sin
  from sympy.matrices.dense import eye, rot_axis1, rot_axis2, rot_axis3
  from sympy.matrices.immutable import ImmutableDenseMatrix
  from sympy.core.cache import cacheit
  from sympy.core.symbol import Str
  import sympy.vector
label_desc: Use image node_id 2 to create a new BodyOrienter object from inherited base classes: ThreeAngleOrienter with example: obj = BodyOrienter(angle1, angle2, angle3, rot_order)