25 #ifndef INCLUDED_UtilityFunctions_h_GUID_18928B12_FA9D_4285_102C_3106E5EEE14C 
   26 #define INCLUDED_UtilityFunctions_h_GUID_18928B12_FA9D_4285_102C_3106E5EEE14C 
   49         EIGEN_MAKE_ALIGNED_OPERATOR_NEW
 
   51         Eigen::Vector3d xlate;
 
   52         Eigen::Quaterniond rot;
 
   53         LedMeasurementVec measurements;
 
   56     using TimestampedMeasurementsPtr = std::unique_ptr<TimestampedMeasurements>;
 
   57     using MeasurementsRows = std::vector<TimestampedMeasurementsPtr>;
 
   59     template <std::
size_t N> 
using Vec = Eigen::Matrix<double, N, 1>;
 
   61     inline Eigen::IOFormat 
const &getFullFormat() {
 
   62         static const Eigen::IOFormat FullFormat =
 
   63             Eigen::IOFormat(Eigen::FullPrecision, 0, 
",", 
",\n");
 
   67     inline double getReallyBigCost() { 
return 1000000.; }
 
   69     template <
typename VecType>
 
   70     inline Eigen::Quaterniond rot_exp(VecType 
const &v) {
 
   71         Eigen::Vector3d vec = v;
 
   72         return util::quat_exp_map(vec).exp();
 
   75     inline Eigen::Isometry3d 
makeIsometry(Eigen::Vector3d 
const &xlate,
 
   76                                           Eigen::Quaterniond 
const &quat) {
 
   77         return Eigen::Isometry3d(Eigen::Translation3d(xlate)) *
 
   78                Eigen::Isometry3d(quat);
 
   81     inline Eigen::Isometry3d 
makeIsometry(Eigen::Translation3d 
const &xlate,
 
   82                                           Eigen::Quaterniond 
const &quat) {
 
   83         return Eigen::Isometry3d(xlate) * Eigen::Isometry3d(quat);
 
   86     inline Eigen::Isometry3d
 
   87     makeIsometry(Eigen::Ref<Eigen::Vector3d const> 
const &xlate) {
 
   88         return Eigen::Isometry3d(Eigen::Translation3d(xlate));
 
   91     namespace reftracker {
 
   92         using TransformParams = Vec<12>;
 
   96         TransformParams 
const &getRefTrackerTransformParams() {
 
   97             static const TransformParams data =
 
   98                 (TransformParams() << -1.328683782476265, 1.405860857175348,
 
   99                  2.382413079481474, -0.08838304984947577, -0.3418371322988537,
 
  100                  0.08973247977775475, 0.04221099149748584, -0.289480834047175,
 
  101                  -0.1169425186552738, -0.03623604095935174, -0.0460904237026321,
 
  102                  0.001219163540875095)
 
  109             BaseRot = BaseXlate + 3,
 
  110             InnerXlate = BaseRot + 3,
 
  111             InnerRot = InnerXlate + 3
 
  114         inline Eigen::Translation3d
 
  115         getBaseTranslation(TransformParams 
const &vec) {
 
  116             return Eigen::Translation3d(vec.head<3>());
 
  118         inline Eigen::Quaterniond getBaseRotation(TransformParams 
const &vec) {
 
  119             return rot_exp(vec.segment<3>(BaseRot));
 
  121         inline Eigen::Isometry3d getBaseTransform(TransformParams 
const &vec) {
 
  122             return makeIsometry(getBaseTranslation(vec), getBaseRotation(vec));
 
  124         inline Eigen::Translation3d
 
  125         getInnerTranslation(TransformParams 
const &vec) {
 
  126             return Eigen::Translation3d(vec.segment<3>(InnerXlate));
 
  128         inline Eigen::Quaterniond getInnerRotation(TransformParams 
const &vec) {
 
  129             return rot_exp(vec.segment<3>(InnerRot));
 
  131         inline Eigen::Isometry3d getInnerTransform(TransformParams 
const &vec) {
 
  133                                 getInnerRotation(vec));
 
  137     double costMeasurement(Eigen::Isometry3d 
const &refPose,
 
  138                            Eigen::Isometry3d 
const &expPose) {
 
  139         auto distanceAway = -1.;
 
  142         using Point = std::array<double, 3>;
 
  143         auto corners = {Point{.2, -.2, distanceAway},
 
  144                         Point{-.2, -.2, distanceAway},
 
  145                         Point{0, .4, distanceAway}};
 
  147         for (
auto &corner : corners) {
 
  148             Eigen::Vector3d pt = Eigen::Vector3d::Map(corner.data());
 
  149             accum += ((refPose * pt) - (expPose * pt)).norm();
 
  155         EIGEN_MAKE_ALIGNED_OPERATOR_NEW
 
  156         Eigen::Isometry3d videoPose;
 
  157         Eigen::Isometry3d refPose;
 
  159     using TrackedDataPtr = std::unique_ptr<TrackedData>;
 
  160     using TrackedSamples = std::vector<TrackedDataPtr>;
 
  162     inline void outputTransformedSample(Eigen::Isometry3d 
const &baseXform,
 
  163                                         Eigen::Isometry3d 
const &innerXform,
 
  165         std::cout << 
"HDK to VideoBase: " 
  166                   << (sample.videoPose).translation().transpose() << std::endl;
 
  167         std::cout << 
"Ref to VideoBase: " 
  168                   << (baseXform * sample.refPose * innerXform)
 
  172         std::cout << 
"Vive to VideoBase: " 
  173                   << (baseXform * sample.refPose).translation().transpose()
 
  175         std::cout << 
"---------" << std::endl;
 
  180 #endif // INCLUDED_UtilityFunctions_h_GUID_18928B12_FA9D_4285_102C_3106E5EEE14C 
Header wrapping include of  and  for warning quieting. 
::OSVR_TimeValue TimeValue
C++-friendly typedef for the OSVR_TimeValue structure. 
Header providing a C++ wrapper around TimeValueC.h. 
Isometry3< typename Derived1::Scalar > makeIsometry(Eigen::MatrixBase< Derived1 > const &translation, Eigen::RotationBase< Derived2, 3 > const &rotation)
A simpler, functional-style alternative to .fromPositionOrientationScale when no scaling is performed...