Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move post-processor params into AIKIDO. #579

Merged
merged 29 commits into from
Aug 7, 2020
Merged
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
c66c194
Add post-processor params header.
evil-sherdil Jun 26, 2020
59698ee
Add getTrajectoryPostProcessor() method to ConcreteRobot.
evil-sherdil Jun 26, 2020
95243e7
Add postProcessPath() to ConcreteRobot.
evil-sherdil Jun 26, 2020
c6c3e05
Re-org post-processor params like Brian suggested.
evil-sherdil Jul 10, 2020
9c9353b
Leave better comment on PostProcessorParams struct.
evil-sherdil Jul 10, 2020
769b5fd
Merge branch 'master' of https://github.com/personalrobotics/aikido i…
evil-sherdil Jul 22, 2020
ccc88b9
Rename Hauser/Kunz param structs to just `Params`, set default args.
evil-sherdil Jul 22, 2020
3cb622e
[WIP] Add new Kunz/Hauser constructors.
evil-sherdil Jul 22, 2020
f9dbb29
Change getTrajectoryPostProcessor() to take limits.
evil-sherdil Jul 22, 2020
bc808aa
Make format.
evil-sherdil Jul 22, 2020
8420706
Add new postProcessPath() to ConcreteRobot that takes limits.
evil-sherdil Jul 22, 2020
6ca0230
[WIP] Think I re-wrote PostProcessorParams.hpp to work but holy cow a
evil-sherdil Jul 22, 2020
20d880e
Move ConcreteRobot post-process stuff to -impl files.
evil-sherdil Jul 22, 2020
dacf6f9
Actually move Params structs into their PP classes.
evil-sherdil Jul 22, 2020
304d95d
In ConcreteRobot -> postProcessPath(), print and return null instead of
evil-sherdil Jul 22, 2020
c3696b4
Whoops, tiny bug fix.
evil-sherdil Jul 22, 2020
a13922a
Mark PostProcessorParams -> getParams() as const.
evil-sherdil Jul 23, 2020
b307153
Respond to nits.
evil-sherdil Jul 24, 2020
ad26706
Update CHANGELOG.
evil-sherdil Jul 24, 2020
de4a129
Update CHANGELOG.
evil-sherdil Jul 31, 2020
238fe01
Respond to some nits.
evil-sherdil Jul 31, 2020
8fdef1d
Don't dupe postProcessPath() logic.
evil-sherdil Jul 31, 2020
2bad0b1
Kill PostProcessorParams.hpp.
evil-sherdil Jul 31, 2020
d3c824d
Last nits, I think.
evil-sherdil Jul 31, 2020
67c7fc7
Final final edits?
evil-sherdil Jul 31, 2020
923cea2
More nits.
evil-sherdil Jul 31, 2020
d1aa486
Add constructors to param structs.
evil-sherdil Aug 1, 2020
9c13c0d
Fix bug with missing template params.
evil-sherdil Aug 5, 2020
903cf81
Merge branch 'master' into sniyaz_post_params
brianhou Aug 7, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

### 0.4.0 (2020-XX-XX)

* Planner

