It is partially no_std
. It does not currently integrate with any API directly, but this may be added in the future.
- Node-like stream system for data processing
- Basic arithmetic + integral and derivative
- PID
- Moving average
- EWMA
- Simple device control system
- Trapezoidal motion profile following
Initial release.
Fix motion profile issue.
Start new motor-encoder system.
Function for motors to follow motion profiles.
Allow the user to run a custom update loop for motion profile following as an alternative to the single function.
Add an update method to encoders.
Add an update method to motors, allow easier detection of parts of motion profiles, and reorganize the package to use features with the motor-encoder system in a module.
Start new stream system.
Reorganize a bit and add EWMA stream.
Add moving average stream.
- performance improvements
- use array instead of vec for inputs to
SumStream
andProductStream
- avoid unnecessary weight sum calculation in
MovingAverageStream
- make the number of shifts in
PIDControllerShift
a constant
- use array instead of vec for inputs to
- replace all instances of
MotionProfileState
withMotionProfilePiece
- add
History
trait, which is like aStream
but you specify a time when youget
- reorganize streams into modules
- remove unnecessary
std
requirement for a couple types
- Move from
Stream
and the previous device system toGetter
andSettable
.Getter
is like a stream or encoder andSettable
is like a writable device. - Add
Device
type which makes rawGetter
s andSettable
s work together better as mechanical devices in a system. This should represent a physical device. - Add
Axle
type which contains multipleDevice
objects. It uses the capabilities of each device to control the real-life system. Eg. Data is gathered fromGetter
devices (Device::Read
for encoders andDevice::ReadWrite
for servos) and used to control motors that do not contain their own control theory processing (Device::ImpreciseWrite
), but motors that can do this on their own (Device::ReadWrite
andDevice::PreciseWrite
depending on whether the internal data can be read) do not need this control. This object should represent a physical linkage between devices. - Don't require a feature to be enabled for PID controller types
- Change API for PID controller types to be constructed with a k-values type rather than three individual
f32
s.
- Don't require a feature to be enabled for motion profiles.
- Make
Settable
able to followGetter
s of the same type. - Add
GetterFromHistory
struct allowingHistory
objects to be used asGetter
s.
- Add
set_delta
andset_time
methods toGetterFromHistory
. - Move
streams::Constant
toConstantGetter
. - Implement
Settable
forConstantGetter
. - Add
get_last_request
method toSettable
. - Move
MotionProfile
get_*
methods toOption
instead ofResult
. - Rename
UpdateOutput
toNothingOrError
. - Fix
Axle
bug where it would try to use nonexistent PID controllers forDevice::ImpreciseWrite
objects if it had not yet received aCommand
. - Instead of directly implementing
set
inSettable
, you now implementdirect_set
. You should still call justset
though. This is a workaround required to makeSettableData
andget_last_request
work correctly. - Move
MotionProfile
toHistory<Command, E>
instead ofHistory<State, E>
. - Move timestamps to
i64
instread off32
. The recommended unit is nanoseconds. This is notu64
due to the use of deltas. - Fix
MovingAverageStream
panicing issue. - Rename
StreamPID
toPIDControllerStream
. - Improve performance of
PIDControllerStream
. - Mark
Error
enum as non-exhaustive. - Write three example files.
- Derive additional traits for a few structs.
- Give
MotionProfile
a return value after it has completed. This is based on the end state provided to the constructor. It will choose the lowest possible position derivative to satisfy the end state. This means that if acceleration is 0, the position derivative in the command will be velocity, otherwise acceleration. If velocity is also 0, it will be position, otherwise just velocity. - Add
get_(position|velocity|acceleration)
methods toCommand
. - Add
Latest
stream allowing you to choose the output of whichever of a set of streams has the later timestamp. - Implement
From<State>
forCommand
. - Rename
TimeGetterFromStream
toTimeGetterFromGetter
.