#include "ros/ros.h"
#include "gazebo/ApplyBodyWrench.h"  // Necesita incluir la dependencia a gazebo en el manifest.xml
#include <cstdlib>


int main(int argc, char **argv)
{
  ros::init(argc, argv, "aplicar_trottle_yaw_simulado");
  

  if (argc != 1)
  {
    ROS_INFO("usage: No hacen falta argumentos, directamente aplicara unas fuerzas de X newton a los rotores de los 4 motores");
    return 1;
  }

  ros::NodeHandle n;
  
  // Creamos servicio del tipo gazebo::ApplyBodyWrench y decimos que vamos a publicar en el servicio /gazebo/apply.. 
  // El objeto client es el que nos permitira enviar objetos del tipo especificado (gazebo::Apply..) al servicio especificado (/gazebo/apply..)
  // Observacion: La llamada es sincrona en el sentido de que si no encuentra/existe el servicio que indiquemos espera a que lo este.
  ros::ServiceClient client = n.serviceClient<gazebo::ApplyBodyWrench>("/gazebo/apply_body_wrench"); 
  
  // Objeto de la clase de gazebo::ApplyBodyWrench para rellenar y enviar(ver en su carpeta srv sus miembros request y response)
  gazebo::ApplyBodyWrench srv1; 
  gazebo::ApplyBodyWrench srv2; 
  gazebo::ApplyBodyWrench srv3; 
  gazebo::ApplyBodyWrench srv4; 
  
  gazebo::ApplyBodyWrench srv5; // SIMULACION DEL YAW: introduzco directamente momento en z
  
										// gazebo::ApplyBodyWrench
										
										//request
			//string body_name                          # Gazebo body to apply wrench (linear force and torque)
													  //# wrench is applied in the gazebo world by default
			//string reference_frame                    # wrench is defined in the reference frame of this entity
													  //# use inertial frame if left empty
			//geometry_msgs/Point  reference_point      # wrench is defined at this location in the reference frame
			//geometry_msgs/Wrench wrench               # wrench applied to the origin of the body
			//time start_time                           # (optional) wrench application start time (seconds)
													  //# if start_time is not specified, or
													  //# start_time < current time, start as soon as possible
			//duration duration                         # optional duration of wrench application time (seconds)
													  //# if duration < 0, apply wrench continuously without end
													  //# if duration = 0, do nothing
													  //# if duration < step size, apply wrench
													  //# for one step size
										//response
			//bool success                              # return true if set wrench successful
			//string status_message                     # comments if available


// Relleno los servicios (Link,fuerza,comienzo,duracion)
  
  float F1;  // Fuerzas a lee desde el control
  float F2;
  float F3;
  float F4;
  
  F1=4.20175;  // (4.20175 N = Fuerza por motor de equlibrio)
  F2=4.20175;
  F3=4.20175;
  F4=4.20175;
  
  F1=F1+0.1; // 0.1 para que suba y 1e-10 para que gire un poco
  F2=F2+0.1;
  F3=F3+0.1;
  F4=F4+0.1;			 
  float M5=0.001;
  			  
  srv1.request.body_name = "quad::Base";   // Cuerpo al que se le ejercen las fuerzas
  srv1.request.reference_frame= "quad::Base";   // Sistema de referencia en el que se escriben las fuerzas
  srv1.request.reference_point.x=0.2875;
  srv1.request.reference_point.y=0;
  srv1.request.reference_point.z=0;
  
  
  srv1.request.wrench.force.x=0;                   // geometry_msgs (wrench, vector3, ...) lo incluye ApplyBodyWrench.h
  srv1.request.wrench.force.y=0;
  srv1.request.wrench.force.z=F1;
  srv1.request.wrench.torque.x=0;
  srv1.request.wrench.torque.y=0;
  srv1.request.wrench.torque.z=0;
  
  srv2.request.body_name = "quad::Base";
  srv2.request.reference_frame= "quad::Base";
  srv2.request.reference_point.x=0;
  srv2.request.reference_point.y=0.2875;
  srv2.request.reference_point.z=0;
  
  srv2.request.wrench.force.x=0;        
  srv2.request.wrench.force.y=0;
  srv2.request.wrench.force.z=F2;
  srv2.request.wrench.torque.x=0;
  srv2.request.wrench.torque.y=0;
  srv2.request.wrench.torque.z=0;
    
  srv3.request.body_name = "quad::Base";
  srv3.request.reference_frame= "quad::Base";
  srv3.request.reference_point.x=-0.2875;
  srv3.request.reference_point.y=0;
  srv3.request.reference_point.z=0;
  
  srv3.request.wrench.force.x=0;        
  srv3.request.wrench.force.y=0;
  srv3.request.wrench.force.z=F3;
  srv3.request.wrench.torque.x=0;
  srv3.request.wrench.torque.y=0;
  srv3.request.wrench.torque.z=0;
   
  srv4.request.body_name = "quad::Base";
  srv4.request.reference_frame= "quad::Base";
  srv4.request.reference_point.x=0;
  srv4.request.reference_point.y=-0.2875;
  srv4.request.reference_point.z=0;
  
  srv4.request.wrench.force.x=0;        
  srv4.request.wrench.force.y=0;
  srv4.request.wrench.force.z=F4;
  srv4.request.wrench.torque.x=0;
  srv4.request.wrench.torque.y=0;
  srv4.request.wrench.torque.z=0;
  
  srv5.request.body_name = "quad::Base";
  srv5.request.reference_frame= "quad::Base";
  srv5.request.reference_point.x=0;
  srv5.request.reference_point.y=0;
  srv5.request.reference_point.z=0;
  
  srv5.request.wrench.force.x=0;        
  srv5.request.wrench.force.y=0;
  srv5.request.wrench.force.z=0;
  srv5.request.wrench.torque.x=0;
  srv5.request.wrench.torque.y=0;
  srv5.request.wrench.torque.z=M5;


  
  ros::Time::waitForValid(); // IMPORTANTE: HAY QUE ESPERAR A QUE EL TOPIC /CLOCK EMPIEZE A EMITIR-LLEGAR AL NODO, SINO VALE CERO SEA CUAL SEA EL TIEMPO DE SIMULACION
  
	  ros::Duration un_seg(1,0);    // LLamada al constructor. Devuelve un objeto denominado un_seg de la clase Duration(sec , nsec) ambos unit_32: ros::Duration un_seg(1,0); 
									//ros::Time un_seg(1,0) no porque NO ESTA DEFINIDO TIME+TIME. Por tanto defino un_seg como duration:
  
	  ros::Time ahora = ros::Time::now(); 
	  ros::Time ahora_mas_uno = ahora + un_seg; 
  srv1.request.start_time= ahora_mas_uno;
  srv2.request.start_time= ahora_mas_uno;
  srv3.request.start_time= ahora_mas_uno;
  srv4.request.start_time= ahora_mas_uno;
  srv5.request.start_time= ahora_mas_uno;	  

  ROS_INFO("Comienzo de aplicacion de las fuerzas: %d", ahora.sec);
	  //ROS_INFO("ahora: %d", ahora.nsec);
	  //ROS_INFO("ahora: %d", ahora_mas_uno.sec);
	  //ROS_INFO("ahora: %d", ahora_mas_uno.nsec);
   
  srv1.request.duration  = ros::Duration(5);
  srv2.request.duration  = ros::Duration(5);
  srv3.request.duration  = ros::Duration(5);
  srv4.request.duration  = ros::Duration(5);
  srv5.request.duration  = ros::Duration(5);
  
  bool a=client.call(srv1);
  bool b=client.call(srv2);
  bool c=client.call(srv3);
  bool d=client.call(srv4);
  bool e=client.call(srv5);
  
  
  // Llamada al servicio, enviando el objeto rellenado
  if (a)
  {
    ROS_INFO("Llamada al servicio correcta 1, fuerza aplicada: %f ", srv1.request.wrench.force.z);
  }
   else
  {
    ROS_ERROR("Fallo al llamar al servicio apply_body_wrench 1");
    return 1;
  }

  if (srv1.response.success)
  {
    ROS_INFO("Respuesta de confirmacion 1");
  }
  else
  {
    ROS_ERROR("No se pudo aplicar la fuerza 1");
    return 1;
  }
  
    if (b)
  {
    ROS_INFO("Llamada al servicio correcta 2, fuerza aplicada: %f ", srv2.request.wrench.force.z);
  }
   else
  {
    ROS_ERROR("Fallo al llamar al servicio apply_body_wrench 2");
    return 1;
  }

  if (srv2.response.success)
  {
    ROS_INFO("Respuesta de confirmacion 2");
  }
  else
  {
    ROS_ERROR("No se pudo aplicar la fuerza 2");
    return 1;
  }
  
    if (c)
  {
    ROS_INFO("Llamada al servicio correcta 3, fuerza aplicada: %f ", srv3.request.wrench.force.z);
  }
   else
  {
    ROS_ERROR("Fallo al llamar al servicio apply_body_wrench 3");
    return 1;
  }

  if (srv3.response.success)
  {
    ROS_INFO("Respuesta de confirmacion 3");
  }
  else
  {
    ROS_ERROR("No se pudo aplicar la fuerza 3");
    return 1;
  }
  
    if (d)
  {
    ROS_INFO("Llamada al servicio correcta 4, fuerza aplicada: %f ", srv4.request.wrench.force.z);
  }
   else
  {
    ROS_ERROR("Fallo al llamar al servicio apply_body_wrench 4");
    return 1;
  }

  if (srv4.response.success)
  {
    ROS_INFO("Respuesta de confirmacion 4");
  }
  else
  {
    ROS_ERROR("No se pudo aplicar la fuerza 4");
    return 1;
  }
  
      if (e)
  {
    ROS_INFO("Llamada al servicio correcta 5, fuerza aplicada: %f ", srv4.request.wrench.torque.z);
  }
   else
  {
    ROS_ERROR("Fallo al llamar al servicio apply_body_wrench 5");
    return 1;
  }

  if (srv5.response.success)
  {
    ROS_INFO("Respuesta de confirmacion 5");
  }
  else
  {
    ROS_ERROR("NO SE PUDO APLICAR EL MOMENTO");
    return 1;
  }
  
  

return 0;
}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es">
	<head>
            <title>e-REdING. Biblioteca de la Escuela Superior de Ingenieros de Sevilla.</title>

                <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="description" content="Buscador de proyectos ETSI" />
