GKD.RoboCtrl
载入中...
搜索中...
未找到
controller.hpp
浏览该文件的文档.
1
6#pragma once
7
8#include <utility>
9#include <functional>
10
11namespace roboctrl::utils{
12
17template<typename T>
18concept controller = requires (T c) {
19 typename T::state_type;
20 typename T::input_type;
21 typename T::params_type;
22 { T(std::declval<typename T::params_type>()) };
23 { c.update(std::declval<typename T::input_type>()) } -> std::same_as<void>;
24 { c.state() } -> std::same_as<typename T::state_type>;
25};
26
31template<controller... Cs>
33 static_assert(sizeof...(Cs) > 0);
34
35 template<std::size_t N>
36 using state_type_n = typename std::tuple_element<N, std::tuple<typename Cs::state_type...>>::type;
37
38 template<std::size_t N>
39 using input_type_n = typename std::tuple_element<N, std::tuple<typename Cs::input_type...>>::type;
40
41 using state_type = state_type_n<sizeof...(Cs) - 1>;
42 using input_type = input_type_n<0>;
43 using params_type = std::tuple<typename Cs::params_type...>;
44
45 std::tuple<Cs...> controllers_;
46
50 explicit control_chain(Cs&&... cs)
51 : controllers_(std::forward<Cs>(cs)...) {}
52
56 explicit control_chain(params_type&& params)
57 : controllers_(std::apply(
58 [](auto&&... ps){ return std::make_tuple(Cs(std::forward<decltype(ps)>(ps))...); },
59 std::move(params)))
60 {}
61
62
67 void update(const input_type& input) {
68 auto current_input = input;
69 std::apply([&](auto&... ctrls){
70 ((ctrls.update(current_input),
71 current_input = ctrls.state()), ...);
72 }, controllers_);
73 }
74
78 const state_type& state() const {
79 return std::get<sizeof...(Cs) - 1>(controllers_).state();
80 }
81};
82
83template<controller controller_type>
84controller_type make_controller(const typename controller_type::info_type& info){
85 return {info};
86}
87
88}
控制器概念,约束 update/state/构造能力。
asio::awaitable< T > awaitable
协程任务类型。
Definition async.hpp:42
用于存放工具函数的命名空间。
Definition concepts.hpp:13
控制链,将多个控制器串联组合。
void update(const input_type &input)
推动控制链一次,依次更新所有控制器。
control_chain(params_type &&params)
使用各控制器的参数构造实例。
const state_type & state() const
读取链路末尾控制器的状态。
control_chain(Cs &&... cs)
直接以控制器实例初始化。