Head: Added roll to lean decoupling constants, appropriate physical limits on angles for head, reduced sensitivity.

This commit is contained in:
Philip Rosedale 2013-02-22 22:37:11 -08:00
parent d31eeda816
commit d272a7de31

View file

@ -73,25 +73,43 @@ void Head::reset()
void Head::UpdatePos(float frametime, SerialInterface * serialInterface, int head_mirror, glm::vec3 * gravity) void Head::UpdatePos(float frametime, SerialInterface * serialInterface, int head_mirror, glm::vec3 * gravity)
// Using serial data, update avatar/render position and angles // Using serial data, update avatar/render position and angles
{ {
const float PITCH_ACCEL_COUPLING = 0.5;
const float ROLL_ACCEL_COUPLING = -1.0;
float measured_pitch_rate = serialInterface->getRelativeValue(PITCH_RATE); float measured_pitch_rate = serialInterface->getRelativeValue(PITCH_RATE);
float measured_yaw_rate = serialInterface->getRelativeValue(YAW_RATE); float measured_yaw_rate = serialInterface->getRelativeValue(YAW_RATE);
float measured_lateral_accel = serialInterface->getRelativeValue(ACCEL_X); float measured_lateral_accel = serialInterface->getRelativeValue(ACCEL_X) -
float measured_fwd_accel = serialInterface->getRelativeValue(ACCEL_Z); ROLL_ACCEL_COUPLING*serialInterface->getRelativeValue(ROLL_RATE);
float measured_fwd_accel = serialInterface->getRelativeValue(ACCEL_Z) -
PITCH_ACCEL_COUPLING*serialInterface->getRelativeValue(PITCH_RATE);
float measured_roll_rate = serialInterface->getRelativeValue(ROLL_RATE); float measured_roll_rate = serialInterface->getRelativeValue(ROLL_RATE);
//std::cout << "Pitch Rate: " << serialInterface->getRelativeValue(PITCH_RATE) <<
// " fwd_accel: " << serialInterface->getRelativeValue(ACCEL_Z) << "\n";
//std::cout << "Roll Rate: " << serialInterface->getRelativeValue(ROLL_RATE) <<
//" ACCEL_X: " << serialInterface->getRelativeValue(ACCEL_X) << "\n";
//std::cout << "Pitch: " << Pitch << "\n";
// Update avatar head position based on measured gyro rates // Update avatar head position based on measured gyro rates
const float HEAD_ROTATION_SCALE = 0.80; const float HEAD_ROTATION_SCALE = 0.70;
const float HEAD_ROLL_SCALE = 0.80; const float HEAD_ROLL_SCALE = 0.40;
const float HEAD_LEAN_SCALE = 0.03; const float HEAD_LEAN_SCALE = 0.01;
if (head_mirror) { const float MAX_PITCH = 45;
addYaw(-measured_yaw_rate * HEAD_ROTATION_SCALE * frametime); const float MIN_PITCH = -45;
const float MAX_YAW = 85;
const float MIN_YAW = -85;
if ((Pitch < MAX_PITCH) && (Pitch > MIN_PITCH))
addPitch(measured_pitch_rate * -HEAD_ROTATION_SCALE * frametime); addPitch(measured_pitch_rate * -HEAD_ROTATION_SCALE * frametime);
addRoll(-measured_roll_rate * HEAD_ROLL_SCALE * frametime); addRoll(-measured_roll_rate * HEAD_ROLL_SCALE * frametime);
if (head_mirror) {
if ((Yaw < MAX_YAW) && (Yaw > MIN_YAW))
addYaw(-measured_yaw_rate * HEAD_ROTATION_SCALE * frametime);
addLean(-measured_lateral_accel * frametime * HEAD_LEAN_SCALE, -measured_fwd_accel*frametime * HEAD_LEAN_SCALE); addLean(-measured_lateral_accel * frametime * HEAD_LEAN_SCALE, -measured_fwd_accel*frametime * HEAD_LEAN_SCALE);
} else { } else {
if ((Yaw < MAX_YAW) && (Yaw > MIN_YAW))
addYaw(measured_yaw_rate * -HEAD_ROTATION_SCALE * frametime); addYaw(measured_yaw_rate * -HEAD_ROTATION_SCALE * frametime);
addPitch(measured_pitch_rate * -HEAD_ROTATION_SCALE * frametime);
addRoll(-measured_roll_rate * HEAD_ROLL_SCALE * frametime);
addLean(measured_lateral_accel * frametime * -HEAD_LEAN_SCALE, measured_fwd_accel*frametime * HEAD_LEAN_SCALE); addLean(measured_lateral_accel * frametime * -HEAD_LEAN_SCALE, measured_fwd_accel*frametime * HEAD_LEAN_SCALE);
} }
} }
@ -116,9 +134,9 @@ void Head::simulate(float deltaTime)
if (!noise) if (!noise)
{ {
// Decay back toward center // Decay back toward center
Pitch *= (1.f - DECAY*deltaTime); Pitch *= (1.f - DECAY*2*deltaTime);
Yaw *= (1.f - DECAY*deltaTime); Yaw *= (1.f - DECAY*2*deltaTime);
Roll *= (1.f - DECAY*deltaTime); Roll *= (1.f - DECAY*2*deltaTime);
} }
else { else {
// Move toward new target // Move toward new target