//mapping atlas/atlas_state to move_group
void UpperBodyPlanner::updateRobotState() {
    //pelvis and torso
    for (int i = 0; i < 3; i++) {
        kinematic_state->setVariablePosition(i + 3, jointAngles(i));
    }
    //neck
    kinematic_state->setVariablePosition(52, jointAngles(3));
    //left arm
    for (int i = 0; i < 7; i++) {
        kinematic_state->setVariablePosition(i + 6, jointAngles(i + 16));
    }
    //right arm
    for (int i = 0; i < 7; i++) {
        kinematic_state->setVariablePosition(i + 54, jointAngles(i + 23));
    }
    //left leg
    for (int i = 0; i < 6; i++) {
        kinematic_state->setVariablePosition(i + 61, jointAngles(i + 4));
    }
    //right leg
    for (int i = 0; i < 6; i++) {
        kinematic_state->setVariablePosition(i + 67, jointAngles(i + 10));
    }
    kinematic_state->update();
    singularity_check = true;
}
void HermesMoveArmActionServer::moveArm(const hermes_move_arm_action::MoveArmGoalConstPtr& goal)
{
	// this callback function is executed each time a request (= goal message) comes in for this service server
	ROS_INFO("MoveArm Action Server: Received a request for arm %i.", goal->arm);

	if (goal->goal_position.header.frame_id.compare("/world") != 0)
	{
		ROS_ERROR("The goal position coordinates are not provided in the correct frame. The required frame is '/world' but '%s' was provided.", goal->goal_position.header.frame_id.c_str());
		return;
	}

	// this command sends a feedback message to the caller, here we transfer that the task is completed 25%
//	hermes_move_arm_action::MoveArmFeedback feedback;
//	feedback.percentageDone = 25;
//	move_arm_action_server_.publishFeedback(feedback);

	// move the arm
	// ...

//goal->goal_position.pose.position.x  //(x,y,z) in meters?????
//goal->goal_position.pose.orientation.w //(w,x,y,z) Quaternion in rad
//goal->goal_position.header.frame_id // Reference frame
	tf::Quaternion quaternion;
	tf::quaternionMsgToTF(goal->goal_position.pose.orientation, quaternion);
	tf::Transform goalPos(quaternion, tf::Vector3(goal->goal_position.pose.position.x,goal->goal_position.pose.position.y,goal->goal_position.pose.position.z));


	// Transform goalPos to Robot Reference frame
	hermes_reference_frames_service::HermesFrame::Request req_frames;
	hermes_reference_frames_service::HermesFrame::Response res_frames;

	if(goal->arm == hermes_move_arm_action::MoveArmGoal::LEFTARM) // Depends of arm
		req_frames.frame = hermes_reference_frames_service::HermesFrame::Request::WORLDTLEFTARM;

	else if(goal->arm == hermes_move_arm_action::MoveArmGoal::RIGHTARM) // Depends of arm
		req_frames.frame = hermes_reference_frames_service::HermesFrame::Request::WORLDTRIGHTARM;

	ros::service::call("reference_frames_service", req_frames, res_frames);

	// Transform world to base robot
	tf::Quaternion qua_wTr(res_frames.quaternion[0],res_frames.quaternion[1],res_frames.quaternion[2],res_frames.quaternion[3]);
	tf::Transform wTr(qua_wTr, tf::Vector3(res_frames.position[0],res_frames.position[1],res_frames.position[2]));

	tf::Transform rTobj;
	rTobj = wTr.inverse()*goalPos;


	std::cout << "rTobj: " << std::endl;
	for (int i=0; i<3; ++i)
	{
		std::cout << rTobj.getBasis()[i].getX() << "\t";
		std::cout << rTobj.getBasis()[i].getY() << "\t";
		std::cout << rTobj.getBasis()[i].getZ() <<std::endl;
	}

	std::cout << "XYZ: " << std::endl;
	std::cout << rTobj.getOrigin().getX() <<std::endl;
	std::cout << rTobj.getOrigin().getY() <<std::endl;
	std::cout << rTobj.getOrigin().getZ() <<std::endl;


//	tf::Vector3 rotX=rTobj.getBasis()[0];
//	tf::Vector3 rotY=rTobj.getBasis()[1];
//	tf::Vector3 rotZ=rTobj.getBasis()[2];
//
//
//	KDL::Vector rotXkdl(rotX.getX(),rotX.getY(),rotX.getZ());
//	KDL::Vector rotYkdl(rotY.getX(),rotY.getY(),rotY.getZ());
//	KDL::Vector rotZkdl(rotZ.getX(),rotZ.getY(),rotZ.getZ());
//
//	KDL::Rotation rot(rotXkdl,rotYkdl,rotZkdl);



	//Get init position
	std::vector<float> q_init;

	if(goal->arm == hermes_move_arm_action::MoveArmGoal::LEFTARM)
		hermesinterface.get_leftJoints(q_init);
	else if(goal->arm == hermes_move_arm_action::MoveArmGoal::RIGHTARM)
		hermesinterface.get_rightJoints(q_init);


   // todo: call hermes_arm_kdl ikine service
	hermes_arm_kdl::ikine::Request req_kdl;
	hermes_arm_kdl::ikine::Response res_kdl;
	for (int i=0; i<7; i++)
		req_kdl.jointAngles_init[i] = q_init[i];
	req_kdl.position[0] = rTobj.getOrigin().getX();
	req_kdl.position[1] = rTobj.getOrigin().getY();
	req_kdl.position[2] = rTobj.getOrigin().getZ();

	for (int i=0; i<3; i++)
	{
		req_kdl.rotation[3*i] = rTobj.getBasis()[i].getX();
		req_kdl.rotation[3*i+1] = rTobj.getBasis()[i].getY();
		req_kdl.rotation[3*i+2] = rTobj.getBasis()[i].getZ();
	}
	ros::service::call("arm_kdl_service_ikine_server", req_kdl, res_kdl);

	// Move the arm with res_kdl
	std::vector<float> jointAngles(7);

	for (int i=0; i<7; i++)
		jointAngles[i] = res_kdl.jointAngles[i];

	std::cout << "jointAngles:" << std::endl;
	for (int i=0; i<7; i++)
		std::cout << jointAngles[i] << std::endl;

	//ARMS DON'T MOVE
	if(goal->arm == hermes_move_arm_action::MoveArmGoal::LEFTARM)
		hermesinterface.moveLeftArm(jointAngles);
	else if(goal->arm == hermes_move_arm_action::MoveArmGoal::RIGHTARM)
		hermesinterface.moveRightArm(jointAngles);

	hermes_move_arm_action::MoveArmResult res;
	res.return_value.val = arm_navigation_msgs::ArmNavigationErrorCodes::SUCCESS; 	// put in there some error code on errors


	// this sends the response back to the caller
	move_arm_action_server_.setSucceeded(res);

	// if failed, use: move_arm_action_server_.setAborted(res);
}