Beispiel #1
0
// 12000 cycles?
void attEstimatePose(void) {

    Quaternion displacement_quat;
    float rate[3], norm, sina_2;
    bams32_t a_2;

    if(!is_ready) { return; }
    if(!is_running) { return; }

    gyroGetRadXYZ(rate); // Get last read gyro values
    timestamp = swatchToc(); // Record timestamp

    // Calculate magnitude and disiplacement
    norm = sqrtf(rate[0]*rate[0] + rate[1]*rate[1] + rate[2]*rate[2]);

    // Special case when no movement occurs due to simplification below
    if(norm == 0.0) {

        displacement_quat.w = 1.0;
        displacement_quat.x = 0.0;
        displacement_quat.y = 0.0;
        displacement_quat.z = 0.0;

    } else {

        // Generate displacement rotation quaternion
        // Normally this is w = cos(a/2), but we can delay normalizing
        // by multiplying all terms by norm
        a_2 = floatToBams32Rad(norm*sample_period)/2;
        sina_2 = bams32SinFine(a_2);

        displacement_quat.w = bams32CosFine(a_2)*norm;
        displacement_quat.x = sina_2*rate[0];
        displacement_quat.y = sina_2*rate[1];
        displacement_quat.z = sina_2*rate[2];
        quatNormalize(&displacement_quat);
    }

    // Apply displacement to pose
    quatMult(&pose_quat, &displacement_quat, &pose_quat);

    // Normalize pose quaternion to account for unnormalized displacement quaternion
    quatNormalize(&pose_quat);
    calculateEulerAngles();

}
void peHomingLoop(void) {
    
    if(swatchToc() > 100000) {
        
        swatchTic();
                
        if (homingOn) {
            peTrack();
            
            if((++callCount) == CALL_FREQ) {
                callCount = 0;
                peSendFrame();
            }
        }
    }
    
    pidSetInput(0, motor_l, 1);
    pidSetInput(1, motor_r, 1);
}