Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Copter: run rate loop at full filter rate in its own thread #27029

Open
wants to merge 63 commits into
base: master
Choose a base branch
from

Conversation

andyp1per
Copy link
Collaborator

@andyp1per andyp1per commented May 9, 2024

This is a redo of #26189

I have squashed the commits, rebased and started fixing the underlying problems. There were some fundamental problems with how the original PR was handling attitude control changes so I thought it was better to just open a new PR.

Support is enabled by setting:

FSTRATE_ENABLE = 1

which gives a variable attitude rate depending on load, and:

FSTRATE_ENABLE = 2

which gives an attitude rate locked to the gyro rate, but dynamic while disarmed. For testing there is also:

FSTRATE_ENABLE = 3

which is a locked rate at all times.

The output rate can be adjusted using FSTRATE_DIV which is a gyro divisor (default 1).
Two different rates - and therefore tunes - can be compared by using the lua applet switch_rates.lua which will persistently switch the appropriate tune/rate parameters with ones saved in names beginning with X_

ArduCopter/Attitude.cpp Outdated Show resolved Hide resolved
libraries/AC_PID/AC_PID.cpp Outdated Show resolved Hide resolved
@andyp1per andyp1per added the WIP label May 10, 2024
@andyp1per andyp1per force-pushed the pr-fast-rate-thread branch 6 times, most recently from e67b845 to 679611b Compare May 22, 2024 20:40
@andyp1per
Copy link
Collaborator Author

Flow today on top of 4.5 - working well.

@andyp1per andyp1per linked an issue May 26, 2024 that may be closed by this pull request
@andyp1per andyp1per force-pushed the pr-fast-rate-thread branch 13 times, most recently from 2370654 to 6398bd3 Compare June 7, 2024 19:29
@andyp1per
Copy link
Collaborator Author

andyp1per commented Jun 9, 2024

@rmackay9 this is close to being ready and I could use your input on what the configuration should look like. The basic premise is that we run the rate controller at the same rate as the gyros which is controlled by INS_GYRO_RATE (0=1Khz,1=2Khz,2=4Khz,3=8Khz). However, this is quite expensive and will not be possible on some hardware setups. In addition we need to be able to log the rate outputs at a faster rate than the main loop rate, but its unlikely that we could successfully log at the gyro rate. Finally we need to update the filters (notch filter in particular) at a faster rate than the main loop, but it does not make sense to do this any faster than at half the gyro rate.

Currently we have the following:
FLIGHT_OPTIONS=8 - enables the rate thread and dynamically schedules the relationship to the gyro rate based on load
FLIGHT_OPTIONS=16 - fixes the rate thread at the same rate as the gyro rate
ATT_FILTER_RATE - update rate of the filters in Hz or fixed at half the gyro rate if set to 0
ATT_LOG_RATE - update rate of the rate logs in Hz or set at the main loop rate if set to 0
The last two are not exact numbers - they are just the closest we can get to the required frequency by counting gyro samples so need to be an integer divisor or the gyro rate.

I'm not currently convinced about the naming or the configuration. I think this is an important enough feature that it needs its own enable flag. I also think it would be worth having a rate parameter that allows you to fix the rate. I also think that ATT is a little bit misleading. Maybe FAST_RATE_ or RATET_ or something. So an alternative might be:

FRATE_ENABLE - set to 1 to enable the rate thread
FRATE_RATE - set to 0 to dynamically throttle, fixed Hz otherwise
FRATE_LOG_RATE - as above
FRATE_FILT_RATE - as above

or something. It would also be possible to not use Hz at all but simply pick the divisor. So 2 would be gyro rate / 2 etc.
Your thoughts appreciated on this important topic!

ArduCopter/Attitude.cpp Outdated Show resolved Hide resolved
lthall and others added 29 commits August 6, 2024 18:04
conditionally compile rate thread pieces
log latest gyro in RATE messages
honour the requested dshot rate as near as possible
if target rate changes immediately jump to target rate
recover quickly from rate changes
ensure fixed rate always prints the rate on arming and is always up to date
add support for fixed rate attitude that does not change when disarmed
only push to subsystems at main loop rate
add logging and motor timing debug
correctly round gyro decimation rates
set dshot rate when changing attitude rate
fallback to higher dshot rates at lower loop rates
re-factor rate loop rate updates
don't compile in support on tradheli
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Run rate controller at full gyro rate
6 participants