-
Notifications
You must be signed in to change notification settings - Fork 532
/
HangprinterKinematics.h
86 lines (74 loc) · 4.39 KB
/
HangprinterKinematics.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*
* HangprinterKinematics.h
*
* Created on: 24 Nov 2017
* Author: David
*/
#ifndef SRC_MOVEMENT_KINEMATICS_HANGPRINTERKINEMATICS_H_
#define SRC_MOVEMENT_KINEMATICS_HANGPRINTERKINEMATICS_H_
#include "Kinematics.h"
class HangprinterKinematics : public Kinematics
{
public:
// Constructors
HangprinterKinematics();
// Overridden base class functions. See Kinematics.h for descriptions.
const char *GetName(bool forStatusReport) const override;
bool Configure(unsigned int mCode, GCodeBuffer& gb, const StringRef& reply, bool& error) override;
bool CartesianToMotorSteps(const float machinePos[], const float stepsPerMm[], size_t numVisibleAxes, size_t numTotalAxes, int32_t motorPos[], bool isCoordinated) const override;
void MotorStepsToCartesian(const int32_t motorPos[], const float stepsPerMm[], size_t numVisibleAxes, size_t numTotalAxes, float machinePos[]) const override;
bool SupportsAutoCalibration() const override { return true; }
bool DoAutoCalibration(size_t numFactors, const RandomProbePointSet& probePoints, const StringRef& reply) override;
void SetCalibrationDefaults() override { Init(); }
bool WriteCalibrationParameters(FileStore *f) const override;
bool IsReachable(float x, float y, bool isCoordinated) const override;
bool LimitPosition(float position[], size_t numAxes, AxesBitmap axesHomed, bool isCoordinated) const override;
void GetAssumedInitialPosition(size_t numAxes, float positions[]) const override;
size_t NumHomingButtons(size_t numVisibleAxes) const override { return 0; }
const char* HomingButtonNames() const override { return "ABCD"; }
const char* MachineAxisNames() const override { return "ABCD"; }
HomingMode GetHomingMode() const override { return homeIndividualMotors; }
AxesBitmap AxesAssumedHomed(AxesBitmap g92Axes) const override;
AxesBitmap MustBeHomedAxes(AxesBitmap axesMoving, bool disallowMovesBeforeHoming) const override;
const char* GetHomingFileName(AxesBitmap toBeHomed, AxesBitmap alreadyHomed, size_t numVisibleAxes, AxesBitmap& mustHomeFirst) const override;
bool QueryTerminateHomingMove(size_t axis) const override;
void OnHomingSwitchTriggered(size_t axis, bool highEnd, const float stepsPerMm[], DDA& dda) const override;
bool WriteResumeSettings(FileStore *f) const override;
void LimitSpeedAndAcceleration(DDA& dda, const float *normalisedDirectionVector) const override;
float MotorAngToAxisPosition(float ang, uint32_t fullStepsPerRevolution, const float stepsPerMm[], size_t axis) override;
uint32_t GetFullStepsPerMotorRev(size_t axis) override;
private:
static constexpr float DefaultSegmentsPerSecond = 100.0;
static constexpr float DefaultMinSegmentSize = 0.2;
// Basic facts about movement system
static constexpr size_t HANGPRINTER_AXES = 4;
static constexpr size_t A_AXIS = 0;
static constexpr size_t B_AXIS = 1;
static constexpr size_t C_AXIS = 2;
static constexpr size_t D_AXIS = 3;
void Init();
void Recalc();
float LineLengthSquared(const float machinePos[3], const float anchor[3]) const; // Calculate the square of the line length from a spool from a Cartesian coordinate
void InverseTransform(float La, float Lb, float Lc, float machinePos[3]) const;
floatc_t ComputeDerivative(unsigned int deriv, float La, float Lb, float Lc) const; // Compute the derivative of height with respect to a parameter at a set of motor endpoints
void Adjust(size_t numFactors, const floatc_t v[]); // Perform 3-, 6- or 9-factor adjustment
void PrintParameters(const StringRef& reply) const; // Print all the parameters for debugging
float anchorA[3], anchorB[3], anchorC[3]; // XYZ coordinates of the anchors
float anchorDz;
float printRadius;
// Line buildup compensation
float spoolBuildupFactor;
float mountedLine[HANGPRINTER_AXES], spoolRadii[HANGPRINTER_AXES];
uint32_t mechanicalAdvantage[HANGPRINTER_AXES], actionPoints[HANGPRINTER_AXES];
uint32_t motorGearTeeth[HANGPRINTER_AXES], spoolGearTeeth[HANGPRINTER_AXES], fullStepsPerMotorRev[HANGPRINTER_AXES];
// Derived parameters
float printRadiusSquared;
float Da2, Db2, Dc2;
float Xab, Xbc, Xca;
float Yab, Ybc, Yca;
float Zab, Zbc, Zca;
float P, Q, R, P2, U, A;
float k0[HANGPRINTER_AXES], k1[HANGPRINTER_AXES], k2[HANGPRINTER_AXES], sqrtk1[HANGPRINTER_AXES], lineLengthsOrigin[HANGPRINTER_AXES]; // For line buildup compensation
bool doneAutoCalibration; // True if we have done auto calibration
};
#endif /* SRC_MOVEMENT_KINEMATICS_HANGPRINTERKINEMATICS_H_ */