Skip to content

Commit d44487e

Browse files
authored
Altitude hold (#161)
* althold init * baro alt hold * alt-hold tuning * accel cosTheta + althold iterm config * code tidy + baro filters
1 parent 6363b65 commit d44487e

29 files changed

+510
-258
lines changed

lib/Espfc/src/Blackbox/Blackbox.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ void FAST_CODE_ATTR Blackbox::updateData()
255255
mag.magADC[i] = _model.state.mag.adc[i] * 1090;
256256
}
257257
if(_model.baroActive()) {
258-
baro.altitude = lrintf(_model.state.baro.altitude * 100.f); // cm
258+
baro.altitude = lrintf(_model.state.baro.altitudeGround * 100.f); // cm
259259
}
260260
}
261261
rcCommand[AXIS_THRUST] = _model.state.input.buffer[AXIS_THRUST];
@@ -324,6 +324,7 @@ void FAST_CODE_ATTR Blackbox::updateMode()
324324
updateModeFlag(&rcModeActivationMask, BOXARM, _model.isSwitchActive(MODE_ARMED));
325325
updateModeFlag(&rcModeActivationMask, BOXANGLE, _model.isSwitchActive(MODE_ANGLE));
326326
updateModeFlag(&rcModeActivationMask, BOXAIRMODE, _model.isSwitchActive(MODE_AIRMODE));
327+
updateModeFlag(&rcModeActivationMask, BOXANTIGRAVITY, _model.isSwitchActive(MODE_ALTHOLD));
327328
updateModeFlag(&rcModeActivationMask, BOXFAILSAFE, _model.isSwitchActive(MODE_FAILSAFE));
328329
updateModeFlag(&rcModeActivationMask, BOXBLACKBOX, _model.isSwitchActive(MODE_BLACKBOX));
329330
updateModeFlag(&rcModeActivationMask, BOXBLACKBOXERASE, _model.isSwitchActive(MODE_BLACKBOX_ERASE));

lib/Espfc/src/Connect/Cli.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,8 +276,8 @@ void Cli::Param::write(ActuatorCondition& ac, const char ** args) const
276276
if(args[3]) ac.ch = String(args[3]).toInt();
277277
if(args[4]) ac.min = String(args[4]).toInt();
278278
if(args[5]) ac.max = String(args[5]).toInt();
279-
if(args[6]) ac.max = String(args[6]).toInt();
280-
if(args[7]) ac.max = String(args[7]).toInt();
279+
if(args[6]) ac.logicMode = String(args[6]).toInt();
280+
if(args[7]) ac.linkId = String(args[7]).toInt();
281281
}
282282

283283
void Cli::Param::write(MixerEntry& ac, const char ** args) const
@@ -560,12 +560,20 @@ const Cli::Param * Cli::initialize(ModelConfig& c)
560560
Param(PSTR("pid_level_p"), &c.pid[FC_PID_LEVEL].P),
561561
Param(PSTR("pid_level_i"), &c.pid[FC_PID_LEVEL].I),
562562
Param(PSTR("pid_level_d"), &c.pid[FC_PID_LEVEL].D),
563+
Param(PSTR("pid_level_f"), &c.pid[FC_PID_LEVEL].F),
563564

564565
Param(PSTR("pid_level_angle_limit"), &c.level.angleLimit),
565566
Param(PSTR("pid_level_rate_limit"), &c.level.rateLimit),
566567
Param(PSTR("pid_level_lpf_type"), &c.level.ptermFilter.type, filterTypeChoices),
567568
Param(PSTR("pid_level_lpf_freq"), &c.level.ptermFilter.freq),
568569

570+
Param(PSTR("pid_althold_vel_p"), &c.pid[FC_PID_VEL].P),
571+
Param(PSTR("pid_althold_vel_i"), &c.pid[FC_PID_VEL].I),
572+
Param(PSTR("pid_althold_vel_d"), &c.pid[FC_PID_VEL].D),
573+
Param(PSTR("pid_althold_vel_f"), &c.pid[FC_PID_VEL].F),
574+
Param(PSTR("pid_althold_iterm_center"), &c.altHold.itermCenter),
575+
Param(PSTR("pid_althold_iterm_range"), &c.altHold.itermRange),
576+
569577
Param(PSTR("pid_yaw_lpf_type"), &c.yaw.filter.type, filterTypeChoices),
570578
Param(PSTR("pid_yaw_lpf_freq"), &c.yaw.filter.freq),
571579

