5#include <Eigen/Geometry>
7#include <SimoxUtility/math/convert/mat4f_to_pos.h>
8#include <SimoxUtility/math/convert/mat4f_to_rpy.h>
9#include <SimoxUtility/math/convert/mat4f_to_xyyaw.h>
15#include <ArmarXCore/interface/serialization/Eigen/Eigen_fdi.h>
23#include <armarx/navigation/trajectory_control/local/aron/TrajectoryFollowingControllerParams.aron.generated.h>
40 arondto::TrajectoryFollowingControllerParams dto;
51 arondto::TrajectoryFollowingControllerParams dto;
77 pidPos(params.pidPos.Kp,
80 std::numeric_limits<double>::
max(),
81 std::numeric_limits<double>::
max(),
83 std::vector<bool>{
false,
false,
false}),
84 pidPosTarget(params.pidPos.Kp / 2,
87 std::numeric_limits<double>::max(),
88 std::numeric_limits<double>::max(),
90 std::vector<bool>{false, false, false}),
91 pidOri(params.pidOri.Kp,
94 std::numeric_limits<double>::max(),
95 std::numeric_limits<double>::max(),
97 std::vector<bool>{true, true, true}),
98 pidOriTarget(params.pidOri.Kp,
101 std::numeric_limits<double>::max(),
102 std::numeric_limits<double>::max(),
104 std::vector<bool>{true, true, true})
107 <<
VAROUT(params.limits.linear) <<
", " <<
VAROUT(params.limits.angular);
112 pidPos(params.pidPos.Kp,
115 std::numeric_limits<double>::
max(),
116 std::numeric_limits<double>::
max(),
118 std::vector<bool>{
false,
false,
false}),
119 pidPosTarget(params.pidPos.Kp / 2,
122 std::numeric_limits<double>::max(),
123 std::numeric_limits<double>::max(),
125 std::vector<bool>{false, false, false}),
126 pidOri(params.pidOri.Kp,
129 std::numeric_limits<double>::max(),
130 std::numeric_limits<double>::max(),
132 std::vector<bool>{true, true, true}),
133 pidOriTarget(params.pidOri.Kp,
136 std::numeric_limits<double>::max(),
137 std::numeric_limits<double>::max(),
139 std::vector<bool>{true, true, true})
142 <<
VAROUT(params.limits.linear) <<
", " <<
VAROUT(params.limits.angular);
148 const core::Twist limits{.linear = Eigen::Vector3f::Ones() * params.limits.linear,
149 .angular = Eigen::Vector3f::Ones() * params.limits.angular};
157 const auto scalePos = twist.
linear.cwiseAbs().cwiseQuotient(limits.linear.cwiseAbs());
158 const auto scaleOri = twist.
angular.cwiseAbs().cwiseQuotient(limits.angular.cwiseAbs());
163 const float scaleMax = std::max(scalePos.maxCoeff(), scaleOri.maxCoeff());
173 constexpr float eps = 0.001;
189 twist.
linear *= params.velocityFactor;
190 twist.
angular *= params.velocityFactor;
199 <<
"Scaling factor for velocity may not be negative, but is " << p.
velocityFactor;
201 <<
"Scaling factor for velocity may not be > 1, but is " << p.
velocityFactor;
210 const Eigen::Isometry3f& global_T_robot)
224 using simox::math::mat4f_to_pos;
225 using simox::math::mat4f_to_rpy;
230 <<
VAROUT(target.pose.translation().head<2>() -
231 global_T_robot.translation().head<2>());
233 pidPos.update(global_T_robot.translation(), target.pose.translation());
234 pidOri.update(mat4f_to_rpy(global_T_robot.matrix()), mat4f_to_rpy(target.pose.matrix()));
237 const core::Twist& twistFeedForward = target.feedforwardTwist;
239 const core::Twist twistError{.linear = pidPos.getControlValue(),
240 .angular = pidOri.getControlValue()};
245 .angular = twistFeedForward.
angular + twistError.angular};
261 << twistLimited.linear.transpose();
263 << twistLimited.angular.transpose();
267 << twistScaled.linear.transpose();
269 << twistScaled.angular.transpose();
272 const auto& twistGlobal = twistScaled;
275 global_T_robot.linear().inverse() * twistGlobal.linear,
276 .angular = twistGlobal.angular};
SpamFilterDataPtr deactivateSpam(SpamFilterDataPtr const &spamFilter, float deactivationDurationSec, const std::string &identifier, bool deactivate)
static DateTime Now()
Current time on the virtual clock.
static Duration MilliSeconds(std::int64_t milliSeconds)
Constructs a duration in milliseconds.
Represents a point in time.
TrajectoryFollowingControllerParams Params
TrajectoryControllerResult control(const core::LocalTrajectory &trajectory, const Eigen::Isometry3f &global_T_robot) override
void updateParams(const Params ¶ms)
core::Twist applyTwistLimits(core::Twist twist)
TrajectoryFollowingController(const Params ¶ms)
core::Twist applyVelocityFactor(core::Twist twist)
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
#define ARMARX_CHECK_LESS_EQUAL(lhs, rhs)
This macro evaluates whether lhs is less or equal (<=) rhs and if it turns out to be false it will th...
#define ARMARX_INFO
The normal logging level.
#define ARMARX_IMPORTANT
The logging level for always important information, but expected behaviour (in contrast to ARMARX_WAR...
#define ARMARX_VERBOSE
The logging level for verbose information.
std::shared_ptr< Dict > DictPtr
This file is part of ArmarX.
@ TrajectoryFollowingController
void toAron(arondto::TrajectoryFollowingControllerParams &dto, const TrajectoryFollowingControllerParams &bo)
TrajectoryFollowingController::Params applyLimitFromGeneralConfig(const TrajectoryFollowingController::Params ¶ms, const core::GeneralConfig &generalConfig)
void fromAron(const arondto::TrajectoryFollowingControllerParams &dto, TrajectoryFollowingControllerParams &bo)
std::vector< T > max(const std::vector< T > &v1, const std::vector< T > &v2)
core::TwistLimits maxVel
max velocity
aron::data::DictPtr toAron() const override
Algorithms algorithm() const override
static TrajectoryFollowingControllerParams FromAron(const aron::data::DictPtr &dict)