Skip to content

Encoder and Position


JCS network off-axis relative encoder is based on an Austria Micro AS5311 magnetic sensing absolute encoder. The AS5311 measures 4096 counts per 2mm pole-pair (1mm magnetic pole length) and works with both linear and ring magnetic targets.

The off-axis relative encoder is capable of sensing both linear position and rotational position.

The linear resolution of the encoder is fixed at \(2mm/4096counts\) (488nm/step). The rotational resolution is dependant on the diameter (and thus the number of pole-pairs) of the magnet ring. JCS offers a 64 pole-pair magnet ring for an encoder count of 262144 counts per revolution. Other magnetic targets may be installed for different resolutions.

At each encoder tick, the position of the sense magnet is sampled and passed through a two state Kalman filter (rotational or linear, depending on the estimator configuration), from which an estimate of the position and velocity of the magnet is obtained.

Encoder/estimator tick rate (\(f\)) 10kHz
op_state warning bits Bit 3 - Encoder zero'd flag
Bit 4 - Velocity warning flag
Bit 5 - Sensor warning flag
Bit 6 - Position maybe invalid flag

Encoder Configuration

The following parameters are available for configuring the encoder:

Command Type Required Description
encoder_position_zero command Optional Records the current encoder position as the zero offset.
encoder_direction boolean Required Sets the encoder direction.
encoder_error_rate_limit float32 Optional Encoder error rate limit.
Default: 0.05

Encoder position zeroing and offset

An encoder may be zeroed by commanding the system to sample the current encoder position as the zero offset.

To store the encoder current position as the zero offset, issue JCS command encoder_position_zero.

Encoder direction

Set the encoder direction with a boolean write to encoder_direction.

Maximum velocity

The off-axis relative encoder has an maximum linear velocity of 20m/s and checks for velocity excursions in both linear and rotary estimator modes.

If the velocity exceeds the maximum speed of the hardware, the position of the encoder cannot be assumed to be valid. The op_state velocity warning flag will be latched. The velocity_warning flag is cleared on power cycle or a call to start.

The op_state position may be invalid flag will be asserted to indicate that the encoders position may now be invalid. The op_state position may be invalid flag may be cleared by zeroing the encoder, a call to start or a by power cycle.

Encoder errors

In the case that the AS5311 sensor itself returns an error, the op_state encoder warning flag will be asserted for the duration of the error. The op_state position may be invalid flag will be latched to indicate that the encoders position may now be invalid. The op_state position may be invalid flag may be cleared by zeroing the encoder, a call to start or a by power cycle.

If a flood of errors occur such that the error rate goes above the limit set in encoder_error_rate_limit, then an E-stop will be generated and the system will attempt to shut down.

To tune the encoder error rate monitor, write a float32 to encoder_error_rate_limit. Values between 0.0f and 1.0f are valid. Writing float32 value 1.0f to encoder_error_rate_limit disables the error rate monitor.

The encoder error rate is available as JCS signal encoder_error_rate.


Estimator Configuration

Estimator selection

JCS network off-axis encoder supports both linear and rotational position and velocity estimation.

Select an estimator by writing an enum to estimator_type:

Estimator type Description
kf_linear Linear Kalman filter estimator
kf_rotational Rotational Kalman filter estimator that normalises the position output to \([-\pi, \pi]\).

kf_linear configuration

Configure the linear Kalman filter estimator with the following parameters:

Command Type Required Description
estimator_linear_scale float32 Optional Sets the encoder scale from mm to users units.
Default: 1.0f (mm)
estimator_linear_q_variance float32 Optional Sets the internal Kalman filter \(\textbf{Q}\) matrix from variance parameter.
Default: \(1e-4\)
estimator_linear_r float32 Optional Sets the internal Kalman filter \(\textbf{R}\) matrix from variance parameter.
Default: \(4.88e-4\)
estimator_linear_P_initial float32 array Optional Sets the internal Kalman filter initial \(\textbf{P}\) covariance matrix.
Default: [100000.0, 0.0, 0.0, 10.0]
Write 4x float32 values

kf_rotational configuration

Configure the rotational Kalman filter estimator with the following parameters:

Command Type Required Description
estimator_rotary_cpr uint32 Required Sets the encoder counts per revolution.
estimator_rotary_q_variance float32 Optional Sets the internal Kalman filter \(\textbf{Q}\) matrix from variance parameter.
Default: \(1e-4\)
estimator_rotary_r float32 Optional Sets the internal Kalman filter \(\textbf{R}\) matrix from variance parameter.
Default: \(4.88e-4\)
estimator_rotary_P_initial float32 array Optional Sets the internal Kalman filter initial \(\textbf{P}\) covariance matrix.
Default: [100000.0, 0.0, 0.0, 10.0]
Write 4x float32 values

Estimator variance

The Kalman filter \(\textbf{Q}\) matrix variance is computed according to a piecewise white noise model.

For the estimated state \(\textbf{x} = \big[\begin{smallmatrix} v && x \end{smallmatrix}\big]^\intercal\), the matrix \(\textbf{Q}\) is computed as:

\[ \begin{bmatrix} 1 && dt \\ dt && {dt}^2 \end{bmatrix} \sigma^2 \]

where \(dt = {1 \over{f}}\) from the encoder/estimator tick rate parameters presented above.

Note: Parameter estimator_q_variance is equivalent to \(\sigma^2\). estimator_q_variance is not squared internally.

Note: This applies equally to the rotational Kalman filter with the state \(\textbf{x} = \big[\begin{smallmatrix} \omega && \theta \end{smallmatrix}\big]^\intercal\).

Estimator initial covariance

If required, set the initial estimator covariance matrix \(\textbf{P}\) by writing a vector of length 4 to estimator_P_initial.

Note: Initial \(\textbf{P}\) matrix values affect the starting performance of the estimator. Since the velocity term is not measured, you may notice large glitches in the velocity estimate at startup if the \(\textbf{P}\) matrix velocity term is too low.

Estimator pass-through

Setting estimator_x_passthrough to true will cause the system to derive the JCS signal x directly from the encoder, rather than from the estimator.

Command Type Required Description
estimator_x_passthrough boolean Optional Bypasses the estimator such that the position obtained from the encoder is presented to JCS output signal x.
Note - The estimator will still produce a velocity estimate output at JCS signal v.

Note that the bypassed position will still retain the following properties:

  • May have zero offset applied
  • If estimator kf_rotational is active then the output will be normalised to \([-\pi, \pi]\)

Absolute position

While the AS5311 magnetic position sensor is able to return an absolute position, it is only able to return the absolute position within the 2mm pole-pair. The sensor is not able to differentiate between pole-pairs and thus the AS5311 encoder system is considered non-absolute. If the user can guarantee that the magnet target does not move out of a given 2mm pole-pair between power cycles, the encoder position may be considered absolute.