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...