* Defined post-processor parameter structs in AIKIDO: [#579](https://github.com/personalrobotics/aikido/pull/579)

### 0.3.0 (2020-05-22)

* Common
Expand Down
1 change: 1 addition & 0 deletions include/aikido/planner.hpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "aikido/planner/PlanningResult.hpp"
#include "aikido/planner/PostProcessorParams.hpp"
#include "aikido/planner/SnapPlanner.hpp"
#include "aikido/planner/TrajectoryPostProcessor.hpp"
#include "aikido/planner/World.hpp"
Expand Down
34 changes: 28 additions & 6 deletions include/aikido/planner/kunzretimer/KunzRetimer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ namespace aikido {
namespace planner {
namespace kunzretimer {

constexpr double DEFAULT_MAX_DEVIATION = 1e-2;
constexpr double DEFAULT_TIME_STEP = 0.1;

/// Computes the time-optimal timing of a trajectory consisting of a sequence
/// Geodesic interpolations between states under velocity and acceleration
/// bounds. The output is a parabolic spline, encoded in cubic polynomials.
Expand All @@ -36,23 +39,42 @@ std::unique_ptr<aikido::trajectory::Spline> computeKunzTiming(
const aikido::trajectory::Interpolated& inputTrajectory,
const Eigen::VectorXd& maxVelocity,
const Eigen::VectorXd& maxAcceleration,
double maxDeviation = 1e-2,
double timeStep = 0.1);
double maxDeviation = DEFAULT_MAX_DEVIATION,
double timeStep = DEFAULT_TIME_STEP);

/// Class for performing time-optimal trajectory retiming following subject to
/// velocity and acceleration limits.
class KunzRetimer : public aikido::planner::TrajectoryPostProcessor
{
public:
/// Kunz postprocessor parameters used with the main `PostProcessorParams`
/// struct.
struct Params
{
/// Maximum deviation in circular blending (in configuration space).
double mMaxDeviation = DEFAULT_MAX_DEVIATION;
/// Time step in following the path (in seconds).
double mTimeStep = DEFAULT_TIME_STEP;
};

/// \param[in] velocityLimits Maximum velocity for each dimension.
/// \param[in] accelerationLimits Maximum acceleration for each dimension.
/// \param[in] maxDeviation Maximum deviation in circular blending (in
/// configuration space).
/// \param[in] timeStep Time step in following the path (in seconds).
KunzRetimer(
const Eigen::VectorXd& velocityLimits,
const Eigen::VectorXd& accelerationLimits,
double maxDeviation = DEFAULT_MAX_DEVIATION,
double timeStep = DEFAULT_TIME_STEP);

/// \param[in] velocityLimits Maximum velocity for each dimension.
/// \param[in] accelerationLimits Maximum acceleration for each dimension.
/// \param[in] maxDeviation Maximum deviation in circular blending
/// \param[in] timeStep Time step in following the path
/// \param[in] params Postprocessor parameters.
KunzRetimer(
const Eigen::VectorXd& velocityLimits,
const Eigen::VectorXd& accelerationLimits,
double maxDeviation,
double timeStep);
const Params& params);

/// Performs parabolic retiming on an input trajectory.
/// \copydoc TrajectoryPostProcessor::postprocess
Expand Down
29 changes: 25 additions & 4 deletions include/aikido/planner/parabolic/ParabolicSmoother.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace aikido {
namespace planner {
namespace parabolic {

constexpr double DEFAULT_TIMELIMT = 3.0;
constexpr double DEFAULT_TIMELIMIT = 3.0;
constexpr double DEFAULT_BLEND_RADIUS = 0.5;
constexpr int DEFAULT_BLEND_ITERATIONS = 4;
constexpr double DEFAULT_CHECK_RESOLUTION = 1e-4;
Expand Down Expand Up @@ -50,7 +50,7 @@ std::unique_ptr<trajectory::Spline> doShortcut(
const Eigen::VectorXd& _maxVelocity,
const Eigen::VectorXd& _maxAcceleration,
aikido::common::RNG& _rng,
double _timelimit = DEFAULT_TIMELIMT,
double _timelimit = DEFAULT_TIMELIMIT,
double _checkResolution = DEFAULT_CHECK_RESOLUTION,
double _tolerance = DEFAULT_TOLERANCE);

Expand Down Expand Up @@ -124,7 +124,7 @@ std::unique_ptr<trajectory::Spline> doShortcutAndBlend(
const Eigen::VectorXd& _maxVelocity,
const Eigen::VectorXd& _maxAcceleration,
aikido::common::RNG& _rng,
double _timelimit = DEFAULT_TIMELIMT,
double _timelimit = DEFAULT_TIMELIMIT,
double _blendRadius = DEFAULT_BLEND_RADIUS,
int _blendIterations = DEFAULT_BLEND_ITERATIONS,
double _checkResolution = DEFAULT_CHECK_RESOLUTION,
Expand All @@ -134,6 +134,19 @@ std::unique_ptr<trajectory::Spline> doShortcutAndBlend(
class ParabolicSmoother : public aikido::planner::TrajectoryPostProcessor
{
public:
/// Hauser postprocessor parameters used with the main `PostProcessorParams`
/// struct.
struct Params
{
bool mEnableShortcut = true;
bool mEnableBlend = true;
double mShortcutTimelimit = DEFAULT_TIMELIMIT;
double mBlendRadius = DEFAULT_BLEND_RADIUS;
int mBlendIterations = DEFAULT_BLEND_ITERATIONS;
double mFeasibilityCheckResolution = DEFAULT_CHECK_RESOLUTION;
double mFeasibilityApproxTolerance = DEFAULT_TOLERANCE;
};

/// \param _velocityLimits Maximum velocity for each dimension.
/// \param _accelerationLimits Maximum acceleration for each dimension.
/// \param _enableShortcut Whether shortcutting is used in smoothing.
Expand All @@ -156,12 +169,20 @@ class ParabolicSmoother : public aikido::planner::TrajectoryPostProcessor
const Eigen::VectorXd& _accelerationLimits,
bool _enableShortcut = true,
bool _enableBlend = true,
double _shortcutTimelimit = DEFAULT_TIMELIMT,
double _shortcutTimelimit = DEFAULT_TIMELIMIT,
double _blendRadius = DEFAULT_BLEND_RADIUS,
int _blendIterations = DEFAULT_BLEND_ITERATIONS,
double _feasibilityCheckResolution = DEFAULT_CHECK_RESOLUTION,
double _feasibilityApproxTolerance = DEFAULT_TOLERANCE);

/// \param _velocityLimits Maximum velocity for each dimension.
/// \param _accelerationLimits Maximum acceleration for each dimension.
/// \param _params Postprocessor parameters.
ParabolicSmoother(
const Eigen::VectorXd& _velocityLimits,
const Eigen::VectorXd& _accelerationLimits,
const Params& _params);

/// Performs parabolic smoothing on an input trajectory.
/// \param _inputTraj The untimed trajectory for the arm to process.
/// \param _rng Random number generator.
Expand Down
45 changes: 45 additions & 0 deletions include/aikido/robot/ConcreteRobot.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,49 @@ class ConcreteRobot : public Robot
double feasibilityCheckResolution,
double feasibilityApproxTolerance) const;

/// Get a postprocessor that respects velocity and acceleration limits. The
/// specific postprocessor returned is controlled by `postProcessorParams`.
/// \param[in] velocityLimits Maximum velocity for each dimension.
/// \param[in] accelerationLimits Maximum acceleration for each dimension.
/// \param[in] postProcessorParams Postprocessor parameters.
/// \tparam PostProcessor The trajectory postprocessor to use.
template <typename PostProcessor>
std::shared_ptr<aikido::planner::TrajectoryPostProcessor>
getTrajectoryPostProcessor(
const Eigen::VectorXd& velocityLimits,
const Eigen::VectorXd& accelerationLimits,
const typename PostProcessor::Params& postProcessorParams) const;

/// Returns a post-processed trajectory that can be executed by the robot.
/// \param[in] metaSkeleton Metaskeleton of the path.
/// \param[in] path Geometric path to execute.
/// \param[in] constraint Must be satisfied after postprocessing. Typically
/// collision constraint is passed.
/// \param[in] postProcessorParams Postprocessor parameters.
/// \tparam PostProcessor The trajectory postprocessor to use.
template <typename PostProcessor>
aikido::trajectory::UniqueSplinePtr postProcessPath(
const dart::dynamics::MetaSkeletonPtr& metaSkeleton,
const aikido::trajectory::Trajectory* path,
const constraint::TestablePtr& constraint,
const typename PostProcessor::Params& postProcessorParams);

/// Returns a post-processed trajectory that can be executed by the robot.
/// \param[in] velocityLimits Maximum velocity for each dimension.
/// \param[in] accelerationLimits Maximum acceleration for each dimension.
/// \param[in] path Geometric path to execute.
/// \param[in] constraint Must be satisfied after postprocessing. Typically
/// collision constraint is passed.
/// \param[in] postProcessorParams Postprocessor parameters.
/// \tparam PostProcessor The trajectory postprocessor to use.
template <typename PostProcessor>
aikido::trajectory::UniqueSplinePtr postProcessPath(
const Eigen::VectorXd& velocityLimits,
const Eigen::VectorXd& accelerationLimits,
const aikido::trajectory::Trajectory* path,
const constraint::TestablePtr& constraint,
const typename PostProcessor::Params& postProcessorParams);

/// TODO: Replace this with Problem interface.
/// Plan the robot to a specific configuration. Restores the robot to its
/// initial configuration after planning.
Expand Down Expand Up @@ -310,4 +353,6 @@ class ConcreteRobot : public Robot
} // namespace robot
} // namespace aikido

#include "detail/ConcreteRobot-impl.hpp"

#endif // AIKIDO_ROBOT_CONCRETEROBOT_HPP_
67 changes: 67 additions & 0 deletions include/aikido/robot/detail/ConcreteRobot-impl.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
namespace aikido {
namespace robot {

//==============================================================================
template <typename PostProcessor>
std::shared_ptr<aikido::planner::TrajectoryPostProcessor>
ConcreteRobot::getTrajectoryPostProcessor(
const Eigen::VectorXd& velocityLimits,
const Eigen::VectorXd& accelerationLimits,
const typename PostProcessor::Params& postProcessorParams) const
{
static_assert(
std::is_base_of<aikido::planner::TrajectoryPostProcessor, PostProcessor>::
value,
"PostProcessor must derive from "
"aikido::planner::TrajectoryPostProcessor");

return std::make_shared<PostProcessor>(
velocityLimits, accelerationLimits, postProcessorParams);
}

//==============================================================================
template <typename PostProcessor>
aikido::trajectory::UniqueSplinePtr ConcreteRobot::postProcessPath(
const dart::dynamics::MetaSkeletonPtr& metaSkeleton,
const aikido::trajectory::Trajectory* path,
const constraint::TestablePtr& constraint,
const typename PostProcessor::Params& postProcessorParams)
{
return postProcessPath(
getVelocityLimits(*metaSkeleton),
getAccelerationLimits(*metaSkeleton),
path,
constraint,
postProcessorParams);
}

//==============================================================================
template <typename PostProcessor>
aikido::trajectory::UniqueSplinePtr ConcreteRobot::postProcessPath(
const Eigen::VectorXd& velocityLimits,
const Eigen::VectorXd& accelerationLimits,
const aikido::trajectory::Trajectory* path,
const constraint::TestablePtr& constraint,
const typename PostProcessor::Params& postProcessorParams)
{
auto postProcessor = getTrajectoryPostProcessor(
velocityLimits, accelerationLimits, postProcessorParams);

auto interpolated
= dynamic_cast<const aikido::trajectory::Interpolated*>(path);
if (interpolated)
return postProcessor->postprocess(
*interpolated, *(cloneRNG().get()), constraint);

auto spline = dynamic_cast<const aikido::trajectory::Spline*>(path);
if (spline)
return postProcessor->postprocess(*spline, *(cloneRNG().get()), constraint);

std::cerr
<< "[postProcessPath]: Path should be either Spline or Interpolated."
<< std::endl;
return nullptr;
}

} // namespace robot
} // namespace aikido
13 changes: 13 additions & 0 deletions src/planner/kunzretimer/KunzRetimer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,19 @@ KunzRetimer::KunzRetimer(
// Do nothing
}

//==============================================================================
KunzRetimer::KunzRetimer(
const Eigen::VectorXd& velocityLimits,
const Eigen::VectorXd& accelerationLimits,
const Params& params)
: mVelocityLimits{velocityLimits}
, mAccelerationLimits{accelerationLimits}
, mMaxDeviation(params.mMaxDeviation)
, mTimeStep(params.mTimeStep)
{
// Do nothing
}

//==============================================================================
std::unique_ptr<aikido::trajectory::Spline> KunzRetimer::postprocess(
const aikido::trajectory::Interpolated& inputTraj,
Expand Down
18 changes: 18 additions & 0 deletions src/planner/parabolic/ParabolicSmoother.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,24 @@ ParabolicSmoother::ParabolicSmoother(
// Do nothing
}

//==============================================================================
ParabolicSmoother::ParabolicSmoother(
const Eigen::VectorXd& _velocityLimits,
const Eigen::VectorXd& _accelerationLimits,
const Params& _params)
: mFeasibilityCheckResolution{_params.mFeasibilityCheckResolution}
, mFeasibilityApproxTolerance{_params.mFeasibilityApproxTolerance}
, mVelocityLimits{_velocityLimits}
, mAccelerationLimits{_accelerationLimits}
, mEnableShortcut{_params.mEnableShortcut}
, mEnableBlend{_params.mEnableBlend}
, mShortcutTimelimit{_params.mShortcutTimelimit}
, mBlendRadius{_params.mBlendRadius}
, mBlendIterations{_params.mBlendIterations}
{
// Do nothing
}

//==============================================================================
std::unique_ptr<aikido::trajectory::Spline> ParabolicSmoother::postprocess(
const aikido::trajectory::Interpolated& _inputTraj,
Expand Down