25 #ifndef INCLUDED_PoseState_h_GUID_57A246BA_940D_4386_ECA4_4C4172D97F5A
26 #define INCLUDED_PoseState_h_GUID_57A246BA_940D_4386_ECA4_4C4172D97F5A
34 #include <Eigen/Geometry>
41 namespace pose_externalized_rotation {
42 using Dimension = types::DimensionConstant<12>;
43 using StateVector = types::DimVector<Dimension>;
44 using StateVectorBlock3 = StateVector::FixedSegmentReturnType<3>::Type;
45 using ConstStateVectorBlock3 =
46 StateVector::ConstFixedSegmentReturnType<3>::Type;
48 using StateVectorBlock6 = StateVector::FixedSegmentReturnType<6>::Type;
49 using StateSquareMatrix = types::DimSquareMatrix<Dimension>;
53 inline StateVectorBlock3 position(StateVector &vec) {
56 inline ConstStateVectorBlock3 position(StateVector
const &vec) {
60 inline StateVectorBlock3 incrementalOrientation(StateVector &vec) {
61 return vec.segment<3>(3);
63 inline ConstStateVectorBlock3
64 incrementalOrientation(StateVector
const &vec) {
65 return vec.segment<3>(3);
68 inline StateVectorBlock3 velocity(StateVector &vec) {
69 return vec.segment<3>(6);
71 inline ConstStateVectorBlock3 velocity(StateVector
const &vec) {
72 return vec.segment<3>(6);
75 inline StateVectorBlock3 angularVelocity(StateVector &vec) {
76 return vec.segment<3>(9);
78 inline ConstStateVectorBlock3 angularVelocity(StateVector
const &vec) {
79 return vec.segment<3>(9);
83 inline StateVectorBlock6 velocities(StateVector &vec) {
84 return vec.segment<6>(6);
90 inline StateSquareMatrix stateTransitionMatrix(
double dt) {
93 StateSquareMatrix A = StateSquareMatrix::Identity();
94 A.topRightCorner<6, 6>() = types::SquareMatrix<6>::Identity() * dt;
100 inline double computeAttenuation(
double damping,
double dt) {
101 return std::pow(damping, dt);
108 inline StateSquareMatrix
109 stateTransitionMatrixWithVelocityDamping(
double dt,
double damping) {
111 auto A = stateTransitionMatrix(dt);
112 A.bottomRightCorner<6, 6>() *= computeAttenuation(damping, dt);
120 inline StateSquareMatrix
121 stateTransitionMatrixWithSeparateVelocityDamping(
double dt,
125 auto A = stateTransitionMatrix(dt);
126 A.block<3, 3>(6, 6) *= computeAttenuation(posDamping, dt);
127 A.bottomRightCorner<3, 3>() *= computeAttenuation(oriDamping, dt);
132 inline StateVector applyVelocity(StateVector
const &state,
double dt) {
138 StateVector ret = state;
139 position(ret) += velocity(state) * dt;
140 incrementalOrientation(ret) += angularVelocity(state) * dt;
145 inline void dampenVelocities(StateVector &state,
double damping,
147 auto attenuation = computeAttenuation(damping, dt);
148 velocities(state) *= attenuation;
152 inline void separatelyDampenVelocities(StateVector &state,
154 double oriDamping,
double dt) {
155 velocity(state) *= computeAttenuation(posDamping, dt);
156 angularVelocity(state) *= computeAttenuation(oriDamping, dt);
159 inline Eigen::Quaterniond
160 incrementalOrientationToQuat(StateVector
const &state) {
161 return external_quat::vecToQuat(incrementalOrientation(state));
164 class State :
public HasDimension<12> {
166 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
170 : m_state(StateVector::Zero()),
171 m_errorCovariance(StateSquareMatrix::Identity() *
173 m_orientation(Eigen::Quaterniond::Identity()) {}
175 void setStateVector(StateVector
const &state) { m_state = state; }
177 StateVector
const &stateVector()
const {
return m_state; }
179 void setErrorCovariance(StateSquareMatrix
const &errorCovariance) {
180 m_errorCovariance = errorCovariance;
183 StateSquareMatrix
const &errorCovariance()
const {
184 return m_errorCovariance;
186 StateSquareMatrix &errorCovariance() {
return m_errorCovariance; }
189 void setQuaternion(Eigen::Quaterniond
const &quaternion) {
190 m_orientation = quaternion.normalized();
193 void postCorrect() { externalizeRotation(); }
195 void externalizeRotation() {
196 setQuaternion(getCombinedQuaternion());
197 incrementalOrientation() = Eigen::Vector3d::Zero();
200 StateVectorBlock3 position() {
201 return pose_externalized_rotation::position(m_state);
204 ConstStateVectorBlock3 position()
const {
205 return pose_externalized_rotation::position(m_state);
208 StateVectorBlock3 incrementalOrientation() {
209 return pose_externalized_rotation::incrementalOrientation(
213 ConstStateVectorBlock3 incrementalOrientation()
const {
214 return pose_externalized_rotation::incrementalOrientation(
218 StateVectorBlock3 velocity() {
219 return pose_externalized_rotation::velocity(m_state);
222 ConstStateVectorBlock3 velocity()
const {
223 return pose_externalized_rotation::velocity(m_state);
226 StateVectorBlock3 angularVelocity() {
227 return pose_externalized_rotation::angularVelocity(m_state);
230 ConstStateVectorBlock3 angularVelocity()
const {
231 return pose_externalized_rotation::angularVelocity(m_state);
234 Eigen::Quaterniond
const &getQuaternion()
const {
235 return m_orientation;
238 Eigen::Quaterniond getCombinedQuaternion()
const {
240 return incrementalOrientationToQuat(m_state).normalized() *
246 Eigen::Isometry3d getIsometry()
const {
247 Eigen::Isometry3d ret;
248 ret.fromPositionOrientationScale(position(), getQuaternion(),
249 Eigen::Vector3d::Constant(1));
259 StateSquareMatrix m_errorCovariance;
261 Eigen::Quaterniond m_orientation;
266 template <
typename OutputStream>
267 inline OutputStream &operator<<(OutputStream &os, State
const &state) {
268 os <<
"State:" << state.stateVector().transpose() <<
"\n";
269 os <<
"quat:" << state.getCombinedQuaternion().coeffs().transpose()
271 os <<
"error:\n" << state.errorCovariance() <<
"\n";
278 #endif // INCLUDED_PoseState_h_GUID_57A246BA_940D_4386_ECA4_4C4172D97F5A
typename detail::Dimension_impl< T >::type Dimension
The main namespace for all C++ elements of the framework, internal and external.