<meta name="author" content="Daniel Callejo"/>
<meta name="author" content="Federico L&oacute;pez"/>
<meta name="author" content="Juli&aacute;n P&eacute;rez"/>
<meta name="author" content="Jos&eacute; Mar&iacute;a Vidal Vidal"/>
<base href="/bibing/proyectos/" /><link rel="shortcut icon" href="./favicon.ico" />
<link rel="stylesheet" href="./publico/css/estructura.css" type="text/css" />
<link rel="stylesheet" href="./publico/css/bootstrap.css" type="text/css" media="screen"/>
<link rel="stylesheet" href="./publico/css/enlaces-capas.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/pestanas.css" type="text/css"  /> 
<link rel="stylesheet" href="./publico/css/formularios.css" type="text/css" />
<link rel="stylesheet" href="./publico/css/lightbox.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/autocompleter.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/resultados.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/milista.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/explorador.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/ultimos.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/contactar.css" type="text/css"  />
<!-- <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" /> -->
<script src="./publico/javascript/jquery-1.9.1.min.js" type="text/javascript"></script>
<script src="./publico/javascript/bootstrap.js" type="text/javascript"></script>

<script src="./publico/javascript/mootools-1.2.4-core.js" type="text/javascript"></script>
<script src="./publico/javascript/mootools-1-1.2.4.2-more.js" type="text/javascript"></script>
<script src="./publico/javascript/targetbl.js" type="text/javascript"></script>
<script src="./publico/javascript/mensajes.js" type="text/javascript"></script>
<script src="./publico/javascript/form.js" type="text/javascript"></script>
<script src="./publico/javascript/autocompleter/Observer.js" type="text/javascript"></script>
<script src="./publico/javascript/autocompleter/Autocompleter.js" type="text/javascript"></script>
<script src="./publico/javascript/autocompleter/Autocompleter.Request.js" type="text/javascript"></script>
<script src="./publico/javascript/domready.js" type="text/javascript"></script>

