Skip to content

Commit 6a7bc62

Browse files
YLouWashUfacebook-github-bot
authored andcommitted
Add interpolated hand API to MPS.
Summary: This diff adds interpolated hand API in MPS data provider. Reviewed By: kongchen1992 Differential Revision: D82865601 fbshipit-source-id: 576816c4a1b4fca4a5733d4415499c300eceb61b
1 parent c93714f commit 6a7bc62

3 files changed

Lines changed: 41 additions & 0 deletions

File tree

core/mps/MpsDataProvider.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,31 @@ std::optional<HandTrackingResult> MpsDataProvider::getHandTrackingResult(
132132
return iter == handTrackingResults_.end() ? std::optional<HandTrackingResult>() : iter->second;
133133
}
134134

135+
std::optional<HandTrackingResult> MpsDataProvider::getInterpolatedHandTrackingResult(
136+
int64_t deviceTimeStampNs) {
137+
// Query for the hand pose before and after the query timestamp
138+
auto handBefore = getHandTrackingResult(deviceTimeStampNs, TimeQueryOptions::Before);
139+
auto handAfter = getHandTrackingResult(deviceTimeStampNs, TimeQueryOptions::After);
140+
141+
// Check for before and after hand availability
142+
if (!handBefore.has_value() && !handAfter.has_value()) {
143+
std::string error = fmt::format(
144+
"Query before and after timestamp {} returns empty results, hand tracking data is likely corrupted",
145+
deviceTimeStampNs);
146+
XR_LOGE("{}", error);
147+
throw std::runtime_error{error};
148+
}
149+
150+
if (!handBefore.has_value() || !handAfter.has_value()) {
151+
// query before the beginning of traj or after the end
152+
return {};
153+
}
154+
155+
std::chrono::microseconds queryTimestampUs = std::chrono::microseconds(deviceTimeStampNs / 1000);
156+
157+
return interpolateHandTrackingResult(handBefore.value(), handAfter.value(), queryTimestampUs);
158+
}
159+
135160
std::optional<EyeGaze> MpsDataProvider::getPersonalizedEyeGaze(
136161
int64_t deviceTimeStampNs,
137162
const TimeQueryOptions& timeQueryOptions) {

core/mps/MpsDataProvider.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,15 @@ class MpsDataProvider {
207207
int64_t captureTimestampNs,
208208
const TimeQueryOptions& timeQueryOptions = TimeQueryOptions::Closest);
209209

210+
/**
211+
* @brief Query MPS for Hand tracking result, at a specific timestamp, and return interpolated
212+
* pose.
213+
* @param deviceTimeStampNs The query timestamp in `TimeDomain::DeviceTime`.
214+
* @return optional HandTrackingResult, will return invalid if the query is
215+
* out of bound
216+
*/
217+
std::optional<HandTrackingResult> getInterpolatedHandTrackingResult(int64_t deviceTimeStampNs);
218+
210219
/**
211220
* @brief Check if HandTrackingResults are available in the MPS data paths
212221
* @return true if data is available, false otherwise

core/python/MpsPyBind.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -801,6 +801,13 @@ void exportMps(py::module& m) {
801801
"Check for data availability first using 'has_hand_tracking_results()'",
802802
py::arg("capture_timestamp_ns"),
803803
py::arg("time_query_options") = TimeQueryOptions::Closest)
804+
.def(
805+
"get_interpolated_hand_tracking_result",
806+
&MpsDataProvider::getInterpolatedHandTrackingResult,
807+
py::return_value_policy::reference_internal,
808+
"Get the interploated MPS hand tracking result (landmarks, wrist transform, wrist and palm normals, etc.). "
809+
"This will return None if the interpolation fails. Check the return value for validity.",
810+
py::arg("capture_timestamp_ns"))
804811
.def("get_slam_version", &MpsDataProvider::getSlamVersion, "Get the MPS SLAM version.")
805812
.def(
806813
"get_eyegaze_version",

0 commit comments

Comments
 (0)