Skip to content

Commit

Permalink
Reorganize interfaces to allow multiple trajectory definitions.
Browse files Browse the repository at this point in the history
Instead of template the pattern generator only by the footprint type,
switch to a more extensible mechanism (i.e. C++ traits).

Now, is is possible to use different kind of trajectory types depending
on the pattern generator algorithm.
One goal would be to allow the use of trajectories defined as spline
functions.
  • Loading branch information
thomas-moulard committed Mar 26, 2012
1 parent 854446e commit fa6001a
Show file tree
Hide file tree
Showing 14 changed files with 186 additions and 103 deletions.
27 changes: 24 additions & 3 deletions halfsteps_pattern_generator/include/halfsteps_pattern_generator.hh
Expand Up @@ -20,10 +20,31 @@ struct WithHalfStepsAdditionalData : public T
double stepHeight;
};

typedef WithHalfStepsAdditionalData<walk::StampedFootprint2d> footprint_t;
typedef walk::PatternGenerator<footprint_t> halfStepsPgParent_t;
class HalfStepsPatternGenerator;

class HalfStepsPatternGenerator : public halfStepsPgParent_t
namespace walk
{
template <>
struct PatternGeneratorTraits<HalfStepsPatternGenerator>
{
/// \brief Footprint definition.
typedef WithHalfStepsAdditionalData<walk::StampedFootprint2d> Footprint;

/// \brief Trajectory in \f$SO(3)\f$.
typedef DiscretizedTrajectory<StampedPosition3d> Trajectory3d;
/// \brief Trajectory in \f$SO(2)\f$.
typedef DiscretizedTrajectory<StampedPosition2d> Trajectory2d;
/// \brief Trajectory in \f$R^2\f$.
typedef DiscretizedTrajectory<StampedVector2d> TrajectoryV2d;
/// \brief Trajectory in \f$R^3\f$.
typedef DiscretizedTrajectory<StampedVector3d> TrajectoryV3d;
/// \brief Trajectory in \f$R^n\f$.
typedef DiscretizedTrajectory<StampedVectorNd> TrajectoryNd;
};
} // end of namespace walk.

