I have a DFRobots MPU6050 module wired to SCL/SDA/Pin 2 on a Mega 2560 board, using Jeff Rowberg's I2CDev/MPU6050_6Axis_MotionApps libraries.  I have 2.2K pullups on the MPU6050 module, tied to +5V, as shown in the following photo.

[![enter image description here][1]][1]

I used a modified version of the code from Jeff's example to retrieve heading values from the MPU6050, as shown below


    bool GetIMUHeadingDeg() //08/28/18 chg to bool return 
{

	//Purpose:  Encapsulate everything needed to acquire a yaw value
	//Inputs:
	//	global_yawval = float variable defined at global scope
	//	fifocount = uint8_t variable defined at global scope
	//	packetsize = uint8_t variable defined at global scope
	//	mpuIntStatus = uint8_t variable defined at global scope
	//	whilecount = long variable defined at global scope
	//	resetcount = int variable defined at global scope
	//Outputs:
	//	global_yawval filled with latest yaw value from sensor
	//	true = success, false = failure
	//Notes:
	//	08/13/18 now returns global_yawval to calling routine
	//	08/28/18 chg return to bool so can return success/failure


	// if programming failed, don't try to do anything
	//if (!dmpReady) return;
	//if (!dmpReady) false;

	bool result = false; //added 01/16/19 to supress warnings


	// wait for MPU interrupt or extra packet(s) available
	while (!mpuInterrupt && fifoCount < DMPpacketSize)
	{
		whilecount++;
		delay(10);
		delay(10);

		if (mpuInterrupt)
		{
			fifoCount = mpu.getFIFOCount();
			mySerial.printf("%ld\t%d\n", whilecount, fifoCount);
			whilecount = 0;
			break;
		}
	}

	// reset interrupt flag and get INT_STATUS byte
	mpuIntStatus = mpu.getIntStatus();
	mpuInterrupt = false;

	// get current FIFO count
	fifoCount = mpu.getFIFOCount();

	// check for overflow (this should never happen unless our code is too inefficient)
	if ((mpuIntStatus & 0x10) || fifoCount == 1024)//0x10 is mask for MPU6050_INTERRUPT_FIFO_OFLOW_BIT
	{
		// reset so we can continue cleanly
		mpu.resetFIFO();
		Serial.println(F("FIFO overflow!"));
		result = false; //added 01/16/19 to supress warnings

		// otherwise, check for DMP data ready interrupt (this should happen frequently)
	}
	else if (mpuIntStatus & 0x02)//0x02 is mask for MPU6050_INTERRUPT_DMP_INT_BIT
	{
		// wait for correct available data length, should be a VERY short wait
		while (fifoCount < DMPpacketSize)
		{
			fifoCount = mpu.getFIFOCount();
			//mySerial.printf("fifo count = %d\n", fifoCount);
		}

		//07/08/18 added to watch for non-modulo FIFO counts
		if (fifoCount == 0 || fifoCount % DMPpacketSize != 0)
		{
			mpu.resetFIFO();
			FIFO_resetcount++;
		}
		else
		{
			//07/07/18 modified to read all outstanding packets
			// read a packet from FIFO
			while (fifoCount >= DMPpacketSize)
			{
				//mySerial.printf("fifo count = %d\n", fifoCount);
				mpu.getFIFOBytes(fifoBuffer, DMPpacketSize);
				fifoCount -= DMPpacketSize;
			}

			// display Euler angles in degrees
			mpu.dmpGetQuaternion(&q, fifoBuffer);
			mpu.dmpGetGravity(&gravity, &q);
			mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);

			global_yawval = ypr[0] * 180 / M_PI;
			result = true; //added 01/16/19 to supress warnings
		}

		////DEBUG!!
		//		mySerial.printf("yawdeg = %4.2f\n", global_yawval);
		//		mySerial.printf("time = %ld\tyawdeg = %6.2f\n", millis(), global_yawval);
		////DEBUG!!
	}

	return result; //added 01/16/19 to surpress warnings
}



I have noticed occasional bad data points in the computed Heading values retrieved from the MPU6050, as shown in the attached plot. Any ideas what I can do about this?  Is bad value detection/removal an expected issue when dealing with IMU products like the MPU6050?

[![enter image description here][2]][2]
TIA,

Frank


  [1]: https://i.sstatic.net/Ux9wG.jpg
  [2]: https://i.sstatic.net/3hZSW.jpg