franky 1.1.4
A High-Level Motion API for Franka
Loading...
Searching...
No Matches
position_waypoint_motion.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <ruckig/ruckig.hpp>
4
8#include "franky/util.hpp"
9
10namespace franky {
11
19template <typename TargetType>
23
32template <typename ControlSignalType, typename TargetType>
33class PositionWaypointMotion : public WaypointMotion<ControlSignalType, PositionWaypoint<TargetType>, TargetType> {
34 public:
48
49 [[nodiscard]] const RelativeDynamicsFactor &relative_dynamics_factor() const { return relative_dynamics_factor_; }
50
51 protected:
53 const PositionWaypoint<TargetType> &waypoint, ruckig::InputParameter<7> &input_parameter) const override {
54 auto [vel_lim, acc_lim, jerk_lim] = getAbsoluteInputLimits();
55
57 waypoint.relative_dynamics_factor * relative_dynamics_factor_ * this->robot()->relative_dynamics_factor_rt();
58
59 input_parameter.max_velocity = toStdD<7>(relative_dynamics_factor.velocity() * vel_lim);
62
64 input_parameter.synchronization = ruckig::Synchronization::TimeIfNecessary;
65 } else {
66 input_parameter.synchronization = ruckig::Synchronization::Time;
67 if (waypoint.minimum_time.has_value()) input_parameter.minimum_duration = waypoint.minimum_time.value().toSec();
68 }
69 }
70
72 const RobotState &robot_state, const franka::Duration &time_step,
73 const ruckig::InputParameter<7> &input_parameter, ruckig::OutputParameter<7> &output_parameter) const override {
75
76 // We use the desired state here as this is likely what the robot uses
77 // internally as well
79
80 auto vel = toEigenD<7>(input_parameter.current_velocity);
81 auto pos = toEigenD<7>(input_parameter.current_position);
82
83 auto vel_delta = acc_d * time_step.toSec();
84 auto new_vel_d = (vel_d + vel_delta).cwiseMin(vel_lim).cwiseMax(-vel_lim);
85 auto new_pos = pos + (vel_d + new_vel_d) * time_step.toSec() / 2.0;
86 auto new_vel = (vel + vel_delta).cwiseMin(vel_lim).cwiseMax(-vel_lim);
87
88 // Franka assumes a constant acceleration model if no new input is received.
89 // See https://frankaemika.github.io/docs/libfranka.html#under-the-hood
90 output_parameter.new_acceleration = input_parameter.current_acceleration;
91 output_parameter.new_velocity = toStdD<7>(new_vel);
92 output_parameter.new_position = toStdD<7>(new_pos);
93 }
94
95 [[nodiscard]] std::tuple<Vector7d, Vector7d, Vector7d> getAbsoluteInputLimits() const override = 0;
96
97 [[nodiscard]] virtual std::tuple<Vector7d, Vector7d, Vector7d> getDesiredState(
98 const RobotState &robot_state) const = 0;
99
100 private:
101 RelativeDynamicsFactor relative_dynamics_factor_;
102};
103
104} // namespace franky
Robot * robot() const
Definition motion.hpp:109
A motion following multiple positional waypoints in a time-optimal way. Works with arbitrary initial ...
Definition position_waypoint_motion.hpp:33
virtual std::tuple< Vector7d, Vector7d, Vector7d > getDesiredState(const RobotState &robot_state) const =0
void extrapolateMotion(const RobotState &robot_state, const franka::Duration &time_step, const ruckig::InputParameter< 7 > &input_parameter, ruckig::OutputParameter< 7 > &output_parameter) const override
Definition position_waypoint_motion.hpp:71
const RelativeDynamicsFactor & relative_dynamics_factor() const
Definition position_waypoint_motion.hpp:49
void setInputLimits(const PositionWaypoint< TargetType > &waypoint, ruckig::InputParameter< 7 > &input_parameter) const override
Definition position_waypoint_motion.hpp:52
std::tuple< Vector7d, Vector7d, Vector7d > getAbsoluteInputLimits() const override=0
PositionWaypointMotion(std::vector< PositionWaypoint< TargetType > > waypoints, const RelativeDynamicsFactor &relative_dynamics_factor=1.0, bool return_when_finished=true)
Definition position_waypoint_motion.hpp:43
Relative dynamics factors.
Definition relative_dynamics_factor.hpp:13
double jerk() const
Jerk factor.
Definition relative_dynamics_factor.hpp:59
double acceleration() const
Acceleration factor.
Definition relative_dynamics_factor.hpp:54
bool max_dynamics() const
Whether the maximum dynamics should be used.
Definition relative_dynamics_factor.hpp:64
double velocity() const
Velocity factor.
Definition relative_dynamics_factor.hpp:49
RelativeDynamicsFactor relative_dynamics_factor_rt()
Returns the current global relative dynamics factor of the robot (Real-Time safe).
Definition robot.cpp:125
A motion following multiple waypoints in a time-optimal way. Works with arbitrary initial conditions.
Definition waypoint_motion.hpp:59
const std::vector< PositionWaypoint< TargetType > > & waypoints() const
Definition waypoint_motion.hpp:72
Definition dynamics_limit.cpp:8
std::array< double, dims > toStdD(const Eigen::Matrix< double, dims, 1 > &vector)
Definition util.hpp:18
ReferenceType
Enum class for reference types.
Definition reference_type.hpp:11
ControlSignalType
Type of control signal.
Definition control_signal_type.hpp:8
A position waypoint with a target and optional parameters.
Definition position_waypoint_motion.hpp:20
ReferenceType reference_type
Definition position_waypoint_motion.hpp:21
Full state of the robot.
Definition robot_state.hpp:40
A waypoint with a target and optional parameters.
Definition waypoint_motion.hpp:36
RelativeDynamicsFactor relative_dynamics_factor
Definition waypoint_motion.hpp:39