<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-8T1TSNC1QY"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-8T1TSNC1QY');
</script>



<script type="text/javascript">
function seleccionar_todo(){
   for (i=0;i<document.formulario_marcados.elements.length;i++)
      if(document.formulario_marcados.elements[i].type == "checkbox")
         document.formulario_marcados.elements[i].checked=1
}
function deseleccionar_todo(){
   for (i=0;i<document.formulario_marcados.elements.length;i++)
      if(document.formulario_marcados.elements[i].type == "checkbox")
         document.formulario_marcados.elements[i].checked=0
} 
</script>
	</head>
    <body style="min-width: 960px; background-color: #e2e2e2; height: 100%">	
		<a name="arriba"></a>
<div>
<div id="header">
    <table id="Tabla_01" height="105" border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td>
            <img src="./publico/imagenes/cabecera/banner_new2_01.jpg" width="3" height="105" alt="">
        </td>
        <td>
            <img src="./publico/imagenes/cabecera/banner_new2_02.jpg" width="100" height="105" alt="">
        </td>
        <td width="100%" align="right"  style="min-width: 613px; background-repeat: no-repeat; background-position: top right; font-size: medium; font-weight: bold; color: white;">
            <table width="100%" height="105" border="0">
                <tr>
                    <td style=" vertical-align: top; width: 547px">
                        <!-- <a style="text-decoration: none" href="./"><img src="./publico/imagenes/cabecera/banner_new2_03.jpg"alt=""></a> -->
                        <a style="text-decoration: none" href="/bibing/proyectos/"><img src="./publico/imagenes/cabecera/banner_new2_03.jpg"alt=""></a>
                     </td>
                     <td  background="./publico/imagenes/cabecera/banner_new2_04.jpg" style="background-repeat: no-repeat; background-color: #c6d4e8;"><br><br><br>
                         &nbsp;
                        </td>
                    </tr>
             </table>
        </td>
    </tr>
    <tr style="border-top: 1px solid #ffffff;">
        <td colspan="3" id="menu_sup" style="font-size: small; text-align: right; background-color: #9c1f2f; vertical-align: bottom">
             
					<a href="/bibing/proyectos/" class="enlace " style=" color: #ffffff">Inicio&nbsp;&nbsp;|</a>
					<a href="/bibing/proyectos/acerca/" style=" color: #ffffff" class="enlace ">&nbsp;&nbsp;Acerca de&nbsp;&nbsp;|</a>
					
					<a href="/bibing/proyectos/contactar/" style=" color: #ffffff" class="enlace ">&nbsp;&nbsp;Contactar&nbsp;&nbsp;</a>
			 <!--       <a href="/bibing/proyectos/ayuda/" style=" color: #ffffff" class="enlace  ">&nbsp;&nbsp;Ayuda&nbsp;&nbsp;|</a> -->
					<!-- <form id="idioma" class=""  method="post" action="">
					<div class="inline" style="color: white">
					<input type="submit" class="tipo_letra " style=" color: #ffffff"name="idioma" value="Castellanossss" />&nbsp;&nbsp;
					</div>	
					</form> -->
			        </td>

    </tr>
    </table>
