forked from ser94mor/sensor-fusion
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CTRVProcessModel.hpp
144 lines (122 loc) · 5.62 KB
/
CTRVProcessModel.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/**
* Copyright (C) 2018-2019 Sergey Morozov <[email protected]>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef SENSOR_FUSION_CTRVPROCESSMODEL_HPP
#define SENSOR_FUSION_CTRVPROCESSMODEL_HPP
#include "definitions.hpp"
#include "state_vector_views.hpp"
#include "ProcessModel.hpp"
#include <Eigen/Dense>
namespace ser94mor
{
namespace sensor_fusion
{
namespace CTRV
{
/**
* A concrete process model class for CTRV process model. The State vector for process model consists of
* [ px, py, v, yaw, yaw_rate ].
* The naming of matrices and functions are taken from the
* "Thrun, S., Burgard, W. and Fox, D., 2005. Probabilistic robotics. MIT press."
*/
class ProcessModel
: public ser94mor::sensor_fusion::ProcessModel<StateVector, StateCovarianceMatrix, ControlVector,
ProcessNoiseCovarianceMatrix,
ROStateVectorView, RWStateVectorView,
ProcessModelKind::CTRV, kIsLinear>
{
public:
/**
* Constructor.
*/
ProcessModel();
/**
* A state transition function without the noise vector.
*
* @param dt a difference between the current measurement timestamp and the previous measurement timestamp
* @param control_vector a control vector
* @param state_vector a state vector
* @return a prior state vector, that is, a state vector after the state transition function applied.
*/
StateVector g(double_t dt, const ControlVector& control_vector, const StateVector& state_vector) const;
/**
* A state transition function with the noise vector. Some filters may require noise terms to be incorporated
* into this non-linear state transition function.
*
* @param dt a difference between the current measurement timestamp and the previous measurement timestamp
* @param control_vector a control vector
* @param state_vector a state vector
* @param noise_vector a noise vector
* @return a prior state vector, that is, a state vector after the state transition function applied.
*/
StateVector g(double_t dt, const ControlVector& control_vector,
const StateVector& state_vector, const ProcessNoiseVector& noise_vector) const;
/**
* @param dt a difference between the current measurement timestamp and the previous measurement timestamp
* @param state_vector a state vector
* @return a state transition matrix
*/
StateTransitionMatrix G(double_t dt, const StateVector& state_vector) const;
/**
* @param dt a difference between the current measurement timestamp and the previous measurement timestamp
* @return a process covariance matrix
*/
ProcessCovarianceMatrix R(double_t dt, const StateVector& state_vector) const;
/**
* Subtract one state vector from another.
* Dimension representing yaw angle that is normalized to be within the [-pi, pi] range.
*
* @tparam StateVector_type a type of a state vector (ordinary or augmented, that is, that has more dimensions)
* @param state_vector_1 a state vector to subtract from
* @param state_vector_2 a state vector which to subtract
*
* @return a difference between two state vectors with normalized yaw angle
*/
template <class StateVector_type>
static auto Subtract(const StateVector_type& state_vector_1, const StateVector_type& state_vector_2)
-> std::enable_if_t<StateVector_type::SizeAtCompileTime >= StateDims(), StateVector_type>
{
StateVector_type sv{state_vector_1 - state_vector_2};
RWStateVectorViewBase<StateVector_type> svv{sv};
Utils::NormalizeAngle(&svv.yaw());
return sv;
}
/**
* Sums two vectors.
* Dimension representing yaw angle that is normalized to be within the [-pi, pi] range.
*
* @tparam StateVector_type a type of a state vector (ordinary or augmented, that is, that has more dimensions)
* @param state_vector_1 a first state vector
* @param state_vector_2 a second state vector
*
* @return a sum of two state vectors with normalized yaw angle
*/
template <class StateVector_type>
static auto Add(const StateVector_type& state_vector_1, const StateVector_type& state_vector_2)
-> std::enable_if_t<StateVector_type::SizeAtCompileTime >= StateDims(), StateVector_type>
{
StateVector_type sv{state_vector_1 + state_vector_2};
RWStateVectorViewBase<StateVector_type> svv{sv};
Utils::NormalizeAngle(&svv.yaw());
return sv;
}
private:
StateTransitionMatrix state_transition_matrix_prototype_;
};
}
}
}
#endif //SENSOR_FUSION_CTRVPROCESSMODEL_HPP