Pybricks I/O
observer.h
Go to the documentation of this file.
1 // SPDX-License-Identifier: MIT
2 // Copyright (c) 2019-2023 The Pybricks Authors
3 
4 // SPDX-License-Identifier: BSD-3-Clause
5 // Copyright (c) 2020-2023 LEGO System A/S
6 
14 #ifndef _PBIO_OBSERVER_H_
15 #define _PBIO_OBSERVER_H_
16 
17 #include <stdint.h>
18 
19 #include <pbio/control_settings.h>
20 #include <pbio/dcmotor.h>
21 #include <pbio/differentiator.h>
22 #include <pbio/angle.h>
23 
27 typedef struct _pbio_observer_model_t {
28  int32_t d_angle_d_speed;
29  int32_t d_speed_d_speed;
44  int32_t torque_friction;
46 
50 typedef struct _pbio_observer_settings_t {
59  uint32_t stall_time;
89 
93 typedef struct _pbio_observer_t {
101  int32_t speed;
105  int32_t current;
113  int32_t speed_numeric;
117  bool stalled;
121  uint32_t stall_start;
131 
132 // Observer state functions:
133 
134 void pbio_observer_reset(pbio_observer_t *obs, const pbio_angle_t *angle);
135 void pbio_observer_get_estimated_state(const pbio_observer_t *obs, int32_t *speed_num, pbio_angle_t *angle_est, int32_t *speed_est);
136 void pbio_observer_update(pbio_observer_t *obs, uint32_t time, const pbio_angle_t *angle, pbio_dcmotor_actuation_t actuation, int32_t voltage);
137 bool pbio_observer_is_stalled(const pbio_observer_t *obs, uint32_t time, uint32_t *stall_duration);
138 int32_t pbio_observer_get_feedback_voltage(const pbio_observer_t *obs, const pbio_angle_t *angle);
139 
140 // Model conversion functions:
141 
142 int32_t pbio_observer_get_max_torque(void);
143 int32_t pbio_observer_get_feedforward_torque(const pbio_observer_model_t *model, int32_t rate_ref, int32_t acceleration_ref);
144 int32_t pbio_observer_torque_to_voltage(const pbio_observer_model_t *model, int32_t desired_torque);
145 int32_t pbio_observer_voltage_to_torque(const pbio_observer_model_t *model, int32_t voltage);
146 
147 #endif // _PBIO_OBSERVER_H_
148 
int32_t d_current_d_voltage
Definition: observer.h:36
uint32_t stall_start
If stalled, this is the time that stall was first detected.
Definition: observer.h:121
int32_t feedback_voltage_stall_ratio
When the motor is stuck, the observer moves ahead and pushes back with a feedback voltage...
Definition: observer.h:70
int32_t d_speed_d_current
Definition: observer.h:32
struct _pbio_observer_model_t pbio_observer_model_t
Device-type specific constants that describe the motor model.
uint32_t stall_time
Minimum consecutive stall time before stall flag getter returns true.
Definition: observer.h:59
bool pbio_observer_is_stalled(const pbio_observer_t *obs, uint32_t time, uint32_t *stall_duration)
Checks whether system is stalled by testing how far the estimate is ahead of the measured angle...
Definition: observer.c:220
int32_t d_current_d_speed
Definition: observer.h:30
Device-type specific constants that describe the motor model.
Definition: observer.h:27
int32_t feedback_gain_low
Feedback gain (mV/deg) to correct the observer for low estimation errors.
Definition: observer.h:74
int32_t current
Current state of observer (estimated system current) in tenths of milliAmperes: 10000 = 1A...
Definition: observer.h:105
int32_t d_angle_d_current
Definition: observer.h:31
int32_t feedback_voltage_negligible
Lower limit of the feedback voltage where we cannot get useful stall information because it is less t...
Definition: observer.h:64
int32_t d_torque_d_acceleration
Definition: observer.h:43
int32_t d_speed_d_speed
Definition: observer.h:29
int32_t pbio_observer_torque_to_voltage(const pbio_observer_model_t *model, int32_t desired_torque)
Converts a torque to a voltage based on the given motor model.
Definition: observer.c:267
Motor state observer object.
Definition: observer.h:93
int32_t speed
Speed state of observer (estimated system speed) in millidegrees/second.
Definition: observer.h:101
bool stalled
Whether the motor is stalled according to the model.
Definition: observer.h:117
int32_t d_torque_d_voltage
Definition: observer.h:41
pbio_observer_settings_t settings
Control settings, which includes stall settings.
Definition: observer.h:129
int32_t torque_friction
Definition: observer.h:44
int32_t pbio_observer_voltage_to_torque(const pbio_observer_model_t *model, int32_t voltage)
Converts a voltage to a torque based on the given motor model.
Definition: observer.c:278
Configurable observer settings.
Definition: observer.h:50
int32_t d_angle_d_speed
Definition: observer.h:28
int32_t d_torque_d_speed
Definition: observer.h:42
int32_t feedback_gain_high
Feedback gain (mV/deg) to correct the observer for high estimation error.
Definition: observer.h:78
int32_t d_current_d_torque
Definition: observer.h:39
void pbio_observer_update(pbio_observer_t *obs, uint32_t time, const pbio_angle_t *angle, pbio_dcmotor_actuation_t actuation, int32_t voltage)
Predicts next system state and corrects the model using a measurement.
Definition: observer.c:153
int32_t pbio_observer_get_max_torque(void)
Gets the maximum torque for use by user input validators.
Definition: observer.c:236
int32_t pbio_observer_get_feedforward_torque(const pbio_observer_model_t *model, int32_t rate_ref, int32_t acceleration_ref)
Calculates the feedforward torque needed to achieve the requested reference rotational speed and acce...
Definition: observer.c:250
pbio_dcmotor_actuation_t
Actuation types that can be applied by a dc motor.
Definition: dcmotor.h:41
int32_t feedback_gain_threshold
Threshold angle (mdeg) from which the higher observer feedback is used.
Definition: observer.h:82
int32_t d_speed_d_torque
Definition: observer.h:38
int32_t coulomb_friction_speed_cutoff
Speed (mdeg/s) below which the coulomb friction starts to linearly scale to zero to avoid a sudden nu...
Definition: observer.h:87
Angle type for up to 2^31 rotations with millidegree resolution.
Definition: angle.h:29
int32_t d_speed_d_voltage
Definition: observer.h:35
pbio_differentiator_t differentiator
Numeric angle differentiator used to verify estimated speed.
Definition: observer.h:109
int32_t speed_numeric
Latest speed value from angle differentiator.
Definition: observer.h:113
Differentiator of position signal.
struct _pbio_observer_settings_t pbio_observer_settings_t
Configurable observer settings.
void pbio_observer_get_estimated_state(const pbio_observer_t *obs, int32_t *speed_num, pbio_angle_t *angle_est, int32_t *speed_est)
Gets the observer state, which is the estimated state of the real system.
Definition: observer.c:58
struct _pbio_observer_t pbio_observer_t
Motor state observer object.
void pbio_observer_reset(pbio_observer_t *obs, const pbio_angle_t *angle)
Resets the observer to a new angle.
Definition: observer.c:36
int32_t d_angle_d_torque
Definition: observer.h:37
const pbio_observer_model_t * model
Model parameters used by this model.
Definition: observer.h:125
int32_t d_voltage_d_torque
Definition: observer.h:40
int32_t pbio_observer_get_feedback_voltage(const pbio_observer_t *obs, const pbio_angle_t *angle)
Gets observer feedback voltage that keeps it close to measured value.
Definition: observer.c:132
int32_t d_current_d_current
Definition: observer.h:33
int32_t stall_speed_limit
If this speed cannot be reached even with the maximum control signal defined in actuation_max, the controller is stalled.
Definition: observer.h:55
pbio_angle_t angle
Angle state of observer (estimated system angle) in millidegrees.
Definition: observer.h:97
int32_t d_angle_d_voltage
Definition: observer.h:34