29 releases (5 breaking)
new 0.6.0 | Dec 1, 2024 |
---|---|
0.6.0-beta.0 | Nov 19, 2024 |
0.5.0 | Oct 21, 2024 |
0.4.0-alpha.2 | Jul 27, 2024 |
0.2.0-beta.2 | Mar 28, 2024 |
#17 in Robotics
492 downloads per month
230KB
4.5K
SLoC
Rust Robotics ToolKit
A set of algorithms and other tools for robotics in Rust.
It is almost entirely no_std
and most things work without alloc
. It does not currently integrate with any API directly. This may be added in the future, probably through another crate.
License: BSD 3-Clause
This basically means that you can do whatever you want as long as you give me attribution and you don't remove the license notices or use my name to endorse stuff I don't. Read the actual license for details though.
RRTK was previously licensed under LGPL. Versions 0.5.0-alpha.1 and earlier have been retroactively dual licensed under LGPL-3.0-only OR BSD-3-Clause. Versions after 0.5.0-alpha.1 are just BSD-3-Clause. This transition does not remove any freedoms, and the LGPL for old versions is maintained solely due to its irrevocability. It is entirely redundant freedoms-wise.
Features
- Architecture based on
Getter
,Settable
, andUpdatable
traits - Node-like stream system for data processing
- Basic arithmetic + integral and derivative
- Logic and control flow management
- PID
- Moving average
- EWMA
- Trait for making your own
- Graph-based device control system
- Devices hold terminals which can be connected together
- Differential, axle, and direction reversal builtin
- Easily connect streams to the device system through wrappers
- Trapezoidal motion profile following
Related Crates
RRTK Stream Builder: Code generation from visual nodes for the stream system.
RRTK Procedural Macros [HIGHLY EXPERIMENTAL]: Procedural math!
macro making the stream system easier to use.
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
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
0.3.0-alpha.5
- 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.
0.3.0-beta.1
- 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.
0.3.0
- 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
.
0.3.1
- Implement several
core::ops
traits andCopy
forState
- Fix name of
PositionToState
- Slightly improve performance of
MotionProfile
and(Position|Velocity|Acceleration)ToState
by removing unnecessary code - Improve tests
- Minor documentation fixes
- Add missing LGPL license notice to a few files
0.4.0-alpha.1
- Begin new device system.
0.4.0-alpha.2
- Make everything use
&RefCell<Terminal>
rather thanRc<RefCell<Terminal>>
- Make math streams use generics.
- Add
SettableCommandDeviceWrapper
andGetterStateDeviceWrapper
allowing types only implementingSettable<Command, _>
to be used as motors and types only implementingGetter<State, _>
to be used as encoders. - Revive
PositionDerivativeDependentPIDKValues
, now with aget_k_values
method for getting the k-values for a specific position derivative. - Add
evaluate
methods forPIDKValues
andPositionDerivativeDependentPIDKValues
. - Add
CommandPID
, an easier and faster way to use PID control to turn a standard DC motor and an encoder into a de facto servo. - Add
latest
function which gets the newer of twoDatum
objects.
0.4.0-alpha.3
- Add new
streams
submodulesflow
andlogic
. - Add new streams
Expirer
flow::IfStream
flow::IfElseStream
flow::FreezeStream
logic::AndStream
logic::OrStream
logic::NotStream
- Pass through
Not
forDatum<T>
whereT
implementsNot
. - Add
NoneGetter
. - Add
Axle
very similar to 0.4.0-alpha.1 one. - Move
(SettableCommand|GetterState)DeviceWrapper
todevices::wrappers
module. - Add experimental
Device
implementor for a differential mechanism. - Remove now-unused
GetterSettable
marker trait. - Move new device system to a new
devices
feature. - Minor documentation fix for
devices
module.
0.4.0-beta.1
- Make differential calculations able to trust all branches equally instead of ignoring one.
- Remove unnecessary
Box
ing fromInputGetter
andInputTimeGetter
.
0.4.0-beta.2
- Rename
following_update
toupdate_following_data
and removeupdate
calls from it. - Make
GetterFromHistory
use&mut dyn History
instead ofBox<dyn History>
and make its constructors takeimpl History
instead ofdyn History
. - Remove now-unnecessary
new_for_motion_profile
constructor forGetterFromHistory
. - Remove
Clone
bound onHistory<T, _>
'sT
. - Make
GetterFromHistory
return the requested timestamp as itsDatum
timestamp rather than that that the internalHistory
returns. - Make
make_input_getter
andmake_input_time_getter
functions instead of macros. - Add
NoneGetter
constructor. (It is a unit struct, so this is redundant.); - Add a
disconnect
method toTerminal
. - Add methods to builtin devices for getting references to their terminals.
- Slightly improve performance of
Terminal
'sget
implementation by using an array ofMaybeUninit
rather thanVec
. - Minor documentation fixes.
0.4.0
- Fix
Invert
get_terminal_2
which was returning terminal 1. - Make terminals pass commands to their connected counterparts.
- Rename
SettableCommandDeviceWrapper
toActuatorWrapper
. - Make
ActuatorWrapper
update its innerSettable
. - Make
ActuatorWrapper
callupdate_terminals
in itsUpdatable
implementation. - Fix
CommandPID
error integral doubling bug. - Add
TerminalData
type containing a timestamp, an optional command, and an optional state. - Implement
Getter<TerminalData, _>
forTerminal
. - Add
PIDWrapper
, a wrapper very similar toActuatorWrapper
that uses aCommandPID
to control a DC motor rather than needing a servo or a control system set up by the user. - Implement
TimeGetter
fori64
. It will always return its value as a time. - Remove unused
CannotConnectTerminals
error variant. - Make
GetterStateDeviceWrapper
update its innerGetter
. - Keep
CommandPID
from resetting itself whenever it gets a new command rather than only when the command is different. - Mark constructors for
State
,Datum
,PIDKValues
,PositionDerivativeDependentPIDKValues
, andCommand
asconst
. - Documentation improvements.
0.5.0-alpha.1
- Make a new
Reference
type that can hold a*mut T
,Rc<RefCell<T>>
, or*const RwLock<T>
, allowing you to not need a dynamic allocator. - Add
alloc
feature. - Temporarily remove
devices::wrappers::PIDWrapper
. It will be back by the time this is stable.
0.5.0-alpha.2
- Move to BSD 3-Clause license.
- Implement
Clone
forReference
- Add
to_dyn!
macro for creatingReference<dyn Trait>
objects. - Add function
rc_refcell_reference
and macrosstatic_reference!
andstatic_rwlock_reference!
which work similarly to the formermake_input_getter
. They put their input into a container if required and then return aReference
to it. - Make all stream inputs
?Sized
. This allows the use ofReference<dyn Getter<_, _>>
andReference<dyn TimeGetter<_, _>>
in the builtin streams. - Add
PIDWrapper
back. - Update many tests to use
Reference
. - Minor documentation changes.
0.5.0-beta.1
- Add
ArcRwLock
,PtrMutex
, andArcMutex
Reference
variants. - Standardize snake_case of
ref_cell
andrw_lock
. - Standardize that the outermost container comes first in variable and function names: a
*const RwLock
isptr_rw_lock
, notrw_lock_ptr
.
0.5.0
- Fix the potential for undefined behavior without an unsafe block by directly constructing
Reference
variants.- Rename
Reference
toReferenceUnsafe
.- Make
borrow
andborrow_mut
methods ofReferenceUnsafe
unsafe.
- Make
- Add a wrapper struct for
ReferenceUnsafe
under the nameReference
.Reference
(the wrapper struct) cannot be constructed with a raw pointer without an unsafe block or a macro that ensures that the pointer's target is static.Reference
has all of the same methods asReferenceUnsafe
except thatborrow
andborrow_mut
are safe.Reference
has one additional method,into_inner
, which returns its innerReferenceUnsafe
.
- Rename
- Rewrite
SumStream
andProductStream
to not requirealloc
. - Change macro scoping to allow both
rrtk::reference::to_dyn!
andrrtk::to_dyn!
as valid paths, and similar scoping for otherReference
-related macros. See the documentation for more information. - Derive
Eq
forDatum
. - Documentation improvements.
0.6.0-alpha.0
- Begin new dimensional analysis system.
0.6.0-alpha.1
- Use correct units in
Mul<Time>
andDiv<Time>
implementations forQuantity
. - Move constant
Unit
s to thedimensions::constants
module, all of the items of which are reexported both to thedimensions
module and at the crate's top level. - Add many new constant units in addition to the original 6.
0.6.0-beta.0
- Add
dim_check_debug
anddim_check_release
features. - Document feature flags in crate-level documentation.
0.6.0
- Add
FloatToQuantity
andQuantityToFloat
streams. - Add
Sum2
andProduct2
streams, which are optimized for adding or multiplying two inputs faster thanSumStream
andProductStream
, which take any number of inputs. - Implement:
AddAssign
forTime
SubAssign
forTime
MulAssign<DimensionlessInteger>
forTime
DivAssign<DimensionlessInteger>
forTime
Add<Quantity>
forTime
Sub<Quantity>
forTime
Mul<Quantity>
forTime
Div<Quantity>
forTime
AddAssign
forDimensionlessInteger
SubAssign
forDimensionlessInteger
MulAssign
forDimensionlessInteger
DivAssign
forDimensionlessInteger
Add<Quantity>
forDimensionlessInteger
Sub<Quantity>
forDimensionlessInteger
Mul<Quantity>
forDimensionlessInteger
Div<Quantity>
forDimensionlessInteger
AddAssign
forQuantity
SubAssign
forQuantity
MulAssign
forQuantity
DivAssign
forQuantity
Add<Time>
forQuantity
Sub<Time>
forQuantity
AddAssign<Time>
forQuantity
SubAssign<Time>
forQuantity
MulAssign<Time>
forQuantity
DivAssign<Time>
forQuantity
Add<DimensionlessInteger>
forQuantity
Sub<DimensionlessInteger>
forQuantity
Mul<DimensionlessInteger>
forQuantity
Div<DimensionlessInteger>
forQuantity
AddAssign<DimensionlessInteger>
forQuantity
SubAssign<DimensionlessInteger>
forQuantity
MulAssign<DimensionlessInteger>
forQuantity
DivAssign<DimensionlessInteger>
forQuantity
AddAssign
forUnit
SubAssign
forUnit
MulAssign
forUnit
DivAssign
forUnit
Neg
forUnit
- Make
State::update
takeTime
. - Make
State::set_constant_(position|velocity|acceleration)
takeQuantity
. - Add
State::set_constant_(position|velocity|acceleration)_raw
functions to still allow setting each position derivative withf32
. - Make
State::new
takeQuantity
for position, velocity, and acceleration. - Add
State::new_raw
to still allow constructingState
withf32
values. - Make
(Position|Velocity|Acceleration)ToState
takeQuantity
. - Make
IntegralStream
andDerivativeStream
takeQuantity
. - Make
EWMAStream
more generic, allowing it to take bothf32
andQuantity
. - Make
MovingAverageStream
more generic, allowing it to take bothf32
andQuantity
. - Mark
State::set_constant_(position|velocity|acceleration)
and their "raw" equivalents as const fn. - Fix bug where the implementation of
From<PositionDerivative> for Unit
would return an incorrect second exponent. - Fix unit issue in
MovingAverageStream
. - Example improvements.
- Unit testing improvements.
- Documentation improvements.