uav_gimbal.h
13.2 KB
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __UAV_GIMBAL_HPP__
#define __UAV_GIMBAL_HPP__
/* Includes ------------------------------------------------------------------*/
#include "uav_typedef.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/**
* @brief Gimbal calibration stage and result.
*/
typedef enum {
UAV_GIMBAL_CALIBRATION_STAGE_COMPLETE = 0, /*!< Calibration have been completed and the result is successful. */
UAV_GIMBAL_CALIBRATION_STAGE_PROCRESSING = 1, /*!< Gimbal is calibrating. */
UAV_GIMBAL_CALIBRATION_STAGE_FAILED = 3, /*!< Calibration have been completed and the result is failure. */
} E_UavGimbalCalibrationStage;
/**
* @brief Axis of gimbal.
*/
typedef enum {
UAV_GIMBAL_AXIS_PITCH = 0, /*!< Pitch axis. */
UAV_GIMBAL_AXIS_ROLL = 1, /*!< Roll axis. */
UAV_GIMBAL_AXIS_YAW = 2, /*!< Yaw axis. */
} E_UavGimbalAxis;
/**
* @brief Reset mode of gimbal.
*/
typedef enum {
/*! Only reset yaw axis of gimbal. Reset angle of yaw axis to the sum of yaw axis angle of aircraft and fine tune angle
* of yaw axis of gimbal. */
UAV_GIMBAL_RESET_MODE_YAW = 1,
/*! Reset yaw axis and pitch axis of gimbal. Reset angle of yaw axis to sum of yaw axis angle of aircraft and fine tune
* angle of yaw axis of gimbal, and reset pitch axis angle to the fine tune angle. */
UAV_GIMBAL_RESET_MODE_PITCH_AND_YAW = 3,
/*! Reset yaw axis and pitch axis of gimbal. Reset angle of yaw axis to sum of yaw axis angle of aircraft and fine tune
* angle of yaw axis of gimbal, and reset pitch axis angle to sum of -90 degree and fine tune angle if gimbal
* downward, sum of 90 degree and fine tune angle if upward. */
UAV_GIMBAL_RESET_MODE_PITCH_DOWNWARD_UPWARD_AND_YAW = 11,
/*! Reset pitch axis of gimbal. Reset pitch axis angle to sum of -90 degree and fine tune angle if gimbal downward,
* sum of 90 degree and fine tune angle if upward.
* Note: only support for dragonfish series
*/
UAV_GIMBAL_RESET_MODE_PITCH_DOWNWARD_UPWARD = 12,
} E_UAVGimbalResetMode;
/**
* @brief Smooth factor of gimbal controller.
*/
typedef struct {
uint8_t pitch; /*!< Smooth factor of pitch axis, range from 0 to 30. */
uint8_t yaw; /*!< Smooth factor of yaw axis, range from 0 to 30. */
} T_UavGimbalControllerSmoothFactor;
/**
* @brief Max speed percentage of every axis of gimbal.
*/
typedef struct {
uint8_t pitch; /*!< Max speed percentage of pitch axis, range from 1 to 100. */
uint8_t yaw; /*!< Max speed percentage of yaw axis, range from 1 to 100. */
} T_UavGimbalControllerMaxSpeedPercentage;
/**
* @brief Data structure describes gimbal system state.
*/
typedef struct {
bool resettingFlag; /*!< Specifies whether gimbal is resetting now or not. */
bool mountedUpward; /*!< Specifies whether gimbal is upward or not. */
bool blockingFlag; /*!< Specifies whether gimbal is stuck or not. */
bool pitchRangeExtensionEnabledFlag; /*!< Specifies whether extended angle range of gimbal pitch axis is enabled or not. */
E_UAVGimbalMode gimbalMode; /*!< Gimbal mode. */
T_UAVAttitude3d fineTuneAngle; /*!< Fine tune angles, unit: 0.1 degree. */
T_UavGimbalControllerSmoothFactor smoothFactor; /*!< Smooth factor of gimbal controller. */
T_UavGimbalControllerMaxSpeedPercentage maxSpeedPercentage; /*!< Max speed percentage of gimbal controller. */
} T_UavGimbalSystemState;
/**
* @brief Reach limit flag.
*/
typedef struct {
bool pitch; /*!< Specifies whether gimbal has reached angle limit of pitch axis, if true, reached the limit. */
bool roll; /*!< Specifies whether gimbal has reached angle limit of roll axis, if true, reached the limit. */
bool yaw; /*!< Specifies whether gimbal has reached angle limit of yaw axis, if true, reached the limit. */
} T_UavGimbalReachLimitFlag;
/**
* @brief Gimbal attitude related information.
*/
typedef struct {
T_UAVAttitude3d attitude; /*!< Gimbal attitude in the ground coordinate, unit: 0.1 degree. */
T_UavGimbalReachLimitFlag reachLimitFlag; /*!< Reach limit flag, being set when the joint angles of gimbal reach limits. */
} T_UavGimbalAttitudeInformation;
/**
* @brief Gimbal calibration state.
*/
typedef struct {
bool calibratingFlag; /*!< Specifies whether gimbal is calibrating now or not. */
bool lastCalibrationResult; /*!< Result of the last calibration, and true specifies success. */
uint8_t currentCalibrationProgress; /*!< Progress percentage of current calibration. If gimbal is calibrating now and fill in real progress percentage, if not, fill in zero. The item ranges from 0 to 100. */
E_UavGimbalCalibrationStage currentCalibrationStage; /*!< Current calibration stage and result. If gimbal is calibrating now and fill in ::UAV_GIMBAL_CALIBRATION_STAGE_PROCRESSING, if not, fill in result of the last calibration. */
} T_UavGimbalCalibrationState;
/**
* @brief Gimbal rotation command property.
*/
typedef struct {
struct {
bool pitch; /*!< Specifies whether ignore rotation command of pitch axis, and true specifies ignoring. */
bool roll; /*!< Specifies whether ignore rotation command of roll axis, and true specifies ignoring. */
bool yaw; /*!< Specifies whether ignore rotation command of yaw axis, and true specifies ignoring. */
} rotationValueInvalidFlag; /*!< Specifies whether ignore rotation command of some axis, including pitch, roll and yaw. */
union {
struct {
uint16_t actionTime; /*!< Action time during which gimbal move to target angles, unit: 0.01s. */
} relativeAngleRotation; /*!< Property of relative angle rotation command. */
struct {
uint16_t actionTime; /*!< Action time during which gimbal move to target angles, unit: 0.01s. */
/*! Joint angle valid flag, specifying whether
* T_UavGimbalRotationProperty::absoluteAngleRotation::jointAngle is valid when absolute angle control. */
bool jointAngleValid;
/*! Joint angles of gimbal, unit: 0.1 degree. If
* T_UavGimbalRotationProperty::absoluteAngleRotation::jointAngleValid is false, specifying here joint
* angles are invalid, and please ignore the joint angles. If joint angles are valid, users should ensure
* that target joint angles of gimbal is approximately the same as the specified value. */
T_UAVAttitude3d jointAngle;
} absoluteAngleRotation; /*!< Property of absolute angle rotation command. */
};
} T_UavGimbalRotationProperty;
/**
* @brief Common handler function prototypes of gimbal, that is, some common callback function prototypes of gimbal.
* @warning User can not execute blocking style operations or functions in callback function, because that will block UAV
* root thread, causing problems such as slow system response, payload disconnection or infinite loop.
*/
typedef struct {
/*!
* @brief Prototype of callback function used to report system state of gimbal.
* @param systemState: pointer to memory space used to store gimbal system state.
* @return Execution result.
*/
T_UAVReturnCode (*GetSystemState)(T_UavGimbalSystemState *systemState);
/*!
* @brief Prototype of callback function used to report attitude information of gimbal.
* @param attitudeInformation: pointer to memory space used to store gimbal attitude information.
* @return Execution result.
*/
T_UAVReturnCode (*GetAttitudeInformation)(T_UavGimbalAttitudeInformation *attitudeInformation);
/*!
* @brief Prototype of callback function used to report calibration state of gimbal.
* @param calibrationState: pointer to memory space used to store gimbal calibration state.
* @return Execution result.
*/
T_UAVReturnCode (*GetCalibrationState)(T_UavGimbalCalibrationState *calibrationState);
/*!
* @brief Prototype of callback function used to rotate gimbal. Rotation callback function will be called when
* other modules control gimbal.
* @warning User should control execution time of the callback function to be short, because this callback function
* may be called at very high frequency in some scenarios, just like 200Hz.
* @param rotationMode: mode of rotation command.
* @param rotationProperty: property of rotation command.
* @param rotationValue: value of rotation command, unit: 0.1 degree (if rotation mode is
* ::UAV_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE or ::UAV_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE), 0.1 degree/s
* (if rotation mode is ::UAV_GIMBAL_ROTATION_MODE_SPEED).
* @return Execution result.
*/
T_UAVReturnCode (*Rotate)(E_UAVGimbalRotationMode rotationMode, T_UavGimbalRotationProperty rotationProperty,
T_UAVAttitude3d rotationValue);
/*!
* @brief Prototype of callback function used to start calibrating gimbal.
* @note Maximum allowable time of gimbal calibration is 120s.
* @return Execution result.
*/
T_UAVReturnCode (*StartCalibrate)(void);
/**
* @brief Set smooth factor for gimbal controller, using to smooth control.
* @param smoothingFactor: smooth factor. The larger the value, the smaller the acceleration of gimbal. Recommended
* calculation formula is "acc = 10000 * (0.8 ^ (1 + x)) deg/s^2", x is smooth factor. Range from 0 to 30.
* @param axis: axis to be set.
* @return Execution result.
*/
T_UAVReturnCode (*SetControllerSmoothFactor)(uint8_t smoothingFactor, E_UavGimbalAxis axis);
/*!
* @brief Prototype of callback function used to enable or disable extended pitch axis angle range.
* @details Switching the gimbal limit euler angle of pitch axis to the extended limit angle or the default limit
* angle.
* @param enabledFlag: flag specified whether enable or disable extended pitch axis angle range.
* @return Execution result.
*/
T_UAVReturnCode (*SetPitchRangeExtensionEnabled)(bool enabledFlag);
/**
* @brief Set max speed percentage for gimbal controller.
* @param maxSpeedPercentage: max speed value. Recommended calculation formula is "spd = default_max_spd * x / 100",
* x is default max speed value. Range from 1 to 100.
* @param axis: axis to be set.
* @return Execution result.
*/
T_UAVReturnCode (*SetControllerMaxSpeedPercentage)(uint8_t maxSpeedPercentage, E_UavGimbalAxis axis);
/**
* @brief Restore factory settings of gimbal, including fine tune angle, pitch angle extension enable flag and max
* speed etc.
* @return Execution result.
*/
T_UAVReturnCode (*RestoreFactorySettings)(void);
/*!
* @brief Prototype of callback function used to set gimbal work mode.
* @param mode: gimbal work mode.
* @return Execution result.
*/
T_UAVReturnCode (*SetMode)(E_UAVGimbalMode mode);
/*!
* @brief Prototype of callback function used to reset gimbal.
* @note Reset command will interrupt rotation process.
* @param mode: Reset mode.
* @return Execution result.
*/
T_UAVReturnCode (*Reset)(E_UAVGimbalResetMode mode);
/*!
* @brief Prototype of callback function used to fine tune angle of gimbal.
* @param fineTuneAngle: fine tune angle, unit: 0.1 degree. Angle value of greater than 0 specifies rotation
* towards the positive direction of body coordinate.
* @return Execution result.
*/
T_UAVReturnCode (*FineTuneAngle)(T_UAVAttitude3d fineTuneAngle);
/**
* @brief Prototype of callback function used to report rotation speed of gimbal.
* @note The callback function will be called at 50 Hz. Developers should ensure that, the average rotation speed
* of gimbal within 20 ms after the callback function is called is approximately equal to the reported rotation
* speed.
* @param rotationSpeed: pointer to memory space used to store rotation speed, in body coordinate, unit:
* 0.1 degree/s.
* @return Execution result.
*/
T_UAVReturnCode (*GetRotationSpeed)(T_UAVAttitude3d *rotationSpeed);
/**
* @brief Prototype of callback function used to report joint angle of gimbal.
* @param jointAngle: pointer to memory space used to store joint angles, unit: 0.1 degree.
* @return Execution result.
*/
T_UAVReturnCode (*GetJointAngle)(T_UAVAttitude3d *jointAngle);
} T_UavGimbalCommonHandler;
/* Exported functions --------------------------------------------------------*/
/**
* @brief Initialise gimbal module, and user should call this function before using gimbal features.
* @return Execution result.
*/
T_UAVReturnCode UavGimbal_Init(void);
/**
* @brief Deinitialise gimbal module.
* @return Execution result.
*/
T_UAVReturnCode UavGimbal_DeInit(void);
/**
* @brief Register common handler functions/callback functions of gimbal. After registering, callback functions will be
* called automatically.
* @param commonHandler: pointer to common handler functions of gimbal.
* @return Execution result.
*/
T_UAVReturnCode UavGimbal_RegCommonHandler(const T_UavGimbalCommonHandler *commonHandler);
#ifdef __cplusplus
}
#endif
#endif //__UAV_GIMBAL_HPP__