Code review feedback

clamp _rotationConstant and _translationConstante between 0 and 1.
re-organized apply structure, to prevent transforming invalid values.
This commit is contained in:
Anthony J. Thibault 2018-01-04 14:21:53 -08:00
parent 9beb3ac5b6
commit f0985a8a01
2 changed files with 27 additions and 18 deletions

View file

@ -21,27 +21,36 @@ namespace controller {
Pose ExponentialSmoothingFilter::apply(Pose value) const { Pose ExponentialSmoothingFilter::apply(Pose value) const {
// to perform filtering in sensor space, we need to compute the transformations. if (value.isValid()) {
auto userInputMapper = DependencyManager::get<UserInputMapper>();
const InputCalibrationData calibrationData = userInputMapper->getInputCalibrationData();
glm::mat4 sensorToAvatarMat = glm::inverse(calibrationData.avatarMat) * calibrationData.sensorToWorldMat;
glm::mat4 avatarToSensorMat = glm::inverse(calibrationData.sensorToWorldMat) * calibrationData.avatarMat;
// transform pose into sensor space. // to perform filtering in sensor space, we need to compute the transformations.
Pose sensorValue = value.transform(avatarToSensorMat); auto userInputMapper = DependencyManager::get<UserInputMapper>();
const InputCalibrationData calibrationData = userInputMapper->getInputCalibrationData();
glm::mat4 sensorToAvatarMat = glm::inverse(calibrationData.avatarMat) * calibrationData.sensorToWorldMat;
glm::mat4 avatarToSensorMat = glm::inverse(calibrationData.sensorToWorldMat) * calibrationData.avatarMat;
if (value.isValid() && _oldSensorValue.isValid()) { // transform pose into sensor space.
Pose sensorValue = value.transform(avatarToSensorMat);
// exponential smoothing filter if (_prevSensorValue.isValid()) {
sensorValue.translation = _translationConstant * sensorValue.getTranslation() + (1.0f - _translationConstant) * _oldSensorValue.getTranslation(); // exponential smoothing filter
sensorValue.rotation = safeMix(sensorValue.getRotation(), _oldSensorValue.getRotation(), _rotationConstant); sensorValue.translation = _translationConstant * sensorValue.getTranslation() + (1.0f - _translationConstant) * _prevSensorValue.getTranslation();
sensorValue.rotation = safeMix(sensorValue.getRotation(), _prevSensorValue.getRotation(), _rotationConstant);
_oldSensorValue = sensorValue; // remember previous sensor space value.
_prevSensorValue = sensorValue;
// transform back into avatar space // transform back into avatar space
return sensorValue.transform(sensorToAvatarMat); return sensorValue.transform(sensorToAvatarMat);
} else {
// remember previous sensor space value.
_prevSensorValue = sensorValue;
// no previous value to smooth with, so return value unchanged
return value;
}
} else { } else {
_oldSensorValue = sensorValue; // return invalid value unchanged
return value; return value;
} }
} }
@ -51,8 +60,8 @@ namespace controller {
if (parameters.isObject()) { if (parameters.isObject()) {
auto obj = parameters.toObject(); auto obj = parameters.toObject();
if (obj.contains(JSON_ROTATION) && obj.contains(JSON_TRANSLATION)) { if (obj.contains(JSON_ROTATION) && obj.contains(JSON_TRANSLATION)) {
_rotationConstant = obj[JSON_ROTATION].toDouble(); _rotationConstant = glm::clamp((float)obj[JSON_ROTATION].toDouble(), 0.0f, 1.0f);
_translationConstant = obj[JSON_TRANSLATION].toDouble(); _translationConstant = glm::clamp((float)obj[JSON_TRANSLATION].toDouble(), 0.0f, 1.0f);
return true; return true;
} }
} }

View file

@ -34,7 +34,7 @@ namespace controller {
float _translationConstant { 0.375f }; float _translationConstant { 0.375f };
float _rotationConstant { 0.375f }; float _rotationConstant { 0.375f };
mutable Pose _oldSensorValue { Pose() }; // sensor space mutable Pose _prevSensorValue { Pose() }; // sensor space
}; };
} }