aligator
0.19.0
A versatile and efficient C++ library for real-time constrained trajectory optimization.
Toggle main menu visibility
Loading...
Searching...
No Matches
filter.hpp
Go to the documentation of this file.
1
3
#pragma once
4
5
#include "
aligator/fwd.hpp
"
6
7
#include <functional>
8
9
namespace
aligator
{
10
12
template
<
typename
Scalar>
struct
FilterTpl
{
13
public
:
14
ALIGATOR_DYNAMIC_TYPEDEFS
(Scalar);
15
16
// List of all filter pairs
17
std::vector<std::pair<Scalar, Scalar>>
filter_pairs_
;
18
19
// Proximity parameter
20
Scalar
beta_
;
21
Scalar
alpha_min_
;
22
std::size_t
max_num_steps_
;
23
24
FilterTpl
(
const
Scalar &beta,
const
Scalar &alpha_min,
25
const
std::size_t &max_num_steps) {
26
beta_
= beta;
27
alpha_min_
= alpha_min;
28
max_num_steps_
= max_num_steps;
29
filter_pairs_
.clear();
30
}
31
32
virtual
~FilterTpl
() =
default
;
33
34
void
resetFilter
(
const
Scalar &beta,
const
Scalar &alpha_min,
35
const
std::size_t &max_num_steps) {
36
beta_
= beta;
37
alpha_min_
= alpha_min;
38
max_num_steps_
= max_num_steps;
39
filter_pairs_
.clear();
40
}
41
42
Scalar
run
(
const
std::function<std::pair<Scalar, Scalar>(Scalar)> &phi,
43
Scalar &alpha_try) {
44
alpha_try = 1;
45
std::pair<Scalar, Scalar> fpair;
46
// Try full step, backtrack if failure
47
while
(
true
) {
48
try
{
49
fpair = phi(alpha_try);
50
break
;
51
}
catch
(
const
std::runtime_error &e) {
52
alpha_try *= 0.5;
53
if
(alpha_try <=
alpha_min_
) {
54
alpha_try =
alpha_min_
;
55
break
;
56
}
57
}
58
}
59
60
// Try to accept pair, backtrack if failure
61
for
(std::size_t i = 0; i <
max_num_steps_
; i++) {
62
if
(!
accept_pair
(fpair)) {
63
alpha_try *= 0.5;
64
if
(alpha_try <=
alpha_min_
) {
65
alpha_try =
alpha_min_
;
66
fpair = phi(alpha_try);
67
break
;
68
}
69
fpair = phi(alpha_try);
70
}
else
71
break
;
72
}
73
74
// TODO: else, feasilibity restauration by minimizing h
75
return
fpair.first;
76
}
77
78
bool
accept_pair
(
const
std::pair<Scalar, Scalar> &fpair) {
79
// Check if pair is acceptable to the filter
80
for
(
auto
el =
filter_pairs_
.begin(); el !=
filter_pairs_
.end(); el++) {
81
std::pair<Scalar, Scalar> element = *el;
82
if
(element.first +
beta_
* element.second <= fpair.first and
83
element.second +
beta_
* element.second <= fpair.second) {
84
return
false
;
85
}
86
}
87
88
// If acceptable, remove all pairs dominated by it
89
for
(
auto
el =
filter_pairs_
.begin(); el !=
filter_pairs_
.end();) {
90
std::pair<Scalar, Scalar> element = *el;
91
if
(fpair.first <= element.first and fpair.second <= element.second) {
92
el =
filter_pairs_
.erase(el);
93
}
else
{
94
el++;
95
}
96
}
97
98
// Push new pair inside filter
99
filter_pairs_
.push_back(fpair);
100
101
return
true
;
102
}
103
};
104
}
// namespace aligator
105
106
#ifdef ALIGATOR_ENABLE_TEMPLATE_INSTANTIATION
107
#include "./filter.txx"
108
#endif
fwd.hpp
Forward declarations.
aligator
Main package namespace.
Definition
action-model-wrap.hpp:14
aligator::FilterTpl::accept_pair
bool accept_pair(const std::pair< Scalar, Scalar > &fpair)
Definition
filter.hpp:78
aligator::FilterTpl::alpha_min_
Scalar alpha_min_
Definition
filter.hpp:21
aligator::FilterTpl::ALIGATOR_DYNAMIC_TYPEDEFS
ALIGATOR_DYNAMIC_TYPEDEFS(Scalar)
aligator::FilterTpl::filter_pairs_
std::vector< std::pair< Scalar, Scalar > > filter_pairs_
Definition
filter.hpp:17
aligator::FilterTpl::run
Scalar run(const std::function< std::pair< Scalar, Scalar >(Scalar)> &phi, Scalar &alpha_try)
Definition
filter.hpp:42
aligator::FilterTpl::beta_
Scalar beta_
Definition
filter.hpp:20
aligator::FilterTpl::max_num_steps_
std::size_t max_num_steps_
Definition
filter.hpp:22
aligator::FilterTpl::FilterTpl
FilterTpl(const Scalar &beta, const Scalar &alpha_min, const std::size_t &max_num_steps)
Definition
filter.hpp:24
aligator::FilterTpl::~FilterTpl
virtual ~FilterTpl()=default
aligator::FilterTpl::resetFilter
void resetFilter(const Scalar &beta, const Scalar &alpha_min, const std::size_t &max_num_steps)
Definition
filter.hpp:34
include
aligator
core
filter.hpp
Generated by
1.17.0