One Motor 0.6.0
RoboMaster全平台一站式电机驱动库
载入中...
搜索中...
未找到
PIDChain.hpp
1#ifndef ONEMOTOR_PIDCHAIN_HPP
2#define ONEMOTOR_PIDCHAIN_HPP
3#include <tuple>
4#include "PID.hpp"
5
6namespace OneMotor::Control
7{
13 template <typename Node, typename... RestNodes>
14 class PIDChain
15 {
16 public:
17 static constexpr size_t Size = 1 + sizeof...(RestNodes);
18 constexpr size_t size() { return Size; }
19
20 // 构造函数:递归初始化
21 template <typename Param, typename... RestParams>
22 explicit PIDChain(const Param& p, const RestParams&... rest)
23 : head_node(p), tail(rest...)
24 {
25 }
26
33 template <typename T, typename... Ms>
34 auto compute(T target, T measure, Ms... rest_measures)
35 {
36 // 1. 计算当前级的输出
37 auto current_output = head_node.compute(target, measure);
38
39 // 2. 将当前输出作为下一级的 target,递归传递剩余测量值
40 // 如果这是最后一级,tail.compute 会处理
41 return tail.compute(current_output, rest_measures...);
42 }
43
44 // 重置所有状态
45 void reset()
46 {
47 head_node.reset();
48 tail.reset();
49 }
50
51 // 获取特定层级的引用(用于调试或运行时参数修改)
52 template <size_t Index>
53 auto& get()
54 {
55 if constexpr (Index == 0) return head_node;
56 else return tail.template get<Index - 1>();
57 }
58
59 private:
60 Node head_node;
61 PIDChain<RestNodes...> tail;
62 };
63
68 template <typename Node>
69 class PIDChain<Node>
70 {
71 public:
72 template <typename Param>
73 explicit PIDChain(const Param& p) : head_node(p)
74 {
75 }
76
77 template <typename T>
78 auto compute(T target, T measure)
79 {
80 return head_node.compute(target, measure);
81 }
82
83 void reset() { head_node.reset(); }
84
85 template <size_t Index>
86 auto& get()
87 {
88 static_assert(Index == 0, "Index out of bounds");
89 return head_node;
90 }
91
92 private:
93 Node head_node;
94 };
95
96 template <typename... Nodes>
97 class ChainBuilder;
98
99 // 空构建器
100 template <>
101 class ChainBuilder<>
102 {
103 public:
104 // 添加一级 PID
105 // TParams 是 PID_Params<...>
106 // Features 是 PIDController 的特性标签
107 template <typename Algorithm = Positional, typename ValueType = float, typename... Features>
108 auto add(const PID_Params<ValueType>& params)
109 {
110 // 定义新节点的类型
111 using NewNode = PIDController<Algorithm, ValueType, Features...>;
112
113 // 返回包含新类型的新构建器,并传递参数
114 return ChainBuilder<NewNode>(std::make_tuple(params));
115 }
116 };
117
118 // 有状态的构建器
119 template <typename... ExistingNodes>
120 class ChainBuilder
121 {
122 using ParamsTuple = std::tuple<typename ExistingNodes::ParamsType...>;
123 ParamsTuple params_store;
124
125 public:
126 explicit ChainBuilder(ParamsTuple p) : params_store(std::move(p))
127 {
128 }
129
130 template <typename Algorithm = Positional, typename ValueType = float, typename... Features>
131 auto add(const PID_Params<ValueType>& new_params)
132 {
133 using NewNode = PIDController<Algorithm, ValueType, Features...>;
134
135 // 合并旧参数和新参数
136 auto new_params_tuple = std::tuple_cat(params_store, std::make_tuple(new_params));
137
138 return ChainBuilder<ExistingNodes..., NewNode>(new_params_tuple);
139 }
140
141 // 构建最终的 PIDChain 对象
142 auto build()
143 {
144 return std::apply([]<typename... T>(T&&... args)
145 {
146 return PIDChain<ExistingNodes...>(std::forward<T>(args)...);
147 }, params_store);
148 }
149 };
150
151 // 辅助函数,创建构建器
152 inline auto createPIDChain()
153 {
154 return ChainBuilder<>{};
155 }
156}
157
158#endif //ONEMOTOR_PIDCHAIN_HPP
定义了一个可配置的PID控制器。
定义 PIDChain.hpp:102
定义 PIDChain.hpp:121
PID处理链。
定义 PIDChain.hpp:15
auto compute(T target, T measure, Ms... rest_measures)
递归计算逻辑
定义 PIDChain.hpp:34
一个通用的、可配置的PID控制器。
定义 PID.hpp:141
PID控制器的参数。
定义 PID.hpp:25
位置式PID算法标签。
定义 PID.hpp:50