px4-firmware/ROMFS/mixers
px4dev 67e0f8b179 Rework the mixer architecture based on discussions about arbitrary geometry mixing and plugins.
Now the mixer is a C++ library that can be fairly easily bolted into an output driver to provide mixing services.

Teach the FMU driver how to use it as an example.  More testing is still required.
2012-08-10 00:30:40 -07:00
..
FMU_AERT.mix Add a simple passthrough mixer for testing. 2012-08-05 19:47:29 -07:00
FMU_AET.mix Rework the mixer architecture based on discussions about arbitrary geometry mixing and plugins. 2012-08-10 00:30:40 -07:00
FMU_RET.mix Rework the mixer architecture based on discussions about arbitrary geometry mixing and plugins. 2012-08-10 00:30:40 -07:00
FMU_delta.mix Rework the mixer architecture based on discussions about arbitrary geometry mixing and plugins. 2012-08-10 00:30:40 -07:00
FMU_multirotor.mix Rework the mixer architecture based on discussions about arbitrary geometry mixing and plugins. 2012-08-10 00:30:40 -07:00
FMU_pass.mix Add a simple passthrough mixer for testing. 2012-08-05 19:47:29 -07:00
README Add a sample mixer definition and documentation. 2012-08-05 16:30:28 -07:00

README

PX4 mixer definitions
=====================

Files in this directory implement example mixers that can be used as a basis
for customisation, or for general testing purposes.

Mixer basics
------------

Mixers combine control values from various sources (control tasks, user inputs,
etc.) and produce output values suitable for controlling actuators; servos,
motors, switches and so on.

An actuator derives its value from the combination of one or more control
values. Each of the control values is scaled according to the actuator's
configuration and then combined to produce the actuator value, which may then be
further scaled to suit the specific output type.

Internally, all scaling is performed using floating point values. Inputs and
outputs are clamped to the range -1.0 to 1.0.

control    control   control
   |          |         |
   v          v         v
 scale      scale     scale
   |          |         |
   |          v         |
   +-------> mix <------+
              |
            scale
              |
              v
             out

Scaling
-------

Basic scalers provide linear scaling of the input to the output.

Each scaler allows the input value to be scaled independently for inputs
greater/less than zero. An offset can be applied to the output, and lower and
upper boundary constraints can be applied. Negative scaling factors cause the
output to be inverted (negative input produces positive output).

Scaler pseudocode:

if (input < 0)
    output = (input * NEGATIVE_SCALE) + OFFSET
else
    output = (input * POSITIVE_SCALE) + OFFSET

if (output < LOWER_LIMIT)
    output = LOWER_LIMIT
if (output > UPPER_LIMIT)
    output = UPPER_LIMIT

Syntax
------

Mixer definitions are text files; lines beginning with a single capital letter
followed by a colon are significant. All other lines are ignored, meaning that
explanatory text can be freely mixed with the definitions.

Each file may define more than one mixer; the allocation of mixers to actuators
is specific to the device reading the mixer definition.

A mixer begins with a line of the form

	M: <scaler count>

If the scaler count is zero, the mixer is a placeholder and the device will not
allocate a mixer for this position. Otherwise, this line is followed by scaler
definitions matching the given count.

A scaler definition is a line of the form:

	S: <group> <index> <-ve scale> <+ve scale> <offset> <lower limit> <upper limit>

The first scaler definition following the M: line configures the output scaler.
The <group> and <index> fields are ignored in this case.

For the remaining scalers, the <group> value identifies the control group from
which the scaler will read. Control group 0 is the vehicle attitude control
group; other group numbers may be assigned for other purposes. The <index> value
selects the  control within the group that will be scaled.

The remaining fields on the line represent the scaler parameters as discussed
above. Whilst the calculations are performed as floating-point operations, the
values stored in the definition file are scaled by a factor of 10000; i.e. an
offset of -0.5 is encoded as -5000.