cmvr-es/src/planner/joint_space_planner/include/toppra_bspline.h
2025-12-18 16:08:08 +08:00

82 lines
2.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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