82 lines
2.7 KiB
C
82 lines
2.7 KiB
C
|
|
#pragma once
|
|||
|
|
#include <memory>
|
|||
|
|
#include <vector>
|
|||
|
|
#include <Eigen/Dense>
|
|||
|
|
|
|||
|
|
#include "planner/joint_space_planner/include/joint_space_planner.h"
|
|||
|
|
#include <toppra/geometric_path/piecewise_poly_path.hpp>
|
|||
|
|
#include <toppra/parametrizer/const_accel.hpp>
|
|||
|
|
#include <toppra/parametrizer/spline.hpp>
|
|||
|
|
|
|||
|
|
namespace cmvr {
|
|||
|
|
|
|||
|
|
|
|||
|
|
// 适配器:ConstAccel
|
|||
|
|
class ConstAccelTraj : public ITrajectory {
|
|||
|
|
public:
|
|||
|
|
explicit ConstAccelTraj(std::shared_ptr<toppra::parametrizer::ConstAccel> p);
|
|||
|
|
|
|||
|
|
toppra::Bound timeInterval() const override;
|
|||
|
|
|
|||
|
|
Eigen::VectorXd q(double t) const override;
|
|||
|
|
|
|||
|
|
Eigen::VectorXd qd(double t) const override;
|
|||
|
|
|
|||
|
|
Eigen::VectorXd qdd(double t) const override;
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
std::shared_ptr<toppra::parametrizer::ConstAccel> impl_;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 适配器:Spline
|
|||
|
|
class SplineTraj : public ITrajectory {
|
|||
|
|
public:
|
|||
|
|
SplineTraj(const std::shared_ptr<toppra::PiecewisePolyPath> &path,
|
|||
|
|
const toppra::Vector &grid,
|
|||
|
|
const toppra::Vector &vsq);
|
|||
|
|
|
|||
|
|
toppra::Bound timeInterval() const override;
|
|||
|
|
|
|||
|
|
Eigen::VectorXd q(double t) const override;
|
|||
|
|
|
|||
|
|
Eigen::VectorXd qd(double t) const override;
|
|||
|
|
|
|||
|
|
Eigen::VectorXd qdd(double t) const override;
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
toppra::parametrizer::Spline impl_;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 具体规划器:一次/三次/五次可切换;ConstAccel 校验失败自动回退 Spline
|
|||
|
|
class ToppraBSpline : public JointSpacePlanner {
|
|||
|
|
public:
|
|||
|
|
explicit ToppraBSpline(PathType type = PathType::Quintic);
|
|||
|
|
|
|||
|
|
// 主入口:尽量保证返回轨迹(失败回退到 Spline)
|
|||
|
|
bool plan(const std::vector<double> &start_joints,
|
|||
|
|
const std::vector<double> &goal_joints,
|
|||
|
|
TrajPtr &traj_out) override;
|
|||
|
|
|
|||
|
|
std::vector<TrajSample> sampleTrajectory(const TrajPtr& traj, double dt) override;
|
|||
|
|
bool writeTrajectoryCsv(const std::string& filename,const std::vector<TrajSample>& samples) override;
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
// 几何路径构造
|
|||
|
|
static std::shared_ptr<toppra::PiecewisePolyPath>
|
|||
|
|
buildLinear(const Eigen::VectorXd &q0, const Eigen::VectorXd &q1);
|
|||
|
|
|
|||
|
|
static std::shared_ptr<toppra::PiecewisePolyPath>
|
|||
|
|
buildCubicHermiteRest(const Eigen::VectorXd &q0, const Eigen::VectorXd &q1);
|
|||
|
|
|
|||
|
|
static std::shared_ptr<toppra::PiecewisePolyPath>
|
|||
|
|
buildQuinticRestToRest(const Eigen::VectorXd &q0, const Eigen::VectorXd &q1);
|
|||
|
|
|
|||
|
|
static std::shared_ptr<toppra::PiecewisePolyPath>
|
|||
|
|
buildPath(const Eigen::VectorXd &q0, const Eigen::VectorXd &q1, PathType t);
|
|||
|
|
|
|||
|
|
static void sanitizeVsq(toppra::Vector &vsq);
|
|||
|
|
|
|||
|
|
bool ensureLimitsSized(std::size_t DoF);
|
|||
|
|
};
|
|||
|
|
} // namespace cmvr
|