Rust Robotics ToolKit
A set of algorithms and other tools for robotics in Rust.
It is partially no_std. It does not currently integrate with any API directly, but this may be added in the future.
License
GNU Lesser General Public License, version 3 only
Features
- Node-like stream system for data processing
- Basic arithmetic + integral and derivative
- PID
- Moving average
- EWMA
- Simple device control system
- Trapezoidal motion profile following
RRTK Stream Builder now available: Code generation from visual nodes for the stream system.
Changes
0.1.0
Initial release.
0.1.1
Fix motion profile issue.
0.2.0-alpha.1
Start new motor-encoder system.
0.2.0-alpha.2
Function for motors to follow motion profiles.
0.2.0-beta.1
Allow the user to run a custom update loop for motion profile following as an alternative to the single function.
0.2.0-beta.2
Add an update method to encoders.
0.2.0
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.
0.3.0-alpha.1
Start new stream system.
0.3.0-alpha.2
Reorganize a bit and add EWMA stream.
0.3.0-alpha.3
Add moving average stream.
0.3.0-alpha.4
- performance improvements
- use array instead of vec for inputs to
SumStreamandProductStream - avoid unnecessary weight sum calculation in
MovingAverageStream - make the number of shifts in
PIDControllerShifta constant
- use array instead of vec for inputs to
- replace all instances of
MotionProfileStatewithMotionProfilePiece - add
Historytrait, which is like aStreambut you specify a time when youget - reorganize streams into modules
- remove unnecessary
stdrequirement for a couple types
0.3.0-alpha.5
- Move from
Streamand the previous device system toGetterandSettable.Getteris like a stream or encoder andSettableis like a writable device. - Add
Devicetype which makes rawGetters andSettables work together better as mechanical devices in a system. This should represent a physical device. - Add
Axletype which contains multipleDeviceobjects. It uses the capabilities of each device to control the real-life system. Eg. Data is gathered fromGetterdevices (Device::Readfor encoders andDevice::ReadWritefor 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::ReadWriteandDevice::PreciseWritedepending 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
f32s.
0.3.0-beta.1
- Don't require a feature to be enabled for motion profiles.
- Make
Settableable to followGetters of the same type. - Add
GetterFromHistorystruct allowingHistoryobjects to be used asGetters.
0.3.0
- Add
set_deltaandset_timemethods toGetterFromHistory. - Move
streams::ConstanttoConstantGetter. - Implement
SettableforConstantGetter. - Add
get_last_requestmethod toSettable. - Move
MotionProfileget_*methods toOptioninstead ofResult. - Rename
UpdateOutputtoNothingOrError. - Fix
Axlebug where it would try to use nonexistent PID controllers forDevice::ImpreciseWriteobjects if it had not yet received aCommand. - Instead of directly implementing
setinSettable, you now implementdirect_set. You should still call justsetthough. This is a workaround required to makeSettableDataandget_last_requestwork correctly. - Move
MotionProfiletoHistory<Command, E>instead ofHistory<State, E>. - Move timestamps to
i64instread off32. The recommended unit is nanoseconds. This is notu64due to the use of deltas. - Fix
MovingAverageStreampanicing issue. - Rename
StreamPIDtoPIDControllerStream. - Improve performance of
PIDControllerStream. - Mark
Errorenum as non-exhaustive. - Write three example files.
- Derive additional traits for a few structs.
- Give
MotionProfilea 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
Lateststream allowing you to choose the output of whichever of a set of streams has the later timestamp. - Implement
From<State>forCommand. - Rename
TimeGetterFromStreamtoTimeGetterFromGetter.
0.3.1
- Implement several
core::opstraits andCopyforState - Fix name of
PositionToState - Slightly improve performance of
MotionProfileand(Position|Velocity|Acceleration)ToStateby removing unnecessary code - Improve tests
- Minor documentation fixes
- Add missing LGPL license notice to a few files