TEST (BagTest, PoseCheck)
{
  ros::NodeHandle nh;
  ros::NodeHandle nhLocal("~");

  double finalX = 0;
  double finalY = 0;
  double finalZ = 0;
  double tolerance = 0;
  bool outputFinalPosition = false;
  std::string finalPositionFile;

  nhLocal.getParam("final_x", finalX);
  nhLocal.getParam("final_y", finalY);
  nhLocal.getParam("final_z", finalZ);
  nhLocal.getParam("tolerance", tolerance);
  nhLocal.param("output_final_position", outputFinalPosition, false);
  nhLocal.param("output_location", finalPositionFile, std::string("test.txt"));

  ros::Subscriber filteredSub = nh.subscribe("/odometry/filtered", 1, &filterCallback);

  while(ros::ok())
  {
    ros::spinOnce();
    ros::Duration(0.0333333).sleep();
  }

  if(outputFinalPosition)
  {
    try
    {
      std::ofstream posOut;
      posOut.open(finalPositionFile.c_str(), std::ofstream::app);
      posOut << filtered_.pose.pose.position.x << " " << filtered_.pose.pose.position.y << " " << filtered_.pose.pose.position.z << std::endl;
      posOut.close();
    }
    catch(...)
    {
      ROS_ERROR_STREAM("Unable to open output file.\n");
    }
  }

  double xDiff = filtered_.pose.pose.position.x - finalX;
  double yDiff = filtered_.pose.pose.position.y - finalY;
  double zDiff = filtered_.pose.pose.position.z - finalZ;

  EXPECT_LT(::sqrt(xDiff*xDiff + yDiff*yDiff + zDiff*zDiff), tolerance);
}
int main(int argc, char **argv)
{
  ros::init(argc, argv, "ukf_navigation_node");
  ros::NodeHandle nhLocal("~");

  std::vector<double> args(3, 0);

  nhLocal.param("alpha", args[0], 0.001);
  nhLocal.param("kappa", args[1], 0.0);
  nhLocal.param("beta", args[2], 2.0);

  RobotLocalization::RosUkf ukf(args);

  ukf.run();

  return 0;
}