[Feature] 3D-based heading for driving. Feedback wanted!
What did we do?
Until now, when you did hub.imu.heading() or drivebase.use_gyro(True), it would only register "flat turns", like driving on a table. But if you lifted the hub or steered across a ramp, you would lose the angle.
We updated the algorithms to take full motion into account. In the future, hub.imu.heading() will do this by default.
Gradual introduction
To make sure nobody experiences sudden changes in the middle of the FLL season, we're introducing this gradually. For now, hub.imu.heading() will still only register flat turns by default.
How can you try it? But if you install the latest nightly firmware, you can now do:
# Old style heading.
heading1 = hub.imu.heading()
# New style heading. This will become the default if everyone is happy.
heading3 = hub.imu.heading('3D')
It will work even better if you run the new calibration first. Just once. The results are saved on the hub until you change firmware again.
Copy pastable example
from pybricks.hubs import PrimeHub
from pybricks.tools import wait
# Optional: For more accuracy, calibrate once.
# Here's how: https://github.com/pybricks/support/issues/1907
# You can also use Technic/Essential/Inventor Hub
hub = PrimeHub()
while True:
# Old style heading.
heading1 = hub.imu.heading()
# New style heading. This will become the default if everyone is happy.
heading3 = hub.imu.heading('3D')
# It should be approximately the same as long as you stay flat. But the new
# version should be much better if you lift it up and put it back.
print(f"Old: {heading1:7.3f} New: {heading3:7.3f}", )
wait(100)
Can I use it with drive bases too?
Yes! As above, "flat turns" will remain default for now. But you can now do:
- Same as before:
drivebase.use_gyro(False) - Same as before:
drivebase.use_gyro(True). But instead you can now do:drivebase.use_gyro('3D')to try out the future method.
Now it should work better on ramps or when it drives over bumps and obstacles.
Can I use it with block coding?
In the future, this will be the default so no action is needed, whether you use Python or blocks. If you want to try it early with blocks, please let me know and we'll put an example together. Thank you!
What are the limitations? It is still just a gyro without a compass for corrections. If you lift it from a table and make lots of motion and put it back, it's going to be off by a few degrees. But still much less than the "flat" case.
What do we want to know from you?
Before we make this the default for everyone, we want to make sure that hub.imu.heading('3D') is at least as accurate as hub.imu.heading() for everyday use like on an FLL table with mostly flat turns.
We'd love to know if you want to try this in an FLL or WRO practice session.
If you do the new calibration, please let us know how it went. Just that alone should give you an accuracy bonus.
Thank you for your time!
If you want to do this as a science project with your students, we're happy to help, and answer "interview questions"!
Thanks @afarago , @DrTom, @ggramlich, @MonongahelaCryptidCooperative, @TheWendyPower, @BertLindeman and @FLL-Team-24277, @Debenben for providing feedback about using the gyro in the past year. As you can see, it has now gone to the next stage with lots of new things to try. Thank you for your consideration!
Impressive Laurens!
Added
hub.imu.reset_heading(0)
and stationary on the print:
print(f"Old: {heading1:7.3f} New: {heading3:7.3f} {hub.imu.stationary()}")
Ran on an not calibrated TechnicHub. Put it flat against the chair, turn it up right and rotate 90 degrees and back and flat again.
[EDIT] collapsed: End of the measurements
Old: 0.003 New: 0.002 False Old: 0.020 New: 0.020 False Old: 0.166 New: 0.163 False Old: 1.150 New: 1.154 False Old: 2.980 New: 2.977 False Old: 3.343 New: 3.352 False Old: 1.234 New: 1.256 False Old: 0.238 New: 0.229 False Old: -0.375 New: -0.365 False Old: -1.437 New: -1.435 False Old: -2.547 New: -2.551 False Old: -3.679 New: -3.663 False Old: -4.705 New: -4.696 False Old: -5.155 New: -5.243 False Old: -4.569 New: -4.768 False Old: -1.747 New: -1.878 False Old: -1.214 New: -1.356 False Old: -0.631 New: -0.778 False Old: -0.643 New: -0.976 False Old: -0.518 New: -1.070 False Old: -0.476 New: -1.365 False Old: -0.457 New: -1.546 False Old: -0.459 New: -1.711 False Old: -0.453 New: -2.403 False Old: -0.520 New: -14.731 False Old: -0.501 New: -11.165 False Old: -0.483 New: -7.026 False Old: -0.542 New: -7.612 False Old: -0.600 New: -9.483 False Old: -0.855 New: -23.168 False Old: -0.981 New: -28.151 False Old: -1.120 New: -28.924 False Old: -1.160 New: -29.621 False Old: -1.178 New: -31.567 False Old: -1.170 New: -25.196 False Old: -1.218 New: 3.472 False Old: -1.373 New: 59.658 False Old: -1.262 New: 74.127 False Old: -1.124 New: 84.129 False Old: -0.935 New: 90.710 False Old: -0.738 New: 91.884 False Old: -0.660 New: 86.631 False Old: -0.561 New: 79.924 False Old: -0.614 New: 25.053 False Old: -0.654 New: 15.859 False Old: -1.101 New: 12.823 False Old: -4.446 New: 7.267 False Old: -11.121 New: -0.569 False Old: -11.378 New: -1.032 False Old: -11.926 New: -1.908 False Old: -11.253 New: -1.260 False Old: -14.396 New: -4.401 False Old: -17.607 New: -7.592 False Old: -16.447 New: -6.475 False Old: -16.207 New: -6.257 False Old: -15.963 New: -6.009 False Old: -14.827 New: -4.857 False Old: -14.328 New: -4.370 False Old: -14.086 New: -4.100 False Old: -16.467 New: -6.438 False Old: -16.829 New: -6.890 False Old: -16.673 New: -6.716 False Old: -15.912 New: -5.949 False Old: -15.517 New: -5.583 False Old: -8.704 New: 1.259 False Old: -8.700 New: 1.260 False Old: -8.668 New: 1.291 False Old: -8.689 New: 1.269 False Old: -8.706 New: 1.251 False Old: -8.725 New: 1.229 False Old: -8.621 New: 1.335 False Old: -8.400 New: 1.559 False Old: -8.438 New: 1.520 False Old: -8.433 New: 1.523 False Old: -8.431 New: 1.523 False Old: -8.430 New: 1.524 False Old: -8.429 New: 1.524 False Old: -8.429 New: 1.524 False Old: -8.428 New: 1.524 False Old: -8.427 New: 1.525 False Old: -8.432 New: 1.520 False Old: -8.432 New: 1.519 False Old: -8.429 New: 1.521 True Old: -8.425 New: 1.526 True Old: -8.420 New: 1.530 True Old: -8.412 New: 1.538 True Old: -8.410 New: 1.539 True Old: -8.410 New: 1.540 True Old: -8.408 New: 1.542 True Old: -8.404 New: 1.545 True Old: -8.404 New: 1.545 True Old: -8.401 New: 1.548 True Old: -8.399 New: 1.550 True Old: -8.398 New: 1.551 True Old: -8.396 New: 1.552 True Old: -8.395 New: 1.554 True Old: -8.394 New: 1.554 True Old: -8.393 New: 1.556 True Old: -8.392 New: 1.556 True Old: -8.390 New: 1.559 True Old: -8.389 New: 1.559 True Old: -8.387 New: 1.561 True Old: -8.387 New: 1.561 True Old: -8.386 New: 1.562 True Old: -8.385 New: 1.564 True Old: -8.383 New: 1.566 True
[EDIT] Next test: the same hub now calibrated. Changed the wait to 1000 msec (too many lines). I see (old) gyro drift and much less (new). In this measurements I see the (new) drift get almost back to zero. The hub is placed on a stone windowsill so more stable than on a table on soft carpet.
stable hub measurements (1 second wait)
Old: 0.000 New: 0.000 True Old: -0.001 New: -0.002 True Old: -0.006 New: -0.006 True Old: -0.009 New: -0.009 True Old: -0.008 New: -0.008 True Old: -0.013 New: -0.011 True Old: -0.009 New: -0.008 True Old: -0.007 New: -0.007 True Old: -0.005 New: -0.004 True Old: -0.008 New: -0.007 True Old: 0.001 New: 0.000 True Old: 0.001 New: -0.000 True Old: 0.004 New: 0.003 True Old: 0.001 New: -0.000 True Old: -0.001 New: -0.004 True Old: -0.000 New: -0.004 True Old: 0.001 New: -0.004 True Old: 0.002 New: -0.004 True Old: 0.000 New: -0.005 True Old: 0.008 New: 0.001 True Old: 0.008 New: 0.000 True Old: 0.008 New: 0.001 True Old: 0.010 New: 0.002 True Old: 0.011 New: 0.001 True Old: 0.012 New: 0.004 True Old: 0.016 New: 0.007 True Old: 0.019 New: 0.009 True Old: 0.014 New: 0.003 True Old: 0.016 New: 0.006 True Old: 0.017 New: 0.007 True Old: 0.022 New: 0.010 True Old: 0.023 New: 0.009 True Old: 0.024 New: 0.010 True Old: 0.026 New: 0.011 True Old: 0.025 New: 0.010 True Old: 0.032 New: 0.017 True Old: 0.039 New: 0.021 True Old: 0.046 New: 0.026 True Old: 0.050 New: 0.026 True Old: 0.051 New: 0.026 True Old: 0.054 New: 0.029 True Old: 0.056 New: 0.028 True Old: 0.050 New: 0.024 True Old: 0.055 New: 0.025 True Old: 0.058 New: 0.026 True Old: 0.062 New: 0.030 True Old: 0.061 New: 0.028 True Old: 0.064 New: 0.030 True Old: 0.067 New: 0.032 True Old: 0.069 New: 0.031 True Old: 0.070 New: 0.029 True Old: 0.070 New: 0.027 True Old: 0.073 New: 0.028 True Old: 0.070 New: 0.023 True Old: 0.072 New: 0.024 True Old: 0.072 New: 0.023 True Old: 0.074 New: 0.025 True Old: 0.077 New: 0.024 True Old: 0.079 New: 0.025 True Old: 0.074 New: 0.020 True Old: 0.063 New: 0.009 True Old: 0.051 New: -0.002 True Old: 0.047 New: -0.006 True Old: 0.038 New: -0.015 True Old: 0.031 New: -0.020 True Old: 0.021 New: -0.030 True Old: 0.015 New: -0.033 True Old: 0.011 New: -0.035 True Old: 0.008 New: -0.037 True Old: -0.002 New: -0.044 True Old: -0.014 New: -0.054 True Old: -0.021 New: -0.059 True Old: -0.027 New: -0.063 True Old: -0.031 New: -0.064 True Old: -0.034 New: -0.064 True Old: -0.036 New: -0.063 True Old: -0.034 New: -0.060 True Old: -0.035 New: -0.058 True Old: -0.034 New: -0.055 True Old: -0.028 New: -0.048 True Old: -0.026 New: -0.044 True Old: -0.027 New: -0.043 True Old: -0.025 New: -0.039 True Old: -0.022 New: -0.036 True Old: -0.020 New: -0.034 True Old: -0.024 New: -0.035 True Old: -0.029 New: -0.038 True Old: -0.033 New: -0.041 True Old: -0.041 New: -0.046 True Old: -0.045 New: -0.048 True Old: -0.047 New: -0.048 True Old: -0.048 New: -0.048 True Old: -0.054 New: -0.052 True Old: -0.057 New: -0.052 True Old: -0.061 New: -0.054 True Old: -0.066 New: -0.058 True Old: -0.066 New: -0.055 True Old: -0.071 New: -0.057 True Old: -0.081 New: -0.065 True Old: -0.081 New: -0.061 True Old: -0.083 New: -0.061 True Old: -0.086 New: -0.061 True Old: -0.088 New: -0.060 True Old: -0.091 New: -0.060 True Old: -0.088 New: -0.056 True Old: -0.095 New: -0.060 True Old: -0.097 New: -0.060 True Old: -0.098 New: -0.059 True Old: -0.096 New: -0.056 True Old: -0.090 New: -0.048 True Old: -0.097 New: -0.052 True Old: -0.093 New: -0.047 True Old: -0.099 New: -0.051 True Old: -0.108 New: -0.056 True Old: -0.117 New: -0.062 True Old: -0.120 New: -0.063 True Old: -0.129 New: -0.068 True Old: -0.132 New: -0.069 True Old: -0.143 New: -0.076 True Old: -0.151 New: -0.081 True Old: -0.155 New: -0.080 True Old: -0.157 New: -0.077 True Old: -0.155 New: -0.072 True Old: -0.154 New: -0.068 True Old: -0.157 New: -0.068 True Old: -0.160 New: -0.068 True Old: -0.157 New: -0.063 True Old: -0.153 New: -0.058 True Old: -0.155 New: -0.058 True Old: -0.156 New: -0.057 True Old: -0.158 New: -0.055 True Old: -0.160 New: -0.056 True Old: -0.164 New: -0.056 True Old: -0.171 New: -0.061 True Old: -0.175 New: -0.063 True Old: -0.182 New: -0.067 True Old: -0.186 New: -0.068 True Old: -0.186 New: -0.065 True Old: -0.191 New: -0.067 True Old: -0.194 New: -0.066 True Old: -0.198 New: -0.067 True Old: -0.199 New: -0.066 True Old: -0.200 New: -0.065 True Old: -0.209 New: -0.069 True Old: -0.213 New: -0.070 True Old: -0.217 New: -0.071 True Old: -0.218 New: -0.069 True Old: -0.217 New: -0.067 True Old: -0.218 New: -0.064 True Old: -0.225 New: -0.068 True Old: -0.225 New: -0.066 True Old: -0.235 New: -0.072 True Old: -0.234 New: -0.067 True Old: -0.233 New: -0.063 True Old: -0.242 New: -0.068 True Old: -0.248 New: -0.069 True Old: -0.251 New: -0.069 True Old: -0.247 New: -0.063 True Old: -0.254 New: -0.065 True Old: -0.257 New: -0.066 True Old: -0.262 New: -0.067 True Old: -0.266 New: -0.067 True Old: -0.270 New: -0.066 True Old: -0.270 New: -0.063 True Old: -0.274 New: -0.065 True Old: -0.273 New: -0.061 True Old: -0.276 New: -0.062 True Old: -0.283 New: -0.065 True Old: -0.287 New: -0.066 True Old: -0.287 New: -0.064 True Old: -0.293 New: -0.065 True Old: -0.294 New: -0.063 True Old: -0.305 New: -0.071 True Old: -0.307 New: -0.070 True Old: -0.308 New: -0.068 True Old: -0.311 New: -0.068 True Old: -0.314 New: -0.068 True Old: -0.320 New: -0.070 True Old: -0.326 New: -0.073 True Old: -0.329 New: -0.072 True Old: -0.333 New: -0.071 True Old: -0.336 New: -0.071 True Old: -0.342 New: -0.072 True Old: -0.348 New: -0.074 True Old: -0.353 New: -0.075 True Old: -0.352 New: -0.071 True Old: -0.355 New: -0.071 True Old: -0.362 New: -0.074 True Old: -0.366 New: -0.075 True Old: -0.368 New: -0.073 True Old: -0.377 New: -0.078 True Old: -0.383 New: -0.079 True Old: -0.391 New: -0.082 True Old: -0.393 New: -0.080 True Old: -0.401 New: -0.085 True Old: -0.400 New: -0.080 True Old: -0.400 New: -0.079 True Old: -0.403 New: -0.076 True Old: -0.408 New: -0.076 True Old: -0.412 New: -0.077 True Old: -0.410 New: -0.073 True Old: -0.406 New: -0.066 True Old: -0.402 New: -0.061 True Old: -0.407 New: -0.064 True Old: -0.403 New: -0.056 True Old: -0.401 New: -0.052 True Old: -0.402 New: -0.051 True Old: -0.402 New: -0.049 True Old: -0.391 New: -0.037 True Old: -0.392 New: -0.036 True Old: -0.387 New: -0.030 True Old: -0.389 New: -0.031 True Old: -0.387 New: -0.028 True Old: -0.392 New: -0.032 True Old: -0.397 New: -0.035 True Old: -0.401 New: -0.036 True Old: -0.409 New: -0.041 True Old: -0.416 New: -0.047 True Old: -0.423 New: -0.052 True Old: -0.432 New: -0.057 True Old: -0.431 New: -0.053 True Old: -0.429 New: -0.050 True Old: -0.435 New: -0.055 True Old: -0.433 New: -0.051 True Old: -0.443 New: -0.056 True Old: -0.450 New: -0.062 True Old: -0.459 New: -0.067 True Old: -0.468 New: -0.071 True Old: -0.473 New: -0.073 True The program was stopped (SystemExit).
I asked a question in: https://github.com/pybricks/support/issues/1907#issuecomment-3154279338
The same question is applicable to this feature also. I'm curious about the reaction
I asked a question in: #1907 (comment)
The same question is applicable to this feature also. I'm curious about the reaction
My question was answered in: https://github.com/pybricks/support/issues/1907#issuecomment-3156109994
I asked a question in: https://github.com/pybricks/support/issues/1907#issuecomment-3154279338
The same question is applicable to this feature also. I'm curious about the reaction
Another question: I've noticed that features in the repo keep their status open. I'm used to them being closed. Is there a house rule for this in the Pybrick repos?
This issue is a request for comments. So far, one person has tried it and given feedback.
We usually aim for a bit more feedback before making a big change to an existing feature. It should be an improvement, but that is what the feedback phase is for. Once it is merged (or in this case, made default), the issue can be closed.
If you've tried it, what do you think?
I asked a question in: #1907 (comment) The same question is applicable to this feature also. I'm curious about the reaction Another question: I've noticed that features in the repo keep their status open. I'm used to them being closed. Is there a house rule for this in the Pybrick repos?
This issue is a request for comments. So far, one person has tried it and given feedback.
We usually aim for a bit more feedback before making a big change to an existing feature. It should be an improvement, but that is what the feedback phase is for. Once it is merged (or in this case, made default), the issue can be closed.
If you've tried it, what do you think?
@Debenben wrote: "Yes, 3D heading and calibration were implemented in https://github.com/pybricks/pybricks-micropython/releases/tag/v3.6.0b3 and therfore part of subsequent versions such as the current stable release 3.6.1." Link: https://github.com/pybricks/support/issues/1907#issuecomment-3156109994
I did not try yet, see my feedback/question in the link above.
1: I'm a bit surprised that @Debenben reaction contradicts yours @laurensvalk. It's not a big deal, but I thought it was already in an official release. 2: I will try this when am back from my vacation and share feedback.
@roykrikke It is in the official 3.6.1 release, but with hub.imu.heading() or by using the block you get the 1D based heading like before. You need to use hub.imu.heading('3D') to get the new 3D based one. The reason why this is classified as "big" change is that there might be people wanting to use existing programs that expect 1D heading calculation (e.g. they use their own compensation logic for tilt). If you suddenly change the behavior of the existing function, their programs will stop working. Therefore you announce such a breaking change like in the documentation to give people the chance to protest ("I cannot work with 3D based heading or raw gyro data functions, I need the 1D based one...") or change their programs accordingly.
Ha, now it's all clear to me. Thanks @laurensvalk & @laurensvalk for the explanation.
I'll think about how I can contribute with testing on the request on top of this thread.
I did some testing after the idea of the orginal post from @laurensvalk and the adoptations shared @BertLindeman
Ran on an calibrated PrimeHub.
>>> version
('primehub', '3.6.1', 'ci-release-86-v3.6.1 on 2025-03-11')
Put it flat against a thick piece of glass on a table. I'm 100% sure it's straight, rotated to 450 degrees and back again. Let me know if there is anything else I can test that might yield better results for the feedback request.
Code for testing:
Click me
from pybricks.hubs import PrimeHub
from pybricks.tools import wait
# Optional: For more accuracy, calibrate once.
# Here's how: https://github.com/pybricks/support/issues/1907
# You can also use Technic/Essential/Inventor Hub
hub = PrimeHub()
hub.imu.reset_heading(0)
while True:
# Old style heading.
heading1 = hub.imu.heading()
# New style heading. This will become the default if everyone is happy.
heading3 = hub.imu.heading('3D')
# It should be approximately the same as long as you stay flat. But the new
# version should be much better if you lift it up and put it back.
print(f"Old: {heading1:7.3f} New: {heading3:7.3f} {hub.imu.stationary()}")
wait(2000)
Measurements details (collapsed):
Click me
Old: 0.000 New: 0.000 True
Old: -0.011 New: 0.001 False
Old: -0.038 New: -0.016 True
Old: -0.042 New: -0.013 True
Old: -0.038 New: -0.000 True
Old: -90.055 New: -90.009 False
Old: -90.055 New: -89.994 True
Old: -90.052 New: -89.978 True
Old: -90.069 New: -89.984 False
Old: -90.087 New: -89.989 False
Old: -180.150 New: -180.034 False
Old: -180.151 New: -180.024 True
Old: -180.161 New: -180.023 True
Old: -187.295 New: -187.035 False
Old: -270.229 New: -270.088 False
Old: -270.254 New: -270.101 True
Old: -270.272 New: -270.106 True
Old: -319.440 New: -319.211 False
Old: -360.444 New: -360.266 False
Old: -360.445 New: -360.254 True
Old: -360.456 New: -360.252 True
Old: -360.458 New: -360.243 True
Old: -450.430 New: -450.205 False
Old: -450.420 New: -450.182 True
Old: -450.419 New: -450.173 True
Old: -424.933 New: -424.818 False
Old: -360.412 New: -360.162 False
Old: -360.410 New: -360.152 True
Old: -360.420 New: -360.155 True
Old: -270.319 New: -270.047 False
Old: -270.316 New: -270.033 True
Old: -270.329 New: -270.038 True
Old: -212.631 New: -212.379 False
Old: -180.284 New: -179.975 False
Old: -180.270 New: -179.953 True
Old: -180.250 New: -179.927 True
Old: -180.239 New: -179.911 False
Old: -90.165 New: -89.853 False
Old: -90.138 New: -89.826 True
Old: -90.129 New: -89.820 True
Old: -89.543 New: -89.289 False
Old: -0.071 New: 0.230 False
Old: -0.074 New: 0.218 False
Old: -0.068 New: 0.218 False
Old: -0.069 New: 0.212 False
Old: -0.066 New: 0.210 False
Old: -0.060 New: 0.211 False
Old: 67.803 New: 67.991 False
Old: 90.031 New: 90.298 False
Old: 90.049 New: 90.316 True
Old: 90.055 New: 90.327 True
Old: 167.444 New: 167.689 False
Old: 180.148 New: 180.435 True
Old: 180.137 New: 180.427 True
Old: 180.142 New: 180.435 True
Old: 270.138 New: 270.425 False
Old: 270.142 New: 270.415 True
Old: 270.141 New: 270.413 True
Old: 295.608 New: 295.664 False
Old: 360.168 New: 360.434 False
Old: 360.159 New: 360.424 True
Old: 360.152 New: 360.417 True
Old: 446.449 New: 446.676 False
Old: 450.218 New: 450.493 True
Old: 450.210 New: 450.487 True
Old: 450.201 New: 450.479 False
Old: 424.701 New: 424.979 False
Old: 360.102 New: 360.372 False
Old: 360.104 New: 360.375 True
Old: 361.375 New: 361.647 True
Old: 270.049 New: 270.325 False
Old: 270.043 New: 270.317 False
Old: 222.056 New: 222.439 False
Old: 180.002 New: 180.288 False
Old: 180.002 New: 180.284 True
Old: 92.062 New: 92.398 False
Old: 89.975 New: 90.248 True
Old: 89.957 New: 90.231 False
Old: -0.173 New: 0.096 False
Old: -0.184 New: 0.086 True
Old: -0.213 New: 0.059 True
Old: -0.202 New: 0.074 True
Thank you. What about when you lift it from the table, move it around, and put it back down? With the 3D option it should stay a lot closer to 0.