class HalfStepsPatternGenerator
: public walk::PatternGenerator<HalfStepsPatternGenerator>
{
public:
explicit HalfStepsPatternGenerator
Expand Down
14 changes: 10 additions & 4 deletions halfsteps_pattern_generator/include/yaml.hh
Expand Up @@ -4,10 +4,13 @@
# include <walk_interfaces/pattern-generator.hh>
# include <walk_interfaces/yaml.hh>

# include <halfsteps_pattern_generator.hh>

namespace walk
{
inline YAML::Emitter&
operator<< (YAML::Emitter& out, const footprint_t& footprint)
operator<< (YAML::Emitter& out,
const HalfStepsPatternGenerator::footprint_t& footprint)
{
out << YAML::BeginMap
<< YAML::Key << "beginTime"
Expand Down Expand Up @@ -36,17 +39,20 @@ namespace walk

inline YAML::Emitter&
operator<< (YAML::Emitter& out,
const WALK_INTERFACES_EIGEN_STL_VECTOR(footprint_t)& footprints)
const WALK_INTERFACES_EIGEN_STL_VECTOR
(HalfStepsPatternGenerator::footprint_t)& footprints)
{
out << YAML::BeginSeq;
BOOST_FOREACH (const footprint_t& footprint, footprints)
typedef HalfStepsPatternGenerator::footprint_t a_t;
BOOST_FOREACH (const a_t& footprint, footprints)
out << footprint;
out << YAML::EndSeq;
return out;
}

inline void
operator>> (const YAML::Node& node, footprint_t& footprint)
operator>> (const YAML::Node& node,
HalfStepsPatternGenerator::footprint_t& footprint)
{
checkYamlType (node, YAML::NodeType::Map, "footprint");

Expand Down
Expand Up @@ -18,15 +18,15 @@ HalfStepsPatternGenerator::HalfStepsPatternGenerator
(const double& timeBeforeZmpShift,
const double& timeAfterZmpShift,
const double& step)
: halfStepsPgParent_t(),
: walk::PatternGenerator<HalfStepsPatternGenerator>(),
timeBeforeZmpShift_(timeBeforeZmpShift),
timeAfterZmpShift_(timeAfterZmpShift),
step_(step)
{}

HalfStepsPatternGenerator::HalfStepsPatternGenerator
(const HalfStepsPatternGenerator& pg)
: halfStepsPgParent_t(),
: walk::PatternGenerator<HalfStepsPatternGenerator>(),
timeBeforeZmpShift_(pg.timeBeforeZmpShift_),
timeAfterZmpShift_(pg.timeAfterZmpShift_),
step_(pg.step_)
Expand Down
@@ -1,5 +1,5 @@
#ifndef WALK_INTERFACE_STAMPED_TRAJECTORY_HH
# define WALK_INTERFACE_STAMPED_TRAJECTORY_HH
#ifndef WALK_INTERFACE_DISCRETIZED_TRAJECTORY_HH
# define WALK_INTERFACE_DISCRETIZED_TRAJECTORY_HH
# include <iosfwd>
# include <vector>

Expand All @@ -20,7 +20,7 @@ namespace walk
///
/// \tparam T Trajectory output type.
template <typename T>
class Trajectory
class DiscretizedTrajectory
{
public:
/// \brief Trajectory element.
Expand All @@ -32,16 +32,16 @@ namespace walk
/// \{

/// \brief Default constructor.
explicit Trajectory();
explicit DiscretizedTrajectory();
/// \brief Copy constructor.
explicit Trajectory(const Trajectory<T>&);
explicit DiscretizedTrajectory(const DiscretizedTrajectory<T>&);
/// \brief Destructor.
~Trajectory();
~DiscretizedTrajectory();

/// \}

/// \brief Assignment operator.
Trajectory<T>& operator=(const Trajectory<T>&);
DiscretizedTrajectory<T>& operator=(const DiscretizedTrajectory<T>&);

/// \brief Trajectory data getter.
data_t& data();
Expand All @@ -62,26 +62,26 @@ namespace walk
EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
};

/// \brief Trajectory in \f$SO(3)\f$.
typedef Trajectory<StampedPosition3d> Trajectory3d;
/// \brief Trajectory in \f$SO(2)\f$.
typedef Trajectory<StampedPosition2d> Trajectory2d;
/// \brief Trajectory in \f$R^2\f$.
typedef Trajectory<StampedVector2d> TrajectoryV2d;
/// \brief Trajectory in \f$R^3\f$.
typedef Trajectory<StampedVector3d> TrajectoryV3d;
/// \brief Trajectory in \f$R^n\f$.
typedef Trajectory<StampedVectorNd> TrajectoryNd;
/// \brief DiscretizedTrajectory in \f$SO(3)\f$.
typedef DiscretizedTrajectory<StampedPosition3d> DiscretizedTrajectory3d;
/// \brief DiscretizedTrajectory in \f$SO(2)\f$.
typedef DiscretizedTrajectory<StampedPosition2d> DiscretizedTrajectory2d;
/// \brief DiscretizedTrajectory in \f$R^2\f$.
typedef DiscretizedTrajectory<StampedVector2d> DiscretizedTrajectoryV2d;
/// \brief DiscretizedTrajectory in \f$R^3\f$.
typedef DiscretizedTrajectory<StampedVector3d> DiscretizedTrajectoryV3d;
/// \brief DiscretizedTrajectory in \f$R^n\f$.
typedef DiscretizedTrajectory<StampedVectorNd> DiscretizedTrajectoryNd;

/// \brief Display a trajectory.
///
/// \param stream Output stream
/// \param trajectory Displayed trajectory
template <typename T>
std::ostream& operator<<(std::ostream& stream,
const Trajectory<T>& trajectory);
const DiscretizedTrajectory<T>& trajectory);

} // end of namespace walk.

# include <walk_interfaces/trajectory.hxx>
#endif //! WALK_INTERFACE_STAMPED_TRAJECTORY_HH
# include <walk_interfaces/discretized-trajectory.hxx>
#endif //! WALK_INTERFACE_DISCRETIZED_TRAJECTORY_HH
@@ -1,26 +1,27 @@
#ifndef WALK_INTERFACE_STAMPED_TRAJECTORY_HXX
# define WALK_INTERFACE_STAMPED_TRAJECTORY_HXX
#ifndef WALK_INTERFACE_DISCRETIZED_TRAJECTORY_HXX
# define WALK_INTERFACE_DISCRETIZED_TRAJECTORY_HXX
# include <iostream>

namespace walk
{
template <typename T>
Trajectory<T>::Trajectory()
DiscretizedTrajectory<T>::DiscretizedTrajectory()
: data_()
{}

template <typename T>
Trajectory<T>::Trajectory(const Trajectory<T>& gamma)
DiscretizedTrajectory<T>::DiscretizedTrajectory
(const DiscretizedTrajectory<T>& gamma)
: data_(gamma.data_)
{}

template <typename T>
Trajectory<T>::~Trajectory()
DiscretizedTrajectory<T>::~DiscretizedTrajectory()
{}

template <typename T>
Trajectory<T>&
Trajectory<T>::operator=(const Trajectory<T>& gamma)
DiscretizedTrajectory<T>&
DiscretizedTrajectory<T>::operator=(const DiscretizedTrajectory<T>& gamma)
{
if (&gamma == this)
return *this;
Expand All @@ -29,22 +30,22 @@ namespace walk
}

template <typename T>
typename Trajectory<T>::data_t&
Trajectory<T>::data()
typename DiscretizedTrajectory<T>::data_t&
DiscretizedTrajectory<T>::data()
{
return data_;
}

template <typename T>
const typename Trajectory<T>::data_t&
Trajectory<T>::data() const
const typename DiscretizedTrajectory<T>::data_t&
DiscretizedTrajectory<T>::data() const
{
return data_;
}

template <typename T>
TimeDuration
Trajectory<T>::computeLength() const
DiscretizedTrajectory<T>::computeLength() const
{
TimeDuration length;
typename data_t::const_iterator iter = data_.begin ();
Expand All @@ -55,14 +56,14 @@ namespace walk

template <typename T>
std::ostream&
operator<<(std::ostream& os, const Trajectory<T>& gamma)
operator<<(std::ostream& os, const DiscretizedTrajectory<T>& gamma)
{
typename Trajectory<T>::data_t::const_iterator iter =
typename DiscretizedTrajectory<T>::data_t::const_iterator iter =
gamma.data().begin ();
for (; iter != gamma.data().end(); ++iter)
os << (*iter) << std::endl;
return os;
}
} // end of namespace walk.

#endif //! WALK_INTERFACE_STAMPED_TRAJECTORY_HXX
#endif //! WALK_INTERFACE_DISCRETIZED_TRAJECTORY_HXX
60 changes: 55 additions & 5 deletions walk_interfaces/include/walk_interfaces/pattern-generator.hh
Expand Up @@ -2,17 +2,22 @@
# define WALK_INTERFACE_WALK_HH
# include <vector>

# include <boost/static_assert.hpp>

# include <walk_interfaces/types.hh>
# include <walk_interfaces/trajectory.hh>
# include <walk_interfaces/discretized-trajectory.hh>
# include <walk_interfaces/stamped-footprint.hh>

namespace walk
{
template <typename T>
class PatternGenerator;

/// \brief Pattern generator expecting 2d footprints as input.
typedef PatternGenerator<StampedFootprint2d> PatternGenerator2d;
template <typename T>
struct PatternGeneratorTraits
{
BOOST_STATIC_ASSERT(sizeof(T) == 0);
};

/// \brief A pattern generator computes walking reference
/// trajectories.
Expand Down Expand Up @@ -41,13 +46,33 @@ namespace walk
/// algorithm specific. Please see the pattern generator
/// documentation for more details.
///
/// \tparam T Footprint type.
/// \tparam T Pattern generator concrete type.
template <typename T>
class PatternGenerator
{
public:
typedef T concreteType_t;

/// \brief Footprint type.
typedef T footprint_t;
typedef typename PatternGeneratorTraits<concreteType_t>::Footprint
footprint_t;

/// \brief DiscretizedTrajectory in \f$SO(3)\f$.
typedef typename PatternGeneratorTraits<concreteType_t>::Trajectory3d
Trajectory3d;
/// \brief DiscretizedTrajectory in \f$SO(3)\f$.
typedef typename PatternGeneratorTraits<concreteType_t>::Trajectory2d
Trajectory2d;
/// \brief DiscretizedTrajectory in \f$R^2\f$.
typedef typename PatternGeneratorTraits<concreteType_t>::TrajectoryV2d
TrajectoryV2d;
/// \brief DiscretizedTrajectory in \f$R^3\f$.
typedef typename PatternGeneratorTraits<concreteType_t>::TrajectoryV3d
TrajectoryV3d;
/// \brief DiscretizedTrajectory in \f$R^n\f$.
typedef typename PatternGeneratorTraits<concreteType_t>::TrajectoryNd
TrajectoryNd;

/// \brief Vector of footprints.
typedef WALK_INTERFACES_EIGEN_STL_VECTOR(footprint_t) footprints_t;

Expand Down Expand Up @@ -229,6 +254,31 @@ namespace walk
std::ostream& operator<<(std::ostream& stream,
const PatternGenerator<T>& pg);


class DiscretizedPatternGenerator2d;
template <>
struct PatternGeneratorTraits<DiscretizedPatternGenerator2d>
{
/// \brief Footprint definition.
typedef StampedFootprint2d Footprint;

/// \brief Trajectory in \f$SO(3)\f$.
typedef DiscretizedTrajectory<StampedPosition3d> Trajectory3d;
/// \brief Trajectory in \f$SO(2)\f$.
typedef DiscretizedTrajectory<StampedPosition2d> Trajectory2d;
/// \brief Trajectory in \f$R^2\f$.
typedef DiscretizedTrajectory<StampedVector2d> TrajectoryV2d;
/// \brief Trajectory in \f$R^3\f$.
typedef DiscretizedTrajectory<StampedVector3d> TrajectoryV3d;
/// \brief Trajectory in \f$R^n\f$.
typedef DiscretizedTrajectory<StampedVectorNd> TrajectoryNd;
};


class DiscretizedPatternGenerator2d
: public PatternGenerator<DiscretizedPatternGenerator2d>
{};

} // end of namespace walk.

# include <walk_interfaces/pattern-generator.hxx>
Expand Down

0 comments on commit fa6001a

Please sign in to comment.