{"id":30105659,"url":"https://github.com/yuwei-wu/planner_interface","last_synced_at":"2025-10-16T01:40:49.008Z","repository":{"id":308403012,"uuid":"1031479953","full_name":"yuwei-wu/planner_interface","owner":"yuwei-wu","description":"A modular library for polynomial trajectory parameterization and representation for trajectory planning.","archived":false,"fork":false,"pushed_at":"2025-08-05T18:02:31.000Z","size":42,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-05T19:34:21.712Z","etag":null,"topics":["motion-planning","trajectory-optimization"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yuwei-wu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-08-03T20:35:55.000Z","updated_at":"2025-08-05T18:42:10.000Z","dependencies_parsed_at":"2025-08-05T19:34:23.707Z","dependency_job_id":"79c32396-9a97-480a-b289-3006946cefb0","html_url":"https://github.com/yuwei-wu/planner_interface","commit_stats":null,"previous_names":["yuwei-wu/planner_interface"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/yuwei-wu/planner_interface","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuwei-wu%2Fplanner_interface","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuwei-wu%2Fplanner_interface/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuwei-wu%2Fplanner_interface/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuwei-wu%2Fplanner_interface/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yuwei-wu","download_url":"https://codeload.github.com/yuwei-wu/planner_interface/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuwei-wu%2Fplanner_interface/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269656199,"owners_count":24454594,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-09T02:00:10.424Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["motion-planning","trajectory-optimization"],"created_at":"2025-08-10T00:16:43.167Z","updated_at":"2025-10-16T01:40:43.963Z","avatar_url":"https://github.com/yuwei-wu.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# planner_interface\n[![Linux platform](https://img.shields.io/badge/platform-linux--64-orange.svg)](https://releases.ubuntu.com/22.04/)\n![ROS2](https://img.shields.io/badge/ROS2-Humble-blueviolet)\n![Eigen](https://img.shields.io/badge/Eigen-3.x-lightgrey)\n![CMake Version](https://img.shields.io/badge/CMake-3.5%2B-blue)\n\n`planner_interface` is a modular library providing polynomial and B-spline trajectory representations, along with ROS message definitions for trajectory planning. \n\n- **poly_lib**: ROS2 library for polynomial and B-spline computation and conversion.\n- **traj_msgs**: Custom ROS message definitions to describe trajectories and splines.\n\n---\n\n## 1. Repository Structure\n\n```\n├── poly_lib\n│   ├── CMakeLists.txt\n│   ├── include\n│   │   └── poly_lib\n│   │       ├── basis_utils.hpp\n│   │       ├── bspline.hpp\n│   │       ├── poly_1d.hpp\n│   │       ├── poly_nd.hpp\n│   │       ├── ros_utils.hpp\n│   │       └── traj_data.hpp\n│   ├── package.xml\n│   └── src\n│       ├── exa_poly1d.cpp\n│       ├── exp_spline.cpp\n│       └── poly_node.cpp\n├── README.md\n└── traj_msgs\n    ├── CMakeLists.txt\n    ├── msg\n    │   ├── BdDervi.msg\n    │   ├── Discrete.msg\n    │   ├── MultiTraj.msg\n    │   ├── PiecewisePoly.msg\n    │   ├── Polynomial.msg\n    │   ├── SingleTraj.msg\n    │   └── Spline.msg\n    └── package.xml\n\n````\n\n---\n\n## 2. Features\n\n### traj_msgs\n\n#### check the support trajectory type in SingleTraj.msg\n\n```\n# === Identification ===\nint32 drone_id          # Drone Unique ID\nint32 traj_id           # Trajectory Unique ID\n\n# === Timing ===\nbuiltin_interfaces/Time start_time\nfloat64 duration\n\n# === Trajectory Type Enum ===\nint8 TRAJ_POLY = 0      # standard polynomial\nint8 TRAJ_SPLINE = 1    # Bspline or Bernstein\nint8 TRAJ_DISCRETE = 2  # discrete method\nint8 TRAJ_BD_DERIV = 3  # hermite quintic\n\nint8 traj_type          # Active trajectory type\n\n# === Union: Only 1 Active Trajectory ===\nPiecewisePoly polytraj\nSpline        splinetraj\nDiscrete      discretetraj\nBdDervi       bddervitraj\n```\n\n### poly_lib\n\n`poly_lib` provides data structures and utilities for polynomial-based trajectory representation and conversion.\n\n\n* **traj_data.hpp**\n  Defines `TrajData`, a struct that supports querying **position**, **velocity**, and **acceleration** for:\n\n\n```cpp\nSTANDARD,  // Standard Polynomials\nBEZIER,    // Bézier (B-spline form)\nBERNSTEIN, // Bernstein Polynomials\nBOUNDARY   // Boundary Conditions (e.g., Quintic Polynomials)\n```\n  ```cpp\n  struct TrajData\n  {\n    double traj_dur_ = 0, traj_yaw_dur_ = 0;\n    rclcpp::Time start_time_;\n    int dim_;\n    traj_opt::Trajectory3D traj_3d_;\n    traj_opt::Trajectory1D traj_yaw_;\n    traj_opt::DiscreteStates traj_discrete_;\n  };\n  ```\n\n* **ros\\_utils.hpp**\n  Provides `SingleTraj2TrajData` to convert `SingleTraj.msg` into `TrajData`.\n\n* **basis\\_utils.hpp**\n  Utility functions to convert **Chebyshev**, **Legendre**, and **Laguerre** polynomials into **Standard Polynomial** form.\n\n* **PolyND**\n  Utilities for handling single and multi-dimensional polynomial curves.\n\n\n## 3. Build Instructions\n\nBuild the entire workspace using `colcon` or `ament`:\n\n```bash\ncolcon build \n````\n\n---\n\n## 4. Resources \n\n### 4.1 Polynomial Bases \n\n| Polynomial Type     | Basis Functions                               | Domain            | Orthogonal? |\n| ------------------- | --------------------------------------------- | ----------------- | ----------- |\n| Standard (Monomial) | $t^k$                                         | Any real interval | No          |\n| Chebyshev           | $T_k(t) = \\cos(k \\arccos t)$                  | $[-1,1]$          | Yes         |\n| Bernstein (Bezier)  | $B_{k,n}(t) = \\binom{n}{k} t^k (1 - t)^{n-k}$ | $[0,1]$           | No          |\n| B-spline            | $N_{i,p}(t)$                                  | $[t_0, t_m]$      | No          |\n| Legendre            | $P_k(t)$ (recurrence)                         | $[-1,1]$          | Yes         |\n| Hermite             | $H_k(t)$ (Rodrigues’ formula)                 | $\\mathbb{R}$      | Yes         |\n| Laguerre            | $L_k(t)$ (Rodrigues’ formula)                 | $[0, \\infty)$     | Yes         |\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e1. Standard (Monomial) Polynomials\u003c/b\u003e\u003c/summary\u003e\n\n**General Form:**  \n$$p(t) = a_0 + a_1 t + a_2 t^2 + \\dots + a_n t^n$$\n\n- **Variables:** $t \\in \\mathbb{R}$, typically representing time or spatial variable.  \n- **Domain:** Usually any real interval; no restriction.  \n- **Description:**  \n  The simplest and most intuitive polynomial basis using powers of $t$.  \n- **Properties:**  \n  - Basis functions: $\\{1, t, t^2, \\ldots, t^n\\}$  \n  - Not orthogonal, can suffer from numerical instability at high degrees (e.g., Runge's phenomenon).  \n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e2. Chebyshev Polynomials\u003c/b\u003e\u003c/summary\u003e\n\n**General Form:**  \n$$p(t) = \\sum_{k=0}^n c_k T_k(t)$$\n\nWhere the Chebyshev polynomials $T_k(t)$ are defined by:  \n$$T_0(t) = 1, \\quad T_1(t) = t, \\quad T_{k+1}(t) = 2 t T_k(t) - T_{k-1}(t)$$  \nor equivalently:  \n$$T_k(t) = \\cos(k \\arccos t)$$\n\n- **Variables:** $t \\in [-1, 1]$  \n- **Domain:** Defined specifically on the interval $[-1,1]$. Inputs outside require domain scaling.  \n- **Description:**  \n  Chebyshev polynomials form an orthogonal basis with respect to the weight $\\frac{1}{\\sqrt{1 - t^2}}$.  \n- **Properties:**  \n  - Orthogonal basis → improved numerical stability.  \n  - Minimizes the maximum error in polynomial approximation (minimax property).  \n  - Helps reduce oscillations (Runge’s phenomenon).  \n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e3. Bernstein Polynomials (Bezier Basis)\u003c/b\u003e\u003c/summary\u003e\n\n**General Form:**  \n$$p(t) = \\sum_{k=0}^n b_k B_{k,n}(t)$$\n\nWhere the Bernstein basis polynomials are:  \n$$B_{k,n}(t) = \\binom{n}{k} t^k (1 - t)^{n-k}$$\n\n- **Variables:** $t \\in [0, 1]$  \n- **Domain:** Defined on $[0,1]$, which fits well with normalized curve parameterization.  \n- **Description:**  \n  The Bernstein basis is the foundation of Bezier curves. The coefficients $b_k$ are the control points.  \n- **Properties:**  \n  - Basis functions are positive and sum to 1 (good for shape control and convex hull property).  \n  - Intuitive geometric interpretation with control points.  \n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e4. B-spline \u003c/b\u003e\u003c/summary\u003e\n\n**General Form:**\n$p(t) = \\sum_{i=0}^m c_i N_{i,n}(t)$\n\nWhere the B-spline basis functions $N_{i,n}(t)$ are defined recursively over a knot vector $\\{t_0, t_1, \\ldots, t_{m+n+1}\\}$:\n\n- Zero-degree basis:\n$N_{i,0}(t) = \\text{1 if } t_i \\leq t \u003c t_{i+1}, \\text{ else } 0$\n\n\n- Recursive definition:\n$N_{i,n}(t) = \\frac{t - t_i}{t_{i+n} - t_i} N_{i,n-1}(t) + \\frac{t_{i+n+1} - t}{t_{i+n+1} - t_{i+1}} N_{i+1,n-1}(t)$\n\n* **Variables:** $t \\in [t_n, t_{m+1}]$ (domain determined by knot vector)\n* **Description:**\n  B-splines generalize Bezier curves by piecing together polynomial segments with continuity and local control, where each basis function is nonzero only on a limited interval defined by knots.\n* **Properties:**\n  * Local support: each basis function affects only a portion of the curve, allowing local shape modification.\n  * Partition of unity: basis functions sum to 1 everywhere on the domain.\n  * Flexibility: knot multiplicities control continuity and shape.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e5. Legendre Polynomials\u003c/b\u003e\u003c/summary\u003e\n\n**General Form:**  \n$$p(t) = \\sum_{k=0}^n l_k P_k(t)$$\n\nWhere Legendre polynomials $P_k(t)$ satisfy the recurrence:  \n$$(k+1) P_{k+1}(t) = (2k+1) t P_k(t) - k P_{k-1}(t)$$\n\n- **Variables:** $t \\in [-1, 1]$  \n- **Domain:** Orthogonal on $[-1,1]$ with uniform weight.  \n- **Description:**  \n  Another set of orthogonal polynomials commonly used in physics and numerical integration (Gauss-Legendre quadrature).  \n- **Properties:**  \n  - Orthogonal w.r.t. uniform weight → useful for approximation and solving differential equations.  \n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e6. Hermite Polynomials\u003c/b\u003e\u003c/summary\u003e\n\n**General Form:**  \n$$p(t) = \\sum_{k=0}^n h_k H_k(t)$$\n\nWhere Hermite polynomials $H_k(t)$ can be defined via Rodrigues’ formula:  \n$$H_k(t) = (-1)^k e^{t^2} \\frac{d^k}{dt^k} e^{-t^2}$$\n\n- **Variables:** $t \\in \\mathbb{R}$ (all real numbers)  \n- **Domain:** Entire real line.  \n- **Description:**  \n  Orthogonal polynomials with respect to Gaussian weight $e^{-t^2}$.  \n- **Properties:**  \n  - Useful for approximations involving Gaussian weight functions.  \n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e6. Laguerre Polynomials\u003c/b\u003e\u003c/summary\u003e\n\n**General Form:**  \n$$p(t) = \\sum_{k=0}^n g_k L_k(t)$$\n\nWhere Laguerre polynomials satisfy:  \n$$L_k(t) = \\frac{e^t}{k!} \\frac{d^k}{dt^k} \\left(t^k e^{-t}\\right)$$\n\n- **Variables:** $t \\in [0, \\infty)$  \n- **Domain:** Semi-infinite interval $[0, \\infty)$.  \n- **Description:**  \n  Orthogonal polynomials with respect to exponential decay weight $e^{-t}$.  \n- **Properties:**  \n  - Suitable for problems on infinite or semi-infinite domains.  \n\u003c/details\u003e\n\n---\n\n## Acknowledges\n\n- Thanks to the [OpenAI GPT](https://openai.com/) for assistance in developing the code and documentation.\n- Reference: \n   -  https://github.com/ethz-asl/mav_comm\n   -  https://github.com/KumarRobotics/kr_mav_control/tree/poly/trackers/kr_tracker_msgs\n   -  https://github.com/KumarRobotics/kr_mav_control/tree/master/kr_mav_msgs\n   -  https://github.com/KumarRobotics/kr_planning_msgs\n   -  https://github.com/ZJU-FAST-Lab/EGO-Planner-v2/tree/main/swarm-playground/main_ws/src/planner/traj_utils\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyuwei-wu%2Fplanner_interface","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyuwei-wu%2Fplanner_interface","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyuwei-wu%2Fplanner_interface/lists"}