@@ -80,19 +80,28 @@ void AutogyroTakeoff::update(const hrt_abstime &now, float airspeed, float rotor
80
80
_climbout = true ;
81
81
takeoff_status_s takeoff_status = {};
82
82
83
+ actuator_armed_s actuator_armed;
84
+ _actuator_armed_sub.update (&actuator_armed);
85
+
86
+ if (actuator_armed.manual_lockdown && _state <= AutogyroTakeoffState::PRE_TAKEOFF_RAMPUP) {
87
+ _state = AutogyroTakeoffState::TAKEOFF_ERROR;
88
+ }
89
+
83
90
switch (_state) {
84
91
/*
85
92
Hangling error states of takeoff mode. Should lead in allerting operator and/or
86
93
abrod takeoff process
87
94
88
95
IN: error state
89
96
*/
90
- case AutogyroTakeoffState::TAKEOFF_ERROR:
91
- PX4_INFO (" ERR STATE" );
92
- mavlink_log_info (mavlink_log_pub, " #Takeoff: Error state" );
97
+ case AutogyroTakeoffState::TAKEOFF_ERROR: {
98
+ if (_state != _state_last) {
99
+ PX4_INFO (" ERR STATE" );
100
+ mavlink_log_info (mavlink_log_pub, " #Takeoff: Error state" );
101
+ }
102
+ }
93
103
break ;
94
104
95
-
96
105
/*
97
106
Initial state of regulator, wait for manual prerotate of rotor.
98
107
@@ -118,7 +127,8 @@ void AutogyroTakeoff::update(const hrt_abstime &now, float airspeed, float rotor
118
127
_time_in_state = now;
119
128
}
120
129
121
- mavlink_log_info (mavlink_log_pub, " #Takeoff: minimal RPM for prerotator reached" );
130
+ mavlink_log_info (mavlink_log_pub, " Takeoff: minimal RPM for prerotator reached" );
131
+ // PX4_INFO("Takeoff: minimal RPM for prerotator reached");
122
132
}
123
133
124
134
break ;
@@ -140,13 +150,14 @@ void AutogyroTakeoff::update(const hrt_abstime &now, float airspeed, float rotor
140
150
_time_in_state = now;
141
151
play_next_tone ();
142
152
mavlink_log_info (mavlink_log_pub, " Takeoff, prerotator RPM reached" );
153
+ // PX4_INFO("Takeoff: prerotator RPM reached");
143
154
}
144
155
145
156
break ;
146
157
147
158
/*
148
- All required takeoff conditions are satisfied. Now it is prepared to start.
149
- Try to start main motor. Slowly rump up and check it .
159
+ All required takeoff conditions are satisfied. Now it is prepared to
160
+ try to start main motor.
150
161
151
162
IN: rotor prepared;
152
163
OUT: rotor prepared; minimal airspeed; motor max power,
@@ -156,31 +167,75 @@ void AutogyroTakeoff::update(const hrt_abstime &now, float airspeed, float rotor
156
167
157
168
if (rotor_rpm < _param_ag_rotor_flight_rpm.get ()) {
158
169
ready_for_release = false ;
159
-
170
+ // PX4_INFO("Takeofff, waiting for flight rpm.");
160
171
// Some histesis needs to be applied for the start interrupt procedure.
161
172
// Currently, this does not allow the start to be interrupted.
162
173
// _state = AutogyroTakeoffState::PRE_TAKEOFF_PREROTATE;
163
- _time_in_state = now;
174
+ // _time_in_state = now;
164
175
}
165
176
166
177
// check minimal airspeed
167
178
if (airspeed < (_param_fw_airspd_min.get () * _param_rwto_airspd_scl.get ())) {
168
179
ready_for_release = false ;
180
+ // PX4_INFO("Takeofff, waiting for min airspeed.");
169
181
}
170
182
171
183
if (ready_for_release) {
172
184
_init_yaw = get_bearing_to_next_waypoint (_initial_wp (0 ), _initial_wp (1 ), current_lat, current_lon);
173
185
174
- _state = AutogyroTakeoffState::TAKEOFF_RELEASE ;
186
+ _state = AutogyroTakeoffState::PRE_TAKEOFF_RAMPUP ;
175
187
_time_in_state = now;
176
- mavlink_log_info (mavlink_log_pub, " Takeoff, Please release. " );
177
-
188
+ mavlink_log_info (mavlink_log_pub, " Ready to start motor " );
189
+ // PX4_INFO("Takeoff, Please release.");
178
190
play_next_tone ();
179
191
}
180
192
181
193
}
182
194
break ;
183
195
196
+ /*
197
+ Slowly rampup motor. Keep trying to check other flight parameters.
198
+ If I can still fly
199
+ */
200
+ case AutogyroTakeoffState::PRE_TAKEOFF_RAMPUP: {
201
+ bool ready_for_release = true ;
202
+
203
+ if (rotor_rpm < _param_ag_rotor_flight_rpm.get ()) {
204
+ ready_for_release = false ;
205
+ // PX4_INFO("Takeofff, waiting for flight rpm.");
206
+ // Some histesis needs to be applied for the start interrupt procedure.
207
+ // Currently, this does not allow the start to be interrupted.
208
+ // _state = AutogyroTakeoffState::PRE_TAKEOFF_PREROTATE;
209
+ // _time_in_state = now;
210
+ }
211
+
212
+ // check minimal airspeed
213
+ if (airspeed < (_param_fw_airspd_min.get () * _param_rwto_airspd_scl.get ())) {
214
+ ready_for_release = false ;
215
+ // PX4_INFO("Takeofff, waiting for min airspeed.");
216
+ }
217
+
218
+ // ramup time elapsed
219
+ if (hrt_elapsed_time (&_time_in_state) < (_param_rwto_ramp_time.get () * 1_s * 1.5 )) {
220
+ ready_for_release = false ;
221
+ }
222
+
223
+ // Check if motor/esc power (properller RPM) is suffiscient
224
+ // TODO
225
+ if (false ) {
226
+ ready_for_release = false ;
227
+ }
228
+
229
+ if (ready_for_release) {
230
+
231
+ _state = AutogyroTakeoffState::TAKEOFF_RELEASE;
232
+ _time_in_state = now;
233
+ PX4_INFO (" Takeoff, Please release." );
234
+ play_next_tone ();
235
+ }
236
+ }
237
+ break ;
238
+
184
239
/*
185
240
Command for release. Sound signal for release from hand or release from
186
241
some takeoff platform with mavlink command. This step ends on release ACK.
@@ -198,8 +253,9 @@ void AutogyroTakeoff::update(const hrt_abstime &now, float airspeed, float rotor
198
253
play_release_tone ();
199
254
}
200
255
201
- if (alt_agl > _param_rwto_nav_alt .get ()) {
256
+ if (alt_agl > _param_ag_nav_alt .get ()) {
202
257
mavlink_log_info (mavlink_log_pub, " Climbout" );
258
+ PX4_INFO (" Takeoff: Climbout." );
203
259
_state = AutogyroTakeoffState::TAKEOFF_CLIMBOUT;
204
260
play_next_tone ();
205
261
_time_in_state = now;
@@ -224,6 +280,7 @@ void AutogyroTakeoff::update(const hrt_abstime &now, float airspeed, float rotor
224
280
_climbout = false ;
225
281
_state = AutogyroTakeoffState::FLY;
226
282
_time_in_state = now;
283
+ PX4_INFO (" Takeoff:FLY." );
227
284
}
228
285
229
286
// _climbout = false;
@@ -278,6 +335,7 @@ float AutogyroTakeoff::getRequestedAirspeed()
278
335
case AutogyroTakeoffState::PRE_TAKEOFF_PREROTATE_START:
279
336
case AutogyroTakeoffState::PRE_TAKEOFF_PREROTATE:
280
337
case AutogyroTakeoffState::PRE_TAKEOFF_DONE:
338
+ case AutogyroTakeoffState::PRE_TAKEOFF_RAMPUP:
281
339
return _param_fw_airspd_min.get () * _param_rwto_airspd_scl.get ();
282
340
283
341
default :
@@ -305,12 +363,14 @@ float AutogyroTakeoff::getPitch(float tecsPitch)
305
363
switch (_state) {
306
364
307
365
case AutogyroTakeoffState::TAKEOFF_ERROR:
308
- case AutogyroTakeoffState::PRE_TAKEOFF_PREROTATE_START: // 0 Null pitch
309
366
return 0 ;
310
367
368
+ case AutogyroTakeoffState::PRE_TAKEOFF_PREROTATE_START: // 0 Null pitch
311
369
case AutogyroTakeoffState::PRE_TAKEOFF_PREROTATE: // 1 maximal pitch
312
370
case AutogyroTakeoffState::PRE_TAKEOFF_DONE: // 2
313
- return math::radians (_param_rwto_max_pitch.get ());
371
+ case AutogyroTakeoffState::PRE_TAKEOFF_RAMPUP:
372
+ // return math::radians(_param_rwto_max_pitch.get());
373
+ return math::radians (_param_rwto_psp.get ());
314
374
315
375
// FLy
316
376
default :
@@ -331,8 +391,8 @@ float AutogyroTakeoff::getRoll(float navigatorRoll)
331
391
// allow some limited roll during RELEASE and CLIMBOUT
332
392
else if (_state < AutogyroTakeoffState::FLY) {
333
393
return math::constrain (navigatorRoll,
334
- math::radians (-_param_rwto_max_roll .get ()),
335
- math::radians (_param_rwto_max_roll .get ()));
394
+ math::radians (-_param_ag_tko_max_roll .get ()),
395
+ math::radians (_param_ag_tko_max_roll .get ()));
336
396
}
337
397
338
398
return navigatorRoll;
@@ -367,6 +427,8 @@ float AutogyroTakeoff::getThrottle(const hrt_abstime &now, float tecsThrottle)
367
427
368
428
float idle = (double )_param_fw_thr_idle.get ();
369
429
430
+ // PX4_INFO("GET THROTTLE %f, state: %f, time: %f", (double)idle, (double)_state, (double)(now - _time_in_state));
431
+
370
432
switch (_state) {
371
433
372
434
case AutogyroTakeoffState::TAKEOFF_ERROR:
@@ -377,15 +439,15 @@ float AutogyroTakeoff::getThrottle(const hrt_abstime &now, float tecsThrottle)
377
439
case AutogyroTakeoffState::PRE_TAKEOFF_DONE: {
378
440
if (_param_ag_prerotator_type.get () == AutogyroTakeoffType::WOPREROT_RUNWAY) {
379
441
float throttle = ((now - _time_in_state) / (_param_rwto_ramp_time.get () * 1_s)) * _param_rwto_max_thr.get ();
442
+ // PX4_INFO("Thortle: %f",(double)throttle);
380
443
return math::min (throttle, _param_rwto_max_thr.get ());
381
444
382
445
} else {
383
446
return idle;
384
447
}
385
448
}
386
449
387
-
388
- case AutogyroTakeoffState::TAKEOFF_RELEASE: {
450
+ case AutogyroTakeoffState::PRE_TAKEOFF_RAMPUP: {
389
451
float throttle = idle;
390
452
391
453
if (_param_ag_prerotator_type.get () == AutogyroTakeoffType::WOPREROT_RUNWAY) {
@@ -396,6 +458,20 @@ float AutogyroTakeoff::getThrottle(const hrt_abstime &now, float tecsThrottle)
396
458
throttle = math::min (throttle, _param_rwto_max_thr.get ());
397
459
}
398
460
461
+ return throttle;
462
+ }
463
+
464
+
465
+ case AutogyroTakeoffState::TAKEOFF_RELEASE: {
466
+ float throttle = idle;
467
+
468
+ if (_param_ag_prerotator_type.get () == AutogyroTakeoffType::WOPREROT_RUNWAY) {
469
+ throttle = _param_rwto_max_thr.get ();
470
+
471
+ } else if (_param_ag_prerotator_type.get () == AutogyroTakeoffType::WOPREROT_PLATFORM) {
472
+ throttle = _param_rwto_max_thr.get ();
473
+ }
474
+
399
475
return math::min (throttle, _param_rwto_max_thr.get ());
400
476
}
401
477
0 commit comments