3#include "../filters/StateSpaceUtil.h"
4#include "../navtypes.h"
5#include "../utils/math.h"
6#include "../utils/time.h"
7#include "../world_interface/data.h"
23template <
int outputDim,
int inputDim>
35 const std::function<navtypes::Vectord<outputDim>(
const navtypes::Vectord<inputDim>&)>&
37 const std::function<navtypes::Matrixd<outputDim, inputDim>(
38 const navtypes::Vectord<inputDim>&)>& jacobianFunc)
39 : kinematicsFunc(kinematicsFunc),
40 jacobianFunc(jacobianFunc ? jacobianFunc
41 :
std::
bind(
util::numericalJacobian, kinematicsFunc,
42 std::placeholders::_1, outputDim)) {
43 CHECK_NOTNULL_F(this->kinematicsFunc);
44 CHECK_NOTNULL_F(this->jacobianFunc);
56 const navtypes::Vectord<inputDim>& currPos) {
73 const navtypes::Vectord<inputDim>& currPos,
75 if (!controllerState) {
85 navtypes::Vectord<outputDim> currPosOutput = kinematicsFunc(currPos);
86 state_t state = controllerState.value();
88 navtypes::Vectord<outputDim> lastTarget = state.lastTarget.value_or(currPosOutput);
89 navtypes::Vectord<outputDim> currTarget = lastTarget + dt * state.targetVel;
90 navtypes::Vectord<outputDim> outputPosDiff = currTarget - currPosOutput;
91 navtypes::Matrixd<outputDim, inputDim> jacobian = jacobianFunc(currPos);
92 navtypes::Vectord<inputDim> inputPosDiff =
93 jacobian.colPivHouseholderQr().solve(outputPosDiff);
97 navtypes::Vectord<outputDim> trueOutputPosDiff = jacobian * inputPosDiff;
98 cosineSim = outputPosDiff.dot(trueOutputPosDiff) /
99 (outputPosDiff.norm() * trueOutputPosDiff.norm());
102 .timestamp = currTime, .targetVel = state.targetVel, .lastTarget = currTarget};
103 controllerState = newState;
105 return currPos + inputPosDiff;
115 const navtypes::Vectord<outputDim>& targetVel) {
116 state_t state = {.timestamp = currTime, .targetVel = targetVel, .lastTarget = {}};
117 this->controllerState = state;
126 return controllerState.has_value();
133 controllerState.reset();
139 navtypes::Vectord<outputDim> targetVel;
140 std::optional<navtypes::Vectord<outputDim>> lastTarget;
143 std::function<navtypes::Vectord<outputDim>(
const navtypes::Vectord<inputDim>&)>
145 std::function<navtypes::Matrixd<outputDim, inputDim>(
const navtypes::Vectord<inputDim>&)>
147 std::optional<state_t> controllerState;
_Bind_helper< __is_socketlike< _Func >::value, _Func, _BoundArgs... >::type bind(_Func &&__f, _BoundArgs &&... __args)
navtypes::Vectord< inputDim > getCommand(robot::types::datatime_t currTime, const navtypes::Vectord< inputDim > &currPos, double &cosineSim)
Get the current target position.
Definition JacobianVelController.h:72
navtypes::Vectord< inputDim > getCommand(robot::types::datatime_t currTime, const navtypes::Vectord< inputDim > &currPos)
Get the current target position.
Definition JacobianVelController.h:55
JacobianVelController(const std::function< navtypes::Vectord< outputDim >(const navtypes::Vectord< inputDim > &)> &kinematicsFunc, const std::function< navtypes::Matrixd< outputDim, inputDim >(const navtypes::Vectord< inputDim > &)> &jacobianFunc)
Construct a new controller.
Definition JacobianVelController.h:34
void setTarget(robot::types::datatime_t currTime, const navtypes::Vectord< outputDim > &targetVel)
Set the target velocity.
Definition JacobianVelController.h:114
bool hasTarget()
Check if a target velocity has been set.
Definition JacobianVelController.h:125
void reset()
Reset the controller, unsetting the current command.
Definition JacobianVelController.h:132
std::chrono::time_point< dataclock > datatime_t
A point in time as measured by dataclock.
Definition data.h:31
A collection of utility functions and classes with common use-cases.
Definition SwerveController.cpp:145
double durationToSec(std::chrono::duration< Rep, Period > dur)
Convert a duration to seconds, as a double.
Definition time.h:18