ethzasl-msf - Modular Sensor Fusion
Time delay compensated single and multi sensor fusion framework based on an EKF
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
msf_tools.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2012-2013 Simon Lynen, ASL, ETH Zurich, Switzerland
3  * You can contact the author at <slynen at ethz dot ch>
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 #ifndef MSF_TOOLS_H_
18 #define MSF_TOOLS_H_
19 
20 #include <Eigen/Dense>
21 #include <algorithm>
22 
23 namespace msf_core {
24 /***
25  * Computes the median of a given vector.
26  */
27 template<typename D>
28 typename Eigen::MatrixBase<D>::Scalar getMedian(
29  const Eigen::MatrixBase<D> & data) {
30  static_assert(
31  (Eigen::MatrixBase<D>::ColsAtCompileTime == 1),
32  "getMedian only takes Eigen column vectors as arguments");
33  Eigen::Matrix<typename Eigen::MatrixBase<D>::Scalar,
34  Eigen::MatrixBase<D>::RowsAtCompileTime,
35  // Copy so we don't sort the original vector.
36  Eigen::MatrixBase<D>::ColsAtCompileTime> m = data;
37 
38  if (Eigen::MatrixBase<D>::SizeAtCompileTime) {
39  double * begin = m.data();
40  double * end = m.data() + m.SizeAtCompileTime;
41  double * middle = begin + static_cast<int>(std::floor((end - begin) / 2));
42  std::nth_element(begin, middle, end);
43  return *middle;
44  } else
45  return 0;
46 }
47 
48 /***
49  * Outputs the time in seconds in a human readable format for debugging.
50  */
51 double timehuman(double val);
52 
53 }
54 
55 #endif // MSF_TOOLS_H_