@@ -1382,13 +1390,15 @@ void Cli::execute(CliCmd& cmd, Stream& s)
13821390
else if(strcmp_P(cmd.args[1], PSTR("erase")) == 0)
13831391
{
13841392
flashfsEraseCompletely();
1393+
s.println("OK");
13851394
}
13861395
else if(strcmp_P(cmd.args[1], PSTR("test")) == 0)
13871396
{
13881397
const char * data = "flashfs-test";
13891398
flashfsWrite((const uint8_t*)data, strlen(data), true);
13901399
flashfsFlushAsync(true);
13911400
flashfsClose();
1401+
s.println("OK");
13921402
}
13931403
else if(strcmp_P(cmd.args[1], PSTR("print")) == 0)
13941404
{

lib/Espfc/src/Connect/MspProcessor.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -275,13 +275,14 @@ void MspProcessor::processCommand(MspMessage& m, MspResponse& r, Device::SerialD
275275
break;
276276

277277
case MSP_BOXNAMES:
278-
r.writeString(F("ARM;ANGLE;AIRMODE;BEEPER;FAILSAFE;BLACKBOX;BLACKBOXERASE;"));
278+
r.writeString(F("ARM;AIRMODE;ANGLE;ALTHOLD;BEEPER;FAILSAFE;BLACKBOX;BLACKBOXERASE;"));
279279
break;
280280

281281
case MSP_BOXIDS:
282282
r.writeU8(MODE_ARMED);
283-
r.writeU8(MODE_ANGLE);
284283
r.writeU8(MODE_AIRMODE);
284+
r.writeU8(MODE_ANGLE);
285+
r.writeU8(MODE_ALTHOLD);
285286
r.writeU8(MODE_BUZZER);
286287
r.writeU8(MODE_FAILSAFE);
287288
r.writeU8(MODE_BLACKBOX);
@@ -684,8 +685,8 @@ void MspProcessor::processCommand(MspMessage& m, MspResponse& r, Device::SerialD
684685
break;
685686

686687
case MSP_ALTITUDE:
687-
r.writeU32(lrintf(_model.state.baro.altitude * 100.f)); // alt [cm]
688-
r.writeU16(0); // vario
688+
r.writeU32(lrintf(_model.state.altitude.height * 100.f)); // alt [cm]
689+
r.writeU16(lrintf(_model.state.altitude.vario * 100.f)); // vario [cm/s]
689690
break;
690691

691692
case MSP_BEEPER_CONFIG:
@@ -1462,7 +1463,12 @@ void MspProcessor::processCommand(MspMessage& m, MspResponse& r, Device::SerialD
14621463
disableRunawayTakeoff = m.readU8();
14631464
}
14641465
(void)disableRunawayTakeoff;
1465-
_model.setArmingDisabled(ARMING_DISABLED_MSP, cmd);
1466+
#if defined(ESPFC_DEV_PRESET_UNSAFE_ARMING)
1467+
(void)cmd;
1468+
#warning "Danger macro used ESPFC_DEV_PRESET_UNSAFE_ARMING"
1469+
#else
1470+
_model.setArmingDisabled(ARMING_DISABLED_MSP, cmd);
1471+
#endif
14661472
if (_model.isModeActive(MODE_ARMED)) _model.disarm(DISARM_REASON_ARMING_DISABLED);
14671473
}
14681474
break;
@@ -1491,7 +1497,7 @@ void MspProcessor::processCommand(MspMessage& m, MspResponse& r, Device::SerialD
14911497
break;
14921498

14931499
case MSP_DEBUG:
1494-
for (int i = 0; i < 4; i++) {
1500+
for (int i = 0; i < 8; i++) {
14951501
r.writeU16(_model.state.debug[i]);
14961502
}
14971503
break;

lib/Espfc/src/Connect/Vtx.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ static uint8_t crc8(const uint8_t * ptr, uint8_t len)
3131
{
3232
uint8_t crc = 0;
3333
for (uint8_t i = 0; i < len; i++) {
34-
crc = crc8tab[crc ^ *ptr++];
35-
}
36-
return crc;
34+
crc = crc8tab[crc ^ *ptr++];
35+
}
36+
return crc;
3737
}
3838

3939
namespace Espfc::Connect {

lib/Espfc/src/Control/Actuator.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,8 @@ bool Actuator::canActivateMode(FlightMode mode)
157157
return _model.accelActive();
158158
case MODE_AIRMODE:
159159
return _model.state.mode.airmodeAllowed;
160+
case MODE_ALTHOLD:
161+
return _model.state.baro.dev;
160162
default:
161163
return true;
162164
}

lib/Espfc/src/Control/Altitude.hpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#pragma once
2+
3+
#include "Model.h"
4+
#include "Utils/Filter.h"
5+
6+
namespace Espfc::Control {
7+
8+
class Altitude
9+
{
10+
public:
11+
Altitude(Model& model): _model(model) {}
12+
13+
int begin()
14+
{
15+
_model.state.altitude.height = 0.0f;
16+
_model.state.altitude.vario = 0.0f;
17+
18+
_altitudeFilter.begin(FilterConfig(FILTER_PT3, 5), _model.state.accel.timer.rate);
19+
_varioFilter.begin(FilterConfig(FILTER_PT3, 5), _model.state.accel.timer.rate);
20+
21+
return 1;
22+
}
23+
24+
int update()
25+
{
26+
_model.state.altitude.height = _altitudeFilter.update(_model.state.baro.altitudeGround);
27+
_model.state.altitude.vario = _varioFilter.update(_model.state.baro.vario);
28+
29+
if(_model.config.debug.mode == DEBUG_ALTITUDE)
30+
{
31+
_model.state.debug[0] = std::clamp(lrintf(_model.state.baro.altitudeGround * 100.0f), -32000l, 32000l); // gps trust
32+
_model.state.debug[1] = std::clamp(lrintf(_model.state.baro.vario * 100.0f), -32000l, 32000l); // baroAlt cm
33+
_model.state.debug[2] = std::clamp(lrintf(_model.state.altitude.height * 100.0f), -32000l, 32000l); // gpsAlt cm
34+
_model.state.debug[3] = std::clamp(lrintf(_model.state.altitude.vario * 100.0f), -32000l, 32000l); // vario
35+
}
36+
37+
return 1;
38+
}
39+
40+
private:
41+
Model& _model;
42+
Utils::Filter _altitudeFilter;
43+
Utils::Filter _varioFilter;
44+
};
45+
46+
}

0 commit comments

Comments
 (0)