'ReferenceFrame initialization method.
A ReferenceFrame has a set of orthonormal basis vectors, along with
orientations relative to other ReferenceFrames and angular velocities
relative to other ReferenceFrames.
Parameters
indices : list (of strings)
If custom indices are desired for console, pretty, and LaTeX
printing, supply three as a list. The basis vectors can then be
accessed with the get_item method.
latexs : list (of strings)
If custom names are desired for LaTeX printing of each basis
vector, supply the names here in a list.
Examples
>>> from sympy.physics.vector import ReferenceFrame, vlatex
>>> N = ReferenceFrame(\'N\')
>>> N.x
N.x
>>> O = ReferenceFrame(\'O\', indices=(\'1\', \'2\', \'3\'))
>>> O.x
O[\'1\']
>>> O[\'1\']
O[\'1\']
>>> P = ReferenceFrame(\'P\', latexs=(\'A1\', \'A2\', \'A3\'))
>>> vlatex(P.x)
\'A1\''

def __init__(self, name, indices=None, latexs=None, variables=None):

    if (not isinstance(name, string_types)):
        raise TypeError('Need    to    supply    a    valid    name')
    if (indices is not None):
        if (not isinstance(indices, (tuple, list))):
            raise TypeError('Supply    the    indices    as    a    list')
        if (len(indices) != 3):
            raise ValueError('Supply    3    indices')
        for i in indices:
            if (not isinstance(i, string_types)):
                raise TypeError('Indices    must    be    strings')
        self.str_vecs = [(((name + "['") + indices[0]) + "']"), (((name + "['") + indices[1]) + "']"), (((name + "['") + indices[2]) + "']")]
        self.pretty_vecs = [((name.lower() + u'_') + indices[0]), ((name.lower() + u'_') + indices[1]), ((name.lower() + u'_') + indices[2])]
        self.latex_vecs = [('\\mathbf{\\hat{%s}_{%s}}' % (name.lower(), indices[0])), ('\\mathbf{\\hat{%s}_{%s}}' % (name.lower(), indices[1])), ('\\mathbf{\\hat{%s}_{%s}}' % (name.lower(), indices[2]))]
        self.indices = indices
    else:
        self.str_vecs = [(name + '.x'), (name + '.y'), (name + '.z')]
        self.pretty_vecs = [(name.lower() + u'_x'), (name.lower() + u'_y'), (name.lower() + u'_z')]
        self.latex_vecs = [('\\mathbf{\\hat{%s}_x}' % name.lower()), ('\\mathbf{\\hat{%s}_y}' % name.lower()), ('\\mathbf{\\hat{%s}_z}' % name.lower())]
        self.indices = ['x', 'y', 'z']
    if (latexs is not None):
        if (not isinstance(latexs, (tuple, list))):
            raise TypeError('Supply    the    indices    as    a    list')
        if (len(latexs) != 3):
            raise ValueError('Supply    3    indices')
        for i in latexs:
            if (not isinstance(i, string_types)):
                raise TypeError('Latex    entries    must    be    strings')
        self.latex_vecs = latexs
    self.name = name
    self._var_dict = {}
    self._dcm_dict = {}
    self._dcm_cache = {}
    self._ang_vel_dict = {}
    self._ang_acc_dict = {}
    self._dlist = [self._dcm_dict, self._ang_vel_dict, self._ang_acc_dict]
    self._cur = 0
    self._x = Vector([(Matrix([1, 0, 0]), self)])
    self._y = Vector([(Matrix([0, 1, 0]), self)])
    self._z = Vector([(Matrix([0, 0, 1]), self)])
    if (variables is not None):
        if (not isinstance(variables, (tuple, list))):
            raise TypeError('Supply    the    variable    names    as    a    list/tuple')
        if (len(variables) != 3):
            raise ValueError('Supply    3    variable    names')
        for i in variables:
            if (not isinstance(i, string_types)):
                raise TypeError('Variable    names    must    be    strings')
    else:
        variables = [(name + '_x'), (name + '_y'), (name + '_z')]
    self.varlist = (CoordinateSym(variables[0], self, 0), CoordinateSym(variables[1], self, 1), CoordinateSym(variables[2], self, 2))
    ReferenceFrame._count += 1
    self.index = ReferenceFrame._count
