Method to determine the tracking angles of heliostats

The heliostats with two tracking axes are considered, and the method is presented to find the tracking angles for reflection of sun light to a given target. An important advantage of the method is that the tracking axes are not required to be orthogonal like in azimuth-elevation, tilt-roll or target-aligned heliostats. All of these configurations are covered in a unified way, and the presented solution is valid even for arbitrary orientation of tracking axes. The ability to have such a general solution is very valuable, because the orthogonality condition may not hold precisely for manufacturing reasons or due to degradation of heliostats. These deviations need to be corrected properly to achieve a high concentration of sun light. The offsets between tracking axes are also taken into account. However, the targeting problem for heliostats in this case becomes considerably different from the inverse kinematic problems for robotic arm manipulators. It is shown that the tracking angles can be found iteratively, and the convergence of results is very fast for a typical set of parameters used in solar thermal plants. To simplify the use of the method, a Python-library HelioK was developed, and it is demonstrated how to work with it in a Jupyter-notebook. To explain the kinematics of heliostats better, a 3D model of heliostat is provided, which was made and animated in an open-source 3D editor Blender. The main highlights of the method:• The tracking axes and the facet of heliostat can have an arbitrary orientation, and there can be offsets between them.• The tracking problem is solved both for targets attached to heliostat (local aiming) and for separated targets (global aiming).• The single-axis trackers are included as a limiting case.


Armature of heliostat
The rotation of heliostat is described by using an armature ( Fig. 1 ). The armature consists of connected bones, which represent different parts of heliostat. The heads and tails of the bones can be linked by a hinge joint, which supports a rotation around given axis, or a more general joint type. The relative positions and orientations of the bones are defined in local heliostat frame when the primary and secondary angles are set to zero ( Fig. 1 a). The head of the foundation bone is positioned at the origin of heliostat frame. This bone is always fixed in the heliostat frame, and serves as a parent for other bones. The primary head has a translation p a from the foundation head. The hinge joint in the primary head can rotate around the axis a in the range [ α min , α max ] . The secondary head has a translation p b from the primary head. The hinge joint in the secondary head can rotate around the axis b in the range [ β min , β max ] . The rotation angles around the axes are measured according to the right-hand rule, and the static configuration ( Fig. 1 a) is used as a reference for zero angles. Notice that there is some ambiguity how to place the armature bones. Only the positions of heads are important where the hinges are, while the positions of tails can be selected to match the geometry of different moving parts. In particular, this was used to make the foundation bone vertical, although the primary axis is slightly shifted from it ( Fig. 1 b). The default directions of the primary and secondary bones can be used as a reference to define zero angles for the corresponding tracking axes. The mirror bone is fixed rigidly to the secondary bone, and it is necessary just to separate the mirror facet.

Heliostat facets
In general, one or more mirror facets can be attached to the secondary bone. They can be described by appropriate translations p m and rotations R m . It is necessary to define a vertex (a combination of point r M0 and normal n 0 ), which can be used to determine the main direction of reflection. For a single facet, it usually corresponds to the center of the facet. The position r M and normal n of the tracking vertex depend on the primary α and secondary β angles as (the subscript '0' is used when the values are taken for zero tracking angles) (2)

Heliostat drives
The positive rotation around the axes is determined by the right-hand rule. The rotation matrix around the axis a for angle α is computed as where I is the identity operator, a × is a cross product in matrix form, and a a = a a T is a dyadic product. The rotation can be performed by slew drives or linear actuators. The former control the rotation angle directly, while the latter control the rotation angle via expansion length. If the distances from an axis to two attachment points are p and q , the expansion length λ according to the law of cosines is This relation can be inverted to get the mapping α(λ) .

Heliostat field
The position and orientation of heliostat in global frame is defined by 4 × 4 transformation matrix The rotation matrix of heliostat can be decomposed into 3 Euler angles as In general, heliostats can be used to concentrate light on a target attached to it (local aiming) or a separated target (global aiming). A typical example of the former is a heliostat dish with a CPV (Concentrated Photovoltaics) element in the focus. The latter is mostly applied in CST (Concentrated Solar Thermal) power plants.

Local aiming
The unit vector in the direction of the sun is converted to heliostat frame as s → R T h s . Since the aiming point r A is specified in the same frame as the facet vertex r M0 , the target vector can be found as t 0 = ( r A − r M0 ) / | r A − r M0 | , and it does not depend on the tracking angles. The corresponding sun vector according to the reflection law is s 0 = (2 n 0 n 0 − 1) t 0 . The tracking angles are found as a rotation of s 0 to s (See Sequential rotation).