</div>
<br><br>
<div class="colmask rightmenu">
<div class="panel panel-default" style="margin:20px">
            <div class="panel-heading"><h4>MODELADO, CONTROL Y SIMULACIÓN DE UN QUADROTOR EQUIPADO CON UN BRAZO MANIPULADOR ROBÓTICO</h4><h5 style="color:grey"><span class="glyphicon glyphicon-user""></span> : <b>RAGEL DE LA TORRE, RICARDO</b><br><span class="glyphicon glyphicon-book""></span>  :<b> Ingenier&iacute;a Industrial</b></h5></div><div class="panel-body"><div class="contenido_proyecto"><div class="titulo2_explorador">Contenido del proyecto:</div><div class="ruta"><a href="abreproy/5139">Directorio ra&iacute;z</a>&nbsp;&nbsp;>&nbsp;&nbsp;<a href="abreproy/5139/direccion/ros_workspace%252F">ros_workspace</a>&nbsp;&nbsp;>&nbsp;&nbsp;<a href="abreproy/5139/direccion/ros_workspace%252Fmodelquad%252F">modelquad</a>&nbsp;&nbsp;>&nbsp;&nbsp;<a href="abreproy/5139/direccion/ros_workspace%252Fmodelquad%252Fsrc%252F">src</a>&nbsp;&nbsp;>&nbsp;&nbsp;<a href="abreproy/5139/direccion/ros_workspace%252Fmodelquad%252Fsrc%252Fpruebas%252F">pruebas</a>&nbsp;&nbsp;>&nbsp;&nbsp;<a href="abreproy/5139/direccion/ros_workspace%252Fmodelquad%252Fsrc%252Fpruebas%252Faplicar_trottle_yaw_simulado.cpp%252F">aplicar_trottle_yaw_simulado.cpp</a></div><div class="listing"></div></div></div></div>
</div>
</div>

        
	</body>
 
 
<!-- Inicio Google Analytics -->
<!--
	<script type="text/javascript">
		var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
		document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
	</script>
	
	<script type="text/javascript">
		try {
		var pageTracker = _gat._getTracker("UA-7789620-1");
		pageTracker._trackPageview();
	} 
		catch(err) {}
	</script>
-->
<!-- Fin Google Analytics -->

</html>

