3#include "../filters/StateSpaceUtil.h"
4#include "../navtypes.h"
5#include "../utils/math.h"
6#include "../world_interface/data.h"
7#include "TrapezoidalVelocityProfile.h"
28template <
int outputDim,
int inputDim>
42 const std::function<navtypes::Vectord<outputDim>(
const navtypes::Vectord<inputDim>&)>&
44 const std::function<navtypes::Matrixd<outputDim, inputDim>(
45 const navtypes::Vectord<inputDim>&)>& jacobianFunc,
46 double maxVel,
double maxAccel)
47 : kinematicsFunc(kinematicsFunc),
48 jacobianFunc(jacobianFunc ? jacobianFunc
49 :
std::
bind(
util::numericalJacobian, kinematicsFunc,
50 std::placeholders::_1, outputDim)),
51 velocityProfile(maxVel, maxAccel) {
52 CHECK_NOTNULL_F(this->kinematicsFunc);
53 CHECK_NOTNULL_F(this->jacobianFunc);
65 const navtypes::Vectord<inputDim>& currPos)
const {
83 const navtypes::Vectord<inputDim>& currPos,
84 double& cosineSim)
const {
85 if (!velocityProfile.hasTarget()) {
93 navtypes::Vectord<outputDim> currTarget = velocityProfile.getCommand(currTime);
94 navtypes::Vectord<outputDim> currPosOutput = kinematicsFunc(currPos);
95 navtypes::Vectord<outputDim> outputPosDiff = currTarget - currPosOutput;
96 navtypes::Matrixd<outputDim, inputDim> jacobian = jacobianFunc(currPos);
97 navtypes::Vectord<inputDim> inputPosDiff =
98 jacobian.colPivHouseholderQr().solve(outputPosDiff);
102 navtypes::Vectord<outputDim> trueOutputPosDiff = jacobian * inputPosDiff;
103 cosineSim = outputPosDiff.dot(trueOutputPosDiff) /
104 (outputPosDiff.norm() * trueOutputPosDiff.norm());
106 return currPos + inputPosDiff;
117 const navtypes::Vectord<inputDim>& currPos,
118 const navtypes::Vectord<outputDim>& target) {
119 navtypes::Vectord<outputDim> currPosOutput = kinematicsFunc(currPos);
120 velocityProfile.setTarget(currTime, currPosOutput, target);
129 return velocityProfile.hasTarget();
136 velocityProfile.reset();
140 std::function<navtypes::Vectord<outputDim>(
const navtypes::Vectord<inputDim>&)>
142 std::function<Eigen::Matrix<double, outputDim, inputDim>(
_Bind_helper< __is_socketlike< _Func >::value, _Func, _BoundArgs... >::type bind(_Func &&__f, _BoundArgs &&... __args)
JacobianPosController(const std::function< navtypes::Vectord< outputDim >(const navtypes::Vectord< inputDim > &)> &kinematicsFunc, const std::function< navtypes::Matrixd< outputDim, inputDim >(const navtypes::Vectord< inputDim > &)> &jacobianFunc, double maxVel, double maxAccel)
Construct a new controller.
Definition JacobianPosController.h:41
bool hasTarget() const
Check if a target has been set.
Definition JacobianPosController.h:128
void setTarget(robot::types::datatime_t currTime, const navtypes::Vectord< inputDim > &currPos, const navtypes::Vectord< outputDim > &target)
Set the target position of the controller.
Definition JacobianPosController.h:116
navtypes::Vectord< inputDim > getCommand(robot::types::datatime_t currTime, const navtypes::Vectord< inputDim > &currPos, double &cosineSim) const
Get the current command position in the input space.
Definition JacobianPosController.h:82
void reset()
Reset the controller, unsetting the target.
Definition JacobianPosController.h:135
navtypes::Vectord< inputDim > getCommand(robot::types::datatime_t currTime, const navtypes::Vectord< inputDim > &currPos) const
Get the current command position in the input space.
Definition JacobianPosController.h:64
Trapezoidal velocity profile in multiple dimensions.
Definition TrapezoidalVelocityProfile.h:23
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