Global aiming
The unit vector in the direction of the sun is converted to heliostat frame as s → R T h s . The aiming point r A can be converted from global to heliostat frame as where for the first iteration r M0 can be used instead of r M . The required position of the normal according to the reflection law is n = (s + t ) / | s + t | . The tracking angles are found as a rotation of n 0 to n (See Sequential rotation). Once the angles are found, they can be used to update r M according to Eq. (1) . The accuracy of iteration is checked by substituting the new value of r M into | t × ( r A − r M ) | , which corresponds to the lateral displacement of reflected ray from target. Typically, a sub-millimeter accuracy is acceptable. Otherwise, a new iteration starts with updating the value of t .

Sequential rotation
The primary α and secondary β angles for rotation of vector v 0 to v are found by composing an intermediate vector m , which separates the sequential rotation into two single-axis rotations [1] . The intermediate vector satisfies the equations a · v = a · m and b · m = b · v 0 . It can be searched in the form m = m a a + m b b ± m k k where k = a × b , and the solution of the system is For each of the m ± branches, the angles of single-axis rotations are found as By default, the angles are returned in the range [ −π , π ) . It is possible to cast them to the range [ ϕ 0 , ϕ 0 + 2 π ) with the following transformation where is the floor function. This simplifies the check whether the angle is within a given range [ ϕ min , ϕ max ] . It is also possible to introduce a function w (α, β ) = | α| + | β| to sort the solutions and select the branch which requires less rotation.

Single-axis trackers
The presented method can also be applied for single-axis trackers like troughs or Fresnel collectors (line focusing as opposed to point focusing). Due to the axial symmetry, it can be assumed that n 0 · a = 0 . The vectors s and t are projected on the rotation plane by using an operator 1 − a a and renormalizing the result. After that the similar steps (See Local aiming and Global aiming) can be applied to find the primary tracking angle α. The main difference is that rotation of vector v 0 to v is solved as

Input data
The method was implemented in Python and can be used as a library (HelioK). The parameters of heliostat field are stored in xml format ( Fig. 2 ). The tag HelioK is used as a root and has the attributes to set the units of lengths and angles. The subtags World, Factory and provide the following details. The tag World defines the location of the plant and the position of the sun. The tag Factory stores the templates of materials and heliostats. The tag Scene describes the layout of the objects in the scene.
The parameters of heliostat are stored in the tag HeliostatKit and are grouped in the following way.
The tag Primary with the attributes translation ( p a ), rotationAxis ( a ) and rotationAngles ( α min , α max ) is used for the primary drive. The tag Secondary with the attributes translation ( p b ), rotationAxis ( b ) and rotationAngles ( β min , β max ) is used for the secondary drive. The tag Facet with attributes translation ( p m , zero by default) and rotation ( R m , stored as Euler angles ϕ x , ϕ y , ϕ z ) defines a heliostat facet and can be repeated several times. The tag Angles with the attributes primary ( α) and secondary ( β) stores the orientation of heliostat. The tag Tracking with the attributes point ( r M0 ) and normal ( n 0 ) defines a vertex on the facet which will be used for tracking. The tag Aiming with the attribute point ( r A ) sets the aiming point. The actual placement of heliostats is described in the tag Scene. It contains a tree of Node tags, which define geometrical transformations. Each node has the attributes translation ( p ) and rotation ( R , stored as Euler angles ϕ x , ϕ y , ϕ z ). The nodes can be nested, which combines the transformations. The heliostats are attached to the nodes by using the tag HeliostatKit with the attribute ref , which refers to a specific template with the attribute name .

Example of usage
The HelioK library can be used in Jupyter notebook ( Fig. 3 ). The cell 1 imports the HelioK library with a short name hk. The cell 2 opens a heliostat field in xml-format and assigns it to a variable app. The cell 3 shows how to find a heliostat by name. The cell 4 sets the primary and secondary angles of the selected heliostat. The output is True, when the angles are within the tracking range. The cell 5 creates a reference to the sun object in the scene and changes its azimuth and elevation. The cell 6 updates the tracking angles of heliostat according to the position of the sun. The optional parameter debug enables a debug output. It shows two possible solutions and how the accuracy changes with iterations. If there is a solution within the tracking range, the tacking angles of heliostat are updated, and the output is True.