24#ifndef FORCECONTROLLER_H_
25#define FORCECONTROLLER_H_
27#include <spdlog/spdlog.h>
30#include <SAL_MTM1M3C.h>
31#include <SAL_MTMountC.h>
33#include <AccelerationForceComponent.h>
34#include <ActiveOpticForceComponent.h>
35#include <AzimuthForceComponent.h>
36#include <BalanceForceComponent.h>
37#include <DistributedForces.h>
38#include <ElevationForceComponent.h>
39#include <FinalForceComponent.h>
40#include <ForceActuatorApplicationSettings.h>
41#include <ForceActuatorSettings.h>
42#include <ForcesAndMoments.h>
43#include <LimitTrigger.h>
44#include <OffsetForceComponent.h>
46#include <SafetyController.h>
47#include <StaticForceComponent.h>
48#include <ThermalForceComponent.h>
49#include <VelocityForceComponent.h>
50#include <cRIO/DataTypes.h>
59 int NearZIndices[FA_MAX_NEAR_COUNT];
60 int FarIndices[FA_FAR_COUNT];
147 void updateAppliedForces();
167 void zeroAccelerationForces();
169 void applyActiveOpticForces(
float *z);
170 void zeroActiveOpticForces();
172 void applyAzimuthForces();
173 void updateTMAAzimuthForces(MTMount_azimuthC *tmaAzimuthData);
174 void zeroAzimuthForces();
176 bool applyBalanceForces();
177 bool zeroBalanceForces();
195 void applyElevationForces();
196 void zeroElevationForces();
198 void applyOffsetForces(
float *x,
float *y,
float *z);
199 void applyOffsetForcesByMirrorForces(
float xForce,
float yForce,
float zForce,
float xMoment,
200 float yMoment,
float zMoment);
201 void zeroOffsetForces();
203 void applyActuatorOffset(
char axis,
int index,
float offset);
205 void applyStaticForces();
206 void zeroStaticForces();
208 void applyThermalForces();
209 void updateThermalForces(
float temperature);
210 void zeroThermalForces();
218 void zeroVelocityForces();
220 void enableDisableForceComponent(
int forceComponentEnum,
bool enabled);
223 void _sumAllForces();
224 void _convertForcesToSetpoints();
226 bool _checkMirrorMoments();
227 bool _checkNearNeighbors();
228 bool _checkMirrorWeight();
229 bool _checkFarNeighbors();
231 static double constexpr _sqrt2 = 1.4142135623730950488016887242097;
247 MTM1M3_appliedCylinderForcesC *_appliedCylinderForces;
248 MTM1M3_appliedForcesC *_appliedForces;
249 MTM1M3_logevent_forceActuatorStateC *_forceActuatorState;
250 MTM1M3_logevent_forceSetpointWarningC *_forceSetpointWarning;
251 MTM1M3_logevent_preclippedCylinderForcesC *_preclippedCylinderForces;
253 MTM1M3_inclinometerDataC *_inclinometerData;
254 MTM1M3_pidDataC *_pidData;
255 MTM1M3_logevent_pidInfoC *_pidInfo;
256 MTM1M3_hardpointActuatorDataC *_hardpointActuatorData;
257 MTM1M3_accelerometerDataC *_accelerometerData;
258 MTM1M3_gyroDataC *_gyroData;
262 float _zero[FA_COUNT];
265 class ForceLimitTrigger :
public LimitTrigger<float, float> {
267 ForceLimitTrigger() {
273 ForceLimitTrigger(
char axis,
int faId) {
280 bool trigger()
override {
283 static int levels[4] = {1, 200, 500, 100000};
284 for (
int i = 0; i < 4; i++)
285 if (levels[i] == _counter)
return true;
286 return ((_counter % levels[3]) == 0);
289 void execute(
float limit,
float fe)
override {
291 "Violated {} follow-up error FA ID {} measured error {} "
292 "({}th occurence), limit +-{}",
293 _axis, _faId, fe, _counter, limit);
296 void reset()
override {
299 "FA ID {} axis {} following error is back into limits "
301 _faId, _axis, _counter);
312 ForceLimitTrigger limitTriggerX[FA_X_COUNT];
313 ForceLimitTrigger limitTriggerY[FA_Y_COUNT];
314 ForceLimitTrigger limitTriggerZ[FA_Z_COUNT];
316 static int32_t _toInt24(
float force) {
return (int32_t)(force * 1000.0); }
Definition AccelerationForceComponent.h:37
Definition ActiveOpticForceComponent.h:36
Definition AzimuthForceComponent.h:37
Distributes balance forces.
Definition BalanceForceComponent.h:54
Definition ElevationForceComponent.h:37
Final force produced as sum of components.
Definition FinalForceComponent.h:43
(Almost) constant force actuator values.
Definition ForceActuatorApplicationSettings.h:87
Coordinate force actuators force calculcation.
Definition ForceController.h:128
void processAppliedForces()
Sums components and run mirror safety checks.
Definition ForceController.cpp:254
void resetPID(int id)
Reset given PID settings to system default (tracking).
Definition ForceController.cpp:345
bool applyAccelerationForces()
Apply acceleration forces.
Definition ForceController.cpp:269
bool applyVelocityForces()
Apply velocity forces.
Definition ForceController.cpp:452
void updateTMAElevationData(MTMount_elevationC *tmaElevationData)
Updates elevation data.
void resetPIDs()
Resets all PIDs to initial (tracking) settings.
Definition ForceController.cpp:350
bool faRaiseFollowingErrorInTolerance()
Tests following error on all actuaturs.
Definition ForceController.cpp:165
Abstract interface class for limiting some action to predefined execution.
Definition LimitTrigger.h:66
Handle user offsets.
Definition OffsetForceComponent.h:40
Controls mirror safety.
Definition SafetyController.h:50
Definition StaticForceComponent.h:39
Applies corrections for mirror cell temperature.
Definition ThermalForceComponent.h:45
Definition VelocityForceComponent.h:37
Definition ForceController.h:56
Parameters for PID calculations.
Definition PIDParameters.h:36