<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://robotica.unileon.es/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fernando</id>
		<title>robotica.unileon.es - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://robotica.unileon.es/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fernando"/>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Special:Contributions/Fernando"/>
		<updated>2026-06-19T23:06:40Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.27.0</generator>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=User:Fernando&amp;diff=5044</id>
		<title>User:Fernando</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=User:Fernando&amp;diff=5044"/>
				<updated>2017-05-22T09:48:52Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* '''Contact:''' fcasag00[ at] estudiantes [dot] unileon [dot] es&lt;br /&gt;
* '''Projects:'''&lt;br /&gt;
** [[Mobile manipulation]]&lt;br /&gt;
** [[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
* [http://fernando.casadogarcia.es Web]&lt;br /&gt;
* [http://es.linkedin.com/pub/fernando-casado-garc%C3%ADa/40/bb0/359 LinkedIn]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=RoboCup&amp;diff=4872</id>
		<title>RoboCup</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=RoboCup&amp;diff=4872"/>
				<updated>2016-04-01T08:25:53Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
This page is currently being developed&lt;br /&gt;
&lt;br /&gt;
= Team =&lt;br /&gt;
&lt;br /&gt;
== Robotics Groups ==&lt;br /&gt;
&lt;br /&gt;
[[Image:BotyBot.png|left|300px|thumb|Robotics Group of University of León - [http://robotica.unileon.es/ Team Web Page] [http://unileon.es University Web Page]]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Peloto.png|center|250px|thumb|Robotics Group of Rey Juan Carlos University - [http://www.robotica.gsyc.es/ Team Web Page] [http://www.urjc.es/ University Web Page]]]&lt;br /&gt;
&lt;br /&gt;
== People ==&lt;br /&gt;
&lt;br /&gt;
* Integration (Team Leader): [http://robotica.unileon.es/lera/ Francisco Javier Rodríguez Lera]&lt;br /&gt;
* Navigation and Control: [http://gsyc.es/~fmartin/ Francisco Martín Rico]&lt;br /&gt;
* Manipulation: [http://www.fernando.casadogarcia.es Fernando Casado García],  Alvaro Moreno García,&lt;br /&gt;
* Navigation:  Jesús Balsa Comerón, Jonathan Gines Claveo, Francisco Javier Gutierrez-Maturana&lt;br /&gt;
* Perception: Diego García Ordás, Alvaro Moreno García, Francisco Javier Gutierrez-Maturana&lt;br /&gt;
* Team Director: [http://robotica.unileon.es/vmo Vicente Matellán Olivera]&lt;br /&gt;
&lt;br /&gt;
= Robot =&lt;br /&gt;
&lt;br /&gt;
== OrBiOne ==&lt;br /&gt;
&lt;br /&gt;
OrBiOne is the robot that we will be using for 2016 competitons. This mobile manipulation ([http://www.robotnik.eu/robotnik-introduces-rb-one-new-mobile-manipulator/ RB-1]) is developed by [http://www.robotnik.eu/robotnik-launches-the-new-version-of-its-mobile-manipulator-rb-1-and-rb-1-base-mobile-platform/ Robotnik].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:RB1_robot.jpg|center|border|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Hardware Description == &lt;br /&gt;
– Robot name: RB1&lt;br /&gt;
#. Base: Robotnik (Dinamixel Motors)&lt;br /&gt;
#. Vision Sensors: RGB-D Xtion&lt;br /&gt;
#. Range sensors: Frontal laser&lt;br /&gt;
#. Dialogue Sensors: Directional microphone Rode Rycote , Loudspeakers&lt;br /&gt;
#. Manipulation: 7DOF arm. Dynamixel Pro servos. Workspace: 70 cm&lt;br /&gt;
#. Computer Description: Intel Core i7 with 8 GB of RAM and a 200 GB of disk&lt;br /&gt;
#. Torso: +40&lt;br /&gt;
#. Head: pan-tilt head.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Software Description == &lt;br /&gt;
– Development framework: ROS&lt;br /&gt;
&lt;br /&gt;
#. Vision: ork, findobject&lt;br /&gt;
#. Dialogue: Pocketsphinx&lt;br /&gt;
#. BellRecognition: pyaudio&lt;br /&gt;
#. Manipulation: MoveIt, self developements.&lt;br /&gt;
#. Navigation: Ros stack, self developements.&lt;br /&gt;
&lt;br /&gt;
– Robot Control: Finite State Machine (FSM) using Bica&lt;br /&gt;
&lt;br /&gt;
= Videos =&lt;br /&gt;
&lt;br /&gt;
=== Navigation in indoor environment ===&lt;br /&gt;
&lt;br /&gt;
The video presents a surveillance task in our lab. It shows the navigation approach of OrbiOne robot ([http://www.robotnik.eu/robotnik-introduces-rb-one-new-mobile-manipulator RB1-robotnik robot]) in our apartment.&lt;br /&gt;
&lt;br /&gt;
The robot navigates different apartment rooms in order to check user availability (living room and bedroom), visits (apartment front door after the doorbell rings) or alarm situation (fridge open-door alarm).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;8icVWz0zSMw&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Quiz Game and Context Awareness===&lt;br /&gt;
&lt;br /&gt;
Trivia game between user and robot. The conversation is interrupted by a ringbell. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;pU4avjbgFMQ&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== CeRVaNTes ==&lt;br /&gt;
&lt;br /&gt;
We are developing a new platform, mobile bi-manipulator, that will not be ready for 2016 competition.&lt;br /&gt;
&lt;br /&gt;
[[Projects#Cervantes_Project|CeRVaNTeS platform]] proof of concept:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;JtDIRky7EKs&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 50%&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&lt;br /&gt;
----&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Teleoperation of CeRVaNTeS using a [http://www.microsoft.com/hardware/es-es/p/xbox-360-wireless-controller-for-windows Xbox 360 wireless controller] ([[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)|more info]]), and CeRVaNTeS platform Integrated in [http://moveit.ros.org/ moveIt!] ([[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)|more info]]):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;videoflash&amp;gt;wF_gKr1KWfg#t=13&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;videoflash&amp;gt;bYtvNJHraVs&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 50%&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&lt;br /&gt;
----&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Research =&lt;br /&gt;
&lt;br /&gt;
== Arhictecture ==&lt;br /&gt;
 &lt;br /&gt;
We have a three layer architecture based on ROS and BICA [1]. The lower layer corresponds to ROS, and is in charge of hardware management. The intermediate layer provides the robot skills in order to carry out specific duties (perception, navigation,...).&lt;br /&gt;
The top layer presents BICA. It is a component-based for generating behaviors architecture. This node coordinates the various capabilities of the robot depending on the task to be carried out by the robot. Figure 2 shows the overall architecture of the software we have developed for participating in the RoCKIn competition.&lt;br /&gt;
&lt;br /&gt;
[[Image:Rokinarq.jpg|center|border|500px]]&lt;br /&gt;
&lt;br /&gt;
= Github Repository=&lt;br /&gt;
&lt;br /&gt;
* Individuals:&lt;br /&gt;
https://github.com/FranLera&lt;br /&gt;
&lt;br /&gt;
https://github.com/fmrico&lt;br /&gt;
&lt;br /&gt;
https://github.com/casadofer&lt;br /&gt;
&lt;br /&gt;
* Group&lt;br /&gt;
https://github.com/Robotica-ule/MYRABot&lt;br /&gt;
&lt;br /&gt;
= Papers =&lt;br /&gt;
&lt;br /&gt;
* [http://robotica.unileon.es/mediawiki/documents/TDP_LeonRobot_31032016.pdf  Team Description paper ]&lt;br /&gt;
&lt;br /&gt;
* List of group publications can be found in the University of [[Publications |León's robotics group publications page]] and in the URJC's [http://gsyc.es/~fmartin/#publications publications] page.&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Mobile_manipulation&amp;diff=4871</id>
		<title>Mobile manipulation</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Mobile_manipulation&amp;diff=4871"/>
				<updated>2016-04-01T08:23:56Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* '''Project Name:''' Brazo Bioloid controlado por ROS con interfaz Arduino&lt;br /&gt;
* '''Author:''' [http://www.fernando.casadogarcia.es Fernando Casado García]&lt;br /&gt;
* '''Dates:''' September 2013 -&lt;br /&gt;
* '''Degree:''' PhD&lt;br /&gt;
* '''Tags:''' MYRAbot, manipulation, arm, Bioloid, webcam, recognition, simulation&lt;br /&gt;
* '''Technologies:''' ROS, c++, Dynamixel, Arduino, find_object_2d, gazebo, URDF, moveIt!, actionlib, maxon, epos2, EposManager (wpi-rover)&lt;br /&gt;
* '''State:''' Ongoing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
----&lt;br /&gt;
[[File:myrabot_portada.png|100px|thumb|right|MYRABot]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center style=&amp;quot;font-size: 30px;&amp;quot;&amp;gt;MYRABot&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! Español&lt;br /&gt;
! English&lt;br /&gt;
|-&lt;br /&gt;
|  valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |Contenido&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
#[[Control brazo MYRAbot (bioloid+arduino)]]&lt;br /&gt;
#[[Detección y cálculo de posición de objetos (cámara web)]]&lt;br /&gt;
#[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&lt;br /&gt;
#[[Modelo para simulación MYRAbot (urdf+gazebo)]]&lt;br /&gt;
#[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
#[[Órdenes y confirmación mediante voz (sphinx+festival)]]&lt;br /&gt;
#[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |Content&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
#[[MYRAbot's arm control (bioloid+arduino)]]&lt;br /&gt;
#[[Objects recognition and position calculation (webcam)]]&lt;br /&gt;
#[[MYRAbot's arm model for simulation (urdf+gazebo)]]&lt;br /&gt;
#[[MYRAbot model for simulation (urdf+gazebo)]]&lt;br /&gt;
#[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
#[[Voice control (sphinx+festival)]]&lt;br /&gt;
#[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
MYRABot ROS packages:&lt;br /&gt;
&lt;br /&gt;
[https://github.com/Robotica-ule/MYRABot MYRABot's GitHub]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
----&lt;br /&gt;
[[File:cervantes_portada.png|100px|thumb|right|CeRVaNTeS]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center style=&amp;quot;font-size: 30px;&amp;quot;&amp;gt;CeRVaNTeS&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! Español&lt;br /&gt;
! English&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |Contenido&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
#[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&lt;br /&gt;
#[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&lt;br /&gt;
#[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&lt;br /&gt;
#[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
#[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |Content&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
#[[CeRVaNTeS' arm and base control (maxon+epos2)]]&lt;br /&gt;
#[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&lt;br /&gt;
#[[CeRVaNTeS model for simulation (urdf+gazebo)]]&lt;br /&gt;
#[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
#[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
----&lt;br /&gt;
[[File:rb1_portada.png|100px|thumb|right|OrBiOne]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center style=&amp;quot;font-size: 30px;&amp;quot;&amp;gt;OrBiOne&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Mobile_manipulation&amp;diff=4756</id>
		<title>Mobile manipulation</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Mobile_manipulation&amp;diff=4756"/>
				<updated>2015-11-06T11:31:17Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* '''Project Name:''' Brazo Bioloid controlado por ROS con interfaz Arduino&lt;br /&gt;
* '''Author:''' [http://www.fernando.casadogarcia.es Fernando Casado García]&lt;br /&gt;
* '''Dates:''' September 2013 -&lt;br /&gt;
* '''Degree:''' PhD&lt;br /&gt;
* '''Tags:''' MYRAbot, manipulation, arm, Bioloid, webcam, recognition, simulation&lt;br /&gt;
* '''Technologies:''' ROS, c++, Dynamixel, Arduino, find_object_2d, gazebo, URDF, moveIt!, actionlib, maxon, epos2, EposManager (wpi-rover)&lt;br /&gt;
* '''State:''' Ongoing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
----&lt;br /&gt;
[[File:myrabot_portada.png|100px|thumb|right|MYRABot]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center style=&amp;quot;font-size: 30px;&amp;quot;&amp;gt;MYRABot&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! Español&lt;br /&gt;
! English&lt;br /&gt;
|-&lt;br /&gt;
|  valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |Contenido&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
#[[Control brazo MYRAbot (bioloid+arduino)]]&lt;br /&gt;
#[[Detección y cálculo de posición de objetos (cámara web)]]&lt;br /&gt;
#[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&lt;br /&gt;
#[[Modelo para simulación MYRAbot (urdf+gazebo)]]&lt;br /&gt;
#[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
#[[Órdenes y confirmación mediante voz (sphinx+festival)]]&lt;br /&gt;
#[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |Content&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
#[[MYRAbot's arm control (bioloid+arduino)]]&lt;br /&gt;
#[[Objects recognition and position calculation (webcam)]]&lt;br /&gt;
#[[MYRAbot's arm model for simulation (urdf+gazebo)]]&lt;br /&gt;
#[[MYRAbot model for simulation (urdf+gazebo)]]&lt;br /&gt;
#[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
#[[Voice control (sphinx+festival)]]&lt;br /&gt;
#[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
MYRABot ROS packages:&lt;br /&gt;
&lt;br /&gt;
[https://github.com/Robotica-ule/MYRABot MYRABot's GitHub]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
----&lt;br /&gt;
[[File:cervantes_portada.png|100px|thumb|right|CeRVaNTeS]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center style=&amp;quot;font-size: 30px;&amp;quot;&amp;gt;CeRVaNTeS&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! Español&lt;br /&gt;
! English&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |Contenido&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
#[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&lt;br /&gt;
#[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&lt;br /&gt;
#[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&lt;br /&gt;
#[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
#[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |Content&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
#[[CeRVaNTeS' arm and base control (maxon+epos2)]]&lt;br /&gt;
#[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&lt;br /&gt;
#[[CeRVaNTeS model for simulation (urdf+gazebo)]]&lt;br /&gt;
#[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
#[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
----&lt;br /&gt;
[[File:rb1_portada.png|100px|thumb|right|RB-1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center style=&amp;quot;font-size: 30px;&amp;quot;&amp;gt;RB-1&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=File:Rb1_portada.png&amp;diff=4755</id>
		<title>File:Rb1 portada.png</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=File:Rb1_portada.png&amp;diff=4755"/>
				<updated>2015-11-06T11:27:25Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: rb1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;rb1&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Integraci%c3%b3n_de_MYRAbot_en_moveIt!_(gazebo%2bmoveIt!)&amp;diff=4706</id>
		<title>Integración de MYRAbot en moveIt! (gazebo+moveIt!)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Integraci%c3%b3n_de_MYRAbot_en_moveIt!_(gazebo%2bmoveIt!)&amp;diff=4706"/>
				<updated>2015-10-28T16:01:23Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: /* Pasos previos= */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Pasos previos=&lt;br /&gt;
&lt;br /&gt;
==Instalación de moveIt!==&lt;br /&gt;
&lt;br /&gt;
[http://moveit.ros.org/ MoveIt!] es un ''package'' que proporciona una herramienta software para todo tipo de tareas de manipulación tanto a nivel industrial como doméstico. Está disponible para las distribuciones [http://wiki.ros.org/groovy groovy] e [http://wiki.ros.org/hydro hydro] de [http://wiki.ros.org ROS], por lo que tendremos que tener instalada alguna de ellas. Para instalar [http://moveit.ros.org/ moveIt!] ejecutaremos el siguiente comando en un terminal, donde &amp;quot;ROS_DISTRIBUCION&amp;quot; corresponde con la distribución que tenemos instalada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get install ros-ROS_DISTRIBUCION-moveit-full&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modificación del modelo de MYRAbot para moveIt!==&lt;br /&gt;
&lt;br /&gt;
===Nuevo URDF del brazo===&lt;br /&gt;
&lt;br /&gt;
Necesitamos modificar el tipo de controladores, de las articulaciones del [[Modelo para simulación brazo MYRAbot (urdf+gazebo)|brazo]], empleados en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] para permitir que pueda tomar el control de estos [http://moveit.ros.org/ moveIt!]. También se han añadido al [[Modelo para simulación brazo MYRAbot (urdf+gazebo)|modelo del brazo]] las mallas 3D de los componentes reales. Crearemos un archivo llamado &amp;quot;brazo-macros_moveit.xacro&amp;quot; dentro del directorio &amp;quot;urdf&amp;quot; del ''package'' &amp;quot;brazo_fer_modelo&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot; xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;property name=&amp;quot;M_PI&amp;quot; value=&amp;quot;3.14159&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;M_SCALE&amp;quot; value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;F10_HEIGHT&amp;quot; value=&amp;quot;0.004&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;F4_HEIGHT&amp;quot; value=&amp;quot;0.0525&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;F3_HEIGHT&amp;quot; value=&amp;quot;0.009&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;AX12_HEIGHT&amp;quot; value=&amp;quot;0.0385&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;AX12_WIDTH&amp;quot; value=&amp;quot;0.038&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;F2_HEIGHT&amp;quot; value=&amp;quot;0.0265&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;color rgba=&amp;quot;0.87 0.90 0.87 1.0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;material name=&amp;quot;black&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;color rgba=&amp;quot;0.0 0.0 0.0 1.0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/material&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;default_inertia&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;default_inertia_servos&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.01&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.01&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;default_dynamics&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;dynamics fricction=&amp;quot;0&amp;quot; damping=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt; &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;bioloid_F10_fixed&amp;quot; params=&amp;quot;parent name color *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package:/brazo_fer_modelo/meshes/F10.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;${color}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F10.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;finger_fixed&amp;quot; params=&amp;quot;parent name color *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0.03075 0.0 0.001 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;box size=&amp;quot;0.0865 0.038 0.002&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;${color}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0.03075 0.0 0.001 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;box size=&amp;quot;0.0865 0.038 0.002&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;bioloid_F3_fixed&amp;quot; params=&amp;quot;parent name color *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F3.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;${color}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F3.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;dynamixel_AX12_fixed&amp;quot; params=&amp;quot;parent name *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.055&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia_servos/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package:/brazo_fer_modelo/meshes/ax12_box.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;black&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package:/brazo_fer_modelo/meshes/ax12_box.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;bioloid_F3_revolute&amp;quot; params=&amp;quot;parent name color llimit ulimit vlimit *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;axis xyz=&amp;quot;0 0 -1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;limit effort=&amp;quot;100&amp;quot; velocity=&amp;quot;${vlimit}&amp;quot; lower=&amp;quot;${llimit}&amp;quot; upper=&amp;quot;${ulimit}&amp;quot; /&amp;gt;&lt;br /&gt;
	  &amp;lt;default_dynamics/&amp;gt;      &lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_brazo_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_brazo_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F3.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;${color}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F3.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;bioloid_F2_revolute&amp;quot; params=&amp;quot;parent name color llimit ulimit vlimit *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;limit effort=&amp;quot;100&amp;quot; velocity=&amp;quot;${vlimit}&amp;quot; lower=&amp;quot;${llimit}&amp;quot; upper=&amp;quot;${ulimit}&amp;quot; /&amp;gt;&lt;br /&gt;
	  &amp;lt;default_dynamics/&amp;gt;       &lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F2.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;${color}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F2.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;bioloid_F4_revolute&amp;quot; params=&amp;quot;parent name color llimit ulimit vlimit *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;limit effort=&amp;quot;100&amp;quot; velocity=&amp;quot;${vlimit}&amp;quot; lower=&amp;quot;${llimit}&amp;quot; upper=&amp;quot;${ulimit}&amp;quot; /&amp;gt;&lt;br /&gt;
	  &amp;lt;default_dynamics/&amp;gt;       &lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F4.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;${color}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F4.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;gazebo_propiedades_link&amp;quot; params=&amp;quot;nombre material&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;${nombre}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;mu1&amp;gt;100&amp;lt;/mu1&amp;gt;&lt;br /&gt;
	&amp;lt;mu2&amp;gt;100&amp;lt;/mu2&amp;gt;&lt;br /&gt;
	&amp;lt;kp&amp;gt;100000000000&amp;lt;/kp&amp;gt;&lt;br /&gt;
	&amp;lt;kd&amp;gt;1000000000&amp;lt;/kd&amp;gt;&lt;br /&gt;
	&amp;lt;material&amp;gt;${material}&amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
    &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt; &lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;gazebo_propiedades_joint&amp;quot; params=&amp;quot;nombre&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;gazebo reference=&amp;quot;${nombre}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;erp&amp;gt;0.1&amp;lt;/erp&amp;gt;&lt;br /&gt;
    &amp;lt;stopKd value=&amp;quot;100000000.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;stopKp value=&amp;quot;100000000.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;fudgeFactor value=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo&amp;gt;&lt;br /&gt;
  &amp;lt;plugin name=&amp;quot;gazebo_ros_control&amp;quot; filename=&amp;quot;libgazebo_ros_control.so&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/plugin&amp;gt;&lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;transmission name=&amp;quot;base_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;type&amp;gt;transmission_interface/SimpleTransmission&amp;lt;/type&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;base&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;base_motor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;hardwareInterface&amp;gt;EffortJointInterface&amp;lt;/hardwareInterface&amp;gt;&lt;br /&gt;
      &amp;lt;mechanicalReduction&amp;gt;1&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/transmission&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;transmission name=&amp;quot;arti1_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;type&amp;gt;transmission_interface/SimpleTransmission&amp;lt;/type&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;arti1&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;arti1_motor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;hardwareInterface&amp;gt;EffortJointInterface&amp;lt;/hardwareInterface&amp;gt;&lt;br /&gt;
      &amp;lt;mechanicalReduction&amp;gt;1&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/transmission&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;transmission name=&amp;quot;arti2_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;type&amp;gt;transmission_interface/SimpleTransmission&amp;lt;/type&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;arti2&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;arti3_motor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;hardwareInterface&amp;gt;EffortJointInterface&amp;lt;/hardwareInterface&amp;gt;&lt;br /&gt;
      &amp;lt;mechanicalReduction&amp;gt;1&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/transmission&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;transmission name=&amp;quot;arti3_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;type&amp;gt;transmission_interface/SimpleTransmission&amp;lt;/type&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;arti3&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;arti3_motor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;hardwareInterface&amp;gt;EffortJointInterface&amp;lt;/hardwareInterface&amp;gt;&lt;br /&gt;
      &amp;lt;mechanicalReduction&amp;gt;1&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/transmission&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;transmission name=&amp;quot;pinza_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;type&amp;gt;transmission_interface/SimpleTransmission&amp;lt;/type&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;pinza&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;pinza_motor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;hardwareInterface&amp;gt;EffortJointInterface&amp;lt;/hardwareInterface&amp;gt;&lt;br /&gt;
      &amp;lt;mechanicalReduction&amp;gt;1&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/transmission&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los archivos empleados, con los modelos de malla 3D &amp;quot;.stl&amp;quot;, en la descripción del brazo se pueden descargar a continuación, deben guardarse en el directorio &amp;quot;meshes&amp;quot; del ''package'' &amp;quot;brazo_fer_modelo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/ax12_box.stl ax12_box.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/F2.stl F2.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/F3.stl F3.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/F4.stl F4.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/F10.stl F10.stl]&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;brazo_moveit.xacro&amp;quot; dentro del directorio &amp;quot;urdf&amp;quot; del ''package'' &amp;quot;brazo_fer_modelo&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find brazo_fer_modelo)/urdf/brazo-macros_moveit.xacro&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;brazo&amp;quot; params=&amp;quot;parent *origin&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;fixed&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;fixed_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 0 1&amp;quot; /&amp;gt;  &lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;fixed_link&amp;quot;/&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- shoulder pan joint --&amp;gt;&lt;br /&gt;
    &amp;lt;dynamixel_AX12_fixed parent=&amp;quot;fixed_link&amp;quot; name=&amp;quot;servo_base&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0.019&amp;quot; rpy=&amp;quot;${M_PI/2} 0 ${-M_PI/2}&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/dynamixel_AX12_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F3_revolute parent=&amp;quot;servo_base_link&amp;quot; name=&amp;quot;base&amp;quot; color=&amp;quot;white&amp;quot; vlimit=&amp;quot;3&amp;quot; llimit=&amp;quot;-2.62&amp;quot; ulimit=&amp;quot;2.62&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 ${AX12_WIDTH/2} 0&amp;quot; rpy=&amp;quot;${-M_PI/2} ${-M_PI/2} ${-M_PI}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F3_revolute&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- shoulder lift joint --&amp;gt;&lt;br /&gt;
    &amp;lt;dynamixel_AX12_fixed parent=&amp;quot;base_brazo_link&amp;quot; name=&amp;quot;servo_arti1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${-AX12_HEIGHT-F10_HEIGHT+0.001}&amp;quot; rpy=&amp;quot;0 ${M_PI} 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/dynamixel_AX12_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F4_revolute parent=&amp;quot;servo_arti1_link&amp;quot; name=&amp;quot;arti1&amp;quot; color=&amp;quot;white&amp;quot; vlimit=&amp;quot;3&amp;quot; llimit=&amp;quot;-2.62&amp;quot; ulimit=&amp;quot;2.62&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F4_revolute&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F10_fixed parent=&amp;quot;arti1_link&amp;quot; name=&amp;quot;arti1_F10_0&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F4_HEIGHT+F10_HEIGHT/2}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F10_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F10_fixed parent=&amp;quot;arti1_F10_0_link&amp;quot; name=&amp;quot;arti1_F10_1&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F10_HEIGHT}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F10_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F10_fixed parent=&amp;quot;arti1_F10_1_link&amp;quot; name=&amp;quot;arti1_F10_2&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F10_HEIGHT}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F10_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F3_fixed parent=&amp;quot;arti1_F10_2_link&amp;quot; name=&amp;quot;arti1_F3_0&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F10_HEIGHT/2}&amp;quot; rpy=&amp;quot;0 ${M_PI} 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F3_fixed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- elbow joint --&amp;gt;&lt;br /&gt;
    &amp;lt;dynamixel_AX12_fixed parent=&amp;quot;arti1_F3_0_link&amp;quot; name=&amp;quot;servo_arti2&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${-AX12_HEIGHT-F10_HEIGHT+0.001}&amp;quot; rpy=&amp;quot;0 ${M_PI} 0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/dynamixel_AX12_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F4_revolute parent=&amp;quot;servo_arti2_link&amp;quot; name=&amp;quot;arti2&amp;quot; color=&amp;quot;white&amp;quot; vlimit=&amp;quot;3&amp;quot; llimit=&amp;quot;-2.63&amp;quot; ulimit=&amp;quot;2.63&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F4_revolute&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F10_fixed parent=&amp;quot;arti2_link&amp;quot; name=&amp;quot;arti2_F10_0&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F4_HEIGHT+F10_HEIGHT/2}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F10_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F10_fixed parent=&amp;quot;arti2_F10_0_link&amp;quot; name=&amp;quot;arti2_F10_1&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F10_HEIGHT}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F10_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F10_fixed parent=&amp;quot;arti2_F10_1_link&amp;quot; name=&amp;quot;arti2_F10_2&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F10_HEIGHT}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F10_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F3_fixed parent=&amp;quot;arti2_F10_2_link&amp;quot; name=&amp;quot;arti2_F3_0&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F10_HEIGHT/2}&amp;quot; rpy=&amp;quot;0 ${M_PI} 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F3_fixed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- wrist joint --&amp;gt;&lt;br /&gt;
    &amp;lt;dynamixel_AX12_fixed parent=&amp;quot;arti2_F3_0_link&amp;quot; name=&amp;quot;servo_arti3&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${-AX12_HEIGHT-F10_HEIGHT+0.001}&amp;quot; rpy=&amp;quot;0 ${M_PI} 0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/dynamixel_AX12_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F2_revolute parent=&amp;quot;servo_arti3_link&amp;quot; name=&amp;quot;arti3&amp;quot; color=&amp;quot;white&amp;quot; vlimit=&amp;quot;3&amp;quot; llimit=&amp;quot;-2.62&amp;quot; ulimit=&amp;quot;2.62&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F2_revolute&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F3_fixed parent=&amp;quot;arti3_link&amp;quot; name=&amp;quot;arti3_F3_0&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0.016 ${F2_HEIGHT}&amp;quot; rpy=&amp;quot;0 ${M_PI} ${-M_PI/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F3_fixed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- gripper joint --&amp;gt;&lt;br /&gt;
    &amp;lt;dynamixel_AX12_fixed parent=&amp;quot;arti3_F3_0_link&amp;quot; name=&amp;quot;servo_pinza&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;-0.02275 0 ${-AX12_WIDTH/2}&amp;quot; rpy=&amp;quot;${M_PI} ${M_PI/2} 0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/dynamixel_AX12_fixed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- finger 1 --&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;pinza&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;limit effort=&amp;quot;100&amp;quot; velocity=&amp;quot;3&amp;quot; lower=&amp;quot;-2.62&amp;quot; upper=&amp;quot;2.62&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;default_dynamics/&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;servo_pinza_link&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;pinza_movil_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;link name=&amp;quot;pinza_movil_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;default_inertia/&amp;gt;      &lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F2.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;white&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F2.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
    &amp;lt;finger_fixed parent=&amp;quot;pinza_movil_link&amp;quot; name=&amp;quot;pinza_movil_dedo&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F2_HEIGHT}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/finger_fixed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- finger 2 --&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F3_fixed parent=&amp;quot;servo_pinza_link&amp;quot; name=&amp;quot;pinza_fija&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${-AX12_HEIGHT-F10_HEIGHT+0.001}&amp;quot; rpy=&amp;quot;0 ${M_PI} 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F3_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;finger_fixed parent=&amp;quot;pinza_fija_link&amp;quot; name=&amp;quot;pinza_fija_dedo&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 ${M_PI}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/finger_fixed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;servo_base_link&amp;quot; material=&amp;quot;brazo_fer/Black&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;base_brazo_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;servo_arti1_link&amp;quot; material=&amp;quot;brazo_fer/Black&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti1_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti1_F10_0_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti1_F10_1_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti1_F10_2_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti1_F3_0_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;servo_arti2_link&amp;quot; material=&amp;quot;brazo_fer/Black&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti2_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti2_F10_0_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti2_F10_1_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti2_F10_2_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti2_F3_0_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;servo_arti3_link&amp;quot; material=&amp;quot;brazo_fer/Black&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti3_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti3_F3_0_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;servo_pinza_link&amp;quot; material=&amp;quot;brazo_fer/Black&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_movil_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;      &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_movil_dedo_link&amp;quot; material=&amp;quot;brazo_fer/WhiteTransparent&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_fija_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_fija_dedo_link&amp;quot; material=&amp;quot;brazo_fer/WhiteTransparent&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;base&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;arti1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;arti2&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;arti3&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;pinza&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
     &lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Controladores para simulación brazo===&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;controller_moveit.yaml&amp;quot; dentro del directorio &amp;quot;config&amp;quot; del ''package'' &amp;quot;brazo_fer_modelo&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  # Publish all joint states -----------------------------------&lt;br /&gt;
  joint_state_controller:&lt;br /&gt;
    type: joint_state_controller/JointStateController&lt;br /&gt;
    publish_rate: 50  &lt;br /&gt;
  &lt;br /&gt;
  # Position Controllers ---------------------------------------   &lt;br /&gt;
  pinza_pos_controller:&lt;br /&gt;
    type: effort_controllers/JointPositionController&lt;br /&gt;
    joint: pinza&lt;br /&gt;
    pid: {p: 0.8, i: 0.6, d: 0.3, i_clamp: 1}&lt;br /&gt;
&lt;br /&gt;
  brazo_controller:&lt;br /&gt;
    type: effort_controllers/JointTrajectoryController&lt;br /&gt;
    joints:&lt;br /&gt;
      - arti1&lt;br /&gt;
      - arti2&lt;br /&gt;
      - arti3&lt;br /&gt;
      - base&lt;br /&gt;
&lt;br /&gt;
    gains: # Required because we're controlling an effort interface&lt;br /&gt;
      arti1: {p: 1.0, i: 0.6, d: 0.3, i_clamp: 10}&lt;br /&gt;
      arti2: {p: 1.0, i: 0.6, d: 0.3, i_clamp: 10}&lt;br /&gt;
      arti3: {p: 1.0, i: 0.6, d: 0.3, i_clamp: 10}&lt;br /&gt;
      base: {p: 1.0, i: 0.6, d: 0.3, i_clamp: 10}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Controlador para el brazo real (actionlib-action server)===&lt;br /&gt;
&lt;br /&gt;
Para la interacción entre el [[Control brazo MYRAbot (bioloid+arduino)|brazo]] y [http://moveit.ros.org/ moveIt!] es necesario un [http://wiki.ros.org/actionlib actionlib-ActionServer] que reciba las trayectorias calculadas a través de un ''Goal'', se suscriba al ''topic'' &amp;quot;pose_arm&amp;quot; (estados del brazo) y publique en el ''topic'' &amp;quot;move_arm&amp;quot; (movimiento del brazo). Crearemos un nuevo archivo llamado &amp;quot;controlador_brazo.cpp&amp;quot; dentro del directorio &amp;quot;src&amp;quot; del ''package'' &amp;quot;brazo_fer&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ros/ros.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ros/time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;trajectory_msgs/JointTrajectoryPoint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;trajectory_msgs/JointTrajectory.h&amp;gt;&lt;br /&gt;
#include &amp;lt;myrabot_arm_base_b/WriteServos.h&amp;gt;&lt;br /&gt;
#include &amp;lt;myrabot_arm_base_b/ReadServos.h&amp;gt;&lt;br /&gt;
#include &amp;lt;actionlib/server/simple_action_server.h&amp;gt;&lt;br /&gt;
#include &amp;lt;control_msgs/FollowJointTrajectoryAction.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define PI 3.14159265&lt;br /&gt;
&lt;br /&gt;
class MYRAbotArm&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&lt;br /&gt;
  MYRAbotArm(std::string name) :&lt;br /&gt;
    as_(nh_, name, false),&lt;br /&gt;
    action_name_(name)&lt;br /&gt;
  {&lt;br /&gt;
    as_.registerGoalCallback(boost::bind(&amp;amp;MYRAbotArm::goalCB, this));&lt;br /&gt;
    as_.registerPreemptCallback(boost::bind(&amp;amp;MYRAbotArm::preemptCB, this));&lt;br /&gt;
&lt;br /&gt;
    sub_pose_arm_ = nh_.subscribe(&amp;quot;/pose_arm&amp;quot;, 1, &amp;amp;MYRAbotArm::analysisCB, this);&lt;br /&gt;
&lt;br /&gt;
    pub_move_arm_ = nh_.advertise&amp;lt;myrabot_arm_base_b::WriteServos&amp;gt;(&amp;quot;/move_arm&amp;quot;, 1, this);&lt;br /&gt;
&lt;br /&gt;
    as_.start();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ~MYRAbotArm(void)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  void goalCB()&lt;br /&gt;
  {&lt;br /&gt;
	i_ = 0;&lt;br /&gt;
&lt;br /&gt;
	goal_ = as_.acceptNewGoal()-&amp;gt;trajectory;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  void preemptCB()&lt;br /&gt;
  {&lt;br /&gt;
    ROS_INFO(&amp;quot;%s: Preempted&amp;quot;, action_name_.c_str());&lt;br /&gt;
    as_.setPreempted();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  void analysisCB(const myrabot_arm_base_b::ReadServos&amp;amp; arm)&lt;br /&gt;
  {&lt;br /&gt;
    if (!as_.isActive())&lt;br /&gt;
      return;&lt;br /&gt;
&lt;br /&gt;
    ros::Time ahora = ros::Time::now();&lt;br /&gt;
&lt;br /&gt;
    feedback_.header.stamp = ahora;&lt;br /&gt;
&lt;br /&gt;
    feedback_.joint_names.resize(4);&lt;br /&gt;
    feedback_.actual.positions.resize(4);&lt;br /&gt;
    feedback_.actual.effort.resize(4);&lt;br /&gt;
&lt;br /&gt;
	for (int i = 0; i &amp;lt; 4; i++)&lt;br /&gt;
	{&lt;br /&gt;
		switch(i)&lt;br /&gt;
		{&lt;br /&gt;
			case 3:&lt;br /&gt;
				feedback_.joint_names[i] = &amp;quot;base_brazo&amp;quot;;&lt;br /&gt;
				feedback_.actual.positions[i] = ((((arm.posicion.base * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
				feedback_.actual.effort[i] = ((((arm.corriente.base * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
			break;&lt;br /&gt;
			case 0:&lt;br /&gt;
				feedback_.joint_names[i] = &amp;quot;arti1&amp;quot;;&lt;br /&gt;
				feedback_.actual.positions[i] = ((((arm.posicion.arti1 * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
				feedback_.actual.effort[i] = ((((arm.corriente.arti1 * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
			break;&lt;br /&gt;
			case 1:&lt;br /&gt;
				feedback_.joint_names[i] = &amp;quot;arti2&amp;quot;;&lt;br /&gt;
				feedback_.actual.positions[i] = ((((arm.posicion.arti2 * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
				feedback_.actual.effort[i] = ((((arm.corriente.arti2 * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
			break;&lt;br /&gt;
			case 2:&lt;br /&gt;
				feedback_.joint_names[i] = &amp;quot;arti3&amp;quot;;&lt;br /&gt;
				feedback_.actual.positions[i] = ((((arm.posicion.arti3 * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
				feedback_.actual.effort[i] = ((((arm.corriente.arti3 * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	puntos_ = goal_.points.size();&lt;br /&gt;
&lt;br /&gt;
	if (i_ != puntos_)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	    	myrabot_arm_base_b::WriteServos move;&lt;br /&gt;
&lt;br /&gt;
	    		if (i_ == 0&lt;br /&gt;
	    		    ||((feedback_.actual.positions[0] &amp;lt;= (goal_.points[i_-1].positions[0] + 0.1) &amp;amp;&amp;amp; feedback_.actual.positions[0] &amp;gt;= (goal_.points[i_-1].positions[0] - 0.1))&lt;br /&gt;
	    		    &amp;amp;&amp;amp; (feedback_.actual.positions[1] &amp;lt;= (goal_.points[i_-1].positions[1] + 0.1) &amp;amp;&amp;amp; feedback_.actual.positions[1] &amp;gt;= (goal_.points[i_-1].positions[1] - 0.1))&lt;br /&gt;
	    		    &amp;amp;&amp;amp; (feedback_.actual.positions[2] &amp;lt;= (goal_.points[i_-1].positions[2] + 0.1) &amp;amp;&amp;amp; feedback_.actual.positions[2] &amp;gt;= (goal_.points[i_-1].positions[2] - 0.1))&lt;br /&gt;
	    		    &amp;amp;&amp;amp; (feedback_.actual.positions[3] &amp;lt;= (goal_.points[i_-1].positions[3] + 0.1) &amp;amp;&amp;amp; feedback_.actual.positions[3] &amp;gt;= (goal_.points[i_-1].positions[3] - 0.1))))&lt;br /&gt;
	    		{&lt;br /&gt;
	    			for (int j = 0; j &amp;lt; 4; j++)&lt;br /&gt;
	    			{&lt;br /&gt;
	    				switch (j)&lt;br /&gt;
	    				{&lt;br /&gt;
	    				case 3:&lt;br /&gt;
	    					move.posicion.base = ((((goal_.points[i_].positions[j]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	    					move.velocidad.base = abs(goal_.points[i_].velocities[j]*511);&lt;br /&gt;
	    					move.par.base = 1;&lt;br /&gt;
	    				break;&lt;br /&gt;
	    				case 0:&lt;br /&gt;
	    					move.posicion.arti1 = ((((goal_.points[i_].positions[j]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	    					move.velocidad.arti1 = abs(goal_.points[i_].velocities[j]*511);&lt;br /&gt;
	    					move.par.arti1 = 1;&lt;br /&gt;
	    				break;&lt;br /&gt;
	    				case 1:&lt;br /&gt;
	    					move.posicion.arti2 = ((((goal_.points[i_].positions[j]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	    					move.velocidad.arti2 = abs(goal_.points[i_].velocities[j]*511);&lt;br /&gt;
	    					move.par.arti2 = 1;&lt;br /&gt;
	    				break;&lt;br /&gt;
	    				case 2:&lt;br /&gt;
	    					move.posicion.arti3 = ((((goal_.points[i_].positions[j]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	    				        move.velocidad.arti3 = abs(goal_.points[i_].velocities[j]*511);&lt;br /&gt;
	    					move.par.arti3 = 1;&lt;br /&gt;
	    				break;&lt;br /&gt;
	    				}&lt;br /&gt;
	    			}&lt;br /&gt;
&lt;br /&gt;
	    			pub_move_arm_.publish(move);&lt;br /&gt;
&lt;br /&gt;
	    			t_inicio = ros::Time::now();&lt;br /&gt;
	    		}&lt;br /&gt;
	    		else&lt;br /&gt;
	    		{&lt;br /&gt;
	    			i_ = i_ - 1;&lt;br /&gt;
	    		}&lt;br /&gt;
&lt;br /&gt;
	    		ros::Time ahora = ros::Time::now();&lt;br /&gt;
&lt;br /&gt;
	    		ros::Duration duracion(1.0);&lt;br /&gt;
&lt;br /&gt;
	    		if (ahora &amp;gt; (t_inicio + duracion))&lt;br /&gt;
	    		{&lt;br /&gt;
	    			result_.error_code = -1;&lt;br /&gt;
	    	                as_.setAborted(result_);&lt;br /&gt;
	    		}&lt;br /&gt;
&lt;br /&gt;
			feedback_.desired = goal_.points[i_];&lt;br /&gt;
&lt;br /&gt;
			feedback_.error.positions.resize(4);&lt;br /&gt;
&lt;br /&gt;
			for (int j = 0; j &amp;lt; 4; j++)&lt;br /&gt;
			{&lt;br /&gt;
				feedback_.error.positions[j] = feedback_.desired.positions[j] - feedback_.actual.positions[j];&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
    		i_ ++;&lt;br /&gt;
  	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		result_.error_code = 0;&lt;br /&gt;
	        as_.setSucceeded(result_);&lt;br /&gt;
	}&lt;br /&gt;
	as_.publishFeedback(feedback_);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
protected:&lt;br /&gt;
&lt;br /&gt;
  ros::NodeHandle nh_;&lt;br /&gt;
  actionlib::SimpleActionServer&amp;lt;control_msgs::FollowJointTrajectoryAction&amp;gt; as_;&lt;br /&gt;
  std::string action_name_;&lt;br /&gt;
  int puntos_, i_;&lt;br /&gt;
  ros::Time t_inicio;&lt;br /&gt;
  trajectory_msgs::JointTrajectory goal_;&lt;br /&gt;
  control_msgs::FollowJointTrajectoryResult result_;&lt;br /&gt;
  control_msgs::FollowJointTrajectoryFeedback feedback_;&lt;br /&gt;
  ros::Subscriber sub_pose_arm_;&lt;br /&gt;
  ros::Publisher pub_move_arm_;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv)&lt;br /&gt;
{&lt;br /&gt;
  ros::init(argc, argv, &amp;quot;brazo_controller/follow_join_trajectory&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  MYRAbotArm brazo(ros::this_node::getName());&lt;br /&gt;
  ros::spin();&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilarlo y generar el ejecutable se debe añadir la siguiente línea de código al archivo &amp;quot;CMakeLists.txt&amp;quot; del ''package'' creado, donde indicamos el nombre para el ejecutable y la ruta y nombre del archivo a compilar: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;rosbuild_add_executable(controlador_brazo src/controlador_brazo.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Necesitamos añadir las siguientes dependencias al ''package'' en el archivo &amp;quot;manifest.xml&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;actionlib&lt;br /&gt;
actionlib_msgs&lt;br /&gt;
trajectory_msgs&lt;br /&gt;
control_msgs&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilar el programa hay que situarse en el directorio del ''package''. Simplemente con ejecutar la siguiente secuencia de comandos en un terminal se compilará y creará el ejecutable, siempre que no existan errores:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Nuevo URDF soporte y cámara xtion===&lt;br /&gt;
&lt;br /&gt;
Se ha colocado una estructra de soporte para situar la nueva cámara [http://www.asus.com/Multimedia/Xtion_PRO_LIVE/ asus Xtion PRO LIVE] para poder realizar tareas de manipulación y reconocimiento de objetos, en sustitución de la anterior [[Detección y cálculo de posición de objetos (cámara web)|cámara web]]. Para la estructura de soporte añadiremos las siguientes líneas de código al archivo &amp;quot;estructura-myrabot.xacro&amp;quot; situado en el directotio &amp;quot;urdf&amp;quot; del ''package'' &amp;quot;myrabot_fer_modelo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;soporte_3&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_soporte_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_soporte_3_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0.065 0.61&amp;quot; rpy=&amp;quot;0.12 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_soporte_3_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.0 -0.065 ${0.06/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.135 -0.2 -0.03&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_soporte_3.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.135 -0.2 -0.03&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_soporte_3.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt; &lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_soporte_3_link&amp;quot; material=&amp;quot;myrabot_fer/LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;xtion.xacro&amp;quot; dentro del directorio &amp;quot;urdf&amp;quot; del ''package'' &amp;quot;myrabot_fer_modelo&amp;quot; con el siguiente contenido para el modelo del sensor 3D:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;robot xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Xacro properties --&amp;gt;&lt;br /&gt;
  &amp;lt;xacro:property name=&amp;quot;M_SCALE&amp;quot; value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;xacro:property name=&amp;quot;asus_xtion_pro_depth_rel_rgb_py&amp;quot; value=&amp;quot;0.0270&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;xacro:property name=&amp;quot;asus_xtion_pro_cam_rel_rgb_py&amp;quot;   value=&amp;quot;-0.0220&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;property name=&amp;quot;M_PI&amp;quot; value=&amp;quot;3.14159&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Parameterised in part by the values in turtlebot_properties.urdf.xacro --&amp;gt;&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;xtion&amp;quot; params=&amp;quot;parent *origin&amp;quot;&amp;gt;&lt;br /&gt;
	  &lt;br /&gt;
    &amp;lt;joint name=&amp;quot;camera_rgb_joint_xtion&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;camera_rgb_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;camera_rgb_frame_xtion&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;camera_rgb_optical_joint_xtion&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;${-M_PI/2} 0 ${-M_PI/2}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;camera_rgb_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;camera_rgb_optical_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;camera_rgb_optical_frame_xtion&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;camera_joint_xtion&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0.0175 ${asus_xtion_pro_cam_rel_rgb_py} 0.021&amp;quot;&lt;br /&gt;
              rpy=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;camera_rgb_frame_xtion&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;camera_link_xtion&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;link name=&amp;quot;camera_link_xtion&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;-0.01 0 0&amp;quot; rpy=&amp;quot;${-M_PI/2} -${M_PI} ${-M_PI/2}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/asus_xtion_pro_live.dae&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;-0.01 0 0&amp;quot; rpy=&amp;quot;${-M_PI/2} -${M_PI} ${-M_PI/2}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/asus_xtion_pro_live.dae&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;camera_depth_joint_xtion&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0.0175 ${asus_xtion_pro_depth_rel_rgb_py} 0.021&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;camera_rgb_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;camera_depth_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;camera_depth_frame_xtion&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;camera_depth_optical_joint_xtion&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;${-M_PI/2} 0 ${-M_PI/2}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;camera_depth_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;camera_depth_optical_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;camera_depth_optical_frame_xtion&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;gazebo reference=&amp;quot;camera_link_xtion&amp;quot;&amp;gt;  &lt;br /&gt;
      &amp;lt;sensor type=&amp;quot;depth&amp;quot; name=&amp;quot;xtion&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;always_on&amp;gt;true&amp;lt;/always_on&amp;gt;&lt;br /&gt;
        &amp;lt;update_rate&amp;gt;20.0&amp;lt;/update_rate&amp;gt;&lt;br /&gt;
        &amp;lt;camera&amp;gt;&lt;br /&gt;
          &amp;lt;horizontal_fov&amp;gt;${60.0*M_PI/180.0}&amp;lt;/horizontal_fov&amp;gt;&lt;br /&gt;
          &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;R8G8B8&amp;lt;/format&amp;gt;&lt;br /&gt;
            &amp;lt;width&amp;gt;640&amp;lt;/width&amp;gt;&lt;br /&gt;
            &amp;lt;height&amp;gt;480&amp;lt;/height&amp;gt;&lt;br /&gt;
          &amp;lt;/image&amp;gt;&lt;br /&gt;
          &amp;lt;clip&amp;gt;&lt;br /&gt;
            &amp;lt;near&amp;gt;0.05&amp;lt;/near&amp;gt;&lt;br /&gt;
            &amp;lt;far&amp;gt;8.0&amp;lt;/far&amp;gt;&lt;br /&gt;
          &amp;lt;/clip&amp;gt;&lt;br /&gt;
        &amp;lt;/camera&amp;gt;&lt;br /&gt;
        &amp;lt;plugin name=&amp;quot;xtion_camera_controller&amp;quot; filename=&amp;quot;libgazebo_ros_openni_kinect.so&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;cameraName&amp;gt;xtion&amp;lt;/cameraName&amp;gt;&lt;br /&gt;
          &amp;lt;alwaysOn&amp;gt;true&amp;lt;/alwaysOn&amp;gt;&lt;br /&gt;
          &amp;lt;updateRate&amp;gt;10&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
          &amp;lt;imageTopicName&amp;gt;rgb/image_raw&amp;lt;/imageTopicName&amp;gt;&lt;br /&gt;
          &amp;lt;depthImageTopicName&amp;gt;depth/image_raw&amp;lt;/depthImageTopicName&amp;gt;&lt;br /&gt;
          &amp;lt;pointCloudTopicName&amp;gt;depth/points&amp;lt;/pointCloudTopicName&amp;gt;&lt;br /&gt;
          &amp;lt;cameraInfoTopicName&amp;gt;rgb/camera_info&amp;lt;/cameraInfoTopicName&amp;gt;&lt;br /&gt;
          &amp;lt;depthImageCameraInfoTopicName&amp;gt;depth/camera_info&amp;lt;/depthImageCameraInfoTopicName&amp;gt;&lt;br /&gt;
          &amp;lt;frameName&amp;gt;camera_depth_optical_frame_xtion&amp;lt;/frameName&amp;gt;&lt;br /&gt;
          &amp;lt;baseline&amp;gt;0.1&amp;lt;/baseline&amp;gt;&lt;br /&gt;
          &amp;lt;distortion_k1&amp;gt;0.0&amp;lt;/distortion_k1&amp;gt;&lt;br /&gt;
          &amp;lt;distortion_k2&amp;gt;0.0&amp;lt;/distortion_k2&amp;gt;&lt;br /&gt;
          &amp;lt;distortion_k3&amp;gt;0.0&amp;lt;/distortion_k3&amp;gt;&lt;br /&gt;
          &amp;lt;distortion_t1&amp;gt;0.0&amp;lt;/distortion_t1&amp;gt;&lt;br /&gt;
          &amp;lt;distortion_t2&amp;gt;0.0&amp;lt;/distortion_t2&amp;gt;&lt;br /&gt;
          &amp;lt;pointCloudCutoff&amp;gt;0.4&amp;lt;/pointCloudCutoff&amp;gt;&lt;br /&gt;
        &amp;lt;/plugin&amp;gt;&lt;br /&gt;
      &amp;lt;/sensor&amp;gt;&lt;br /&gt;
    &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Los archivos empleados, con los modelos de malla 3D &amp;quot;.stl&amp;quot; y &amp;quot;.dae&amp;quot;, en la descrición de la estructura soporte y de la cámara se pueden descargar a continuación, deben guardarse en el directorio &amp;quot;meshes&amp;quot; de nuestro ''package'':&lt;br /&gt;
&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_soporte_3.stl e_soporte_3.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/asus_xtion_pro_live.dae asus_xtion_pro_live.dae]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/images/asus_xtion_pro_live.png asus_xtion_pro_live.png]&lt;br /&gt;
&lt;br /&gt;
===Nuevo URDF de MYRAbot===&lt;br /&gt;
&lt;br /&gt;
También debemos crear un archivo llamado &amp;quot;myrabot_moveit.urdf.xacro&amp;quot; dentro del directorio &amp;quot;urdf&amp;quot; del ''package'' &amp;quot;myrabot_fer_modelo&amp;quot; con el siguiente contenido, para añadir a el [[Modelo para simulación MYRAbot (urdf+gazebo)|modelo del robot]] el nuevo [[Modelo para simulación brazo MYRAbot (urdf+gazebo)|modelo del brazo]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot name=&amp;quot;MYRAbot&amp;quot;&lt;br /&gt;
       xmlns:xi=&amp;quot;http://www.w3.org/2001/XInclude&amp;quot;&lt;br /&gt;
       xmlns:gazebo=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#gz&amp;quot;&lt;br /&gt;
       xmlns:model=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#model&amp;quot;&lt;br /&gt;
       xmlns:sensor=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor&amp;quot;&lt;br /&gt;
       xmlns:body=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#body&amp;quot;&lt;br /&gt;
       xmlns:geom=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#geom&amp;quot;&lt;br /&gt;
       xmlns:joint=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#joint&amp;quot;&lt;br /&gt;
       xmlns:interface=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#interface&amp;quot;&lt;br /&gt;
       xmlns:rendering=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#rendering&amp;quot;&lt;br /&gt;
       xmlns:renderable=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#renderable&amp;quot;&lt;br /&gt;
       xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot;&lt;br /&gt;
       xmlns:physics=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#physics&amp;quot;&lt;br /&gt;
       xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/roomba.xacro&amp;quot; /&amp;gt;		&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/estructura-myrabot.xacro&amp;quot; /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/kinect.xacro&amp;quot; /&amp;gt;	&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find brazo_fer_modelo)/urdf/brazo_moveit.xacro&amp;quot; /&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/xtion.xacro&amp;quot; /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/ultrasonidos.xacro&amp;quot; /&amp;gt;		&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;roomba /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;estructura_myrabot parent=&amp;quot;base_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 1.57&amp;quot; xyz=&amp;quot;0 0 0.063&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/estructura_myrabot&amp;gt; &lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;kinect parent=&amp;quot;e_base_kinect_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 -1.57&amp;quot; xyz=&amp;quot;0 -0.045 0.112&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/kinect&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;brazo parent=&amp;quot;e_base_brazo_1_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 1.57&amp;quot; xyz=&amp;quot;0 -0.1015 0.075&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/brazo&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;xtion parent=&amp;quot;e_soporte_3_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0.65 -1.57&amp;quot; xyz=&amp;quot;0.021 -0.03 0.175&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/xtion&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;1&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 1.57&amp;quot; xyz=&amp;quot;0 0 ${0.04-0.007}&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;	&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;2&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 2.36&amp;quot; xyz=&amp;quot;0 0 ${0.04-0.007}&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;3&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 3.14&amp;quot; xyz=&amp;quot;0 0 ${0.04-0.007}&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;	&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;4&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 3.93&amp;quot; xyz=&amp;quot;0 0 ${0.04-0.007}&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;5&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 4.71&amp;quot; xyz=&amp;quot;0 0 ${0.04-0.007}&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;							&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;myrabot_gazebo_moveit.launcher&amp;quot; dentro del directorio &amp;quot;launch&amp;quot; del ''package'' &amp;quot;myrabot_fer_modelo&amp;quot; con el siguiente contenido, para cargar en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] el nuevo modelo del robot adaptado a [http://moveit.ros.org/ moveIt!]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find gazebo_ros)/launch/empty_world.launch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;arg name=&amp;quot;paused&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;arg name=&amp;quot;use_sim_time&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;arg name=&amp;quot;debug&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;arg name=&amp;quot;world_name&amp;quot; value=&amp;quot;$(find turtlebot_gazebo)/worlds/empty.world&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/include&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;robot_description&amp;quot; command=&amp;quot;$(find xacro)/xacro.py '$(find myrabot_fer_modelo)/urdf/myrabot_moveit.urdf.xacro'&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_myrabot&amp;quot; pkg=&amp;quot;gazebo_ros&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-urdf -param robot_description -model MYRAbot&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;rosparam file=&amp;quot;$(find brazo_fer_modelo)/config/controller_moveit.yaml&amp;quot; command=&amp;quot;load&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;controller_spawner&amp;quot; pkg=&amp;quot;controller_manager&amp;quot; type=&amp;quot;spawner&amp;quot; args=&amp;quot;pinza_pos_controller brazo_controller joint_state_controller&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;node name=&amp;quot;robot_state_publisher&amp;quot; pkg=&amp;quot;robot_state_publisher&amp;quot; type=&amp;quot;state_publisher&amp;quot; /&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;robot_pose_ekf&amp;quot; type=&amp;quot;robot_pose_ekf&amp;quot; name=&amp;quot;robot_pose_ekf&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;freq&amp;quot; value=&amp;quot;30.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;sensor_timeout&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;publish_tf&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;odom_used&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;imu_used&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;vo_used&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;output_frame&amp;quot; value=&amp;quot;odom&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;pointcloud_throttle&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudThrottle openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;max_rate&amp;quot; value=&amp;quot;20.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud_in&amp;quot; to=&amp;quot;/camera/depth/points&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud_out&amp;quot; to=&amp;quot;cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;kinect_laser&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudToScan openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;output_frame_id&amp;quot; value=&amp;quot;/camera_depth_frame&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;!-- heights are in the (optical?) frame of the kinect --&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;min_height&amp;quot; value=&amp;quot;-0.15&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;max_height&amp;quot; value=&amp;quot;0.15&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud&amp;quot; to=&amp;quot;/cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;kinect_laser_narrow&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudToScan openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;output_frame_id&amp;quot; value=&amp;quot;/camera_depth_frame&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;!-- heights are in the (optical?) frame of the kinect --&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;min_height&amp;quot; value=&amp;quot;-0.025&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;max_height&amp;quot; value=&amp;quot;0.025&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud&amp;quot; to=&amp;quot;/cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;scan&amp;quot; to=&amp;quot;/narrow_scan&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Configuración de MYRAbot en moveIt!=&lt;br /&gt;
&lt;br /&gt;
==Asistente de configuración==&lt;br /&gt;
&lt;br /&gt;
Una vez instalado [http://moveit.ros.org/ moveIt!] ejecutaremos el siguiente comando en un terminal para iniciar el asistente de configuración de este ''package'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch moveit_setup_assistant setup_assistant.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos aparecerá la ventana que se muestra a continuación, donde podemos escoger entre crear un nuevo ''package'' de configuración (Create New MoveIt Configuration Package) o editar un ''package'' de configuración existente (Edit existing MoveIt Configuration Package):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[file:myrabot_moveit_asistente_01.png|thumb|400px|center|Ventana de inicio asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Pinchamos sobre la opción &amp;quot;Create New MoveIt Configuration Package&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Seleccionamos el archivo [http://wiki.ros.org/urdf/Tutorials URDF] del [[Modelo para simulación MYRAbot (urdf+gazebo)|modelo de MYRAbot]] pinchando en &amp;quot;Browse&amp;quot; &amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||[[file:myrabot_moveit_asistente_02.png|thumb|400px|center|Ventana creación nuevo ''package'' asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Cuando tengamos seleccionado el modelo del robot pincharemos en &amp;quot;Load Files&amp;quot; para que el asistente de [http://moveit.ros.org/ moveIt!] cargue nuestro modelo. Al finalizar el proceso de carga aparecerá el modelo del robot en la parte derecha de la ventana, como se puede ver en la siguiente imagen:&lt;br /&gt;
&lt;br /&gt;
[[file:myrabot_moveit_asistente_03.png|thumb|400px|center|Ventana carga modelo robot asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
&lt;br /&gt;
Ahora seleccionaremos en el menú de la parte izquierda de la ventana &amp;quot;Self-Collision&amp;quot; y pincharemos en &amp;quot;Regenerate Default Collision Mtrix&amp;quot; para calcular la matriz de colisiones de nuestro modelo, podemos ver el resultado en la siguiente imagen:&lt;br /&gt;
&lt;br /&gt;
[[file:myrabot_moveit_asistente_04.png|thumb|400px|center|Ventana Self-Collision asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
&lt;br /&gt;
En el menú de la izquierda seleccionaremos &amp;quot;Virtual Joints&amp;quot; y pincharemos en &amp;quot;Add Virtual Joint&amp;quot;. En el campo &amp;quot;Virtual Joint Name&amp;quot; escribiremos '''virtual_joint''', en el campo &amp;quot;Child_Link&amp;quot; seleccionaremos el ''link'' '''base_footprint''', en el campo &amp;quot;Parent Frame Name&amp;quot; escribiremos '''odom''' y en el campo &amp;quot;Joint Type&amp;quot; seleccionaremos '''planar'''. El procedimiento se muestra en las siguientes imagenes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[file:myrabot_moveit_asistente_05.png|thumb|400px|center|Ventana añadir &amp;quot;Virtual Joint&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Para añadir la &amp;quot;Virtual Joint&amp;quot; pinchamos en &amp;quot;Save&amp;quot; &amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||[[file:myrabot_moveit_asistente_06.png|thumb|400px|center|Ventana &amp;quot;Virtual Joints&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En el menú de la izquierda seleccionaremos &amp;quot;Planning Groups&amp;quot; y pincharemos en &amp;quot;Add group&amp;quot;. En el campo &amp;quot;Group Name&amp;quot; escribiremos '''brazo''' y en el campo &amp;quot;Kinematic Solver&amp;quot; seleccionaremos '''kdl_kinematics_plugin/KDLKinematicsPlugin''', el resto de campos se dejarán como viene por defecto. El procedimiento se muestra en las siguientes imagenes:&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[file:myrabot_moveit_asistente_07.png|thumb|300px|center|Ventana añadir &amp;quot;Group&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Para añadir articulaciones pinchamos en &amp;quot;Add Joints&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Seleccionamos de la lista las articulaciones del brazo (&amp;lt;font style=&amp;quot;font-weight: bold&amp;quot;&amp;gt;base, arti1, arti2, arti3&amp;lt;/font&amp;gt;) &amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||[[file:myrabot_moveit_asistente_08.png|thumb|300px|center|Ventana añadir &amp;quot;Joints&amp;quot; a &amp;quot;Group&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
||||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Para añadir &amp;quot;Joints&amp;quot; y &amp;quot;Group&amp;quot; pinchamos en &amp;quot;Save&amp;quot; &amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||||[[file:myrabot_moveit_asistente_09.png|thumb|300px|center|Ventana &amp;quot;Planning Group&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
|}&lt;br /&gt;
También debemos añadir el grupo de la pinza pinchando en &amp;quot;Add Group&amp;quot;. En el campo &amp;quot;Group Name&amp;quot; escribiremos '''pinza''' y en el campo &amp;quot;Kinematic Solver&amp;quot; seleccionaremos '''None''', el resto de campos se dejarán como viene por defecto. El procedimiento se muestra en las siguientes imagenes:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[file:myrabot_moveit_asistente_10.png|thumb|300px|center|Ventana añadir &amp;quot;Group&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Para añadir partes pinchamos en &amp;quot;Add Links&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Seleccionamos de la lista las partes de la pinza &amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||[[file:myrabot_moveit_asistente_11.png|thumb|300px|center|Ventana añadir &amp;quot;Links&amp;quot; a &amp;quot;Group&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
||||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Para añadir &amp;quot;Links&amp;quot; y &amp;quot;Group&amp;quot; pinchamos en &amp;quot;Save&amp;quot; &amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||||[[file:myrabot_moveit_asistente_12.png|thumb|300px|center|Ventana &amp;quot;Planning Group&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Podemos establecer posiciones predefinidas para el brazo y así poder reutilizarlas. En el menú de la izquierda seleccionaremos &amp;quot;Robot Poses&amp;quot; y pincharemos en &amp;quot;Add Pose&amp;quot;. En el campo &amp;quot;Pose Name&amp;quot; escribiremos '''home''' y en el campo &amp;quot;Planning Group&amp;quot; seleccionaremos '''brazo'''. Con los controles deslizantes podemos modificar la posición de cada articulación para establecer la posición deseada. El procedimiento se muestra en las siguientes imagenes:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[file:myrabot_moveit_asistente_13.png|thumb|400px|center|Ventana añadir &amp;quot;Robot Pose&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Para añadir la &amp;quot;Robot Pose&amp;quot; pinchamos en &amp;quot;Save&amp;quot; &amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||[[file:myrabot_moveit_asistente_14.png|thumb|400px|center|Ventana &amp;quot;Robot Pose&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En el menú de la izquierda seleccionaremos &amp;quot;End Effectors&amp;quot; y pincharemos en &amp;quot;Add End Effector&amp;quot;. En el campo &amp;quot;End Effector Name&amp;quot; escribiremos '''pinza_eef''', en el campo &amp;quot;End Effector Group&amp;quot; seleccionaremos '''pinza''', en el campo &amp;quot;Parent Link&amp;quot; seleccionaremos '''arti3_link''' y el campo &amp;quot;Parent Group&amp;quot; lo dejaremos en blanco. El procedimiento se muestra en las siguientes imagenes:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[file:myrabot_moveit_asistente_15.png|thumb|400px|center|Ventana añadir &amp;quot;End Effector&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Para añadir el &amp;quot;End Effector&amp;quot; pinchamos en &amp;quot;Save&amp;quot; &amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||[[file:myrabot_moveit_asistente_16.png|thumb|400px|center|Ventana &amp;quot;End Effectors&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Para finalizar seleccionamos &amp;quot;Configuration Files&amp;quot; en el menú de la izquierda y  pincharemos en &amp;quot;Browse&amp;quot; para seleccionar la ubicación y nombre del ''package'' de configuración. Para generar el ''package'' simplemente pincharemos en &amp;quot;Generate Package&amp;quot;, como se muestra en la imagen:&lt;br /&gt;
&lt;br /&gt;
[[file:myrabot_moveit_asistente_18.png|thumb|400px|center|Ventana final asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
&lt;br /&gt;
==Integración de controladores del brazo==&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;controllers.yaml&amp;quot; dentro del directorio &amp;quot;config&amp;quot; del ''package'' de configuración de [http://moveit.ros.org/ moveIt!] creado con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
controller_list:&lt;br /&gt;
 - name: brazo_controller&lt;br /&gt;
   action_ns: follow_joint_trajectory&lt;br /&gt;
   type: FollowJointTrajectory&lt;br /&gt;
   default: true&lt;br /&gt;
   joints:&lt;br /&gt;
     - arti1&lt;br /&gt;
     - arti2&lt;br /&gt;
     - arti3&lt;br /&gt;
     - base&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Editaremos el archivo &amp;quot;MYRAbot_moveit_controller_manager.launch.xml&amp;quot; situado en el directorio &amp;quot;launch&amp;quot;  del ''package'' de configuración de [http://moveit.ros.org/ moveIt!] creado para que su contenido sea el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!-- Set the param that trajectory_execution_manager needs to find the controller plugin --&amp;gt;&lt;br /&gt;
 &amp;lt;arg name=&amp;quot;moveit_controller_manager&amp;quot; default=&amp;quot;moveit_simple_controller_manager/MoveItSimpleControllerManager&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;param name=&amp;quot;moveit_controller_manager&amp;quot; value=&amp;quot;$(arg moveit_controller_manager)&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;!-- load controller_list --&amp;gt;&lt;br /&gt;
 &amp;lt;rosparam file=&amp;quot;$(find myrabot_moveit_generated)/config/controllers.yaml&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Integración de sensores de percepción==&lt;br /&gt;
&lt;br /&gt;
Dentro de estos sensores tenemos la [http://www.asus.com/Multimedia/Xtion_PRO_LIVE/ asus xtion pro live] y la [http://www.microsoft.com/en-us/kinectforwindows/ kinect], con las cuales puede estar equipado MYRAbot y las cuales se configuran de igual modo. Crearemos un archivo llamado &amp;quot;xtion.yaml&amp;quot; dentro del directorio &amp;quot;config&amp;quot; del ''package'' de configuración de [http://moveit.ros.org/ moveIt!] creado con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sensors:&lt;br /&gt;
  - sensor_plugin: occupancy_map_monitor/PointCloudOctomapUpdater&lt;br /&gt;
    point_cloud_topic: /xtion/depth/points&lt;br /&gt;
    max_range: 5.0&lt;br /&gt;
    point_subsample: 1&lt;br /&gt;
    padding_offset: 0.1&lt;br /&gt;
    padding_scale: 1.0&lt;br /&gt;
    filtered_cloud_topic: filtered_cloud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Editaremos el archivo &amp;quot;MYRAbot_moveit_sensor_manager.launch.xml&amp;quot; situado en el directorio &amp;quot;launch&amp;quot;  del ''package'' de configuración de [http://moveit.ros.org/ moveIt!] creado para que su contenido sea el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rosparam command=&amp;quot;load&amp;quot; file=&amp;quot;$(find myrabot_moveit_generated)/config/xtion.yaml&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;param name=&amp;quot;octomap_frame&amp;quot; type=&amp;quot;string&amp;quot; value=&amp;quot;odom&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;param name=&amp;quot;octomap_resolution&amp;quot; type=&amp;quot;double&amp;quot; value=&amp;quot;0.05&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;param name=&amp;quot;max_range&amp;quot; type=&amp;quot;double&amp;quot; value=&amp;quot;5.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tenemos que añadir el valor '''move_group/MoveGroupGetPlanningSceneService''' al parámetro &amp;quot;capabilities&amp;quot; en el archivo &amp;quot;move_group.launch&amp;quot; que se encuantra dentro del directorio &amp;quot;launch&amp;quot;  del ''package'' de configuración de [http://moveit.ros.org/ moveIt!] creado, quedando como se muestra a continuación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- MoveGroup capabilities to load --&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;capabilities&amp;quot; value=&amp;quot;move_group/MoveGroupCartesianPathService&lt;br /&gt;
				      move_group/MoveGroupExecuteService&lt;br /&gt;
				      move_group/MoveGroupKinematicsService&lt;br /&gt;
				      move_group/MoveGroupMoveAction&lt;br /&gt;
				      move_group/MoveGroupPickPlaceAction&lt;br /&gt;
				      move_group/MoveGroupPlanService&lt;br /&gt;
				      move_group/MoveGroupQueryPlannersService&lt;br /&gt;
				      move_group/MoveGroupStateValidationService&lt;br /&gt;
				      move_group/MoveGroupGetPlanningSceneService&lt;br /&gt;
				      &amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modificación del archivo .srdf generado==&lt;br /&gt;
&lt;br /&gt;
Tenemos que modificar el archivo &amp;quot;MYRAbot.srdf&amp;quot; generado por el asistente para remplazar las comas por puntos en los valores de las posiciones de las articulaciones guardados, como se muestra a continuación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;group_state name=&amp;quot;home&amp;quot; group=&amp;quot;brazo&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;arti1&amp;quot; value=&amp;quot;1,3836&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;arti2&amp;quot; value=&amp;quot;-2,2458&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;arti3&amp;quot; value=&amp;quot;-0,7065&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;base&amp;quot; value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/group_state&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;group_state name=&amp;quot;home&amp;quot; group=&amp;quot;brazo&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;arti1&amp;quot; value=&amp;quot;1.3836&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;arti2&amp;quot; value=&amp;quot;-2.2458&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;arti3&amp;quot; value=&amp;quot;-0.7065&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;base&amp;quot; value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/group_state&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ejecución=&lt;br /&gt;
&lt;br /&gt;
==Planificación simple==&lt;br /&gt;
&lt;br /&gt;
Para probar que MYRAbot funciona correctamente en [http://moveit.ros.org/ moveIt!] podemos iniciar el ''launcher'' &amp;quot;demo.launch&amp;quot; contenido en el directorio &amp;quot;launch&amp;quot; del ''package'' generado, ejecutando en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_moveit_generated demo.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se cargará el modelo de MYRAbot en [http://wiki.ros.org/rviz rviz] con el &amp;quot;Motion Planning Interface&amp;quot; de [http://moveit.ros.org/ moveIt!], como se muestra en la siguiente imagen:&lt;br /&gt;
&lt;br /&gt;
[[file:myrabot_moveit_plugin_rviz.png|thumb|500px|center|MYRAbot en [http://wiki.ros.org/rviz rviz] con ''plugin'' de [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
&lt;br /&gt;
Podemos ver, si esta seleccionado el modo &amp;quot;interact&amp;quot;, unos ''interactive markers'' en torno a la pinza mediante los cuales podremos interactuar con la representación de los estados inicial y final del brazo. Si desplegamos la opción '''Planning Request''' dentro de '''MotionPlanning''', podemos activa o desactivar la representación del estado inicial '''Query Start State''' (representado en verde) o la representación del estado final '''Query Goal State''' (representado en naranja). Cuando alguna de las partes del brazo entre en contacto con otra u otro objeto, estas cambiarán a color rojo.&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo podemos ver un proceso de planificación simple, sin obstáculos, que desplaza el brazo desde una posición inicio, en este caso la pose guardada &amp;quot;home&amp;quot;, hasta una posición de destino, marcada desplazando el brazo usando los ''interantive markers'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;doy6VRjzYZc&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=doy6VRjzYZc Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Planificación con escena modelada==&lt;br /&gt;
&lt;br /&gt;
Ejecutaremos el siguiente comando en un terminal para iniciar [http://wiki.ros.org/rviz rviz] con el modelo del robot y el &amp;quot;MotionPlanning&amp;quot; de [http://moveit.ros.org/ moveIt!]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_moveit_generated demo.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se ha creado una escena con figuras geométricas básicas que representan una mesa y una lata sobre esta. No se han empleado mallas 3D, ''meshes'', aunque es una opción disponible, ya que hay problemas de intercambio aleatorio entre las representaciones visuales de los objetos. Crearemos un archivo llamado &amp;quot;mesa_lata.scene&amp;quot; dentro de nuestra carpeta personal&lt;br /&gt;
con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesa_Lata&lt;br /&gt;
* mesa_pata_izquierda_delantera&lt;br /&gt;
1&lt;br /&gt;
cylinder&lt;br /&gt;
0.015 0.71&lt;br /&gt;
0.20 0.97 0.355&lt;br /&gt;
0 0 0 1&lt;br /&gt;
0 0 0 1&lt;br /&gt;
* mesa_pata_derecha_delantera&lt;br /&gt;
1&lt;br /&gt;
cylinder&lt;br /&gt;
0.015 0.71&lt;br /&gt;
0.20 -0.97 0.355&lt;br /&gt;
0 0 0 1&lt;br /&gt;
0 0 0 1&lt;br /&gt;
* mesa_pata_derecha_trasera&lt;br /&gt;
1&lt;br /&gt;
cylinder&lt;br /&gt;
0.015 0.71&lt;br /&gt;
0.89 -0.97 0.355&lt;br /&gt;
0 0 0 1&lt;br /&gt;
0 0 0 1&lt;br /&gt;
* mesa_pata_izquierda_trasera&lt;br /&gt;
1&lt;br /&gt;
cylinder&lt;br /&gt;
0.015 0.71&lt;br /&gt;
0.89 0.97 0.355&lt;br /&gt;
0 0 0 1&lt;br /&gt;
0 0 0 1&lt;br /&gt;
* mesa_tablero&lt;br /&gt;
1&lt;br /&gt;
box&lt;br /&gt;
0.75 2 0.03&lt;br /&gt;
0.545 0 0.725&lt;br /&gt;
0 0 0 1&lt;br /&gt;
0.71372549 0.494117647 0.301960784 1&lt;br /&gt;
* lata&lt;br /&gt;
1&lt;br /&gt;
cylinder&lt;br /&gt;
0.03 0.12&lt;br /&gt;
0.28 0 0.8&lt;br /&gt;
0 0 0 1&lt;br /&gt;
1 0 0 1&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este archivo lo cargaremos en el menú '''Scene Objects''' de '''MotionPlanning''' pinchando en '''Import From Text'''. En el siguiente vídeo podemos ver el proceso de carga de la escena y la planificación de la trayectoria para evitar la lata, representada por un cilindro de color rojo, situada sobre la masa, desplazando el brazo desde un punto de partida a otro de destino entre los cuales se encuentra situada la lata:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;oWe_jj4keXU&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=oWe_jj4keXU Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Planificación con robot en gazebo==&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;myrabot_gazebo_moveit_mesa+latas.launch&amp;quot; dentro del directorio &amp;quot;launch&amp;quot; del ''package'' &amp;quot;myrabot_fer_modelo&amp;quot; con el siguiente contenido, para cargar [[Modelo para simulación MYRAbot (urdf+gazebo)#Creación de modelos de objetos|los modelos de los objetos]] (mesa y latas):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find myrabot_fer_modelo)/launch/myrabot_gazebo_moveit.launch&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Load models table and cans --&amp;gt;&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_mesa&amp;quot; pkg=&amp;quot;gazebo_ros&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find myrabot_objects_models_b)/urdf/mesa.urdf -urdf -x 0.545 -y 0 -z 0 -Y -1.57 -model mesa&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;    &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!--node name=&amp;quot;spawn_lata_coca_cola&amp;quot; pkg=&amp;quot;gazebo_ros&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find myrabot_objects_models_b)/urdf/lata_coca_cola.urdf -urdf -x 0.32 -y -0.18 -z 0.74 -Y -1.57 -model lata_Coca_Cola&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /--&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_lata_amstel&amp;quot; pkg=&amp;quot;gazebo_ros&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find myrabot_objects_models_b)/urdf/lata_amstel.urdf -urdf -x 0.32 -y 0.0 -z 0.74 -Y -1.57 -model lata_Amstel&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Crearemos otro archivo llamado &amp;quot;moveit_planning_execution.launch&amp;quot; dentro del directorio &amp;quot;launch&amp;quot; del ''package'' de configuración de [http://moveit.ros.org/ moveIt!] con el siguiente contenido, para iniciar el interfaz de planificación de movimientos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
 # The planning and execution components of MoveIt! configured to &lt;br /&gt;
 # publish the current configuration of the robot (simulated or real)&lt;br /&gt;
 # and the current state of the world as seen by the planner&lt;br /&gt;
 &amp;lt;include file=&amp;quot;$(find myrabot_moveit_generated)/launch/move_group.launch&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;arg name=&amp;quot;publish_monitored_planning_scene&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/include&amp;gt;&lt;br /&gt;
 # The visualization component of MoveIt!&lt;br /&gt;
 &amp;lt;include file=&amp;quot;$(find myrabot_moveit_generated)/launch/moveit_rviz.launch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Ejecutaremos el siguiente comando en un terminal para iniciar [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] con los modelos del robot y los objetos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_fer_modelo myrabot_gazebo_moveit_mesa+latas.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En otro terminal ejecutaremos el siguiente comando para iniciar [http://wiki.ros.org/rviz rviz] con el &amp;quot;Motion Planning Interface&amp;quot; de [http://moveit.ros.org/ moveIt!]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_moveit_generated moveit_planning_execution.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo podemos ver el proceso de planificación y ejecución de la trayectoria para evitar la lata que se encuentra en medio de la trayectoria de las posiciones de inicio y destino, se planifica dos veces ya que la primera vez se detecta una colisión entre el brazo y la lata. La escena representada corresponde con la captada por el sensor de percepción situado por encima de la pantalla, donde se muestra el espacio ocupado mediante cubos con una tolerancia que permita evitar colisiones.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;xf1Jz1L-Xyc&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=xf1Jz1L-Xyc Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Planificación simple con robot real==&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;controlador_moveit.launch&amp;quot; dentro del directorio &amp;quot;launch&amp;quot; del ''package'' &amp;quot;brazo_fer&amp;quot; con el siguiente contenido, para cargar el modelo del robot e iniciar el brazo con el controlador para [http://moveit.ros.org/ moveIt!]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;robot_description&amp;quot; command=&amp;quot;$(find xacro)/xacro.py '$(find myrabot_fer_modelo)/urdf/myrabot_moveit.urdf.xacro'&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;robot_state_publisher&amp;quot; pkg=&amp;quot;robot_state_publisher&amp;quot; type=&amp;quot;state_publisher&amp;quot;&amp;gt;&amp;lt;/node&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;serial_node&amp;quot; pkg=&amp;quot;rosserial_python&amp;quot; type=&amp;quot;serial_node.py&amp;quot; args=&amp;quot;/dev/ttyACM0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;joint_states_brazo&amp;quot; pkg=&amp;quot;brazo_fer&amp;quot; type=&amp;quot;joint_states_brazo&amp;quot; /&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;group ns=&amp;quot;brazo_controller&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;node name=&amp;quot;follow_joint_trajectory&amp;quot; pkg=&amp;quot;brazo_fer&amp;quot; type=&amp;quot;controlador_moveit&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;/group&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutaremos el siguiente comando en un terminal para iniciar el control del brazo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer controlador_moveit.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En otro terminal ejecutaremos el siguiente comando para iniciar [http://wiki.ros.org/rviz rviz] con el &amp;quot;Motion Planning Interface&amp;quot; de [http://moveit.ros.org/ moveIt!]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_moveit_generated moveit_planning_execution.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo puede verse la planificación y ejecución de las trayectorias, por el brazo real, para alcanzar las pociones marcadas por el modelo del robot haciendo uso de ''interactive markers'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;Kz7bKL4ZP98&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=Kz7bKL4ZP98 Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Fernando-TFM-ROS02&amp;diff=4360</id>
		<title>Fernando-TFM-ROS02</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Fernando-TFM-ROS02&amp;diff=4360"/>
				<updated>2014-11-13T12:22:58Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: /* =Calibración de odómetro y giroscopio */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* '''Project Name:''' Programas de control para el robot Turtlebot sobre ROS&lt;br /&gt;
* '''Authors:''' [http://www.fernando.casadogarcia.es Fernando Casado García]&lt;br /&gt;
* '''Academic Year:''' 2011-2012&lt;br /&gt;
* '''Degree:''' Master&lt;br /&gt;
* '''Tags:''' Turtlebot&lt;br /&gt;
* '''Technologies:''' ROS, c++&lt;br /&gt;
* '''Status:''' Finished&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Otros artículos&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;100%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Teleoperación con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Instalando ROS=&lt;br /&gt;
&lt;br /&gt;
Lo primero que necesitamos es un computador con el sistema operativo [http://www.ubuntu.com Ubuntu], que es el único soportado por [http://www.ros.org ROS], o instalarlo; otros sistemas operativos para los que está disponible solo son experimentales. Para instalar [http://www.ubuntu.com Ubuntu] en un equipo con sistema operativo windows, podemos optar entre una instalación tradicional desde un CD-ROM o USB, en una partición diferente a la de windows, o la opción más rápida y sencilla , instalarlo desde windows como si se tratara de una aplicación o programa mas.&lt;br /&gt;
&lt;br /&gt;
Provistos ya de un equipo con [http://www.ubuntu.com Ubuntu], para descargar e instalar el sistema [http://www.ros.org ROS] simplemente deberemos seguir las indicaciones de [http://www.ros.org/wiki/electric/Installation/Ubuntu instalación]. No esta de más el tomarse un tiempo realizando los [http://www.ros.org/wiki/ROS/Tutorials tutoriales] que proponen, son de gran ayuda para conocer la estructura de ficheros y el funcionamiento de ''Nodes'' y ''Topics''.&lt;br /&gt;
&lt;br /&gt;
==Instalando ''Turtlebot-desktop''==&lt;br /&gt;
&lt;br /&gt;
Con el sistema [http://www.ros.org ROS] instalado, necesitamos instalar las herramientas para desarrollo del robot [http://www.turtlebot.com Turtlebot] en el equipo de trabajo. Ejecutando el siguiente comando en un terminal comenzará la descarga e instalación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get install ros-electric-turtlebot-desktop&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es importante que el reloj del PC estación de trabajo se encuentre sincronizado con el reloj del PC robot, para prevenir las posibles perdidas de red inalámbrica. Para instalar el cliente [http://es.wikipedia.org/wiki/Network_Time_Protocol NTP] ''Chrony'' se ejecutará el siguiente comando en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get install chrony&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Instalando ''Turtlebot-robot''==&lt;br /&gt;
&lt;br /&gt;
Puede que se utilice otro equipo diferente al que suministran con el [http://www.turtlebot.com Turtlebot] o que se actualice [http://www.ubuntu.com Ubuntu] a una nueva versión, por lo que será necesario instalar la versión para el robor de [http://www.ros.org ROS]. Ejecutando el siguiente comando en un terminal comenzará la descarga e instalación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get install ros-electric-turtlebot-robot&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se necesita crear un archivo llamado “52-turtlebot.rules” en el directorio '''/etc/udev/rules.d/'''. Con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;ATTRS{idProduct}==&amp;quot;XXXX&amp;quot;,ATTRS{idVendor}==&amp;quot;XXXX&amp;quot;,MODE=&amp;quot;666&amp;quot;,GROUP=&amp;quot;turtlebot&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donde las “XXXX” corresponden a la identificación del producto y del fabricante, respectivamente, del adaptador USB de conexión con el iRobot Create. Esta información la obtiene ejecutando el siguiente comando en un terminal, con el adaptador conectado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;lsusb&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que mostrará una información similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub&lt;br /&gt;
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub&lt;br /&gt;
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub&lt;br /&gt;
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub&lt;br /&gt;
Bus 002 Device 002: ID 0a5c:2101 Broadcom Corp. Bluetooth Controller&lt;br /&gt;
Bus 003 Device 002: ID 04fc:0801 Sunplus Technology Co., Ltd &lt;br /&gt;
Bus 004 Device 002: ID 08ff:2580 AuthenTec, Inc. AES2501 Fingerprint Sensor&lt;br /&gt;
Bus 004 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donde “6001” corresponde a la identificación del producto y “0403” a la identificación del fabricante.&lt;br /&gt;
También se debe añadir el usuario, con el que hemos instalado ROS, al grupo “dialout”, para que tenga permisos sobre el puerto que se emplea para la comunicación con el iRobot Create, ttyUSB0.&lt;br /&gt;
&lt;br /&gt;
=Conociendo el Turtlebot=&lt;br /&gt;
&lt;br /&gt;
[[File:Turtlebot.png|thumb|130px|Fotografía del [http://www.turtlebot.com Turtlebot].]]&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
* [http://store.irobot.com/shop/index.jsp?categoryId=3311368 iRobot Create]&lt;br /&gt;
* Laptop ASUS 1215N &lt;br /&gt;
* Microsoft Kinect&lt;br /&gt;
* Placa de gestión de alimentación y giroscopio&lt;br /&gt;
* Cables USB de comunicaciones y alimentación&lt;br /&gt;
* Estructura de soporte de elementos&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
* Sistema operativo [http://www.ubuntu.com Ubuntu]&lt;br /&gt;
* [http://www.ros.org ROS] con ''Turtlebot-robot''&lt;br /&gt;
&lt;br /&gt;
=Conexión estación de trabajo-robot=&lt;br /&gt;
&lt;br /&gt;
==Configuración de la red==&lt;br /&gt;
&lt;br /&gt;
Lo habitual es conectar ambos equipos a una red [http://es.wikipedia.org/wiki/Wi-Fi Wi-Fi], pero puede darse que el PC estación de trabajo no disponga de un interfaz de red inalámbrica. En este caso es necesario poder conectarse a un puerto del [http://es.wikipedia.org/wiki/Router router] que provee la red [http://es.wikipedia.org/wiki/Wi-Fi Wi-Fi], para que exista una ruta de acceso entre el PC estación de trabajo y el PC robot.&lt;br /&gt;
&lt;br /&gt;
En ambos equipos, PC estación de trabajo y PC robot, se añadirá el ROS_MASTER_URI en el archivo de configuración del terminal (~/.bashrc), que apunta a la dirección IP del PC robot, que es el que ejecuta el servicio maestro. Simplemente se debe escribir el siguiente comando en un terminal, sustituyendo &amp;quot;IP_OF_TURTLEBOT&amp;quot;, por la dirección IP asignada en la red al PC robot:&lt;br /&gt;
     &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;echo export ROS_MASTER_URI=http://IP_OF_TURTLEBOT:11311 &amp;gt;&amp;gt; ~/.bashrc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se debe asignar un nombre de equipo, tanto al PC estación de trabajo como al PC robot. Este nombre será la dirección IP de cada equipo, que se almacenará en el archivo de configuración del terminal (~/.bashrc). En un terminal del PC robot se ejecutará el siguiente comando, sustituyendo &amp;quot;IP_OF_TURTLEBOT&amp;quot;, por la dirección IP asignada en la red al PC robot:&lt;br /&gt;
     &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;echo export ROS_HOSTNAME=IP_OF_TURTLEBOT &amp;gt;&amp;gt; ~/.bashrc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En un terminal del PC estación de trabajo se ejecutará el siguiente comando, sustituyendo &amp;quot;IP_OF_WORKSTATION&amp;quot;, por la dirección IP asignada en la red al PC estación de trabajo:&lt;br /&gt;
     &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;echo export ROS_HOSTNAME=IP_OF_WORKSTATION &amp;gt;&amp;gt; ~/.bashrc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Nota''': Para conocer la dirección IP, asignada en la red a un equipo, simplemente se debe ejecutar en un terminal:&lt;br /&gt;
      &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;ifconfig&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
que mostrará una información similar a esta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
      eth0      Link encap:Ethernet  direcciónHW 00:16:d4:55:85:b4  &lt;br /&gt;
                ACTIVO DIFUSIÓN MULTICAST  MTU:1500  Métrica:1&lt;br /&gt;
                Paquetes RX:0 errores:0 perdidos:0 overruns:0 frame:0&lt;br /&gt;
                Paquetes TX:0 errores:0 perdidos:0 overruns:0 carrier:0&lt;br /&gt;
                colisiones:0 long.colaTX:1000 &lt;br /&gt;
                Bytes RX:0 (0.0 B)  TX bytes:0 (0.0 B)&lt;br /&gt;
                Interrupción:44 &lt;br /&gt;
&lt;br /&gt;
      lo        Link encap:Bucle local  &lt;br /&gt;
                Direc. inet:127.0.0.1  Másc:255.0.0.0&lt;br /&gt;
                Dirección inet6: ::1/128 Alcance:Anfitrión&lt;br /&gt;
                ACTIVO BUCLE FUNCIONANDO  MTU:16436  Métrica:1&lt;br /&gt;
                Paquetes RX:64 errores:0 perdidos:0 overruns:0 frame:0&lt;br /&gt;
                Paquetes TX:64 errores:0 perdidos:0 overruns:0 carrier:0&lt;br /&gt;
                colisiones:0 long.colaTX:0 &lt;br /&gt;
                Bytes RX:5184 (5.1 KB)  TX bytes:5184 (5.1 KB)&lt;br /&gt;
&lt;br /&gt;
      wlan0     Link encap:Ethernet  direcciónHW 00:18:de:21:4b:ad  &lt;br /&gt;
                Direc. inet:192.168.1.10  Difus.:192.168.1.255  Másc:255.255.255.0&lt;br /&gt;
                Dirección inet6: fe80::218:deff:fe21:4bad/64 Alcance:Enlace&lt;br /&gt;
                ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST  MTU:1500  Métrica:1&lt;br /&gt;
                Paquetes RX:130972 errores:0 perdidos:0 overruns:0 frame:0&lt;br /&gt;
                Paquetes TX:87840 errores:0 perdidos:0 overruns:0 carrier:0&lt;br /&gt;
                colisiones:0 long.colaTX:1000 &lt;br /&gt;
                Bytes RX:169415208 (169.4 MB)  TX bytes:9379691 (9.3 MB)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Puesta en marcha==&lt;br /&gt;
&lt;br /&gt;
Con la red configurada, ya se puede proceder a la puesta en marcha del [http://www.turtlebot.com Turtlebot]. Se conectarán los cables USB de comunicación y alimentación del robot al PC robot, se encenderá el [http://store.irobot.com/shop/index.jsp?categoryId=3311368 iRobot Create] y se arrancará el PC robot.&lt;br /&gt;
&lt;br /&gt;
Las operaciones sobre el PC robot se pueden hacer directamente sobre él, pero no es la opción recomendable por comodidad de trabajo. Así que se comenzará conectando por [http://es.wikipedia.org/wiki/Secure_Shell ssh], desde el PC estación de trabajo con el PC robot. Se ejecutará el siguiente comando en un terminal en la estación de trabajo, sustituyendo &amp;quot;IP_OF_TURTLEBOT&amp;quot; por la dirección IP asignada en la red al PC robot:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;ssh turtlebot@IP_OF_TURTLEBOT&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pedirá la contraseña asignada al PC robot. Cuando se conecte el [http://es.wikipedia.org/wiki/Prompt prompt] del terminal cambiará por el del PC robot. Se puede comprobar el estado del servicio del robot, tecleando el siguiente comando en el terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo service turtlebot status&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Devolverá un mensaje diciendo que está iniciado. El servicio se inicia siempre que encendemos el PC robot, pero se puede detener y poner en marcha desde el terminal con los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo service turtlebot stop&lt;br /&gt;
sudo service turtlebot start&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En un terminal nuevo, de forma local sin conectar con el PC robot, se ejecutará la aplicación del tablero de instrumentos (dashboard) del robot. Simplemente se debe introducir este comando en el terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun turtlebot_dashboard turtlebot_dashboard&amp;amp;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aparecerá una pequeña ventana similar a esta:&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_dashboard_0.png|center]]&lt;br /&gt;
&lt;br /&gt;
La ventana del tablero de instrumentos consta de tres zonas bien diferenciadas:&lt;br /&gt;
* Diagnóstico del sistema, mensajes del sistema y modo de operación.&lt;br /&gt;
* Interruptores de los circuitos de las tres salidas digitales del [http://store.irobot.com/shop/index.jsp?categoryId=3311368 iRobot Create].&lt;br /&gt;
* Niveles de batería de el [http://store.irobot.com/shop/index.jsp?categoryId=3311368 iRobot Create] y el PC robot.&lt;br /&gt;
Si todo va bien, como en la imagen, estarán en verde los iconos de diagnostico del sistema (llave inglesa) y mensajes del sistema (nube de llamada). El modo de operación se debe poner poner en ''Full Mode'', para poder operar el robot. En los otros modos no está permitida la operación del robot, son el modo de carga (Passive Mode) y de espera (Safety Mode).&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_dashboard.png|center]]&lt;br /&gt;
&lt;br /&gt;
También se debe activar al menos el interruptor &amp;quot;1&amp;quot;, que es el que controla el circuito de alimentación de la cámara Kinect. Ahora ya esta todo listo para comenzar a operar con el robot. Para verlo en funcionamiento es recomendable probar alguna de las [http://www.ros.org/wiki/turtlebot_apps aplicaciones] de demostración.&lt;br /&gt;
&lt;br /&gt;
=Primer programa (Vuelta al mundo)=&lt;br /&gt;
&lt;br /&gt;
==Creando un espacio de trabajo==&lt;br /&gt;
&lt;br /&gt;
Lo más cómodo para trabajar es crear un directorio propio para ''stacks'' y ''packages'' en el PC estación de trabajo, ya que [http://www.ros.org ROS] tiene por defecto como directorio para ''stacks'' y ''packages'' '''/opt/ros/electric/stacks'''. Se pueden crear los nuevos ''stacks'' o ''packages'' en este directorio por defecto, pero queda más organizado y accesible de esta forma.&lt;br /&gt;
&lt;br /&gt;
El directorio se puede situar donde y con el nombre que se quiera. Se comenzará creando un directorio, por ejemplo en la carpeta personal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;mkdir ~/ros_workspace&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para que el sistema también busque ''stacks'' y ''packages'' en nuestra carpeta, se debe crear en la carpeta personal un archivo llamado &amp;quot;setup.sh&amp;quot;, con el siguiente contenido:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
source /opt/ros/electric/setup.bash&lt;br /&gt;
export ROS_ROOT=/opt/ros/electric/ros&lt;br /&gt;
export PATH=$ROS_ROOT/bin:$PATH&lt;br /&gt;
export PYTHONPATH=$ROS_ROOT/core/roslib/src:$PYTHONPATH&lt;br /&gt;
export ROS_PACKAGE_PATH=~/ros_workspace:/opt/ros/electric/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se debe añadir este nuevo archivo creado al archivo de configuración del terminal (~/.bashrc), para hacer efectiva esta modificación. Para ello se debe ejecutar el siguiente comando en un terminal:&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;echo source  ~/setup.sh &amp;gt;&amp;gt; ~/.bashrc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Creando un ''package''==&lt;br /&gt;
&lt;br /&gt;
En el directorio de trabajo creado se creará un ''package'', el cual va a depender de otros ''packages'' del sistema. Las dependencias van en función del tipo de mensajes que queremos enviar o recibir, y el lenguaje empleado en los programas. En este primer programa no se necesitan todas las dependencias, pero se usaran en los siguientes programas, por lo que las añadiremos al crear el ''package'' que va a contener los programas. Para esto se introducirá la siguiente secuencia de comandos en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;cd ~/ros_workspace&lt;br /&gt;
roscreate-pkg turtlebot_fer std_msgs turtlebot_node geometry_msgs nav_msgs sensor_msgs image_transport roscpp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se pueden añadir dependencias a un ''package'' ya creado, simplemente se debe editar el archivo &amp;quot;manifest.xml&amp;quot; que se encuentra dentro de la carpeta del ''package'' creado. El contenido del archivo &amp;quot;manifest.xml&amp;quot; es similar al siguiente, las dependencias se encuentran al final:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;package&amp;gt;&lt;br /&gt;
        &amp;lt;description brief=&amp;quot;turtlebot_fer&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
           turtlebot_fer&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/description&amp;gt;&lt;br /&gt;
        &amp;lt;author&amp;gt;FeR&amp;lt;/author&amp;gt;&lt;br /&gt;
        &amp;lt;license&amp;gt;BSD&amp;lt;/license&amp;gt;&lt;br /&gt;
        &amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;url&amp;gt;http://ros.org/wiki/turtlebot_fer&amp;lt;/url&amp;gt;&lt;br /&gt;
        &amp;lt;depend package=&amp;quot;turtlebot_node&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;depend package=&amp;quot;nav_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;depend package=&amp;quot;std_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;depend package=&amp;quot;image_transport&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;/package&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vez creado el ''package'', o modificadas las dependencias de un ''package'' existente, se debe compilar para que se hagan efectivas las dependencias. Simplemente se debe ejecutar el siguiente comando en el terminal, indicando el nombre del ''package'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosmake turtlebot_fer&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Escribiendo y compilando el programa==&lt;br /&gt;
&lt;br /&gt;
Los programas se pueden escribir en c++ o python, el escogido ha sido c++. Para la redacción del programa se puede emplear algún editor de código, como [http://www.geany.org/ Geany]. Los archivos de los programas se guardarán en la carpeta &amp;quot;src&amp;quot; del ''package'' creado, turtlebot_fer. Este primer programa, simplemente crea el ''nodo'' &amp;quot;gira&amp;quot; y publica el ''topic'' &amp;quot;cmd_vel&amp;quot;, que hace mover el robot con una velocidad de avance y de giro, describiendo un círculo, hasta que se reciba la señal de parada &amp;quot;Ctrl+C&amp;quot;. El programa es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;   //Librería de funciones del sistema ROS&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Twist.h&amp;quot;   //Librería &amp;quot;Twist&amp;quot; del package &amp;quot;geometry_msgs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
	ros::init(argc, argv, &amp;quot;gira&amp;quot;);   //Creación del nodo &amp;quot;gira&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        ros::NodeHandle n;&lt;br /&gt;
  &lt;br /&gt;
        ros::Publisher vel_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1);   //Publicación del topic &amp;quot;cmd_vel&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        geometry_msgs::Twist vel;&lt;br /&gt;
&lt;br /&gt;
        ros::Rate loop_rate(10);   //Frecuencia de realización del bucle (10 Hz)&lt;br /&gt;
  &lt;br /&gt;
        while (ros::ok())   //Bucle mientras no se reciba &amp;quot;Ctrl+C&amp;quot;&lt;br /&gt;
        {&lt;br /&gt;
	      vel.linear.x = 0.2;   //velocidad de avance&lt;br /&gt;
       	      vel.angular.z = 0.4;   //velocidad de giro&lt;br /&gt;
   &lt;br /&gt;
	      vel_pub_.publish(vel);&lt;br /&gt;
	&lt;br /&gt;
              loop_rate.sleep();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se guardará con el nombre &amp;quot;gira.cpp&amp;quot;. Para compilarlo y generar el ejecutable se debe añadir la siguiente línea de código al archivo &amp;quot;CMakeLists.txt&amp;quot; del ''package'' creado, donde indicamos el nombre para el ejecutable y la ruta y nombre del archivo a compilar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosbuild_add_executable(gira src/gira.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilar el programa hay que situarse en el directorio del ''package''. Simplemente con ejecutar la siguiente secuencia de comandos en un terminal se compilará y creará el ejecutable, siempre que no existan errores:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd turtlebot_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ejecutando el programa==&lt;br /&gt;
&lt;br /&gt;
===Simulador===&lt;br /&gt;
&lt;br /&gt;
Lo primero que hay que hacer es descargar el simulador del [http://www.turtlebot.com Turtlebot], ejecutando el siguiente comando en unterminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get install ros-electric-turtlebot-simulator&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede ejecutar primero en el simulador para salvaguardar la integridad del robot. Lo primero que se debe hacer para poder arrancar el simulador es comentar las líneas que se han añadido para la comunicación con el PC robot en el archivo &amp;quot;~/.bashrc&amp;quot;, del PC estación de trabajo, tal y como se muestra, añadiendo el símbolo &amp;quot;#&amp;quot; al principio de la línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;# export ROS_MASTER_URI=http://IP_OF_TURTLEBOT:11311&lt;br /&gt;
# export ROS_HOSTNAME=IP_OF_WORKSTATION&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se debe reiniciar la sesión de usuario para que surtan efecto los cambios. Para ejecutar el simulador del [http://www.turtlebot.com Turtlebot] simplemente se bebe ejecutar el siguiente comando en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch turtlebot_gazebo turtlebot_empty_world.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Terminada la carga aparecerá una ventana gráfica del simulador [http://gazebosim.org/ Gazebo] con un escenario vacío y el modelo 3D del robot, como se muestra en la imagen:&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_sim.png|center]]&lt;br /&gt;
&lt;br /&gt;
Se puede cambiar el punto de vista jugando con la rueda del ratón y el botón derecho. Además, se pueden añadir objetos 3D, como esferas, prismas y cilindros. Para ejecutar el programa creado ejecutamos el siguiente comando en un terminal nuevo, indicando el ''package'' donde se encuentra y el nombre del ejecutable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun turtlebot_fer gira&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si todo ha ido bien, el modelo 3D del robot comenzara a desplazarse formando un circulo, y no se detendrá hasta que reciba la señal de parada el terminal desde el que se ejecuta el programa, &amp;quot;Ctrl+C&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Robot===&lt;br /&gt;
&lt;br /&gt;
Si se han modificado las lineas para comunicación del archivo &amp;quot;~/.bashrc&amp;quot;, para ejecutar el simulador, se deben restaurar y reiniciar la sesión de usuario para que surtan efecto los cambios. Ahora se procederá a la [[#Puesta en marcha|puesta en marcha]] del robot.&lt;br /&gt;
&lt;br /&gt;
Conectado el PC estación de trabajo al PC robot, se debe [[#Creando un espacio de trabajo|crear un espacio de trabajo]] y [[#Creando un package|crear un ''package'']], al igual que en el PC estación de trabajo. Creado el espacio de trabajo y el ''package'', se copiará el programa situado en el PC estación de trabajo al PC robot, escribiendo el siguiente comando en un terminal del PC estación de trabajo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd turtlebot_fer&lt;br /&gt;
cd src&lt;br /&gt;
scp gira.cpp turtlebot@IP_OF_TURTLEBOT:/home/turtlebot/ros_workspace/turtlebot_fer/src/gira.cpp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vez copiado el archivo del programa al PC robot, para poder ser ejecutado hay que [[#Escribiendo y compilando el programa|compilarlo]] desde un terminal del PC robot. Para ejecutar el programa simplemente se debe introducir el siguiente comando en un terminal del PC robot, tomando la precaución que el robot se encuentre en un espacio lo bastante diáfano para evitar colisiones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun turtlebot_fer gira&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo puede verse el robot ejecutando el programa:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;ZY1oZWB7Vn4&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=ZY1oZWB7Vn4 Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Nota''': si se encuentra conectada al robot alguna de las fuentes de alimentación, PC robot o [http://store.irobot.com/shop/index.jsp?categoryId=3311368 iRobot Create], este no se moverá.&lt;br /&gt;
&lt;br /&gt;
=Segundo programa (Golpea y escapa)=&lt;br /&gt;
&lt;br /&gt;
Este segundo programa añade la suscripción a un ''topic'', además de la publicación. El funcionamiento es bastante simple, comenzará a avanzar en línea recta hasta que se detecte el accionamiento del parachoques del [http://store.irobot.com/shop/index.jsp?categoryId=3311368 iRobot Create], provocado por el choque con un objeto; en este momento realizará un pequeño retroceso y girará un ángulo, de sentido y magnitud aleatorios, para intentar evitar el obstáculo. No se detendrá hasta recibir la señal de parada &amp;quot;Ctrl+C&amp;quot;. El código del programa, escrito en lenguaje c++, es  el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;   //Librería de funciones del sistema ROS&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Twist.h&amp;quot;   //Librería &amp;quot;Twist&amp;quot; del package &amp;quot;geometry_msgs&amp;quot;&lt;br /&gt;
  #include &amp;quot;turtlebot_node/TurtlebotSensorState.h&amp;quot;   //Librería &amp;quot;TurtlebotSensorState&amp;quot; del package &amp;quot;turtlebot_node&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  geometry_msgs::Twist vel;   //Declaración de la variable global vel&lt;br /&gt;
  double alea;   //Declaración de la variable global alea&lt;br /&gt;
&lt;br /&gt;
  void callback(const turtlebot_node::TurtlebotSensorState&amp;amp; sen)   //Función de llamda con cada dato recibido&lt;br /&gt;
  {	&lt;br /&gt;
        ros::NodeHandle n;&lt;br /&gt;
  &lt;br /&gt;
  	ros::Publisher vel_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1);   //Publicación del topic &amp;quot;cmd_vel&amp;quot;&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Rate loop_rate(10);   //Frecuencia de realización del bucle (10 Hz)&lt;br /&gt;
			&lt;br /&gt;
        ros::Time ahora;   //Declaración de variable tipo tiempo, variable ROS&lt;br /&gt;
  	&lt;br /&gt;
  	&lt;br /&gt;
  	if (sen.bumps_wheeldrops == 0)   //Comprobación si ha habido señal del parachoques&lt;br /&gt;
  	{&lt;br /&gt;
	        ::vel.linear.x = 0.2;&lt;br /&gt;
	        ::vel.angular.z = 0.0;&lt;br /&gt;
	&lt;br /&gt;
 		vel_pub_.publish(::vel);&lt;br /&gt;
	}&lt;br /&gt;
        else&lt;br /&gt;
  	{&lt;br /&gt;
 		ahora = ros::Time::now();   //Asignación del tiempo actual a la variable ahora&lt;br /&gt;
			&lt;br /&gt;
		&lt;br /&gt;
		while (ros::Time::now() &amp;lt; (ahora + ros::Duration(0.5)))   //Bucle durante 0,5 segundos, retroceso después de choque&lt;br /&gt;
 		{&lt;br /&gt;
			::vel.linear.x = -0.2;&lt;br /&gt;
 			::vel.angular.z = 0.0;&lt;br /&gt;
	&lt;br /&gt;
			vel_pub_.publish(::vel);&lt;br /&gt;
			&lt;br /&gt;
			loop_rate.sleep();&lt;br /&gt;
 		}&lt;br /&gt;
		&lt;br /&gt;
		::alea = ((rand() %40) -20)/10;   //Asignación de valor aleatorio&lt;br /&gt;
		&lt;br /&gt;
		while (::alea == 0)   //Bucle mientras la variable aleatoria sea cero&lt;br /&gt;
		{&lt;br /&gt;
			::alea = ((rand() %40) -20)/10;	&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		ahora = ros::Time::now();   //Asignación del tiempo actual a la variable ahora&lt;br /&gt;
		&lt;br /&gt;
		while (ros::Time::now() &amp;lt; (ahora + ros::Duration(1.5)))   //Bucle durante 1,5 segundos, giro de ángulo aleatorio&lt;br /&gt;
		{&lt;br /&gt;
			::vel.linear.x = 0.0;&lt;br /&gt;
			::vel.angular.z = ::alea;&lt;br /&gt;
	&lt;br /&gt;
			vel_pub_.publish(::vel);&lt;br /&gt;
			&lt;br /&gt;
			loop_rate.sleep();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
  } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
	ros::init(argc, argv, &amp;quot;juguete_golpe&amp;quot;);   //Creación del nodo &amp;quot;juguete_golpe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
  &lt;br /&gt;
  	ros::Publisher vel_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1);   //Publicación del topic &amp;quot;cmd_vel&amp;quot;&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber odom_sub_= n.subscribe(&amp;quot;turtlebot_node/sensor_state&amp;quot;, 1, callback);  //Suscripción del topic &amp;quot;turtlebot_node/sensor_state&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
	ros::spin();   //Mantiene la suscripción al topic hasta que se reciba &amp;quot;Ctrl+C&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si se tiene ya creado el [[#Creando un espacio de trabajo|espacio de trabajo]] y el [[#Creando un package|''package'']], simplemente se debe guardar en un archivo llamado &amp;quot;juguete_golpe.cpp&amp;quot;, [[#Escribiendo y compilando el programa|compilar]] y [[#Robot|ejecutar]].&lt;br /&gt;
En el siguiente vídeo puede verse el robot ejecutando el programa:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;w7k0381Nfb8&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=w7k0381Nfb8 Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Nota''': El modelo 3D del [http://www.turtlebot.com Turtlebot] empleado en el simulador no implementa este sensor, por lo que no será posible probar el programa en el [[#Simulador|simulador]].&lt;br /&gt;
&lt;br /&gt;
=Tercer programa (Toro loco)=&lt;br /&gt;
&lt;br /&gt;
La peculiaridad de este programa es que el ''topic'' de suscripción es la imagen obtenida por la cámara Kinect. La imagen se recibe empaquetada en un array de &amp;quot;píxeles ancho x píxeles alto x 3 (componentes color rgb)&amp;quot; elementos, por defecto (640 x 480 x 3) = 921600 elementos. Los píxeles se encuentran representados en sus componentes rgb, con ese orden, comenzando en el píxel de la esquina superior izquierda, continuando por filas hasta llegar al último píxel, esquina inferior derecha de la imagen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! align = &amp;quot;center&amp;quot; colspan = &amp;quot;3&amp;quot; |Píxel 1 !! align = &amp;quot;center&amp;quot; colspan = &amp;quot;3&amp;quot; |Píxel 2 !! align = &amp;quot;center&amp;quot; colspan = &amp;quot;3&amp;quot; |Píxel 3 !! align = &amp;quot;center&amp;quot; | !! align = &amp;quot;center&amp;quot; colspan = &amp;quot;3&amp;quot; |Píxel 307200&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;red&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 100 ||bgcolor = &amp;quot;green&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot; |&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 65 ||bgcolor = &amp;quot;blue&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot; |&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 50 ||bgcolor = &amp;quot;red&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot; |&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 110 ||bgcolor = &amp;quot;green&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 63 ||bgcolor = &amp;quot;blue&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 49 ||bgcolor = &amp;quot;red&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 109 ||bgcolor = &amp;quot;green&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 65 ||bgcolor = &amp;quot;blue&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 48 ||align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;| ... ||bgcolor = &amp;quot;red&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 75 ||bgcolor = &amp;quot;green&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 98 ||bgcolor = &amp;quot;blue&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 244&lt;br /&gt;
|-&lt;br /&gt;
|align = &amp;quot;center&amp;quot;|[0] ||align = &amp;quot;center&amp;quot;|[1] ||align = &amp;quot;center&amp;quot;|[2] ||align = &amp;quot;center&amp;quot;|[3] ||align = &amp;quot;center&amp;quot;|[4] ||align = &amp;quot;center&amp;quot;|[5] ||align = &amp;quot;center&amp;quot;|[6] ||align = &amp;quot;center&amp;quot;|[7] ||align = &amp;quot;center&amp;quot;|[8] ||align = &amp;quot;center&amp;quot;| ||align = &amp;quot;center&amp;quot;|[921597] ||align = &amp;quot;center&amp;quot;|[921598] ||align = &amp;quot;center&amp;quot;|[921599] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Este tercer programa realiza el seguimiento de objetos de color rojo. Para ello analiza cada imagen píxel a píxel, contando los píxeles del lado izquierdo y del lado derecho. Cuando el número total de píxeles de tonalidades rojas es superior al 0,1 %, de los píxeles totales de la imagen, e inferior al 5 %, comienza el seguimiento hasta hacer el numero de píxeles totales cercano al 2,5 % e igual a cada lado (estos valores dependerán del tamaño del objeto). Cuando el objeto se encuentre demasiado lejos o demasiado cerca se detendrá el seguimiento. Para facilitar la calibración cada vez que se quiera modificar alguno de los parámetros del programa se creará un archivo .h, en el que estarán definidas las constantes para cada parámetro, se guardará con el nombre &amp;quot;param_sigue_rojo.h&amp;quot; y con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      #ifndef __PARAM_SIGUE_ROJO_H&lt;br /&gt;
      #define __PARAM_SIGUE_ROJO_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      #define li_red 100   //Límite inferior para canal rojo&lt;br /&gt;
      #define ls_red 255   //Límite superior para canal rojo&lt;br /&gt;
      #define li_green 0   //Límite inferior para canal verde&lt;br /&gt;
      #define ls_green 30   //Límite superior para canal verde&lt;br /&gt;
      #define li_blue 0   //Límite inferior para canal azul&lt;br /&gt;
      #define ls_blue 50   //Límite superior para canal azul&lt;br /&gt;
&lt;br /&gt;
      #define tam_min 0.001   //Porcentaje de píxeles de tonalidades rojas mínimo&lt;br /&gt;
      #define tam_max 0.05   //Porcentaje de píxeles de tonalidades rojas máximo&lt;br /&gt;
      #define tam_med 0.025   //Porcentaje de píxeles de tonalidades rojas medio&lt;br /&gt;
&lt;br /&gt;
      #define Px 0.08   //Ganancia velocidad de avance-retroceso&lt;br /&gt;
      #define Pz 1.2   //Ganancia velocidad de giro&lt;br /&gt;
&lt;br /&gt;
      #endif /*__PARAM_SIGUE_ROJO_H*/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El código del programa, escrito en lenguaje c++, es  el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;   //Librería de funciones del sistema ROS&lt;br /&gt;
  #include &amp;quot;sensor_msgs/Image.h&amp;quot;   //Librería &amp;quot;Image&amp;quot; del package &amp;quot;sensor_msgs&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Twist.h&amp;quot;   //Librería &amp;quot;Twist&amp;quot; del package &amp;quot;geometry_msgs&amp;quot;&lt;br /&gt;
  #include &amp;quot;param_sigue_rojo.h&amp;quot;   //Parámetros de ajuste&lt;br /&gt;
 &lt;br /&gt;
  geometry_msgs::Twist vel;   //Declaración de la variable global vel&lt;br /&gt;
  sensor_msgs::Image region;   //Declaración de la variable global vel&lt;br /&gt;
 &lt;br /&gt;
  void callback(const sensor_msgs::Image&amp;amp; ima)&lt;br /&gt;
  {	&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher vel_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1);   //Publicación del topic &amp;quot;cmd_vel&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
	uint pix_r;   //Declaración de variables de almacenaje valores rgb de cada píxel&lt;br /&gt;
	uint pix_g;&lt;br /&gt;
	uint pix_b;&lt;br /&gt;
	uint ancho = ima.step;   //Número de elementos de cada fila de la imagen&lt;br /&gt;
	uint tam = ima.data.size();   //Número de elementos del array&lt;br /&gt;
 &lt;br /&gt;
	double cont_izq = 0;   //Declaración e inicialización de contadores de píxeles&lt;br /&gt;
	double cont_der = 0;&lt;br /&gt;
	&lt;br /&gt;
	::region = ima;&lt;br /&gt;
	uint up;&lt;br /&gt;
	uint right;&lt;br /&gt;
	uint down;&lt;br /&gt;
	uint left;&lt;br /&gt;
 &lt;br /&gt;
	for (uint i = 0; i &amp;lt; tam; i = i + ancho)   //Filtro de regiones pequeñas o píxeles aislados&lt;br /&gt;
	{&lt;br /&gt;
		for (uint j = 0; j &amp;lt; ancho; j = j + 3)&lt;br /&gt;
		{&lt;br /&gt;
			pix_r = ima.data[i + j];&lt;br /&gt;
			pix_g = ima.data[i + j + 1];&lt;br /&gt;
			pix_b = ima.data[i + j + 2];&lt;br /&gt;
 &lt;br /&gt;
			if (pix_r &amp;gt;= li_red &amp;amp;&amp;amp; pix_r &amp;lt;= ls_red &amp;amp;&amp;amp; pix_g &amp;gt;= li_green &amp;amp;&amp;amp; pix_g &amp;lt;= ls_green &amp;amp;&amp;amp; pix_b &amp;gt;= li_blue &amp;amp;&amp;amp; pix_b &amp;lt;= ls_blue)&lt;br /&gt;
			{&lt;br /&gt;
				up = 12;&lt;br /&gt;
				if ((i/ancho) &amp;lt; 12)&lt;br /&gt;
				{&lt;br /&gt;
					up = (i/ancho);&lt;br /&gt;
				}&lt;br /&gt;
				right = 12;&lt;br /&gt;
				if (((ancho - j)/3) &amp;lt; 12)&lt;br /&gt;
				{&lt;br /&gt;
					right = ((ancho - j)/3);&lt;br /&gt;
				}&lt;br /&gt;
				down = 12;&lt;br /&gt;
				if (((tam/ancho) - (i/ancho)) &amp;lt; 12)&lt;br /&gt;
				{&lt;br /&gt;
					down = ((tam/ancho) - (i/ancho));&lt;br /&gt;
				}&lt;br /&gt;
				left = 12;&lt;br /&gt;
				if ((j/3) &amp;lt; 12)&lt;br /&gt;
				{&lt;br /&gt;
					left = (j/3);&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				uint contr = 0;&lt;br /&gt;
				&lt;br /&gt;
				for (uint k = i + j - (ancho*up) - (3*left); k &amp;lt;= (i + j + (ancho*down) - (3*left)); k = k + ancho)&lt;br /&gt;
				{	&lt;br /&gt;
					for(uint l = 0; l &amp;lt; ((3*left) + (3*right) +3); l = l + 3)&lt;br /&gt;
					{&lt;br /&gt;
						pix_r = ima.data[k + l];&lt;br /&gt;
						pix_g = ima.data[k + l + 1];&lt;br /&gt;
						pix_b = ima.data[k + l + 2];&lt;br /&gt;
 &lt;br /&gt;
					if (pix_r &amp;gt;= li_red &amp;amp;&amp;amp; pix_r &amp;lt;= ls_red &amp;amp;&amp;amp; pix_g &amp;gt;= li_green &amp;amp;&amp;amp; pix_g &amp;lt;= ls_green &amp;amp;&amp;amp; pix_b &amp;gt;= li_blue &amp;amp;&amp;amp; pix_b &amp;lt;= ls_blue)&lt;br /&gt;
					{&lt;br /&gt;
						contr++;&lt;br /&gt;
					}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if (contr &amp;gt; (625*0.5))&lt;br /&gt;
				{&lt;br /&gt;
					::region.data[i + j] = 1;&lt;br /&gt;
					::region.data[i + j + 1] = 1;&lt;br /&gt;
					::region.data[i + j + 2] = 1;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	&lt;br /&gt;
	for (uint i = 0; i &amp;lt; (tam - (ancho/2)); i = i + ancho)   //Contar píxeles tonos rojos lado izquierdo imagen&lt;br /&gt;
	{&lt;br /&gt;
		for (uint j = 0; j &amp;lt; (ancho/2); j = j + 3)&lt;br /&gt;
		{&lt;br /&gt;
			pix_r = ::region.data[i + j];&lt;br /&gt;
			pix_g = ::region.data[i + j + 1];&lt;br /&gt;
			pix_b = ::region.data[i + j + 2];&lt;br /&gt;
 &lt;br /&gt;
			if (pix_r == 1 &amp;amp;&amp;amp; pix_g == 1 &amp;amp;&amp;amp; pix_b == 1)&lt;br /&gt;
			{&lt;br /&gt;
				cont_izq++;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	for (uint i = (ancho/2); i &amp;lt; tam; i = i + ancho)   //Contar píxeles tonos rojos lado derecho imagen&lt;br /&gt;
	{&lt;br /&gt;
		for (uint j = 0; j &amp;lt; (ancho/2); j = j + 3)&lt;br /&gt;
		{&lt;br /&gt;
			pix_r = ::region.data[i + j];&lt;br /&gt;
			pix_g = ::region.data[i + j + 1];&lt;br /&gt;
			pix_b = ::region.data[i + j + 2];&lt;br /&gt;
 &lt;br /&gt;
			if (pix_r == 1 &amp;amp;&amp;amp; pix_g == 1 &amp;amp;&amp;amp; pix_b == 1)&lt;br /&gt;
			{&lt;br /&gt;
				cont_der++;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	double cont = cont_izq + cont_der;&lt;br /&gt;
 &lt;br /&gt;
	if (cont &amp;gt; ((tam/3) * tam_min) &amp;amp;&amp;amp; cont &amp;lt; ((tam/3) * tam_max))   //Comprobación si se está dentro del limite inferior y superior de píxeles&lt;br /&gt;
	{&lt;br /&gt;
		::vel.angular.z = (cont_izq - cont_der) / (::abs(cont_izq - cont_der) * Pz);   //Velocidad de giro&lt;br /&gt;
		::vel.linear.x = (((tam/3) * tam_med) - cont) / ((tam/3) * Px);   //Velocidad de avance-retroceso&lt;br /&gt;
		vel_pub_.publish(vel);&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;sigue_rojo&amp;quot;);   //Creación del nodo &amp;quot;sigue_rojo&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
	ros::Publisher vel_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1);   //Publicación del topic &amp;quot;cmd_vel&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber image_sub_= n.subscribe(&amp;quot;camera/rgb/image_color&amp;quot;, 1, callback);   //Suscripción del topic &amp;quot;camera/rgb/image_color&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
	ros::spin();   //Mantiene la suscripción al topic hasta que se reciba &amp;quot;Ctrl+C&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Nota''': Ya que la tonalidad percibida por la cámara depende de la iluminación del recinto, es necesaria una calibración de los límites de los canales RGB, para un correcto funcionamiento.&lt;br /&gt;
&lt;br /&gt;
Si se tiene ya creado el [[#Creando un espacio de trabajo|espacio de trabajo]] y el [[#Creando un package|''package'']], simplemente se debe guardar en un archivo llamado &amp;quot;sigue_rojo.cpp&amp;quot;, [[#Escribiendo y compilando el programa|compilar]] y [[#Robot|ejecutar]]. Para poner en marcha la cámara Kinect se debe lanzar en el PC robot el &amp;quot;kinect.launch&amp;quot;, ejecutando el siguiente comando en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch turtlebot_bringup kinect.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo puede verse el robot ejecutando el programa:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;LSXP9Xgl1MI&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=LSXP9Xgl1MI Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Además para la supervisión de las imagenes procesadas por el programa se ha realizado otro programa que publica el ''topic'' &amp;quot;/camara/rojo&amp;quot; con la imagen modificada, en la que los píxeles de tonalidad roja se colorean en rojo y el resto se muestra en escala de grises, con una linea divisoria de color negro en el centro. El código del programa, escrito en lenguaje c++, es  el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;   //Librería de funciones del sistema ROS&lt;br /&gt;
  #include &amp;quot;sensor_msgs/Image.h&amp;quot;   //Librería &amp;quot;Image&amp;quot; del package &amp;quot;sensor_msgs&amp;quot;&lt;br /&gt;
  #include &amp;quot;param_sigue_rojo.h&amp;quot;   //Parámetros de ajuste&lt;br /&gt;
 &lt;br /&gt;
  sensor_msgs::Image region;   //Declaración de la variable global region&lt;br /&gt;
 &lt;br /&gt;
  void callback(const sensor_msgs::Image&amp;amp; ima)&lt;br /&gt;
  {	&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
	ros::Publisher rojo_pub_=n.advertise&amp;lt;sensor_msgs::Image&amp;gt;(&amp;quot;camara/rojo&amp;quot;, 1);   //Publicación del topic &amp;quot;camara/rojo&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
	uint pix_r;   //Declaración de variables de almacenaje valores rgb de cada píxel&lt;br /&gt;
	uint pix_g;&lt;br /&gt;
	uint pix_b;&lt;br /&gt;
	uint ancho = ima.step;   //Número de elementos de cada fila de la imagen&lt;br /&gt;
	uint tam = ima.data.size();   //Número de elementos del array&lt;br /&gt;
 &lt;br /&gt;
	::region = ima;&lt;br /&gt;
	uint up;&lt;br /&gt;
	uint right;&lt;br /&gt;
	uint down;&lt;br /&gt;
	uint left;&lt;br /&gt;
 &lt;br /&gt;
	for (uint i = 0; i &amp;lt; tam; i = i + ancho)   //Filtro de regiones pequeñas o píxeles aislados&lt;br /&gt;
	{&lt;br /&gt;
		for (uint j = 0; j &amp;lt; ancho; j = j + 3)&lt;br /&gt;
		{&lt;br /&gt;
			pix_r = ima.data[i + j];&lt;br /&gt;
			pix_g = ima.data[i + j + 1];&lt;br /&gt;
			pix_b = ima.data[i + j + 2];&lt;br /&gt;
 &lt;br /&gt;
			if (pix_r &amp;gt;= li_red &amp;amp;&amp;amp; pix_r &amp;lt;= ls_red &amp;amp;&amp;amp; pix_g &amp;gt;= li_green &amp;amp;&amp;amp; pix_g &amp;lt;= ls_green &amp;amp;&amp;amp; pix_b &amp;gt;= li_blue &amp;amp;&amp;amp; pix_b &amp;lt;= ls_blue)&lt;br /&gt;
			{&lt;br /&gt;
				up = 12;&lt;br /&gt;
				if ((i/ancho) &amp;lt; 12)&lt;br /&gt;
				{&lt;br /&gt;
					up = (i/ancho);&lt;br /&gt;
				}&lt;br /&gt;
				right = 12;&lt;br /&gt;
				if (((ancho - j)/3) &amp;lt; 12)&lt;br /&gt;
				{&lt;br /&gt;
					right = ((ancho - j)/3);&lt;br /&gt;
				}&lt;br /&gt;
				down = 12;&lt;br /&gt;
				if (((tam/ancho) - (i/ancho)) &amp;lt; 12)&lt;br /&gt;
				{&lt;br /&gt;
					down = ((tam/ancho) - (i/ancho));&lt;br /&gt;
				}&lt;br /&gt;
				left = 12;&lt;br /&gt;
				if ((j/3) &amp;lt; 12)&lt;br /&gt;
				{&lt;br /&gt;
					left = (j/3);&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				uint contr = 0;&lt;br /&gt;
				&lt;br /&gt;
				for (uint k = i + j - (ancho*up) - (3*left); k &amp;lt;= (i + j + (ancho*down) - (3*left)); k = k + ancho)&lt;br /&gt;
				{	&lt;br /&gt;
					for(uint l = 0; l &amp;lt; ((3*left) + (3*right) +3); l = l + 3)&lt;br /&gt;
					{&lt;br /&gt;
						pix_r = ima.data[k + l];&lt;br /&gt;
						pix_g = ima.data[k + l + 1];&lt;br /&gt;
						pix_b = ima.data[k + l + 2];&lt;br /&gt;
 &lt;br /&gt;
					if (pix_r &amp;gt;= li_red &amp;amp;&amp;amp; pix_r &amp;lt;= ls_red &amp;amp;&amp;amp; pix_g &amp;gt;= li_green &amp;amp;&amp;amp; pix_g &amp;lt;= ls_green &amp;amp;&amp;amp; pix_b &amp;gt;= li_blue &amp;amp;&amp;amp; pix_b &amp;lt;= ls_blue)&lt;br /&gt;
					{&lt;br /&gt;
						contr++;&lt;br /&gt;
					}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if (contr &amp;gt; (625*0.5))&lt;br /&gt;
				{&lt;br /&gt;
					::region.data[i + j] = 255;&lt;br /&gt;
					::region.data[i + j + 1] = 0;&lt;br /&gt;
					::region.data[i + j + 2] = 0;&lt;br /&gt;
					&lt;br /&gt;
				}&lt;br /&gt;
				else   //Conversión a escala de grises regiones pequeñas o píxeles aislados&lt;br /&gt;
				{&lt;br /&gt;
					if (pix_r &amp;gt; pix_g)&lt;br /&gt;
					{&lt;br /&gt;
						::region.data[i + j] = pix_r;&lt;br /&gt;
						::region.data[i + j + 1] = pix_r;&lt;br /&gt;
						::region.data[i + j + 2] = pix_r;&lt;br /&gt;
					}&lt;br /&gt;
					else if (pix_g &amp;gt; pix_b)&lt;br /&gt;
					{&lt;br /&gt;
						::region.data[i + j] = pix_g;&lt;br /&gt;
						::region.data[i + j + 1] = pix_g;&lt;br /&gt;
						::region.data[i + j + 2] = pix_g;&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						::region.data[i + j] = pix_b;&lt;br /&gt;
						::region.data[i + j + 1] = pix_b;&lt;br /&gt;
						::region.data[i + j + 2] = pix_b;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			else   //Conversión a escala de grises resto píxeles&lt;br /&gt;
			{&lt;br /&gt;
				if (pix_r &amp;gt; pix_g)&lt;br /&gt;
				{&lt;br /&gt;
					::region.data[i + j] = pix_r;&lt;br /&gt;
					::region.data[i + j + 1] = pix_r;&lt;br /&gt;
					::region.data[i + j + 2] = pix_r;&lt;br /&gt;
				}&lt;br /&gt;
				else if (pix_g &amp;gt; pix_b)&lt;br /&gt;
				{&lt;br /&gt;
					::region.data[i + j] = pix_g;&lt;br /&gt;
					::region.data[i + j + 1] = pix_g;&lt;br /&gt;
					::region.data[i + j + 2] = pix_g;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::region.data[i + j] = pix_b;&lt;br /&gt;
					::region.data[i + j + 1] = pix_b;&lt;br /&gt;
					::region.data[i + j + 2] = pix_b;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for (uint i = (ancho/2)-3; i &amp;lt; tam; i = i + ancho)   //Línea negra divisoria central&lt;br /&gt;
	{&lt;br /&gt;
		for (uint j = 0; j &amp;lt; 6; j = j + 3)&lt;br /&gt;
		{&lt;br /&gt;
				::region.data[i + j] = 0;   &lt;br /&gt;
				::region.data[i + j + 1] = 0;&lt;br /&gt;
				::region.data[i + j + 2] = 0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
        rojo_pub_.publish(::region);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;visualizacion&amp;quot;);   //Creación del nodo &amp;quot;visualizacion&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher rojo_pub_=n.advertise&amp;lt;sensor_msgs::Image&amp;gt;(&amp;quot;camara/rojo&amp;quot;, 1);   //Publicación del topic &amp;quot;camara/rojo&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
        ros::Subscriber image_sub_= n.subscribe(&amp;quot;camera/rgb/image_color&amp;quot;, 1, callback);   //Suscripción del topic &amp;quot;camera/rgb/image_color&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
	ros::spin();   //Mantiene la suscripción al topic hasta que se reciba &amp;quot;Ctrl+C&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
	return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si se tiene ya creado el [[#Creando un espacio de trabajo|espacio de trabajo]] y el [[#Creando un package|''package'']], simplemente se debe guardar en un archivo llamado &amp;quot;visualizacion.cpp&amp;quot;, [[#Escribiendo y compilando el programa|compilar]] y [[#Robot|ejecutar]].&lt;br /&gt;
&lt;br /&gt;
Para poder ejecutar &amp;quot;kinect.launch&amp;quot;, &amp;quot;sigue_rojo&amp;quot; y &amp;quot;visualización&amp;quot;de forma simultanea se creará un ''launcher''. Para ello crearemos dentro de la carpeta de nuestro ''package'' una carpeta llamada &amp;quot;launch&amp;quot;, dentro de la cual crearemos un archivo llamado &amp;quot;rojo.launch&amp;quot; con el siguiente contenido:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;launch&amp;gt;&lt;br /&gt;
        &amp;lt;include file=&amp;quot;$(find turtlebot_bringup)/kinect.launch&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;node name=&amp;quot;sigue_rojo&amp;quot; pkg=&amp;quot;turtlebot_fer&amp;quot; type=&amp;quot;sigue_rojo&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;node name=&amp;quot;visualizacion&amp;quot; pkg=&amp;quot;turtlebot_fer&amp;quot; type=&amp;quot;visualizacion&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ejecutar el ''launcher'' que lanza los dos nodos, &amp;quot;sigue_rojo&amp;quot; y &amp;quot;visualización&amp;quot;, simplemente habrá que ejecutar el siguiente comando en un terminal del PC robot:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch turtlebot_fer rojo.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para poder visualizar la imagen modificada de la cámara Kinect en el PC estación de trabajo, para la supervisión. Simplemente hay que ejecutar el siguiente comando en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun image_view image_view image:=/camara/rojo&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las imágenes tendrán una tasa de frames baja y un retardo, teniendo en cuenta que simplemente son para supervisión pueden valer. Las imágenes obtenidas tendrán un aspecto similar al siguiente:&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_visualizacion.png|center]]&lt;br /&gt;
&lt;br /&gt;
=Navegación autónoma=&lt;br /&gt;
&lt;br /&gt;
==Calibración de odómetro y giroscopio==&lt;br /&gt;
&lt;br /&gt;
Para un correcto seguimiento del movimiento del robot se debe hacer una calibración de su odómetro y su giroscopio, para corregir el error que puedan cometer. Para ello colocaremos el robot frente a una pared recta, con al menos 2 metros de superficie libre, separado unos 30 centímetros de ella, como se muestra en las imágenes.&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_calibracion.png|center]]&lt;br /&gt;
&lt;br /&gt;
Para ejecutar el programa de calibración simplemente se debe ejecutar el siguiente comando en un terminal del PC robot:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch turtlebot_calibration calibrate.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalizado el proceso de calibración aparecerán los valores de corrección de escala de los parámetros ''turtlebot_node/gyro_scale_correction'' y ''turtlebot_node/odom_angular_scale_correction''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;[INFO] [WallTime: 1299286750.821002] Multiply the 'turtlebot_node/gyro_scale_correction' parameter with VALOR_CALIBRACION&lt;br /&gt;
[INFO] [WallTime: 1299286750.822427] Multiply the 'turtlebot_node/odom_angular_scale_correction' parameter with VALOR_CALIBRACION&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El nuevo valor a aplicar a los parámetros será el resultado de multiplicar el valor antiguo, por defecto 1, por el valor obtenido en la calibración. Para aplicar este nuevo valor a los parámetros de forma permanente se debe editar el archivo &amp;quot;turtlebot.launch&amp;quot;, situado en la ruta '''/etc/ros/electric''', tal como se muestra a continuación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- sample file, copy this to /etc/ros/electric/turtlebot.launch --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;param name=&amp;quot;turtlebot_node/gyro_scale_correction&amp;quot; value=&amp;quot;VALOR_ANTIGUO_x_VALOR_CALIBRACION&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;param name=&amp;quot;turtlebot_node/odom_angular_scale_correction&amp;quot; value=&amp;quot;VALOR_ANTIGUO_x_VALOR_CALIBRACION&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;include file=&amp;quot;$(find turtlebot_bringup)/minimal.launch&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;arg name=&amp;quot;urdf_file&amp;quot; value=&amp;quot;$(find xacro)/xacro.py '$(find turtlebot_description)/urdf/turtlebot.urdf.xacro'&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/include&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Nota''': El parámetro gyro_measurement_range tiene por defecto un valor de 150, el valor adecuado si el [http://www.turtlebot.com Turtlebot] es de Willow Garage, pero debe ser 250 si es de [http://www.turtlebot.com Turtlebot] de Clearpath y 300 si es de iHeartEngineering (en este caso el giroscopio tiene un rango de medida de 300). Para esto será necesario añadir otra linea al archivo &amp;quot;turtlebot.launch&amp;quot; para establecer el valor adecuado según el modelo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;param name=&amp;quot;turtlebot_node/gyro_measurement_range&amp;quot; value=&amp;quot;VALOR_SEGÚN_MODELO&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para que el cambio de valores de los parámetros sea efectivo deberemos detener, y poner en marcha de nuevo el servicio del [http://www.turtlebot.com Turtlebot], con los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo service turtlebot stop&lt;br /&gt;
sudo service turtlebot start&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Nota''': También se puede hacer una modificación dinámica de estos parámetros usando un interfaz gráfico ejecutando el siguiente comando en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun dynamic_reconfigure reconfigure_gui&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Creación del mapa==&lt;br /&gt;
&lt;br /&gt;
Para la creación del mapa se usará el stack proporcionado por [http://www.ros.org ROS] &amp;quot;slam_gmapping&amp;quot;, que contiene el package &amp;quot;gmapping&amp;quot; que implementa un método para SLAM. El archivo &amp;quot;crear_mapa.launch&amp;quot;, que se guardará en la carpeta &amp;quot;launch&amp;quot; de nuestro ''package'', tendrá el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;launch&amp;gt;&lt;br /&gt;
        &amp;lt;include file=&amp;quot;$(find turtlebot_bringup)/kinect.launch&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;arg name=&amp;quot;scan_topic&amp;quot; default=&amp;quot;scan&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;gmapping&amp;quot; type=&amp;quot;slam_gmapping&amp;quot; name=&amp;quot;slam_gmapping&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;odom_frame&amp;quot; value=&amp;quot;odom&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;map_update_interval&amp;quot; value=&amp;quot;3.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;maxUrange&amp;quot; value=&amp;quot;16.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;sigma&amp;quot; value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;kernelSize&amp;quot; value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;lstep&amp;quot; value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;astep&amp;quot; value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;iterations&amp;quot; value=&amp;quot;5&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;lsigma&amp;quot; value=&amp;quot;0.075&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;ogain&amp;quot; value=&amp;quot;3.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;lskip&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;srr&amp;quot; value=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;srt&amp;quot; value=&amp;quot;0.02&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;str&amp;quot; value=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;stt&amp;quot; value=&amp;quot;0.02&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;linearUpdate&amp;quot; value=&amp;quot;0.5&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;angularUpdate&amp;quot; value=&amp;quot;0.436&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;temporalUpdate&amp;quot; value=&amp;quot;-1.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;resampleThreshold&amp;quot; value=&amp;quot;0.5&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;particles&amp;quot; value=&amp;quot;80&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;param name=&amp;quot;xmin&amp;quot; value=&amp;quot;-1.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;ymin&amp;quot; value=&amp;quot;-1.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;xmax&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;ymax&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;param name=&amp;quot;delta&amp;quot; value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;llsamplerange&amp;quot; value=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;llsamplestep&amp;quot; value=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;lasamplerange&amp;quot; value=&amp;quot;0.005&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;lasamplestep&amp;quot; value=&amp;quot;0.005&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;remap from=&amp;quot;scan&amp;quot; to=&amp;quot;$(arg scan_topic)&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;move_base&amp;quot; type=&amp;quot;move_base&amp;quot; respawn=&amp;quot;false&amp;quot; name=&amp;quot;move_base&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/costmap_common_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; ns=&amp;quot;global_costmap&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/costmap_common_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; ns=&amp;quot;local_costmap&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/local_costmap_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/global_costmap_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/base_local_planner_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
      &amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Nota''': los archivos de configuración del ''package'' &amp;quot;move_base&amp;quot; se han obtenido del ''package'' &amp;quot;turtlebot_navigation&amp;quot;, carpeta &amp;quot;config&amp;quot;, y se han situado en nuestro ''package'' en una carpeta llamada, igualmente, &amp;quot;config&amp;quot;.&lt;br /&gt;
Para ejecutar &amp;quot;crear_mapa.launch&amp;quot;, que inicia la Kinect, &amp;quot;slam_gmaping&amp;quot; y &amp;quot;move_base&amp;quot;, se debe introducir el siguiente comando en un terminal del PC robot:&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch turtlebot_fer crear_mapa.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el desplazamiento del [http://www.turtlebot.com Turtlebot] a través del espacio a mapear se empleará el teleoperador por teclado, ejecutando en un terminal del PC robot el siguiente comando:&lt;br /&gt;
     &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch turtlebot_teleop keyboard_teleop.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Nota''': Para la correcta realización del mapa es necesario dar varias pasadas por el espacio a mapear, saliendo de un punto de partida y regresando a él para cerrar el bucle.&lt;br /&gt;
Para poder visualizar el proceso de creación del mapa, en un terminal del PC estación de trabajo se ejecutará el siguiente comando, que lanza el entorno de visualización &amp;quot;rviz&amp;quot; contenido en [http://www.ros.org ROS]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun rviz rviz -d `rospack find turtlebot_navigation`/nav_rviz.vcg&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El resultado obtenido después de varias pasadas por el entorno a mapear es el siguiente (Laboratorio F6, robótica):&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_mapa.png|center]]&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo puede verse el el proceso de creación del mapa:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;nfbD1vOdIU8&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=nfbD1vOdIU8 Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se creará una carpeta llamada &amp;quot;mapas&amp;quot; dentro de nuestro ''package'', donde se guardará el mapa con el nombre &amp;quot;labf6&amp;quot; introduciendo el siguiente comando en un terminal del PC robot:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun map_server map_saver -f /home/turtlebot/ros_workspace/turtlebot_fer/mapas/labf6&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Navegación por el entorno mapeado==&lt;br /&gt;
&lt;br /&gt;
Con el mapa ya creado, para que el robot se desplace por él se hará uso del ''stack'' proporcionado por ROS &amp;quot;navigation&amp;quot;, que contiene los ''packages'' &amp;quot;map_server&amp;quot;, &amp;quot;amcl&amp;quot; (adaptive Monte Carlo localization) y “move_base”. Cada uno de ellos, respectivamente, carga el mapa creado, ejecuta el método probabilístico de localización adaptativa Monte Carlo y planifica la ruta para ir del origen al destino dentro del mapa evitando los obstaculos.&lt;br /&gt;
El ''package'' “move_base” se encarga de la planificación de rutas, navegación global, y evitación de obstáculos, navegación local. En la siguiente imagen se muestra el diagrama de bloques de la estructura de este ''package'':&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_move_base.png|center]]&lt;br /&gt;
&lt;br /&gt;
Cuando el robot se encuentra atascado el procedimiento, por defecto, que sigue “move_base” para intentar recuperarlo es el que se muestra en la siguiente imagen, pudiendo ser modificado este comportamiento en el parámetro “recovery_behaviors”, por otro de los disponibles:&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_move_base_behabior.png|center|450px]]&lt;br /&gt;
&lt;br /&gt;
Se creará, en la carpeta &amp;quot;launch&amp;quot; de nuestro ''package'', el archivo &amp;quot;usar_mapa.launch&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;launch&amp;gt;&lt;br /&gt;
        &amp;lt;include file=&amp;quot;$(find turtlebot_bringup)/kinect.launch&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;arg name=&amp;quot;map_file&amp;quot; default=&amp;quot;$(find turtlebot_fer)/mapas/labf6.yaml&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;node name=&amp;quot;map_server&amp;quot; pkg=&amp;quot;map_server&amp;quot; type=&amp;quot;map_server&amp;quot; args=&amp;quot;$(arg map_file)&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;arg name=&amp;quot;use_map_topic&amp;quot; default=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;arg name=&amp;quot;scan_topic&amp;quot; default=&amp;quot;scan&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;amcl&amp;quot; type=&amp;quot;amcl&amp;quot; name=&amp;quot;amcl&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;use_map_topic&amp;quot; value=&amp;quot;$(arg use_map_topic)&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Publish scans from best pose at a max of 10 Hz --&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;odom_model_type&amp;quot; value=&amp;quot;diff&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;odom_alpha5&amp;quot; value=&amp;quot;0.1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;gui_publish_rate&amp;quot; value=&amp;quot;10.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_max_beams&amp;quot; value=&amp;quot;60&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_max_range&amp;quot; value=&amp;quot;12.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;min_particles&amp;quot; value=&amp;quot;500&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;max_particles&amp;quot; value=&amp;quot;2000&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;kld_err&amp;quot; value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;kld_z&amp;quot; value=&amp;quot;0.99&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;odom_alpha1&amp;quot; value=&amp;quot;0.2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;odom_alpha2&amp;quot; value=&amp;quot;0.2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;!-- translation std dev, m --&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;odom_alpha3&amp;quot; value=&amp;quot;0.2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;odom_alpha4&amp;quot; value=&amp;quot;0.2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_z_hit&amp;quot; value=&amp;quot;0.5&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_z_short&amp;quot; value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_z_max&amp;quot; value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_z_rand&amp;quot; value=&amp;quot;0.5&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_sigma_hit&amp;quot; value=&amp;quot;0.2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_lambda_short&amp;quot; value=&amp;quot;0.1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_model_type&amp;quot; value=&amp;quot;likelihood_field&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;!-- &amp;lt;param name=&amp;quot;laser_model_type&amp;quot; value=&amp;quot;beam&amp;quot;/&amp;gt; --&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_likelihood_max_dist&amp;quot; value=&amp;quot;2.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;update_min_d&amp;quot; value=&amp;quot;0.25&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;update_min_a&amp;quot; value=&amp;quot;0.2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;odom_frame_id&amp;quot; value=&amp;quot;odom&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;resample_interval&amp;quot; value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Increase tolerance because the computer can get quite busy --&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;transform_tolerance&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;recovery_alpha_slow&amp;quot; value=&amp;quot;0.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;recovery_alpha_fast&amp;quot; value=&amp;quot;0.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;remap from=&amp;quot;scan&amp;quot; to=&amp;quot;$(arg scan_topic)&amp;quot;/&amp;gt;    &lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;move_base&amp;quot; type=&amp;quot;move_base&amp;quot; respawn=&amp;quot;false&amp;quot; name=&amp;quot;move_base&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/costmap_common_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; ns=&amp;quot;global_costmap&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/costmap_common_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; ns=&amp;quot;local_costmap&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/local_costmap_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/global_costmap_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/base_local_planner_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
      &amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ejecutar &amp;quot;usar_mapa.launch&amp;quot;, que inicia la Kinect, &amp;quot;map_server&amp;quot;, &amp;quot;amcl&amp;quot; y &amp;quot;move_base&amp;quot;, se debe introducir el siguiente comando en un terminal del PC robot:&lt;br /&gt;
&lt;br /&gt;
      roslaunch turtlebot_fer usar_mapa.launch map_file:=/home/turtlebot/ros_workspace/turtlebot_fer/mapas/labf6.yaml&lt;br /&gt;
&lt;br /&gt;
Para interactuar con el robot se debe iniciar el entrono de visualización &amp;quot;rviz&amp;quot;, ejecutando el siguiente comando en un terminal del PC estación de trabajo:&lt;br /&gt;
&lt;br /&gt;
      rosrun rviz rviz -d `rospack find turtlebot_navigation`/nav_rviz.vcg&lt;br /&gt;
&lt;br /&gt;
Primero se deberá indicar la posición y orientación aproximada del robot dentro del mapa, pulsando en el botón &amp;quot;2D Pose Estimate&amp;quot; y posteriormente pulsando sobre el mapa en la posición estimada, sin soltar el botón del ratón indicar la orientación estimada y soltar. El modelo del robot se situará ahora en esta posición, rodeado por una nube de puntos en color rojo como se muestra en la imagen:&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_estimate.png|center]]&lt;br /&gt;
&lt;br /&gt;
Para indicar el punto de destino dentro del mapa, pulsando &amp;quot;2D Nav Goal&amp;quot; y posteriormente pulsando sobre el mapa en la posición de destino, sin soltar el botón del ratón se indicara la orientación final. En este momento el robot comenzará a moverse siguiendo la trayectoria calculada, línea de color verde, hasta alcanzar el punto de destino, como se muestra en la imagen:&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_goal.png|center]]&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo puede verse el el proceso de indicación de la situación estimada del robot y navegación al destino marcado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;6CLc72Llfow&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=6CLc72Llfow Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo se puede ver al [http://www.turtlebot.com Turtlebot] usando la navegación autónoma, y como esquiva un objeto no incluido en el mapa, después de ejecutar el comportamiento de recuperación tras un atascamiento, recalculando la ruta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;Sh4zswP1fVo&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=Sh4zswP1fVo Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Nota''': Para poder probar la navegación autónoma en el [[#Simulador|simulador]] es necesario añadir la siguiente línea de código al archivo &amp;quot;robot.launch&amp;quot;, situado en la ruta '''opt/ros/electric/stacks/turtlebot_simulator/turtlebot_gazebo/launch''':&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;param name=&amp;quot;output_frame&amp;quot; value=&amp;quot;odom&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta línea deberá añadirse en la ejecución del ''node'' &amp;quot;robot_pose_ekf&amp;quot;. Quedando el archivo &amp;quot;robot.launch&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;launch&amp;gt;&lt;br /&gt;
        &amp;lt;param name=&amp;quot;robot_description&amp;quot; command=&amp;quot;$(find xacro)/xacro.py '$(find turtlebot_description)/urdf/turtlebot.urdf.xacro'&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;node name=&amp;quot;spawn_turtlebot_model&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;$(optenv ROBOT_INITIAL_POSE) -unpause -urdf &lt;br /&gt;
-param robot_description -model turtlebot&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;diagnostic_aggregator&amp;quot; type=&amp;quot;aggregator_node&amp;quot; name=&amp;quot;diagnostic_aggregator&amp;quot; &amp;gt;&lt;br /&gt;
          &amp;lt;rosparam command=&amp;quot;load&amp;quot; file=&amp;quot;$(find turtlebot_bringup)/config/diagnostics.yaml&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;robot_state_publisher&amp;quot; type=&amp;quot;state_publisher&amp;quot; name=&amp;quot;robot_state_publisher&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;publish_frequency&amp;quot; type=&amp;quot;double&amp;quot; value=&amp;quot;30.0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- The odometry estimator --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;robot_pose_ekf&amp;quot; type=&amp;quot;robot_pose_ekf&amp;quot; name=&amp;quot;robot_pose_ekf&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;freq&amp;quot; value=&amp;quot;30.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;sensor_timeout&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;publish_tf&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;odom_used&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;imu_used&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;vo_used&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
      	  &amp;lt;param name=&amp;quot;output_frame&amp;quot; value=&amp;quot;odom&amp;quot;/&amp;gt; &amp;lt;!-- NUEVA LINEA --&amp;gt;&lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- throttling --&amp;gt;&lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;pointcloud_throttle&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudThrottle openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;max_rate&amp;quot; value=&amp;quot;20.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;remap from=&amp;quot;cloud_in&amp;quot; to=&amp;quot;/camera/depth/points&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;remap from=&amp;quot;cloud_out&amp;quot; to=&amp;quot;cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Fake Laser --&amp;gt;&lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;kinect_laser&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudToScan openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;output_frame_id&amp;quot; value=&amp;quot;/camera_depth_frame&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;!-- heights are in the (optical?) frame of the kinect --&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;min_height&amp;quot; value=&amp;quot;-0.15&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;max_height&amp;quot; value=&amp;quot;0.15&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;remap from=&amp;quot;cloud&amp;quot; to=&amp;quot;/cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Fake Laser (narrow one, for localization --&amp;gt;&lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;kinect_laser_narrow&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudToScan openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;output_frame_id&amp;quot; value=&amp;quot;/camera_depth_frame&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;!-- heights are in the (optical?) frame of the kinect --&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;min_height&amp;quot; value=&amp;quot;-0.025&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;max_height&amp;quot; value=&amp;quot;0.025&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;remap from=&amp;quot;cloud&amp;quot; to=&amp;quot;/cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;remap from=&amp;quot;scan&amp;quot; to=&amp;quot;/narrow_scan&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Otros artículos&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;100%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Teleoperación con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Fernando-TFM-ROS02&amp;diff=4359</id>
		<title>Fernando-TFM-ROS02</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Fernando-TFM-ROS02&amp;diff=4359"/>
				<updated>2014-11-05T16:32:10Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* '''Project Name:''' Programas de control para el robot Turtlebot sobre ROS&lt;br /&gt;
* '''Authors:''' [http://www.fernando.casadogarcia.es Fernando Casado García]&lt;br /&gt;
* '''Academic Year:''' 2011-2012&lt;br /&gt;
* '''Degree:''' Master&lt;br /&gt;
* '''Tags:''' Turtlebot&lt;br /&gt;
* '''Technologies:''' ROS, c++&lt;br /&gt;
* '''Status:''' Finished&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Otros artículos&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;100%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Teleoperación con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Instalando ROS=&lt;br /&gt;
&lt;br /&gt;
Lo primero que necesitamos es un computador con el sistema operativo [http://www.ubuntu.com Ubuntu], que es el único soportado por [http://www.ros.org ROS], o instalarlo; otros sistemas operativos para los que está disponible solo son experimentales. Para instalar [http://www.ubuntu.com Ubuntu] en un equipo con sistema operativo windows, podemos optar entre una instalación tradicional desde un CD-ROM o USB, en una partición diferente a la de windows, o la opción más rápida y sencilla , instalarlo desde windows como si se tratara de una aplicación o programa mas.&lt;br /&gt;
&lt;br /&gt;
Provistos ya de un equipo con [http://www.ubuntu.com Ubuntu], para descargar e instalar el sistema [http://www.ros.org ROS] simplemente deberemos seguir las indicaciones de [http://www.ros.org/wiki/electric/Installation/Ubuntu instalación]. No esta de más el tomarse un tiempo realizando los [http://www.ros.org/wiki/ROS/Tutorials tutoriales] que proponen, son de gran ayuda para conocer la estructura de ficheros y el funcionamiento de ''Nodes'' y ''Topics''.&lt;br /&gt;
&lt;br /&gt;
==Instalando ''Turtlebot-desktop''==&lt;br /&gt;
&lt;br /&gt;
Con el sistema [http://www.ros.org ROS] instalado, necesitamos instalar las herramientas para desarrollo del robot [http://www.turtlebot.com Turtlebot] en el equipo de trabajo. Ejecutando el siguiente comando en un terminal comenzará la descarga e instalación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get install ros-electric-turtlebot-desktop&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es importante que el reloj del PC estación de trabajo se encuentre sincronizado con el reloj del PC robot, para prevenir las posibles perdidas de red inalámbrica. Para instalar el cliente [http://es.wikipedia.org/wiki/Network_Time_Protocol NTP] ''Chrony'' se ejecutará el siguiente comando en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get install chrony&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Instalando ''Turtlebot-robot''==&lt;br /&gt;
&lt;br /&gt;
Puede que se utilice otro equipo diferente al que suministran con el [http://www.turtlebot.com Turtlebot] o que se actualice [http://www.ubuntu.com Ubuntu] a una nueva versión, por lo que será necesario instalar la versión para el robor de [http://www.ros.org ROS]. Ejecutando el siguiente comando en un terminal comenzará la descarga e instalación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get install ros-electric-turtlebot-robot&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se necesita crear un archivo llamado “52-turtlebot.rules” en el directorio '''/etc/udev/rules.d/'''. Con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;ATTRS{idProduct}==&amp;quot;XXXX&amp;quot;,ATTRS{idVendor}==&amp;quot;XXXX&amp;quot;,MODE=&amp;quot;666&amp;quot;,GROUP=&amp;quot;turtlebot&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donde las “XXXX” corresponden a la identificación del producto y del fabricante, respectivamente, del adaptador USB de conexión con el iRobot Create. Esta información la obtiene ejecutando el siguiente comando en un terminal, con el adaptador conectado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;lsusb&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que mostrará una información similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub&lt;br /&gt;
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub&lt;br /&gt;
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub&lt;br /&gt;
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub&lt;br /&gt;
Bus 002 Device 002: ID 0a5c:2101 Broadcom Corp. Bluetooth Controller&lt;br /&gt;
Bus 003 Device 002: ID 04fc:0801 Sunplus Technology Co., Ltd &lt;br /&gt;
Bus 004 Device 002: ID 08ff:2580 AuthenTec, Inc. AES2501 Fingerprint Sensor&lt;br /&gt;
Bus 004 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donde “6001” corresponde a la identificación del producto y “0403” a la identificación del fabricante.&lt;br /&gt;
También se debe añadir el usuario, con el que hemos instalado ROS, al grupo “dialout”, para que tenga permisos sobre el puerto que se emplea para la comunicación con el iRobot Create, ttyUSB0.&lt;br /&gt;
&lt;br /&gt;
=Conociendo el Turtlebot=&lt;br /&gt;
&lt;br /&gt;
[[File:Turtlebot.png|thumb|130px|Fotografía del [http://www.turtlebot.com Turtlebot].]]&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
* [http://store.irobot.com/shop/index.jsp?categoryId=3311368 iRobot Create]&lt;br /&gt;
* Laptop ASUS 1215N &lt;br /&gt;
* Microsoft Kinect&lt;br /&gt;
* Placa de gestión de alimentación y giroscopio&lt;br /&gt;
* Cables USB de comunicaciones y alimentación&lt;br /&gt;
* Estructura de soporte de elementos&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
* Sistema operativo [http://www.ubuntu.com Ubuntu]&lt;br /&gt;
* [http://www.ros.org ROS] con ''Turtlebot-robot''&lt;br /&gt;
&lt;br /&gt;
=Conexión estación de trabajo-robot=&lt;br /&gt;
&lt;br /&gt;
==Configuración de la red==&lt;br /&gt;
&lt;br /&gt;
Lo habitual es conectar ambos equipos a una red [http://es.wikipedia.org/wiki/Wi-Fi Wi-Fi], pero puede darse que el PC estación de trabajo no disponga de un interfaz de red inalámbrica. En este caso es necesario poder conectarse a un puerto del [http://es.wikipedia.org/wiki/Router router] que provee la red [http://es.wikipedia.org/wiki/Wi-Fi Wi-Fi], para que exista una ruta de acceso entre el PC estación de trabajo y el PC robot.&lt;br /&gt;
&lt;br /&gt;
En ambos equipos, PC estación de trabajo y PC robot, se añadirá el ROS_MASTER_URI en el archivo de configuración del terminal (~/.bashrc), que apunta a la dirección IP del PC robot, que es el que ejecuta el servicio maestro. Simplemente se debe escribir el siguiente comando en un terminal, sustituyendo &amp;quot;IP_OF_TURTLEBOT&amp;quot;, por la dirección IP asignada en la red al PC robot:&lt;br /&gt;
     &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;echo export ROS_MASTER_URI=http://IP_OF_TURTLEBOT:11311 &amp;gt;&amp;gt; ~/.bashrc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se debe asignar un nombre de equipo, tanto al PC estación de trabajo como al PC robot. Este nombre será la dirección IP de cada equipo, que se almacenará en el archivo de configuración del terminal (~/.bashrc). En un terminal del PC robot se ejecutará el siguiente comando, sustituyendo &amp;quot;IP_OF_TURTLEBOT&amp;quot;, por la dirección IP asignada en la red al PC robot:&lt;br /&gt;
     &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;echo export ROS_HOSTNAME=IP_OF_TURTLEBOT &amp;gt;&amp;gt; ~/.bashrc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En un terminal del PC estación de trabajo se ejecutará el siguiente comando, sustituyendo &amp;quot;IP_OF_WORKSTATION&amp;quot;, por la dirección IP asignada en la red al PC estación de trabajo:&lt;br /&gt;
     &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;echo export ROS_HOSTNAME=IP_OF_WORKSTATION &amp;gt;&amp;gt; ~/.bashrc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Nota''': Para conocer la dirección IP, asignada en la red a un equipo, simplemente se debe ejecutar en un terminal:&lt;br /&gt;
      &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;ifconfig&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
que mostrará una información similar a esta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
      eth0      Link encap:Ethernet  direcciónHW 00:16:d4:55:85:b4  &lt;br /&gt;
                ACTIVO DIFUSIÓN MULTICAST  MTU:1500  Métrica:1&lt;br /&gt;
                Paquetes RX:0 errores:0 perdidos:0 overruns:0 frame:0&lt;br /&gt;
                Paquetes TX:0 errores:0 perdidos:0 overruns:0 carrier:0&lt;br /&gt;
                colisiones:0 long.colaTX:1000 &lt;br /&gt;
                Bytes RX:0 (0.0 B)  TX bytes:0 (0.0 B)&lt;br /&gt;
                Interrupción:44 &lt;br /&gt;
&lt;br /&gt;
      lo        Link encap:Bucle local  &lt;br /&gt;
                Direc. inet:127.0.0.1  Másc:255.0.0.0&lt;br /&gt;
                Dirección inet6: ::1/128 Alcance:Anfitrión&lt;br /&gt;
                ACTIVO BUCLE FUNCIONANDO  MTU:16436  Métrica:1&lt;br /&gt;
                Paquetes RX:64 errores:0 perdidos:0 overruns:0 frame:0&lt;br /&gt;
                Paquetes TX:64 errores:0 perdidos:0 overruns:0 carrier:0&lt;br /&gt;
                colisiones:0 long.colaTX:0 &lt;br /&gt;
                Bytes RX:5184 (5.1 KB)  TX bytes:5184 (5.1 KB)&lt;br /&gt;
&lt;br /&gt;
      wlan0     Link encap:Ethernet  direcciónHW 00:18:de:21:4b:ad  &lt;br /&gt;
                Direc. inet:192.168.1.10  Difus.:192.168.1.255  Másc:255.255.255.0&lt;br /&gt;
                Dirección inet6: fe80::218:deff:fe21:4bad/64 Alcance:Enlace&lt;br /&gt;
                ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST  MTU:1500  Métrica:1&lt;br /&gt;
                Paquetes RX:130972 errores:0 perdidos:0 overruns:0 frame:0&lt;br /&gt;
                Paquetes TX:87840 errores:0 perdidos:0 overruns:0 carrier:0&lt;br /&gt;
                colisiones:0 long.colaTX:1000 &lt;br /&gt;
                Bytes RX:169415208 (169.4 MB)  TX bytes:9379691 (9.3 MB)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Puesta en marcha==&lt;br /&gt;
&lt;br /&gt;
Con la red configurada, ya se puede proceder a la puesta en marcha del [http://www.turtlebot.com Turtlebot]. Se conectarán los cables USB de comunicación y alimentación del robot al PC robot, se encenderá el [http://store.irobot.com/shop/index.jsp?categoryId=3311368 iRobot Create] y se arrancará el PC robot.&lt;br /&gt;
&lt;br /&gt;
Las operaciones sobre el PC robot se pueden hacer directamente sobre él, pero no es la opción recomendable por comodidad de trabajo. Así que se comenzará conectando por [http://es.wikipedia.org/wiki/Secure_Shell ssh], desde el PC estación de trabajo con el PC robot. Se ejecutará el siguiente comando en un terminal en la estación de trabajo, sustituyendo &amp;quot;IP_OF_TURTLEBOT&amp;quot; por la dirección IP asignada en la red al PC robot:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;ssh turtlebot@IP_OF_TURTLEBOT&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pedirá la contraseña asignada al PC robot. Cuando se conecte el [http://es.wikipedia.org/wiki/Prompt prompt] del terminal cambiará por el del PC robot. Se puede comprobar el estado del servicio del robot, tecleando el siguiente comando en el terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo service turtlebot status&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Devolverá un mensaje diciendo que está iniciado. El servicio se inicia siempre que encendemos el PC robot, pero se puede detener y poner en marcha desde el terminal con los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo service turtlebot stop&lt;br /&gt;
sudo service turtlebot start&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En un terminal nuevo, de forma local sin conectar con el PC robot, se ejecutará la aplicación del tablero de instrumentos (dashboard) del robot. Simplemente se debe introducir este comando en el terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun turtlebot_dashboard turtlebot_dashboard&amp;amp;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aparecerá una pequeña ventana similar a esta:&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_dashboard_0.png|center]]&lt;br /&gt;
&lt;br /&gt;
La ventana del tablero de instrumentos consta de tres zonas bien diferenciadas:&lt;br /&gt;
* Diagnóstico del sistema, mensajes del sistema y modo de operación.&lt;br /&gt;
* Interruptores de los circuitos de las tres salidas digitales del [http://store.irobot.com/shop/index.jsp?categoryId=3311368 iRobot Create].&lt;br /&gt;
* Niveles de batería de el [http://store.irobot.com/shop/index.jsp?categoryId=3311368 iRobot Create] y el PC robot.&lt;br /&gt;
Si todo va bien, como en la imagen, estarán en verde los iconos de diagnostico del sistema (llave inglesa) y mensajes del sistema (nube de llamada). El modo de operación se debe poner poner en ''Full Mode'', para poder operar el robot. En los otros modos no está permitida la operación del robot, son el modo de carga (Passive Mode) y de espera (Safety Mode).&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_dashboard.png|center]]&lt;br /&gt;
&lt;br /&gt;
También se debe activar al menos el interruptor &amp;quot;1&amp;quot;, que es el que controla el circuito de alimentación de la cámara Kinect. Ahora ya esta todo listo para comenzar a operar con el robot. Para verlo en funcionamiento es recomendable probar alguna de las [http://www.ros.org/wiki/turtlebot_apps aplicaciones] de demostración.&lt;br /&gt;
&lt;br /&gt;
=Primer programa (Vuelta al mundo)=&lt;br /&gt;
&lt;br /&gt;
==Creando un espacio de trabajo==&lt;br /&gt;
&lt;br /&gt;
Lo más cómodo para trabajar es crear un directorio propio para ''stacks'' y ''packages'' en el PC estación de trabajo, ya que [http://www.ros.org ROS] tiene por defecto como directorio para ''stacks'' y ''packages'' '''/opt/ros/electric/stacks'''. Se pueden crear los nuevos ''stacks'' o ''packages'' en este directorio por defecto, pero queda más organizado y accesible de esta forma.&lt;br /&gt;
&lt;br /&gt;
El directorio se puede situar donde y con el nombre que se quiera. Se comenzará creando un directorio, por ejemplo en la carpeta personal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;mkdir ~/ros_workspace&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para que el sistema también busque ''stacks'' y ''packages'' en nuestra carpeta, se debe crear en la carpeta personal un archivo llamado &amp;quot;setup.sh&amp;quot;, con el siguiente contenido:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
source /opt/ros/electric/setup.bash&lt;br /&gt;
export ROS_ROOT=/opt/ros/electric/ros&lt;br /&gt;
export PATH=$ROS_ROOT/bin:$PATH&lt;br /&gt;
export PYTHONPATH=$ROS_ROOT/core/roslib/src:$PYTHONPATH&lt;br /&gt;
export ROS_PACKAGE_PATH=~/ros_workspace:/opt/ros/electric/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se debe añadir este nuevo archivo creado al archivo de configuración del terminal (~/.bashrc), para hacer efectiva esta modificación. Para ello se debe ejecutar el siguiente comando en un terminal:&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;echo source  ~/setup.sh &amp;gt;&amp;gt; ~/.bashrc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Creando un ''package''==&lt;br /&gt;
&lt;br /&gt;
En el directorio de trabajo creado se creará un ''package'', el cual va a depender de otros ''packages'' del sistema. Las dependencias van en función del tipo de mensajes que queremos enviar o recibir, y el lenguaje empleado en los programas. En este primer programa no se necesitan todas las dependencias, pero se usaran en los siguientes programas, por lo que las añadiremos al crear el ''package'' que va a contener los programas. Para esto se introducirá la siguiente secuencia de comandos en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;cd ~/ros_workspace&lt;br /&gt;
roscreate-pkg turtlebot_fer std_msgs turtlebot_node geometry_msgs nav_msgs sensor_msgs image_transport roscpp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se pueden añadir dependencias a un ''package'' ya creado, simplemente se debe editar el archivo &amp;quot;manifest.xml&amp;quot; que se encuentra dentro de la carpeta del ''package'' creado. El contenido del archivo &amp;quot;manifest.xml&amp;quot; es similar al siguiente, las dependencias se encuentran al final:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;package&amp;gt;&lt;br /&gt;
        &amp;lt;description brief=&amp;quot;turtlebot_fer&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
           turtlebot_fer&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/description&amp;gt;&lt;br /&gt;
        &amp;lt;author&amp;gt;FeR&amp;lt;/author&amp;gt;&lt;br /&gt;
        &amp;lt;license&amp;gt;BSD&amp;lt;/license&amp;gt;&lt;br /&gt;
        &amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;url&amp;gt;http://ros.org/wiki/turtlebot_fer&amp;lt;/url&amp;gt;&lt;br /&gt;
        &amp;lt;depend package=&amp;quot;turtlebot_node&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;depend package=&amp;quot;nav_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;depend package=&amp;quot;std_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;depend package=&amp;quot;image_transport&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;/package&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vez creado el ''package'', o modificadas las dependencias de un ''package'' existente, se debe compilar para que se hagan efectivas las dependencias. Simplemente se debe ejecutar el siguiente comando en el terminal, indicando el nombre del ''package'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosmake turtlebot_fer&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Escribiendo y compilando el programa==&lt;br /&gt;
&lt;br /&gt;
Los programas se pueden escribir en c++ o python, el escogido ha sido c++. Para la redacción del programa se puede emplear algún editor de código, como [http://www.geany.org/ Geany]. Los archivos de los programas se guardarán en la carpeta &amp;quot;src&amp;quot; del ''package'' creado, turtlebot_fer. Este primer programa, simplemente crea el ''nodo'' &amp;quot;gira&amp;quot; y publica el ''topic'' &amp;quot;cmd_vel&amp;quot;, que hace mover el robot con una velocidad de avance y de giro, describiendo un círculo, hasta que se reciba la señal de parada &amp;quot;Ctrl+C&amp;quot;. El programa es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;   //Librería de funciones del sistema ROS&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Twist.h&amp;quot;   //Librería &amp;quot;Twist&amp;quot; del package &amp;quot;geometry_msgs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
	ros::init(argc, argv, &amp;quot;gira&amp;quot;);   //Creación del nodo &amp;quot;gira&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        ros::NodeHandle n;&lt;br /&gt;
  &lt;br /&gt;
        ros::Publisher vel_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1);   //Publicación del topic &amp;quot;cmd_vel&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        geometry_msgs::Twist vel;&lt;br /&gt;
&lt;br /&gt;
        ros::Rate loop_rate(10);   //Frecuencia de realización del bucle (10 Hz)&lt;br /&gt;
  &lt;br /&gt;
        while (ros::ok())   //Bucle mientras no se reciba &amp;quot;Ctrl+C&amp;quot;&lt;br /&gt;
        {&lt;br /&gt;
	      vel.linear.x = 0.2;   //velocidad de avance&lt;br /&gt;
       	      vel.angular.z = 0.4;   //velocidad de giro&lt;br /&gt;
   &lt;br /&gt;
	      vel_pub_.publish(vel);&lt;br /&gt;
	&lt;br /&gt;
              loop_rate.sleep();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se guardará con el nombre &amp;quot;gira.cpp&amp;quot;. Para compilarlo y generar el ejecutable se debe añadir la siguiente línea de código al archivo &amp;quot;CMakeLists.txt&amp;quot; del ''package'' creado, donde indicamos el nombre para el ejecutable y la ruta y nombre del archivo a compilar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosbuild_add_executable(gira src/gira.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilar el programa hay que situarse en el directorio del ''package''. Simplemente con ejecutar la siguiente secuencia de comandos en un terminal se compilará y creará el ejecutable, siempre que no existan errores:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd turtlebot_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ejecutando el programa==&lt;br /&gt;
&lt;br /&gt;
===Simulador===&lt;br /&gt;
&lt;br /&gt;
Lo primero que hay que hacer es descargar el simulador del [http://www.turtlebot.com Turtlebot], ejecutando el siguiente comando en unterminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get install ros-electric-turtlebot-simulator&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede ejecutar primero en el simulador para salvaguardar la integridad del robot. Lo primero que se debe hacer para poder arrancar el simulador es comentar las líneas que se han añadido para la comunicación con el PC robot en el archivo &amp;quot;~/.bashrc&amp;quot;, del PC estación de trabajo, tal y como se muestra, añadiendo el símbolo &amp;quot;#&amp;quot; al principio de la línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;# export ROS_MASTER_URI=http://IP_OF_TURTLEBOT:11311&lt;br /&gt;
# export ROS_HOSTNAME=IP_OF_WORKSTATION&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se debe reiniciar la sesión de usuario para que surtan efecto los cambios. Para ejecutar el simulador del [http://www.turtlebot.com Turtlebot] simplemente se bebe ejecutar el siguiente comando en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch turtlebot_gazebo turtlebot_empty_world.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Terminada la carga aparecerá una ventana gráfica del simulador [http://gazebosim.org/ Gazebo] con un escenario vacío y el modelo 3D del robot, como se muestra en la imagen:&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_sim.png|center]]&lt;br /&gt;
&lt;br /&gt;
Se puede cambiar el punto de vista jugando con la rueda del ratón y el botón derecho. Además, se pueden añadir objetos 3D, como esferas, prismas y cilindros. Para ejecutar el programa creado ejecutamos el siguiente comando en un terminal nuevo, indicando el ''package'' donde se encuentra y el nombre del ejecutable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun turtlebot_fer gira&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si todo ha ido bien, el modelo 3D del robot comenzara a desplazarse formando un circulo, y no se detendrá hasta que reciba la señal de parada el terminal desde el que se ejecuta el programa, &amp;quot;Ctrl+C&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Robot===&lt;br /&gt;
&lt;br /&gt;
Si se han modificado las lineas para comunicación del archivo &amp;quot;~/.bashrc&amp;quot;, para ejecutar el simulador, se deben restaurar y reiniciar la sesión de usuario para que surtan efecto los cambios. Ahora se procederá a la [[#Puesta en marcha|puesta en marcha]] del robot.&lt;br /&gt;
&lt;br /&gt;
Conectado el PC estación de trabajo al PC robot, se debe [[#Creando un espacio de trabajo|crear un espacio de trabajo]] y [[#Creando un package|crear un ''package'']], al igual que en el PC estación de trabajo. Creado el espacio de trabajo y el ''package'', se copiará el programa situado en el PC estación de trabajo al PC robot, escribiendo el siguiente comando en un terminal del PC estación de trabajo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd turtlebot_fer&lt;br /&gt;
cd src&lt;br /&gt;
scp gira.cpp turtlebot@IP_OF_TURTLEBOT:/home/turtlebot/ros_workspace/turtlebot_fer/src/gira.cpp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vez copiado el archivo del programa al PC robot, para poder ser ejecutado hay que [[#Escribiendo y compilando el programa|compilarlo]] desde un terminal del PC robot. Para ejecutar el programa simplemente se debe introducir el siguiente comando en un terminal del PC robot, tomando la precaución que el robot se encuentre en un espacio lo bastante diáfano para evitar colisiones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun turtlebot_fer gira&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo puede verse el robot ejecutando el programa:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;ZY1oZWB7Vn4&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=ZY1oZWB7Vn4 Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Nota''': si se encuentra conectada al robot alguna de las fuentes de alimentación, PC robot o [http://store.irobot.com/shop/index.jsp?categoryId=3311368 iRobot Create], este no se moverá.&lt;br /&gt;
&lt;br /&gt;
=Segundo programa (Golpea y escapa)=&lt;br /&gt;
&lt;br /&gt;
Este segundo programa añade la suscripción a un ''topic'', además de la publicación. El funcionamiento es bastante simple, comenzará a avanzar en línea recta hasta que se detecte el accionamiento del parachoques del [http://store.irobot.com/shop/index.jsp?categoryId=3311368 iRobot Create], provocado por el choque con un objeto; en este momento realizará un pequeño retroceso y girará un ángulo, de sentido y magnitud aleatorios, para intentar evitar el obstáculo. No se detendrá hasta recibir la señal de parada &amp;quot;Ctrl+C&amp;quot;. El código del programa, escrito en lenguaje c++, es  el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;   //Librería de funciones del sistema ROS&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Twist.h&amp;quot;   //Librería &amp;quot;Twist&amp;quot; del package &amp;quot;geometry_msgs&amp;quot;&lt;br /&gt;
  #include &amp;quot;turtlebot_node/TurtlebotSensorState.h&amp;quot;   //Librería &amp;quot;TurtlebotSensorState&amp;quot; del package &amp;quot;turtlebot_node&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  geometry_msgs::Twist vel;   //Declaración de la variable global vel&lt;br /&gt;
  double alea;   //Declaración de la variable global alea&lt;br /&gt;
&lt;br /&gt;
  void callback(const turtlebot_node::TurtlebotSensorState&amp;amp; sen)   //Función de llamda con cada dato recibido&lt;br /&gt;
  {	&lt;br /&gt;
        ros::NodeHandle n;&lt;br /&gt;
  &lt;br /&gt;
  	ros::Publisher vel_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1);   //Publicación del topic &amp;quot;cmd_vel&amp;quot;&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Rate loop_rate(10);   //Frecuencia de realización del bucle (10 Hz)&lt;br /&gt;
			&lt;br /&gt;
        ros::Time ahora;   //Declaración de variable tipo tiempo, variable ROS&lt;br /&gt;
  	&lt;br /&gt;
  	&lt;br /&gt;
  	if (sen.bumps_wheeldrops == 0)   //Comprobación si ha habido señal del parachoques&lt;br /&gt;
  	{&lt;br /&gt;
	        ::vel.linear.x = 0.2;&lt;br /&gt;
	        ::vel.angular.z = 0.0;&lt;br /&gt;
	&lt;br /&gt;
 		vel_pub_.publish(::vel);&lt;br /&gt;
	}&lt;br /&gt;
        else&lt;br /&gt;
  	{&lt;br /&gt;
 		ahora = ros::Time::now();   //Asignación del tiempo actual a la variable ahora&lt;br /&gt;
			&lt;br /&gt;
		&lt;br /&gt;
		while (ros::Time::now() &amp;lt; (ahora + ros::Duration(0.5)))   //Bucle durante 0,5 segundos, retroceso después de choque&lt;br /&gt;
 		{&lt;br /&gt;
			::vel.linear.x = -0.2;&lt;br /&gt;
 			::vel.angular.z = 0.0;&lt;br /&gt;
	&lt;br /&gt;
			vel_pub_.publish(::vel);&lt;br /&gt;
			&lt;br /&gt;
			loop_rate.sleep();&lt;br /&gt;
 		}&lt;br /&gt;
		&lt;br /&gt;
		::alea = ((rand() %40) -20)/10;   //Asignación de valor aleatorio&lt;br /&gt;
		&lt;br /&gt;
		while (::alea == 0)   //Bucle mientras la variable aleatoria sea cero&lt;br /&gt;
		{&lt;br /&gt;
			::alea = ((rand() %40) -20)/10;	&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		ahora = ros::Time::now();   //Asignación del tiempo actual a la variable ahora&lt;br /&gt;
		&lt;br /&gt;
		while (ros::Time::now() &amp;lt; (ahora + ros::Duration(1.5)))   //Bucle durante 1,5 segundos, giro de ángulo aleatorio&lt;br /&gt;
		{&lt;br /&gt;
			::vel.linear.x = 0.0;&lt;br /&gt;
			::vel.angular.z = ::alea;&lt;br /&gt;
	&lt;br /&gt;
			vel_pub_.publish(::vel);&lt;br /&gt;
			&lt;br /&gt;
			loop_rate.sleep();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
  } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
	ros::init(argc, argv, &amp;quot;juguete_golpe&amp;quot;);   //Creación del nodo &amp;quot;juguete_golpe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
  &lt;br /&gt;
  	ros::Publisher vel_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1);   //Publicación del topic &amp;quot;cmd_vel&amp;quot;&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber odom_sub_= n.subscribe(&amp;quot;turtlebot_node/sensor_state&amp;quot;, 1, callback);  //Suscripción del topic &amp;quot;turtlebot_node/sensor_state&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
	ros::spin();   //Mantiene la suscripción al topic hasta que se reciba &amp;quot;Ctrl+C&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si se tiene ya creado el [[#Creando un espacio de trabajo|espacio de trabajo]] y el [[#Creando un package|''package'']], simplemente se debe guardar en un archivo llamado &amp;quot;juguete_golpe.cpp&amp;quot;, [[#Escribiendo y compilando el programa|compilar]] y [[#Robot|ejecutar]].&lt;br /&gt;
En el siguiente vídeo puede verse el robot ejecutando el programa:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;w7k0381Nfb8&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=w7k0381Nfb8 Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Nota''': El modelo 3D del [http://www.turtlebot.com Turtlebot] empleado en el simulador no implementa este sensor, por lo que no será posible probar el programa en el [[#Simulador|simulador]].&lt;br /&gt;
&lt;br /&gt;
=Tercer programa (Toro loco)=&lt;br /&gt;
&lt;br /&gt;
La peculiaridad de este programa es que el ''topic'' de suscripción es la imagen obtenida por la cámara Kinect. La imagen se recibe empaquetada en un array de &amp;quot;píxeles ancho x píxeles alto x 3 (componentes color rgb)&amp;quot; elementos, por defecto (640 x 480 x 3) = 921600 elementos. Los píxeles se encuentran representados en sus componentes rgb, con ese orden, comenzando en el píxel de la esquina superior izquierda, continuando por filas hasta llegar al último píxel, esquina inferior derecha de la imagen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! align = &amp;quot;center&amp;quot; colspan = &amp;quot;3&amp;quot; |Píxel 1 !! align = &amp;quot;center&amp;quot; colspan = &amp;quot;3&amp;quot; |Píxel 2 !! align = &amp;quot;center&amp;quot; colspan = &amp;quot;3&amp;quot; |Píxel 3 !! align = &amp;quot;center&amp;quot; | !! align = &amp;quot;center&amp;quot; colspan = &amp;quot;3&amp;quot; |Píxel 307200&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;red&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 100 ||bgcolor = &amp;quot;green&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot; |&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 65 ||bgcolor = &amp;quot;blue&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot; |&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 50 ||bgcolor = &amp;quot;red&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot; |&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 110 ||bgcolor = &amp;quot;green&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 63 ||bgcolor = &amp;quot;blue&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 49 ||bgcolor = &amp;quot;red&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 109 ||bgcolor = &amp;quot;green&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 65 ||bgcolor = &amp;quot;blue&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 48 ||align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;| ... ||bgcolor = &amp;quot;red&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 75 ||bgcolor = &amp;quot;green&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 98 ||bgcolor = &amp;quot;blue&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;40px&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot; &amp;gt; 244&lt;br /&gt;
|-&lt;br /&gt;
|align = &amp;quot;center&amp;quot;|[0] ||align = &amp;quot;center&amp;quot;|[1] ||align = &amp;quot;center&amp;quot;|[2] ||align = &amp;quot;center&amp;quot;|[3] ||align = &amp;quot;center&amp;quot;|[4] ||align = &amp;quot;center&amp;quot;|[5] ||align = &amp;quot;center&amp;quot;|[6] ||align = &amp;quot;center&amp;quot;|[7] ||align = &amp;quot;center&amp;quot;|[8] ||align = &amp;quot;center&amp;quot;| ||align = &amp;quot;center&amp;quot;|[921597] ||align = &amp;quot;center&amp;quot;|[921598] ||align = &amp;quot;center&amp;quot;|[921599] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Este tercer programa realiza el seguimiento de objetos de color rojo. Para ello analiza cada imagen píxel a píxel, contando los píxeles del lado izquierdo y del lado derecho. Cuando el número total de píxeles de tonalidades rojas es superior al 0,1 %, de los píxeles totales de la imagen, e inferior al 5 %, comienza el seguimiento hasta hacer el numero de píxeles totales cercano al 2,5 % e igual a cada lado (estos valores dependerán del tamaño del objeto). Cuando el objeto se encuentre demasiado lejos o demasiado cerca se detendrá el seguimiento. Para facilitar la calibración cada vez que se quiera modificar alguno de los parámetros del programa se creará un archivo .h, en el que estarán definidas las constantes para cada parámetro, se guardará con el nombre &amp;quot;param_sigue_rojo.h&amp;quot; y con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      #ifndef __PARAM_SIGUE_ROJO_H&lt;br /&gt;
      #define __PARAM_SIGUE_ROJO_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      #define li_red 100   //Límite inferior para canal rojo&lt;br /&gt;
      #define ls_red 255   //Límite superior para canal rojo&lt;br /&gt;
      #define li_green 0   //Límite inferior para canal verde&lt;br /&gt;
      #define ls_green 30   //Límite superior para canal verde&lt;br /&gt;
      #define li_blue 0   //Límite inferior para canal azul&lt;br /&gt;
      #define ls_blue 50   //Límite superior para canal azul&lt;br /&gt;
&lt;br /&gt;
      #define tam_min 0.001   //Porcentaje de píxeles de tonalidades rojas mínimo&lt;br /&gt;
      #define tam_max 0.05   //Porcentaje de píxeles de tonalidades rojas máximo&lt;br /&gt;
      #define tam_med 0.025   //Porcentaje de píxeles de tonalidades rojas medio&lt;br /&gt;
&lt;br /&gt;
      #define Px 0.08   //Ganancia velocidad de avance-retroceso&lt;br /&gt;
      #define Pz 1.2   //Ganancia velocidad de giro&lt;br /&gt;
&lt;br /&gt;
      #endif /*__PARAM_SIGUE_ROJO_H*/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El código del programa, escrito en lenguaje c++, es  el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;   //Librería de funciones del sistema ROS&lt;br /&gt;
  #include &amp;quot;sensor_msgs/Image.h&amp;quot;   //Librería &amp;quot;Image&amp;quot; del package &amp;quot;sensor_msgs&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Twist.h&amp;quot;   //Librería &amp;quot;Twist&amp;quot; del package &amp;quot;geometry_msgs&amp;quot;&lt;br /&gt;
  #include &amp;quot;param_sigue_rojo.h&amp;quot;   //Parámetros de ajuste&lt;br /&gt;
 &lt;br /&gt;
  geometry_msgs::Twist vel;   //Declaración de la variable global vel&lt;br /&gt;
  sensor_msgs::Image region;   //Declaración de la variable global vel&lt;br /&gt;
 &lt;br /&gt;
  void callback(const sensor_msgs::Image&amp;amp; ima)&lt;br /&gt;
  {	&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher vel_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1);   //Publicación del topic &amp;quot;cmd_vel&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
	uint pix_r;   //Declaración de variables de almacenaje valores rgb de cada píxel&lt;br /&gt;
	uint pix_g;&lt;br /&gt;
	uint pix_b;&lt;br /&gt;
	uint ancho = ima.step;   //Número de elementos de cada fila de la imagen&lt;br /&gt;
	uint tam = ima.data.size();   //Número de elementos del array&lt;br /&gt;
 &lt;br /&gt;
	double cont_izq = 0;   //Declaración e inicialización de contadores de píxeles&lt;br /&gt;
	double cont_der = 0;&lt;br /&gt;
	&lt;br /&gt;
	::region = ima;&lt;br /&gt;
	uint up;&lt;br /&gt;
	uint right;&lt;br /&gt;
	uint down;&lt;br /&gt;
	uint left;&lt;br /&gt;
 &lt;br /&gt;
	for (uint i = 0; i &amp;lt; tam; i = i + ancho)   //Filtro de regiones pequeñas o píxeles aislados&lt;br /&gt;
	{&lt;br /&gt;
		for (uint j = 0; j &amp;lt; ancho; j = j + 3)&lt;br /&gt;
		{&lt;br /&gt;
			pix_r = ima.data[i + j];&lt;br /&gt;
			pix_g = ima.data[i + j + 1];&lt;br /&gt;
			pix_b = ima.data[i + j + 2];&lt;br /&gt;
 &lt;br /&gt;
			if (pix_r &amp;gt;= li_red &amp;amp;&amp;amp; pix_r &amp;lt;= ls_red &amp;amp;&amp;amp; pix_g &amp;gt;= li_green &amp;amp;&amp;amp; pix_g &amp;lt;= ls_green &amp;amp;&amp;amp; pix_b &amp;gt;= li_blue &amp;amp;&amp;amp; pix_b &amp;lt;= ls_blue)&lt;br /&gt;
			{&lt;br /&gt;
				up = 12;&lt;br /&gt;
				if ((i/ancho) &amp;lt; 12)&lt;br /&gt;
				{&lt;br /&gt;
					up = (i/ancho);&lt;br /&gt;
				}&lt;br /&gt;
				right = 12;&lt;br /&gt;
				if (((ancho - j)/3) &amp;lt; 12)&lt;br /&gt;
				{&lt;br /&gt;
					right = ((ancho - j)/3);&lt;br /&gt;
				}&lt;br /&gt;
				down = 12;&lt;br /&gt;
				if (((tam/ancho) - (i/ancho)) &amp;lt; 12)&lt;br /&gt;
				{&lt;br /&gt;
					down = ((tam/ancho) - (i/ancho));&lt;br /&gt;
				}&lt;br /&gt;
				left = 12;&lt;br /&gt;
				if ((j/3) &amp;lt; 12)&lt;br /&gt;
				{&lt;br /&gt;
					left = (j/3);&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				uint contr = 0;&lt;br /&gt;
				&lt;br /&gt;
				for (uint k = i + j - (ancho*up) - (3*left); k &amp;lt;= (i + j + (ancho*down) - (3*left)); k = k + ancho)&lt;br /&gt;
				{	&lt;br /&gt;
					for(uint l = 0; l &amp;lt; ((3*left) + (3*right) +3); l = l + 3)&lt;br /&gt;
					{&lt;br /&gt;
						pix_r = ima.data[k + l];&lt;br /&gt;
						pix_g = ima.data[k + l + 1];&lt;br /&gt;
						pix_b = ima.data[k + l + 2];&lt;br /&gt;
 &lt;br /&gt;
					if (pix_r &amp;gt;= li_red &amp;amp;&amp;amp; pix_r &amp;lt;= ls_red &amp;amp;&amp;amp; pix_g &amp;gt;= li_green &amp;amp;&amp;amp; pix_g &amp;lt;= ls_green &amp;amp;&amp;amp; pix_b &amp;gt;= li_blue &amp;amp;&amp;amp; pix_b &amp;lt;= ls_blue)&lt;br /&gt;
					{&lt;br /&gt;
						contr++;&lt;br /&gt;
					}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if (contr &amp;gt; (625*0.5))&lt;br /&gt;
				{&lt;br /&gt;
					::region.data[i + j] = 1;&lt;br /&gt;
					::region.data[i + j + 1] = 1;&lt;br /&gt;
					::region.data[i + j + 2] = 1;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	&lt;br /&gt;
	for (uint i = 0; i &amp;lt; (tam - (ancho/2)); i = i + ancho)   //Contar píxeles tonos rojos lado izquierdo imagen&lt;br /&gt;
	{&lt;br /&gt;
		for (uint j = 0; j &amp;lt; (ancho/2); j = j + 3)&lt;br /&gt;
		{&lt;br /&gt;
			pix_r = ::region.data[i + j];&lt;br /&gt;
			pix_g = ::region.data[i + j + 1];&lt;br /&gt;
			pix_b = ::region.data[i + j + 2];&lt;br /&gt;
 &lt;br /&gt;
			if (pix_r == 1 &amp;amp;&amp;amp; pix_g == 1 &amp;amp;&amp;amp; pix_b == 1)&lt;br /&gt;
			{&lt;br /&gt;
				cont_izq++;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	for (uint i = (ancho/2); i &amp;lt; tam; i = i + ancho)   //Contar píxeles tonos rojos lado derecho imagen&lt;br /&gt;
	{&lt;br /&gt;
		for (uint j = 0; j &amp;lt; (ancho/2); j = j + 3)&lt;br /&gt;
		{&lt;br /&gt;
			pix_r = ::region.data[i + j];&lt;br /&gt;
			pix_g = ::region.data[i + j + 1];&lt;br /&gt;
			pix_b = ::region.data[i + j + 2];&lt;br /&gt;
 &lt;br /&gt;
			if (pix_r == 1 &amp;amp;&amp;amp; pix_g == 1 &amp;amp;&amp;amp; pix_b == 1)&lt;br /&gt;
			{&lt;br /&gt;
				cont_der++;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	double cont = cont_izq + cont_der;&lt;br /&gt;
 &lt;br /&gt;
	if (cont &amp;gt; ((tam/3) * tam_min) &amp;amp;&amp;amp; cont &amp;lt; ((tam/3) * tam_max))   //Comprobación si se está dentro del limite inferior y superior de píxeles&lt;br /&gt;
	{&lt;br /&gt;
		::vel.angular.z = (cont_izq - cont_der) / (::abs(cont_izq - cont_der) * Pz);   //Velocidad de giro&lt;br /&gt;
		::vel.linear.x = (((tam/3) * tam_med) - cont) / ((tam/3) * Px);   //Velocidad de avance-retroceso&lt;br /&gt;
		vel_pub_.publish(vel);&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;sigue_rojo&amp;quot;);   //Creación del nodo &amp;quot;sigue_rojo&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
	ros::Publisher vel_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1);   //Publicación del topic &amp;quot;cmd_vel&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber image_sub_= n.subscribe(&amp;quot;camera/rgb/image_color&amp;quot;, 1, callback);   //Suscripción del topic &amp;quot;camera/rgb/image_color&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
	ros::spin();   //Mantiene la suscripción al topic hasta que se reciba &amp;quot;Ctrl+C&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Nota''': Ya que la tonalidad percibida por la cámara depende de la iluminación del recinto, es necesaria una calibración de los límites de los canales RGB, para un correcto funcionamiento.&lt;br /&gt;
&lt;br /&gt;
Si se tiene ya creado el [[#Creando un espacio de trabajo|espacio de trabajo]] y el [[#Creando un package|''package'']], simplemente se debe guardar en un archivo llamado &amp;quot;sigue_rojo.cpp&amp;quot;, [[#Escribiendo y compilando el programa|compilar]] y [[#Robot|ejecutar]]. Para poner en marcha la cámara Kinect se debe lanzar en el PC robot el &amp;quot;kinect.launch&amp;quot;, ejecutando el siguiente comando en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch turtlebot_bringup kinect.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo puede verse el robot ejecutando el programa:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;LSXP9Xgl1MI&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=LSXP9Xgl1MI Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Además para la supervisión de las imagenes procesadas por el programa se ha realizado otro programa que publica el ''topic'' &amp;quot;/camara/rojo&amp;quot; con la imagen modificada, en la que los píxeles de tonalidad roja se colorean en rojo y el resto se muestra en escala de grises, con una linea divisoria de color negro en el centro. El código del programa, escrito en lenguaje c++, es  el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;   //Librería de funciones del sistema ROS&lt;br /&gt;
  #include &amp;quot;sensor_msgs/Image.h&amp;quot;   //Librería &amp;quot;Image&amp;quot; del package &amp;quot;sensor_msgs&amp;quot;&lt;br /&gt;
  #include &amp;quot;param_sigue_rojo.h&amp;quot;   //Parámetros de ajuste&lt;br /&gt;
 &lt;br /&gt;
  sensor_msgs::Image region;   //Declaración de la variable global region&lt;br /&gt;
 &lt;br /&gt;
  void callback(const sensor_msgs::Image&amp;amp; ima)&lt;br /&gt;
  {	&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
	ros::Publisher rojo_pub_=n.advertise&amp;lt;sensor_msgs::Image&amp;gt;(&amp;quot;camara/rojo&amp;quot;, 1);   //Publicación del topic &amp;quot;camara/rojo&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
	uint pix_r;   //Declaración de variables de almacenaje valores rgb de cada píxel&lt;br /&gt;
	uint pix_g;&lt;br /&gt;
	uint pix_b;&lt;br /&gt;
	uint ancho = ima.step;   //Número de elementos de cada fila de la imagen&lt;br /&gt;
	uint tam = ima.data.size();   //Número de elementos del array&lt;br /&gt;
 &lt;br /&gt;
	::region = ima;&lt;br /&gt;
	uint up;&lt;br /&gt;
	uint right;&lt;br /&gt;
	uint down;&lt;br /&gt;
	uint left;&lt;br /&gt;
 &lt;br /&gt;
	for (uint i = 0; i &amp;lt; tam; i = i + ancho)   //Filtro de regiones pequeñas o píxeles aislados&lt;br /&gt;
	{&lt;br /&gt;
		for (uint j = 0; j &amp;lt; ancho; j = j + 3)&lt;br /&gt;
		{&lt;br /&gt;
			pix_r = ima.data[i + j];&lt;br /&gt;
			pix_g = ima.data[i + j + 1];&lt;br /&gt;
			pix_b = ima.data[i + j + 2];&lt;br /&gt;
 &lt;br /&gt;
			if (pix_r &amp;gt;= li_red &amp;amp;&amp;amp; pix_r &amp;lt;= ls_red &amp;amp;&amp;amp; pix_g &amp;gt;= li_green &amp;amp;&amp;amp; pix_g &amp;lt;= ls_green &amp;amp;&amp;amp; pix_b &amp;gt;= li_blue &amp;amp;&amp;amp; pix_b &amp;lt;= ls_blue)&lt;br /&gt;
			{&lt;br /&gt;
				up = 12;&lt;br /&gt;
				if ((i/ancho) &amp;lt; 12)&lt;br /&gt;
				{&lt;br /&gt;
					up = (i/ancho);&lt;br /&gt;
				}&lt;br /&gt;
				right = 12;&lt;br /&gt;
				if (((ancho - j)/3) &amp;lt; 12)&lt;br /&gt;
				{&lt;br /&gt;
					right = ((ancho - j)/3);&lt;br /&gt;
				}&lt;br /&gt;
				down = 12;&lt;br /&gt;
				if (((tam/ancho) - (i/ancho)) &amp;lt; 12)&lt;br /&gt;
				{&lt;br /&gt;
					down = ((tam/ancho) - (i/ancho));&lt;br /&gt;
				}&lt;br /&gt;
				left = 12;&lt;br /&gt;
				if ((j/3) &amp;lt; 12)&lt;br /&gt;
				{&lt;br /&gt;
					left = (j/3);&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				uint contr = 0;&lt;br /&gt;
				&lt;br /&gt;
				for (uint k = i + j - (ancho*up) - (3*left); k &amp;lt;= (i + j + (ancho*down) - (3*left)); k = k + ancho)&lt;br /&gt;
				{	&lt;br /&gt;
					for(uint l = 0; l &amp;lt; ((3*left) + (3*right) +3); l = l + 3)&lt;br /&gt;
					{&lt;br /&gt;
						pix_r = ima.data[k + l];&lt;br /&gt;
						pix_g = ima.data[k + l + 1];&lt;br /&gt;
						pix_b = ima.data[k + l + 2];&lt;br /&gt;
 &lt;br /&gt;
					if (pix_r &amp;gt;= li_red &amp;amp;&amp;amp; pix_r &amp;lt;= ls_red &amp;amp;&amp;amp; pix_g &amp;gt;= li_green &amp;amp;&amp;amp; pix_g &amp;lt;= ls_green &amp;amp;&amp;amp; pix_b &amp;gt;= li_blue &amp;amp;&amp;amp; pix_b &amp;lt;= ls_blue)&lt;br /&gt;
					{&lt;br /&gt;
						contr++;&lt;br /&gt;
					}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if (contr &amp;gt; (625*0.5))&lt;br /&gt;
				{&lt;br /&gt;
					::region.data[i + j] = 255;&lt;br /&gt;
					::region.data[i + j + 1] = 0;&lt;br /&gt;
					::region.data[i + j + 2] = 0;&lt;br /&gt;
					&lt;br /&gt;
				}&lt;br /&gt;
				else   //Conversión a escala de grises regiones pequeñas o píxeles aislados&lt;br /&gt;
				{&lt;br /&gt;
					if (pix_r &amp;gt; pix_g)&lt;br /&gt;
					{&lt;br /&gt;
						::region.data[i + j] = pix_r;&lt;br /&gt;
						::region.data[i + j + 1] = pix_r;&lt;br /&gt;
						::region.data[i + j + 2] = pix_r;&lt;br /&gt;
					}&lt;br /&gt;
					else if (pix_g &amp;gt; pix_b)&lt;br /&gt;
					{&lt;br /&gt;
						::region.data[i + j] = pix_g;&lt;br /&gt;
						::region.data[i + j + 1] = pix_g;&lt;br /&gt;
						::region.data[i + j + 2] = pix_g;&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						::region.data[i + j] = pix_b;&lt;br /&gt;
						::region.data[i + j + 1] = pix_b;&lt;br /&gt;
						::region.data[i + j + 2] = pix_b;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			else   //Conversión a escala de grises resto píxeles&lt;br /&gt;
			{&lt;br /&gt;
				if (pix_r &amp;gt; pix_g)&lt;br /&gt;
				{&lt;br /&gt;
					::region.data[i + j] = pix_r;&lt;br /&gt;
					::region.data[i + j + 1] = pix_r;&lt;br /&gt;
					::region.data[i + j + 2] = pix_r;&lt;br /&gt;
				}&lt;br /&gt;
				else if (pix_g &amp;gt; pix_b)&lt;br /&gt;
				{&lt;br /&gt;
					::region.data[i + j] = pix_g;&lt;br /&gt;
					::region.data[i + j + 1] = pix_g;&lt;br /&gt;
					::region.data[i + j + 2] = pix_g;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::region.data[i + j] = pix_b;&lt;br /&gt;
					::region.data[i + j + 1] = pix_b;&lt;br /&gt;
					::region.data[i + j + 2] = pix_b;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for (uint i = (ancho/2)-3; i &amp;lt; tam; i = i + ancho)   //Línea negra divisoria central&lt;br /&gt;
	{&lt;br /&gt;
		for (uint j = 0; j &amp;lt; 6; j = j + 3)&lt;br /&gt;
		{&lt;br /&gt;
				::region.data[i + j] = 0;   &lt;br /&gt;
				::region.data[i + j + 1] = 0;&lt;br /&gt;
				::region.data[i + j + 2] = 0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
        rojo_pub_.publish(::region);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;visualizacion&amp;quot;);   //Creación del nodo &amp;quot;visualizacion&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher rojo_pub_=n.advertise&amp;lt;sensor_msgs::Image&amp;gt;(&amp;quot;camara/rojo&amp;quot;, 1);   //Publicación del topic &amp;quot;camara/rojo&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
        ros::Subscriber image_sub_= n.subscribe(&amp;quot;camera/rgb/image_color&amp;quot;, 1, callback);   //Suscripción del topic &amp;quot;camera/rgb/image_color&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
	ros::spin();   //Mantiene la suscripción al topic hasta que se reciba &amp;quot;Ctrl+C&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
	return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si se tiene ya creado el [[#Creando un espacio de trabajo|espacio de trabajo]] y el [[#Creando un package|''package'']], simplemente se debe guardar en un archivo llamado &amp;quot;visualizacion.cpp&amp;quot;, [[#Escribiendo y compilando el programa|compilar]] y [[#Robot|ejecutar]].&lt;br /&gt;
&lt;br /&gt;
Para poder ejecutar &amp;quot;kinect.launch&amp;quot;, &amp;quot;sigue_rojo&amp;quot; y &amp;quot;visualización&amp;quot;de forma simultanea se creará un ''launcher''. Para ello crearemos dentro de la carpeta de nuestro ''package'' una carpeta llamada &amp;quot;launch&amp;quot;, dentro de la cual crearemos un archivo llamado &amp;quot;rojo.launch&amp;quot; con el siguiente contenido:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;launch&amp;gt;&lt;br /&gt;
        &amp;lt;include file=&amp;quot;$(find turtlebot_bringup)/kinect.launch&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;node name=&amp;quot;sigue_rojo&amp;quot; pkg=&amp;quot;turtlebot_fer&amp;quot; type=&amp;quot;sigue_rojo&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;node name=&amp;quot;visualizacion&amp;quot; pkg=&amp;quot;turtlebot_fer&amp;quot; type=&amp;quot;visualizacion&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ejecutar el ''launcher'' que lanza los dos nodos, &amp;quot;sigue_rojo&amp;quot; y &amp;quot;visualización&amp;quot;, simplemente habrá que ejecutar el siguiente comando en un terminal del PC robot:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch turtlebot_fer rojo.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para poder visualizar la imagen modificada de la cámara Kinect en el PC estación de trabajo, para la supervisión. Simplemente hay que ejecutar el siguiente comando en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun image_view image_view image:=/camara/rojo&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las imágenes tendrán una tasa de frames baja y un retardo, teniendo en cuenta que simplemente son para supervisión pueden valer. Las imágenes obtenidas tendrán un aspecto similar al siguiente:&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_visualizacion.png|center]]&lt;br /&gt;
&lt;br /&gt;
=Navegación autónoma=&lt;br /&gt;
&lt;br /&gt;
==Calibración de odómetro y giroscopio=&lt;br /&gt;
&lt;br /&gt;
Para un correcto seguimiento del movimiento del robot se debe hacer una calibración de su odómetro y su giroscopio, para corregir el error que puedan cometer. Para ello colocaremos el robot frente a una pared recta, con al menos 2 metros de superficie libre, separado unos 30 centímetros de ella, como se muestra en las imágenes.&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_calibracion.png|center]]&lt;br /&gt;
&lt;br /&gt;
Para ejecutar el programa de calibración simplemente se debe ejecutar el siguiente comando en un terminal del PC robot:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch turtlebot_calibration calibrate.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalizado el proceso de calibración aparecerán los valores de corrección de escala de los parámetros ''turtlebot_node/gyro_scale_correction'' y ''turtlebot_node/odom_angular_scale_correction''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;[INFO] [WallTime: 1299286750.821002] Multiply the 'turtlebot_node/gyro_scale_correction' parameter with VALOR_CALIBRACION&lt;br /&gt;
[INFO] [WallTime: 1299286750.822427] Multiply the 'turtlebot_node/odom_angular_scale_correction' parameter with VALOR_CALIBRACION&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El nuevo valor a aplicar a los parámetros será el resultado de multiplicar el valor antiguo, por defecto 1, por el valor obtenido en la calibración. Para aplicar este nuevo valor a los parámetros de forma permanente se debe editar el archivo &amp;quot;turtlebot.launch&amp;quot;, situado en la ruta '''/etc/ros/electric''', tal como se muestra a continuación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- sample file, copy this to /etc/ros/electric/turtlebot.launch --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;param name=&amp;quot;turtlebot_node/gyro_scale_correction&amp;quot; value=&amp;quot;VALOR_ANTIGUO_x_VALOR_CALIBRACION&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;param name=&amp;quot;turtlebot_node/odom_angular_scale_correction&amp;quot; value=&amp;quot;VALOR_ANTIGUO_x_VALOR_CALIBRACION&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;include file=&amp;quot;$(find turtlebot_bringup)/minimal.launch&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;arg name=&amp;quot;urdf_file&amp;quot; value=&amp;quot;$(find xacro)/xacro.py '$(find turtlebot_description)/urdf/turtlebot.urdf.xacro'&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/include&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Nota''': El parámetro gyro_measurement_range tiene por defecto un valor de 150, el valor adecuado si el [http://www.turtlebot.com Turtlebot] es de Willow Garage, pero debe ser 250 si es de [http://www.turtlebot.com Turtlebot] de Clearpath y 300 si es de iHeartEngineering (en este caso el giroscopio tiene un rango de medida de 300). Para esto será necesario añadir otra linea al archivo &amp;quot;turtlebot.launch&amp;quot; para establecer el valor adecuado según el modelo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;param name=&amp;quot;turtlebot_node/gyro_measurement_range&amp;quot; value=&amp;quot;VALOR_SEGÚN_MODELO&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para que el cambio de valores de los parámetros sea efectivo deberemos detener, y poner en marcha de nuevo el servicio del [http://www.turtlebot.com Turtlebot], con los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo service turtlebot stop&lt;br /&gt;
sudo service turtlebot start&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Nota''': También se puede hacer una modificación dinámica de estos parámetros usando un interfaz gráfico ejecutando el siguiente comando en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun dynamic_reconfigure reconfigure_gui&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Creación del mapa==&lt;br /&gt;
&lt;br /&gt;
Para la creación del mapa se usará el stack proporcionado por [http://www.ros.org ROS] &amp;quot;slam_gmapping&amp;quot;, que contiene el package &amp;quot;gmapping&amp;quot; que implementa un método para SLAM. El archivo &amp;quot;crear_mapa.launch&amp;quot;, que se guardará en la carpeta &amp;quot;launch&amp;quot; de nuestro ''package'', tendrá el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;launch&amp;gt;&lt;br /&gt;
        &amp;lt;include file=&amp;quot;$(find turtlebot_bringup)/kinect.launch&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;arg name=&amp;quot;scan_topic&amp;quot; default=&amp;quot;scan&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;gmapping&amp;quot; type=&amp;quot;slam_gmapping&amp;quot; name=&amp;quot;slam_gmapping&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;odom_frame&amp;quot; value=&amp;quot;odom&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;map_update_interval&amp;quot; value=&amp;quot;3.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;maxUrange&amp;quot; value=&amp;quot;16.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;sigma&amp;quot; value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;kernelSize&amp;quot; value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;lstep&amp;quot; value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;astep&amp;quot; value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;iterations&amp;quot; value=&amp;quot;5&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;lsigma&amp;quot; value=&amp;quot;0.075&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;ogain&amp;quot; value=&amp;quot;3.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;lskip&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;srr&amp;quot; value=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;srt&amp;quot; value=&amp;quot;0.02&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;str&amp;quot; value=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;stt&amp;quot; value=&amp;quot;0.02&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;linearUpdate&amp;quot; value=&amp;quot;0.5&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;angularUpdate&amp;quot; value=&amp;quot;0.436&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;temporalUpdate&amp;quot; value=&amp;quot;-1.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;resampleThreshold&amp;quot; value=&amp;quot;0.5&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;particles&amp;quot; value=&amp;quot;80&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;param name=&amp;quot;xmin&amp;quot; value=&amp;quot;-1.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;ymin&amp;quot; value=&amp;quot;-1.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;xmax&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;ymax&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;param name=&amp;quot;delta&amp;quot; value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;llsamplerange&amp;quot; value=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;llsamplestep&amp;quot; value=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;lasamplerange&amp;quot; value=&amp;quot;0.005&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;lasamplestep&amp;quot; value=&amp;quot;0.005&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;remap from=&amp;quot;scan&amp;quot; to=&amp;quot;$(arg scan_topic)&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;move_base&amp;quot; type=&amp;quot;move_base&amp;quot; respawn=&amp;quot;false&amp;quot; name=&amp;quot;move_base&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/costmap_common_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; ns=&amp;quot;global_costmap&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/costmap_common_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; ns=&amp;quot;local_costmap&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/local_costmap_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/global_costmap_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/base_local_planner_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
      &amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Nota''': los archivos de configuración del ''package'' &amp;quot;move_base&amp;quot; se han obtenido del ''package'' &amp;quot;turtlebot_navigation&amp;quot;, carpeta &amp;quot;config&amp;quot;, y se han situado en nuestro ''package'' en una carpeta llamada, igualmente, &amp;quot;config&amp;quot;.&lt;br /&gt;
Para ejecutar &amp;quot;crear_mapa.launch&amp;quot;, que inicia la Kinect, &amp;quot;slam_gmaping&amp;quot; y &amp;quot;move_base&amp;quot;, se debe introducir el siguiente comando en un terminal del PC robot:&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch turtlebot_fer crear_mapa.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el desplazamiento del [http://www.turtlebot.com Turtlebot] a través del espacio a mapear se empleará el teleoperador por teclado, ejecutando en un terminal del PC robot el siguiente comando:&lt;br /&gt;
     &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch turtlebot_teleop keyboard_teleop.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Nota''': Para la correcta realización del mapa es necesario dar varias pasadas por el espacio a mapear, saliendo de un punto de partida y regresando a él para cerrar el bucle.&lt;br /&gt;
Para poder visualizar el proceso de creación del mapa, en un terminal del PC estación de trabajo se ejecutará el siguiente comando, que lanza el entorno de visualización &amp;quot;rviz&amp;quot; contenido en [http://www.ros.org ROS]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun rviz rviz -d `rospack find turtlebot_navigation`/nav_rviz.vcg&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El resultado obtenido después de varias pasadas por el entorno a mapear es el siguiente (Laboratorio F6, robótica):&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_mapa.png|center]]&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo puede verse el el proceso de creación del mapa:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;nfbD1vOdIU8&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=nfbD1vOdIU8 Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se creará una carpeta llamada &amp;quot;mapas&amp;quot; dentro de nuestro ''package'', donde se guardará el mapa con el nombre &amp;quot;labf6&amp;quot; introduciendo el siguiente comando en un terminal del PC robot:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun map_server map_saver -f /home/turtlebot/ros_workspace/turtlebot_fer/mapas/labf6&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Navegación por el entorno mapeado==&lt;br /&gt;
&lt;br /&gt;
Con el mapa ya creado, para que el robot se desplace por él se hará uso del ''stack'' proporcionado por ROS &amp;quot;navigation&amp;quot;, que contiene los ''packages'' &amp;quot;map_server&amp;quot;, &amp;quot;amcl&amp;quot; (adaptive Monte Carlo localization) y “move_base”. Cada uno de ellos, respectivamente, carga el mapa creado, ejecuta el método probabilístico de localización adaptativa Monte Carlo y planifica la ruta para ir del origen al destino dentro del mapa evitando los obstaculos.&lt;br /&gt;
El ''package'' “move_base” se encarga de la planificación de rutas, navegación global, y evitación de obstáculos, navegación local. En la siguiente imagen se muestra el diagrama de bloques de la estructura de este ''package'':&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_move_base.png|center]]&lt;br /&gt;
&lt;br /&gt;
Cuando el robot se encuentra atascado el procedimiento, por defecto, que sigue “move_base” para intentar recuperarlo es el que se muestra en la siguiente imagen, pudiendo ser modificado este comportamiento en el parámetro “recovery_behaviors”, por otro de los disponibles:&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_move_base_behabior.png|center|450px]]&lt;br /&gt;
&lt;br /&gt;
Se creará, en la carpeta &amp;quot;launch&amp;quot; de nuestro ''package'', el archivo &amp;quot;usar_mapa.launch&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;launch&amp;gt;&lt;br /&gt;
        &amp;lt;include file=&amp;quot;$(find turtlebot_bringup)/kinect.launch&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;arg name=&amp;quot;map_file&amp;quot; default=&amp;quot;$(find turtlebot_fer)/mapas/labf6.yaml&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;node name=&amp;quot;map_server&amp;quot; pkg=&amp;quot;map_server&amp;quot; type=&amp;quot;map_server&amp;quot; args=&amp;quot;$(arg map_file)&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;arg name=&amp;quot;use_map_topic&amp;quot; default=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;arg name=&amp;quot;scan_topic&amp;quot; default=&amp;quot;scan&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;amcl&amp;quot; type=&amp;quot;amcl&amp;quot; name=&amp;quot;amcl&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;use_map_topic&amp;quot; value=&amp;quot;$(arg use_map_topic)&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Publish scans from best pose at a max of 10 Hz --&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;odom_model_type&amp;quot; value=&amp;quot;diff&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;odom_alpha5&amp;quot; value=&amp;quot;0.1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;gui_publish_rate&amp;quot; value=&amp;quot;10.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_max_beams&amp;quot; value=&amp;quot;60&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_max_range&amp;quot; value=&amp;quot;12.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;min_particles&amp;quot; value=&amp;quot;500&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;max_particles&amp;quot; value=&amp;quot;2000&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;kld_err&amp;quot; value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;kld_z&amp;quot; value=&amp;quot;0.99&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;odom_alpha1&amp;quot; value=&amp;quot;0.2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;odom_alpha2&amp;quot; value=&amp;quot;0.2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;!-- translation std dev, m --&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;odom_alpha3&amp;quot; value=&amp;quot;0.2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;odom_alpha4&amp;quot; value=&amp;quot;0.2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_z_hit&amp;quot; value=&amp;quot;0.5&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_z_short&amp;quot; value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_z_max&amp;quot; value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_z_rand&amp;quot; value=&amp;quot;0.5&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_sigma_hit&amp;quot; value=&amp;quot;0.2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_lambda_short&amp;quot; value=&amp;quot;0.1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_model_type&amp;quot; value=&amp;quot;likelihood_field&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;!-- &amp;lt;param name=&amp;quot;laser_model_type&amp;quot; value=&amp;quot;beam&amp;quot;/&amp;gt; --&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;laser_likelihood_max_dist&amp;quot; value=&amp;quot;2.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;update_min_d&amp;quot; value=&amp;quot;0.25&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;update_min_a&amp;quot; value=&amp;quot;0.2&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;odom_frame_id&amp;quot; value=&amp;quot;odom&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;resample_interval&amp;quot; value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Increase tolerance because the computer can get quite busy --&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;transform_tolerance&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;recovery_alpha_slow&amp;quot; value=&amp;quot;0.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;recovery_alpha_fast&amp;quot; value=&amp;quot;0.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;remap from=&amp;quot;scan&amp;quot; to=&amp;quot;$(arg scan_topic)&amp;quot;/&amp;gt;    &lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;move_base&amp;quot; type=&amp;quot;move_base&amp;quot; respawn=&amp;quot;false&amp;quot; name=&amp;quot;move_base&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/costmap_common_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; ns=&amp;quot;global_costmap&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/costmap_common_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; ns=&amp;quot;local_costmap&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/local_costmap_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/global_costmap_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;rosparam file=&amp;quot;$(find turtlebot_fer)/config/base_local_planner_params.yaml&amp;quot; command=&amp;quot;load&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
      &amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ejecutar &amp;quot;usar_mapa.launch&amp;quot;, que inicia la Kinect, &amp;quot;map_server&amp;quot;, &amp;quot;amcl&amp;quot; y &amp;quot;move_base&amp;quot;, se debe introducir el siguiente comando en un terminal del PC robot:&lt;br /&gt;
&lt;br /&gt;
      roslaunch turtlebot_fer usar_mapa.launch map_file:=/home/turtlebot/ros_workspace/turtlebot_fer/mapas/labf6.yaml&lt;br /&gt;
&lt;br /&gt;
Para interactuar con el robot se debe iniciar el entrono de visualización &amp;quot;rviz&amp;quot;, ejecutando el siguiente comando en un terminal del PC estación de trabajo:&lt;br /&gt;
&lt;br /&gt;
      rosrun rviz rviz -d `rospack find turtlebot_navigation`/nav_rviz.vcg&lt;br /&gt;
&lt;br /&gt;
Primero se deberá indicar la posición y orientación aproximada del robot dentro del mapa, pulsando en el botón &amp;quot;2D Pose Estimate&amp;quot; y posteriormente pulsando sobre el mapa en la posición estimada, sin soltar el botón del ratón indicar la orientación estimada y soltar. El modelo del robot se situará ahora en esta posición, rodeado por una nube de puntos en color rojo como se muestra en la imagen:&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_estimate.png|center]]&lt;br /&gt;
&lt;br /&gt;
Para indicar el punto de destino dentro del mapa, pulsando &amp;quot;2D Nav Goal&amp;quot; y posteriormente pulsando sobre el mapa en la posición de destino, sin soltar el botón del ratón se indicara la orientación final. En este momento el robot comenzará a moverse siguiendo la trayectoria calculada, línea de color verde, hasta alcanzar el punto de destino, como se muestra en la imagen:&lt;br /&gt;
&lt;br /&gt;
[[file:turtlebot_goal.png|center]]&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo puede verse el el proceso de indicación de la situación estimada del robot y navegación al destino marcado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;6CLc72Llfow&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=6CLc72Llfow Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo se puede ver al [http://www.turtlebot.com Turtlebot] usando la navegación autónoma, y como esquiva un objeto no incluido en el mapa, después de ejecutar el comportamiento de recuperación tras un atascamiento, recalculando la ruta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;Sh4zswP1fVo&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=Sh4zswP1fVo Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Nota''': Para poder probar la navegación autónoma en el [[#Simulador|simulador]] es necesario añadir la siguiente línea de código al archivo &amp;quot;robot.launch&amp;quot;, situado en la ruta '''opt/ros/electric/stacks/turtlebot_simulator/turtlebot_gazebo/launch''':&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;param name=&amp;quot;output_frame&amp;quot; value=&amp;quot;odom&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta línea deberá añadirse en la ejecución del ''node'' &amp;quot;robot_pose_ekf&amp;quot;. Quedando el archivo &amp;quot;robot.launch&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;launch&amp;gt;&lt;br /&gt;
        &amp;lt;param name=&amp;quot;robot_description&amp;quot; command=&amp;quot;$(find xacro)/xacro.py '$(find turtlebot_description)/urdf/turtlebot.urdf.xacro'&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;node name=&amp;quot;spawn_turtlebot_model&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;$(optenv ROBOT_INITIAL_POSE) -unpause -urdf &lt;br /&gt;
-param robot_description -model turtlebot&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;diagnostic_aggregator&amp;quot; type=&amp;quot;aggregator_node&amp;quot; name=&amp;quot;diagnostic_aggregator&amp;quot; &amp;gt;&lt;br /&gt;
          &amp;lt;rosparam command=&amp;quot;load&amp;quot; file=&amp;quot;$(find turtlebot_bringup)/config/diagnostics.yaml&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;robot_state_publisher&amp;quot; type=&amp;quot;state_publisher&amp;quot; name=&amp;quot;robot_state_publisher&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;publish_frequency&amp;quot; type=&amp;quot;double&amp;quot; value=&amp;quot;30.0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- The odometry estimator --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;robot_pose_ekf&amp;quot; type=&amp;quot;robot_pose_ekf&amp;quot; name=&amp;quot;robot_pose_ekf&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;freq&amp;quot; value=&amp;quot;30.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;sensor_timeout&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;publish_tf&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;odom_used&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;imu_used&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;vo_used&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
      	  &amp;lt;param name=&amp;quot;output_frame&amp;quot; value=&amp;quot;odom&amp;quot;/&amp;gt; &amp;lt;!-- NUEVA LINEA --&amp;gt;&lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- throttling --&amp;gt;&lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;pointcloud_throttle&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudThrottle openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;max_rate&amp;quot; value=&amp;quot;20.0&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;remap from=&amp;quot;cloud_in&amp;quot; to=&amp;quot;/camera/depth/points&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;remap from=&amp;quot;cloud_out&amp;quot; to=&amp;quot;cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Fake Laser --&amp;gt;&lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;kinect_laser&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudToScan openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;output_frame_id&amp;quot; value=&amp;quot;/camera_depth_frame&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;!-- heights are in the (optical?) frame of the kinect --&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;min_height&amp;quot; value=&amp;quot;-0.15&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;max_height&amp;quot; value=&amp;quot;0.15&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;remap from=&amp;quot;cloud&amp;quot; to=&amp;quot;/cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Fake Laser (narrow one, for localization --&amp;gt;&lt;br /&gt;
        &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;kinect_laser_narrow&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudToScan openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;output_frame_id&amp;quot; value=&amp;quot;/camera_depth_frame&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;!-- heights are in the (optical?) frame of the kinect --&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;min_height&amp;quot; value=&amp;quot;-0.025&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;param name=&amp;quot;max_height&amp;quot; value=&amp;quot;0.025&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;remap from=&amp;quot;cloud&amp;quot; to=&amp;quot;/cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;remap from=&amp;quot;scan&amp;quot; to=&amp;quot;/narrow_scan&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Otros artículos&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;100%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Teleoperación con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_Teleoperation_with_xbox360_wireless_controller_(xbox360_controller%2bjoy)&amp;diff=4358</id>
		<title>CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_Teleoperation_with_xbox360_wireless_controller_(xbox360_controller%2bjoy)&amp;diff=4358"/>
				<updated>2014-10-28T19:32:21Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Teleoperation of CeRVaNTeS=&lt;br /&gt;
&lt;br /&gt;
We need a teleoperation system in order to take the control of the robot to make specific tasks. Currently we use the [http://es.wikipedia.org/wiki/Secure_Shell ssh] connection between the robot PC and our PC, using the keyboard. This method use a [http://es.wikipedia.org/wiki/Wi-Fi wifi] network that can fail or not available. For this reason the best option is to use a device plugged in to the PC robot with its own network. The well-chosen device is the [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows xbox360 wireless controller of microsoft].&lt;br /&gt;
&lt;br /&gt;
=xbox360 controller=&lt;br /&gt;
&lt;br /&gt;
==Description of buttons and axes==&lt;br /&gt;
&lt;br /&gt;
This controller has 6 axes and 14 buttons that are distributed like is shown below:&lt;br /&gt;
&lt;br /&gt;
* Left pad: 2 axes and 1 button.&lt;br /&gt;
* Right pad: 2 axes and 1 button.&lt;br /&gt;
* Left trigger: 1 axe.&lt;br /&gt;
* Right trigger: 1 axe.&lt;br /&gt;
* Cross: 4 buttons.&lt;br /&gt;
* Left side buttons: 4 buttons.&lt;br /&gt;
* Left button: 1 button.&lt;br /&gt;
* Right button: 1 button.&lt;br /&gt;
* &amp;quot;Back&amp;quot; button: 1 button.&lt;br /&gt;
* &amp;quot;Start&amp;quot; button: 1 button.&lt;br /&gt;
&lt;br /&gt;
The function assigned to the buttons and axes of the [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows xbox360 controller] for teleoperation of CeRVaNTeS is shown in the next picture:&lt;br /&gt;
&lt;br /&gt;
[[file:xbox360_control-CeRVaNTeS-EN.jpg|thumb|center|800px|Funcionalidad [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows xbox360 controller] for CeRVaNTeS.]]&lt;br /&gt;
&lt;br /&gt;
==Program==&lt;br /&gt;
&lt;br /&gt;
The program assigns the function to the buttons and axes. The program subscribes to the ''topic'' &amp;quot;joy&amp;quot; where is published the state of the buttons and axes and publishes the ''topics'' &amp;quot;Base_Control&amp;quot; and &amp;quot;Group_Motor_Control&amp;quot; for the control of the base and the [[CeRVaNTeS' arm control (maxon+epos2)|arm]]. We have to execute the next command in a terminal in order to create a new ''package'' named &amp;quot;cervantes_teleop&amp;quot; within our catkin workspace:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;catkin_create_pkg cervantes_teleop cervantes_epos_manager geometry_msgs sensor_msgs tf tf_conversions std_msgs moveit_core moveit_ros_perception moveit_ros_planning_interface ros_cpp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a new file named &amp;quot;teleop_xbox360.cpp&amp;quot; within the folder &amp;quot;src&amp;quot; of the created ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cpp enclose=div&amp;gt;&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;  &lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/GroupEPOSControl.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/EPOSControl.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/GroupMotorInfo.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/MotorInfo.h&amp;gt;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Pose.h&amp;quot;&lt;br /&gt;
  #include &amp;lt;tf/transform_listener.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;tf_conversions/tf_eigen.h&amp;gt;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;sensor_msgs/JointState.h&amp;quot;    &lt;br /&gt;
  #include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  // MoveIt!&lt;br /&gt;
  #include &amp;lt;moveit/robot_model_loader/robot_model_loader.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;moveit/robot_model/robot_model.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;moveit/robot_state/robot_state.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #define PI 3.14159265&lt;br /&gt;
&lt;br /&gt;
double avance = 0.005, giro = 0.05;&lt;br /&gt;
double avance_base = 0.05, giro_base = 0.1;&lt;br /&gt;
int start = 0;&lt;br /&gt;
int flanco = 0;&lt;br /&gt;
&lt;br /&gt;
geometry_msgs::Twist base;&lt;br /&gt;
&lt;br /&gt;
double pad_izquierda_x, pad_izquierda_y, gatillo_izquierda, pad_derecha_x, pad_derecha_y, gatillo_derecha;&lt;br /&gt;
int boton_a, boton_b, boton_izquierda, boton_x, boton_y, boton_derecha, boton_back, boton_start, boton_pad_izquierda, boton_pad_derecha, cruz_izquierda, cruz_derecha, cruz_arriba, cruz_abajo;&lt;br /&gt;
	 &lt;br /&gt;
 &lt;br /&gt;
  void xbox(const sensor_msgs::Joy&amp;amp; xbox_joystick)   &lt;br /&gt;
  {	&lt;br /&gt;
	&lt;br /&gt;
	::pad_izquierda_x = xbox_joystick.axes[0];&lt;br /&gt;
	::pad_izquierda_y = xbox_joystick.axes[1];&lt;br /&gt;
	::gatillo_izquierda = xbox_joystick.axes[2] -1;&lt;br /&gt;
	::pad_derecha_x = xbox_joystick.axes[3];&lt;br /&gt;
	::pad_derecha_y = xbox_joystick.axes[4];&lt;br /&gt;
	::gatillo_derecha = xbox_joystick.axes[5] -1;&lt;br /&gt;
	&lt;br /&gt;
	::boton_a = xbox_joystick.buttons[0];&lt;br /&gt;
	::boton_b = xbox_joystick.buttons[1];&lt;br /&gt;
	::boton_x = xbox_joystick.buttons[2];&lt;br /&gt;
	::boton_y = xbox_joystick.buttons[3];&lt;br /&gt;
	::boton_izquierda = xbox_joystick.buttons[4];&lt;br /&gt;
	::boton_derecha = xbox_joystick.buttons[5];&lt;br /&gt;
	::boton_back = xbox_joystick.buttons[6];&lt;br /&gt;
	::boton_start = xbox_joystick.buttons[7];&lt;br /&gt;
	::boton_pad_izquierda = xbox_joystick.buttons[9];&lt;br /&gt;
	::boton_pad_derecha = xbox_joystick.buttons[10];	&lt;br /&gt;
	::cruz_izquierda = xbox_joystick.buttons[11];&lt;br /&gt;
	::cruz_derecha = xbox_joystick.buttons[12];&lt;br /&gt;
	::cruz_arriba = xbox_joystick.buttons[13];&lt;br /&gt;
	::cruz_abajo = xbox_joystick.buttons[14];	&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;teleoperador_xbox360&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;  &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber joystick_sub_= n.subscribe(&amp;quot;joy&amp;quot;, 1, xbox); &lt;br /&gt;
  	&lt;br /&gt;
  	&lt;br /&gt;
	ros::Publisher move_pub_=n.advertise&amp;lt;cervantes_epos_manager::GroupEPOSControl&amp;gt;(&amp;quot;Group_Motor_Control&amp;quot;, 1);   &lt;br /&gt;
	&lt;br /&gt;
	ros::Publisher base_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;Base_Control&amp;quot;, 1); &lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	robot_model_loader::RobotModelLoader robot_model_loader(&amp;quot;robot_description&amp;quot;);&lt;br /&gt;
	robot_model::RobotModelPtr kinematic_model = robot_model_loader.getModel();&lt;br /&gt;
&lt;br /&gt;
	robot_state::RobotStatePtr kinematic_state(new robot_state::RobotState(kinematic_model));&lt;br /&gt;
&lt;br /&gt;
	const robot_state::JointModelGroup* joint_model_group = kinematic_model-&amp;gt;getJointModelGroup(&amp;quot;brazo&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	std::vector&amp;lt;double&amp;gt; joint_values;&lt;br /&gt;
	&lt;br /&gt;
	std::vector&amp;lt;std::string&amp;gt; joint_names;&lt;br /&gt;
	&lt;br /&gt;
	joint_names = joint_model_group-&amp;gt;getJointModelNames();&lt;br /&gt;
	&lt;br /&gt;
	Eigen::Affine3d end_effector_state, end_effector_state_i;&lt;br /&gt;
	&lt;br /&gt;
	int cont = 0;&lt;br /&gt;
		&lt;br /&gt;
        ros::Rate loop_rate(5);	&lt;br /&gt;
	&lt;br /&gt;
	while (ros::ok())&lt;br /&gt;
	{&lt;br /&gt;
	&lt;br /&gt;
		end_effector_state = kinematic_state-&amp;gt;getGlobalLinkTransform(&amp;quot;muneca_c_link&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		if (cont == 0)&lt;br /&gt;
		{			&lt;br /&gt;
			end_effector_state_i = end_effector_state;&lt;br /&gt;
			&lt;br /&gt;
			cont = 1;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			if (::boton_start != 0 &amp;amp;&amp;amp; ::flanco == 0)&lt;br /&gt;
			{&lt;br /&gt;
				flanco = 1;&lt;br /&gt;
			}&lt;br /&gt;
			else &lt;br /&gt;
			{&lt;br /&gt;
				if (::boton_start != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::flanco = 2;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::flanco = 0;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		&lt;br /&gt;
			if (::boton_start != 0 &amp;amp;&amp;amp; ::flanco == 1)&lt;br /&gt;
			{&lt;br /&gt;
				if (::start == 0)&lt;br /&gt;
				{&lt;br /&gt;
					::start = 1;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::start = 0;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			if (::start == 1)&lt;br /&gt;
			{&lt;br /&gt;
&lt;br /&gt;
				if (::pad_derecha_x &amp;gt; 0.2 || ::pad_derecha_x &amp;lt; -0.2 || pad_derecha_y &amp;gt; 0.2 || pad_derecha_y &amp;lt; -0.2 ||&lt;br /&gt;
					(::gatillo_izquierda &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_izquierda != -1) || &lt;br /&gt;
					(::gatillo_derecha &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_derecha != -1) || &lt;br /&gt;
					::cruz_izquierda !=  0 || ::cruz_derecha !=  0 || ::cruz_arriba != 0 || ::cruz_abajo != 0 || &lt;br /&gt;
					::boton_back != 0 || &lt;br /&gt;
					::boton_izquierda != 0 || ::boton_derecha != 0)&lt;br /&gt;
				{&lt;br /&gt;
				&lt;br /&gt;
					if (::boton_back != 0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state = end_effector_state_i;&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					if (::pad_derecha_x &amp;gt; 0.2 || ::pad_derecha_x &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(0, 0, ::pad_derecha_x * avance));&lt;br /&gt;
					}&lt;br /&gt;
		&lt;br /&gt;
					if (::pad_derecha_y &amp;gt; 0.2 || ::pad_derecha_y &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(0, -::pad_derecha_y * avance, 0));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::gatillo_izquierda &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_izquierda != -1)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(::gatillo_izquierda * (avance/2), 0, 0));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::gatillo_derecha &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_derecha != -1)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(-::gatillo_derecha * (avance/2), 0, 0));&lt;br /&gt;
					} &lt;br /&gt;
					&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_arriba !=  0)&lt;br /&gt;
					{					&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(-giro, Eigen::Vector3d::UnitZ()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_abajo !=  0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(giro, Eigen::Vector3d::UnitZ()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_derecha !=  0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(giro, Eigen::Vector3d::UnitY()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_izquierda !=  0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(-giro, Eigen::Vector3d::UnitY()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_derecha != 0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(giro, Eigen::Vector3d::UnitX()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_izquierda != 0)&lt;br /&gt;
					{   	  &lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(-giro, Eigen::Vector3d::UnitX()));&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					bool found_ik = kinematic_state-&amp;gt;setFromIK(joint_model_group, end_effector_state, 5, 0.1);&lt;br /&gt;
		&lt;br /&gt;
					if (found_ik)&lt;br /&gt;
					{&lt;br /&gt;
						cervantes_epos_manager::GroupEPOSControl arm;&lt;br /&gt;
						std::vector&amp;lt;cervantes_epos_manager::EPOSControl&amp;gt; motor_group;&lt;br /&gt;
						cervantes_epos_manager::EPOSControl motor_control;	&lt;br /&gt;
						kinematic_state-&amp;gt;copyJointGroupPositions(joint_model_group, joint_values);&lt;br /&gt;
						&lt;br /&gt;
						for(int i = 0; i &amp;lt; joint_names.size(); i++)&lt;br /&gt;
						{&lt;br /&gt;
							if (joint_names[i] == &amp;quot;hombro_a&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 3;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;hombro_b&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 5;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;codo_a&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 4;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;codo_b&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 6;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;muneca_a&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 7;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(270*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;muneca_b&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 9;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(270*16);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;muneca_c&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 8;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(270*16);&lt;br /&gt;
							}&lt;br /&gt;
							&lt;br /&gt;
							motor_control.control_mode = 3;&lt;br /&gt;
							motor_group.push_back(motor_control);&lt;br /&gt;
				&lt;br /&gt;
						}&lt;br /&gt;
						&lt;br /&gt;
						arm.motor_group = motor_group;&lt;br /&gt;
						&lt;br /&gt;
						move_pub_.publish(arm);&lt;br /&gt;
						&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						ROS_INFO(&amp;quot;Did not find IK solution&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					if (::boton_a != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::avance_base = ::avance_base - 0.01;&lt;br /&gt;
						&lt;br /&gt;
						if (::avance_base &amp;lt; 0.01)&lt;br /&gt;
						{&lt;br /&gt;
							::avance_base = 0.01;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_b != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::avance_base = ::avance_base + 0.1;&lt;br /&gt;
						&lt;br /&gt;
						if (::avance_base &amp;gt; 0.1)&lt;br /&gt;
						{&lt;br /&gt;
							::avance_base = 0.1;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::pad_izquierda_y &amp;gt; 0.2 || ::pad_izquierda_y &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						::base.linear.x = ::avance_base * ::pad_izquierda_y;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						::base.linear.x = 0.0;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_x != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::giro_base = ::giro_base - 0.01;&lt;br /&gt;
						&lt;br /&gt;
						if (::giro_base &amp;lt; 0.05)&lt;br /&gt;
						{&lt;br /&gt;
							::giro_base = 0.05;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_y != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::giro_base = ::giro_base + 0.01;&lt;br /&gt;
						&lt;br /&gt;
						if (::giro_base &amp;gt; 1)&lt;br /&gt;
						{&lt;br /&gt;
							::giro_base = 1;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::pad_izquierda_x &amp;gt; 0.2 || ::pad_izquierda_x &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						::base.angular.z = ::giro_base * ::pad_izquierda_x;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						::base.angular.z = 0.0;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		ros::spinOnce();&lt;br /&gt;
	&lt;br /&gt;
		loop_rate.sleep();&lt;br /&gt;
	}		  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will add the next code line to the file &amp;quot;CMakeLists.txt&amp;quot; of the created ''package'' where we indicate the name of the executable and the path of the file to compile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;add_executable(teleop_xbox360 src/teleop_xbox360.cpp)&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(teleop_xbox360&lt;br /&gt;
  ${catkin_LIBRARIES}&lt;br /&gt;
)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal, placed in the root folder of the our catkin work space, in order to compile and generate the executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd cervantes_teleop&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;teleop_xbox360.launch&amp;quot; within the folder &amp;quot;launch&amp;quot; of the created ''package'' with the content that is shown below in order to start all the necessary programs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find cervantes_epos_manager)/launch/cervantes_bringup.launch&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;joy&amp;quot; type=&amp;quot;joy_node&amp;quot; name=&amp;quot;joystick&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;node name=&amp;quot;teleop_xbox360&amp;quot; pkg=&amp;quot;cervantes_teleop&amp;quot; type=&amp;quot;teleop_xbox360&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start the teleoperator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch cervantes_teleop teleop_xbox360.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the next video we can see de teleoperation of CeRVaNTeS in the [http://gazebosim.org/ gazebo] simulator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;wF_gKr1KWfg#t=13&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=wF_gKr1KWfg#t=13 Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_Teleoperation_with_xbox360_wireless_controller_(xbox360_controller%2bjoy)&amp;diff=4357</id>
		<title>CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_Teleoperation_with_xbox360_wireless_controller_(xbox360_controller%2bjoy)&amp;diff=4357"/>
				<updated>2014-10-28T19:31:44Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Teleoperation of CeRVaNTeS=&lt;br /&gt;
&lt;br /&gt;
We need a teleoperation system in order to take the control of the robot to make specific tasks. Currently we use the [http://es.wikipedia.org/wiki/Secure_Shell ssh] connection between the robot PC and our PC, using the keyboard. This method use a [http://es.wikipedia.org/wiki/Wi-Fi wifi] network that can fail or not available. For this reason the best option is to use a device plugged in to the PC robot with its own network. The well-chosen device is the [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows xbox360 wireless controller of microsoft].&lt;br /&gt;
&lt;br /&gt;
=xbox360 controller=&lt;br /&gt;
&lt;br /&gt;
==Description of buttons and axes==&lt;br /&gt;
&lt;br /&gt;
This controller has 6 axes and 14 buttons that are distributed like is shown below:&lt;br /&gt;
&lt;br /&gt;
* Left pad: 2 axes and 1 button.&lt;br /&gt;
* Right pad: 2 axes and 1 button.&lt;br /&gt;
* Left trigger: 1 axe.&lt;br /&gt;
* Right trigger: 1 axe.&lt;br /&gt;
* Cross: 4 buttons.&lt;br /&gt;
* Left side buttons: 4 buttons.&lt;br /&gt;
* Left button: 1 button.&lt;br /&gt;
* Right button: 1 button.&lt;br /&gt;
* &amp;quot;Back&amp;quot; button: 1 button.&lt;br /&gt;
* &amp;quot;Start&amp;quot; button: 1 button.&lt;br /&gt;
&lt;br /&gt;
The function assigned to the buttons and axes of the [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows xbox360 controller] for teleoperation of CeRVaNTeS is shown in the next picture:&lt;br /&gt;
&lt;br /&gt;
[[file:xbox360_control-CeRVaNTeS-EN.jpg|thumb|center|800px|Funcionalidad [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows xbox360 controller] for CeRVaNTeS.]]&lt;br /&gt;
&lt;br /&gt;
==Program==&lt;br /&gt;
&lt;br /&gt;
The program assigns the function to the buttons and axes. The program subscribes to the ''topic'' &amp;quot;joy&amp;quot; where is published the state of the buttons and axes and publishes the ''topics'' &amp;quot;Base_Control&amp;quot; and &amp;quot;Group_Motor_Control&amp;quot; for the control of the base and the [[CeRVaNTeS' arm control (maxon+epos2)|arm]]. We have to execute the next command in a terminal in order to create a new ''package'' named &amp;quot;cervantes_teleop&amp;quot; within our catkin workspace:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;catkin_create_pkg cervantes_teleop cervantes_epos_manager geometry_msgs sensor_msgs tf tf_conversions std_msgs moveit_core moveit_ros_perception moveit_ros_planning_interface ros_cpp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a new file named &amp;quot;teleop_xbox360.cpp&amp;quot; within the folder &amp;quot;src&amp;quot; of the created ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cpp enclose=div&amp;gt;&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;  &lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/GroupEPOSControl.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/EPOSControl.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/GroupMotorInfo.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/MotorInfo.h&amp;gt;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Pose.h&amp;quot;&lt;br /&gt;
  #include &amp;lt;tf/transform_listener.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;tf_conversions/tf_eigen.h&amp;gt;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;sensor_msgs/JointState.h&amp;quot;    &lt;br /&gt;
  #include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  // MoveIt!&lt;br /&gt;
  #include &amp;lt;moveit/robot_model_loader/robot_model_loader.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;moveit/robot_model/robot_model.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;moveit/robot_state/robot_state.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #define PI 3.14159265&lt;br /&gt;
&lt;br /&gt;
double avance = 0.005, giro = 0.05;&lt;br /&gt;
double avance_base = 0.05, giro_base = 0.1;&lt;br /&gt;
int start = 0;&lt;br /&gt;
int flanco = 0;&lt;br /&gt;
&lt;br /&gt;
geometry_msgs::Twist base;&lt;br /&gt;
&lt;br /&gt;
double pad_izquierda_x, pad_izquierda_y, gatillo_izquierda, pad_derecha_x, pad_derecha_y, gatillo_derecha;&lt;br /&gt;
int boton_a, boton_b, boton_izquierda, boton_x, boton_y, boton_derecha, boton_back, boton_start, boton_pad_izquierda, boton_pad_derecha, cruz_izquierda, cruz_derecha, cruz_arriba, cruz_abajo;&lt;br /&gt;
	 &lt;br /&gt;
 &lt;br /&gt;
  void xbox(const sensor_msgs::Joy&amp;amp; xbox_joystick)   &lt;br /&gt;
  {	&lt;br /&gt;
	&lt;br /&gt;
	::pad_izquierda_x = xbox_joystick.axes[0];&lt;br /&gt;
	::pad_izquierda_y = xbox_joystick.axes[1];&lt;br /&gt;
	::gatillo_izquierda = xbox_joystick.axes[2] -1;&lt;br /&gt;
	::pad_derecha_x = xbox_joystick.axes[3];&lt;br /&gt;
	::pad_derecha_y = xbox_joystick.axes[4];&lt;br /&gt;
	::gatillo_derecha = xbox_joystick.axes[5] -1;&lt;br /&gt;
	&lt;br /&gt;
	::boton_a = xbox_joystick.buttons[0];&lt;br /&gt;
	::boton_b = xbox_joystick.buttons[1];&lt;br /&gt;
	::boton_x = xbox_joystick.buttons[2];&lt;br /&gt;
	::boton_y = xbox_joystick.buttons[3];&lt;br /&gt;
	::boton_izquierda = xbox_joystick.buttons[4];&lt;br /&gt;
	::boton_derecha = xbox_joystick.buttons[5];&lt;br /&gt;
	::boton_back = xbox_joystick.buttons[6];&lt;br /&gt;
	::boton_start = xbox_joystick.buttons[7];&lt;br /&gt;
	::boton_pad_izquierda = xbox_joystick.buttons[9];&lt;br /&gt;
	::boton_pad_derecha = xbox_joystick.buttons[10];	&lt;br /&gt;
	::cruz_izquierda = xbox_joystick.buttons[11];&lt;br /&gt;
	::cruz_derecha = xbox_joystick.buttons[12];&lt;br /&gt;
	::cruz_arriba = xbox_joystick.buttons[13];&lt;br /&gt;
	::cruz_abajo = xbox_joystick.buttons[14];	&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;teleoperador_xbox360&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;  &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber joystick_sub_= n.subscribe(&amp;quot;joy&amp;quot;, 1, xbox); &lt;br /&gt;
  	&lt;br /&gt;
  	&lt;br /&gt;
	ros::Publisher move_pub_=n.advertise&amp;lt;cervantes_epos_manager::GroupEPOSControl&amp;gt;(&amp;quot;Group_Motor_Control&amp;quot;, 1);   &lt;br /&gt;
	&lt;br /&gt;
	ros::Publisher base_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;Base_Control&amp;quot;, 1); &lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	robot_model_loader::RobotModelLoader robot_model_loader(&amp;quot;robot_description&amp;quot;);&lt;br /&gt;
	robot_model::RobotModelPtr kinematic_model = robot_model_loader.getModel();&lt;br /&gt;
&lt;br /&gt;
	robot_state::RobotStatePtr kinematic_state(new robot_state::RobotState(kinematic_model));&lt;br /&gt;
&lt;br /&gt;
	const robot_state::JointModelGroup* joint_model_group = kinematic_model-&amp;gt;getJointModelGroup(&amp;quot;brazo&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	std::vector&amp;lt;double&amp;gt; joint_values;&lt;br /&gt;
	&lt;br /&gt;
	std::vector&amp;lt;std::string&amp;gt; joint_names;&lt;br /&gt;
	&lt;br /&gt;
	joint_names = joint_model_group-&amp;gt;getJointModelNames();&lt;br /&gt;
	&lt;br /&gt;
	Eigen::Affine3d end_effector_state, end_effector_state_i;&lt;br /&gt;
	&lt;br /&gt;
	int cont = 0;&lt;br /&gt;
		&lt;br /&gt;
        ros::Rate loop_rate(5);	&lt;br /&gt;
	&lt;br /&gt;
	while (ros::ok())&lt;br /&gt;
	{&lt;br /&gt;
	&lt;br /&gt;
		end_effector_state = kinematic_state-&amp;gt;getGlobalLinkTransform(&amp;quot;muneca_c_link&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		if (cont == 0)&lt;br /&gt;
		{			&lt;br /&gt;
			end_effector_state_i = end_effector_state;&lt;br /&gt;
			&lt;br /&gt;
			cont = 1;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			if (::boton_start != 0 &amp;amp;&amp;amp; ::flanco == 0)&lt;br /&gt;
			{&lt;br /&gt;
				flanco = 1;&lt;br /&gt;
			}&lt;br /&gt;
			else &lt;br /&gt;
			{&lt;br /&gt;
				if (::boton_start != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::flanco = 2;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::flanco = 0;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		&lt;br /&gt;
			if (::boton_start != 0 &amp;amp;&amp;amp; ::flanco == 1)&lt;br /&gt;
			{&lt;br /&gt;
				if (::start == 0)&lt;br /&gt;
				{&lt;br /&gt;
					::start = 1;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::start = 0;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			if (::start == 1)&lt;br /&gt;
			{&lt;br /&gt;
&lt;br /&gt;
				if (::pad_derecha_x &amp;gt; 0.2 || ::pad_derecha_x &amp;lt; -0.2 || pad_derecha_y &amp;gt; 0.2 || pad_derecha_y &amp;lt; -0.2 ||&lt;br /&gt;
					(::gatillo_izquierda &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_izquierda != -1) || &lt;br /&gt;
					(::gatillo_derecha &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_derecha != -1) || &lt;br /&gt;
					::cruz_izquierda !=  0 || ::cruz_derecha !=  0 || ::cruz_arriba != 0 || ::cruz_abajo != 0 || &lt;br /&gt;
					::boton_back != 0 || &lt;br /&gt;
					::boton_izquierda != 0 || ::boton_derecha != 0)&lt;br /&gt;
				{&lt;br /&gt;
				&lt;br /&gt;
					if (::boton_back != 0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state = end_effector_state_i;&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					if (::pad_derecha_x &amp;gt; 0.2 || ::pad_derecha_x &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(0, 0, ::pad_derecha_x * avance));&lt;br /&gt;
					}&lt;br /&gt;
		&lt;br /&gt;
					if (::pad_derecha_y &amp;gt; 0.2 || ::pad_derecha_y &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(0, -::pad_derecha_y * avance, 0));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::gatillo_izquierda &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_izquierda != -1)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(::gatillo_izquierda * (avance/2), 0, 0));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::gatillo_derecha &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_derecha != -1)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(-::gatillo_derecha * (avance/2), 0, 0));&lt;br /&gt;
					} &lt;br /&gt;
					&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_arriba !=  0)&lt;br /&gt;
					{					&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(-giro, Eigen::Vector3d::UnitZ()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_abajo !=  0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(giro, Eigen::Vector3d::UnitZ()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_derecha !=  0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(giro, Eigen::Vector3d::UnitY()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_izquierda !=  0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(-giro, Eigen::Vector3d::UnitY()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_derecha != 0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(giro, Eigen::Vector3d::UnitX()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_izquierda != 0)&lt;br /&gt;
					{   	  &lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(-giro, Eigen::Vector3d::UnitX()));&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					bool found_ik = kinematic_state-&amp;gt;setFromIK(joint_model_group, end_effector_state, 5, 0.1);&lt;br /&gt;
		&lt;br /&gt;
					if (found_ik)&lt;br /&gt;
					{&lt;br /&gt;
						cervantes_epos_manager::GroupEPOSControl arm;&lt;br /&gt;
						std::vector&amp;lt;cervantes_epos_manager::EPOSControl&amp;gt; motor_group;&lt;br /&gt;
						cervantes_epos_manager::EPOSControl motor_control;	&lt;br /&gt;
						kinematic_state-&amp;gt;copyJointGroupPositions(joint_model_group, joint_values);&lt;br /&gt;
						&lt;br /&gt;
						for(int i = 0; i &amp;lt; joint_names.size(); i++)&lt;br /&gt;
						{&lt;br /&gt;
							if (joint_names[i] == &amp;quot;hombro_a&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 3;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;hombro_b&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 5;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;codo_a&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 4;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;codo_b&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 6;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;muneca_a&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 7;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(270*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;muneca_b&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 9;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(270*16);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;muneca_c&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 8;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(270*16);&lt;br /&gt;
							}&lt;br /&gt;
							&lt;br /&gt;
							motor_control.control_mode = 3;&lt;br /&gt;
							motor_group.push_back(motor_control);&lt;br /&gt;
				&lt;br /&gt;
						}&lt;br /&gt;
						&lt;br /&gt;
						arm.motor_group = motor_group;&lt;br /&gt;
						&lt;br /&gt;
						move_pub_.publish(arm);&lt;br /&gt;
						&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						ROS_INFO(&amp;quot;Did not find IK solution&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					if (::boton_a != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::avance_base = ::avance_base - 0.01;&lt;br /&gt;
						&lt;br /&gt;
						if (::avance_base &amp;lt; 0.01)&lt;br /&gt;
						{&lt;br /&gt;
							::avance_base = 0.01;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_b != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::avance_base = ::avance_base + 0.1;&lt;br /&gt;
						&lt;br /&gt;
						if (::avance_base &amp;gt; 0.1)&lt;br /&gt;
						{&lt;br /&gt;
							::avance_base = 0.1;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::pad_izquierda_y &amp;gt; 0.2 || ::pad_izquierda_y &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						::base.linear.x = ::avance_base * ::pad_izquierda_y;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						::base.linear.x = 0.0;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_x != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::giro_base = ::giro_base - 0.01;&lt;br /&gt;
						&lt;br /&gt;
						if (::giro_base &amp;lt; 0.05)&lt;br /&gt;
						{&lt;br /&gt;
							::giro_base = 0.05;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_y != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::giro_base = ::giro_base + 0.01;&lt;br /&gt;
						&lt;br /&gt;
						if (::giro_base &amp;gt; 1)&lt;br /&gt;
						{&lt;br /&gt;
							::giro_base = 1;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::pad_izquierda_x &amp;gt; 0.2 || ::pad_izquierda_x &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						::base.angular.z = ::giro_base * ::pad_izquierda_x;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						::base.angular.z = 0.0;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		ros::spinOnce();&lt;br /&gt;
	&lt;br /&gt;
		loop_rate.sleep();&lt;br /&gt;
	}		  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will add the next code line to the file &amp;quot;CMakeLists.txt&amp;quot; of the created ''package'' where we indicate the name of the executable and the path of the file to compile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;add_executable(teleop_xbox360 src/teleop_xbox360.cpp)&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(teleop_xbox360&lt;br /&gt;
  ${catkin_LIBRARIES}&lt;br /&gt;
)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal, placed in the root folder of the our catkin work space, in order to compile and generate the executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd cervantes_teleop&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;teleop_xbox360.launch&amp;quot; within the folder &amp;quot;launch&amp;quot; of the created ''package'' with the content that is shown below in order to start all the necessary programs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find cervantes_epos_manager)/launch/cervantes_bringup.launch&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;joy&amp;quot; type=&amp;quot;joy_node&amp;quot; name=&amp;quot;joystick&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;node name=&amp;quot;teleop_xbox360&amp;quot; pkg=&amp;quot;cervantes_teleop&amp;quot; type=&amp;quot;teleop_xbox360&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start the teleoperator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch cervantes_teleop teleop_xbox360.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the next video we can see de teleoperation of CeRVaNTeS in the [http://gazebosim.org/ gazebo] simulator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;wF_gKr1KWfg#t=13&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=wF_gKr1KWfg#t=13 Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Mobile_manipulation&amp;diff=4356</id>
		<title>Mobile manipulation</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Mobile_manipulation&amp;diff=4356"/>
				<updated>2014-10-27T23:45:30Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* '''Project Name:''' Brazo Bioloid controlado por ROS con interfaz Arduino&lt;br /&gt;
* '''Author:''' [http://www.fernando.casadogarcia.es Fernando Casado García]&lt;br /&gt;
* '''Dates:''' September 2013 -&lt;br /&gt;
* '''Degree:''' PhD&lt;br /&gt;
* '''Tags:''' MYRAbot, manipulation, arm, Bioloid, webcam, recognition, simulation&lt;br /&gt;
* '''Technologies:''' ROS, c++, Dynamixel, Arduino, find_object_2d, gazebo, URDF, moveIt!, actionlib, maxon, epos2, EposManager (wpi-rover)&lt;br /&gt;
* '''State:''' Ongoing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
----&lt;br /&gt;
[[File:myrabot_portada.png|100px|thumb|right|MYRABot]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center style=&amp;quot;font-size: 30px;&amp;quot;&amp;gt;MYRABot&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! Español&lt;br /&gt;
! English&lt;br /&gt;
|-&lt;br /&gt;
|  valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |Contenido&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
#[[Control brazo MYRAbot (bioloid+arduino)]]&lt;br /&gt;
#[[Detección y cálculo de posición de objetos (cámara web)]]&lt;br /&gt;
#[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&lt;br /&gt;
#[[Modelo para simulación MYRAbot (urdf+gazebo)]]&lt;br /&gt;
#[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
#[[Órdenes y confirmación mediante voz (sphinx+festival)]]&lt;br /&gt;
#[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |Content&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
#[[MYRAbot's arm control (bioloid+arduino)]]&lt;br /&gt;
#[[Objects recognition and position calculation (webcam)]]&lt;br /&gt;
#[[MYRAbot's arm model for simulation (urdf+gazebo)]]&lt;br /&gt;
#[[MYRAbot model for simulation (urdf+gazebo)]]&lt;br /&gt;
#[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
#[[Voice control (sphinx+festival)]]&lt;br /&gt;
#[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
MYRABot ROS packages:&lt;br /&gt;
&lt;br /&gt;
[https://github.com/Robotica-ule/MYRABot MYRABot's GitHub]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
----&lt;br /&gt;
[[File:cervantes_portada.png|100px|thumb|right|CeRVaNTeS]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center style=&amp;quot;font-size: 30px;&amp;quot;&amp;gt;CeRVaNTeS&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! Español&lt;br /&gt;
! English&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |Contenido&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
#[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&lt;br /&gt;
#[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&lt;br /&gt;
#[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&lt;br /&gt;
#[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
#[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |Content&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
#[[CeRVaNTeS' arm and base control (maxon+epos2)]]&lt;br /&gt;
#[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&lt;br /&gt;
#[[CeRVaNTeS model for simulation (urdf+gazebo)]]&lt;br /&gt;
#[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
#[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=File:Cervantes_portada.png&amp;diff=4355</id>
		<title>File:Cervantes portada.png</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=File:Cervantes_portada.png&amp;diff=4355"/>
				<updated>2014-10-27T23:17:49Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: CeRVaNTeS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CeRVaNTeS&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=File:Myrabot_portada.png&amp;diff=4354</id>
		<title>File:Myrabot portada.png</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=File:Myrabot_portada.png&amp;diff=4354"/>
				<updated>2014-10-27T23:16:25Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: MYRABot&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MYRABot&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_Teleoperation_with_xbox360_wireless_controller_(xbox360_controller%2bjoy)&amp;diff=4343</id>
		<title>CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_Teleoperation_with_xbox360_wireless_controller_(xbox360_controller%2bjoy)&amp;diff=4343"/>
				<updated>2014-10-15T10:39:43Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: /* Program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Teleoperation of CeRVaNTeS=&lt;br /&gt;
&lt;br /&gt;
We need a teleoperation system in order to take the control of the robot to make specific tasks. Currently we use the [http://es.wikipedia.org/wiki/Secure_Shell ssh] connection between the robot PC and our PC, using the keyboard. This method use a [http://es.wikipedia.org/wiki/Wi-Fi wifi] network that can fail or not available. For this reason the best option is to use a device plugged in to the PC robot with its own network. The well-chosen device is the [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows xbox360 wireless controller of microsoft].&lt;br /&gt;
&lt;br /&gt;
=xbox360 controller=&lt;br /&gt;
&lt;br /&gt;
==Description of buttons and axes==&lt;br /&gt;
&lt;br /&gt;
This controller has 6 axes and 14 buttons that are distributed like is shown below:&lt;br /&gt;
&lt;br /&gt;
* Left pad: 2 axes and 1 button.&lt;br /&gt;
* Right pad: 2 axes and 1 button.&lt;br /&gt;
* Left trigger: 1 axe.&lt;br /&gt;
* Right trigger: 1 axe.&lt;br /&gt;
* Cross: 4 buttons.&lt;br /&gt;
* Left side buttons: 4 buttons.&lt;br /&gt;
* Left button: 1 button.&lt;br /&gt;
* Right button: 1 button.&lt;br /&gt;
* &amp;quot;Back&amp;quot; button: 1 button.&lt;br /&gt;
* &amp;quot;Start&amp;quot; button: 1 button.&lt;br /&gt;
&lt;br /&gt;
The function assigned to the buttons and axes of the [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows xbox360 controller] for teleoperation of CeRVaNTeS is shown in the next picture:&lt;br /&gt;
&lt;br /&gt;
[[file:xbox360_control-CeRVaNTeS-EN.jpg|thumb|center|800px|Funcionalidad [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows xbox360 controller] for CeRVaNTeS.]]&lt;br /&gt;
&lt;br /&gt;
==Program==&lt;br /&gt;
&lt;br /&gt;
The program assigns the function to the buttons and axes. The program subscribes to the ''topic'' &amp;quot;joy&amp;quot; where is published the state of the buttons and axes and publishes the ''topics'' &amp;quot;Base_Control&amp;quot; and &amp;quot;Group_Motor_Control&amp;quot; for the control of the base and the [[CeRVaNTeS' arm control (maxon+epos2)|arm]]. We have to execute the next command in a terminal in order to create a new ''package'' named &amp;quot;cervantes_teleop&amp;quot; within our catkin workspace:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;catkin_create_pkg cervantes_teleop cervantes_epos_manager geometry_msgs sensor_msgs tf tf_conversions std_msgs moveit_core moveit_ros_perception moveit_ros_planning_interface ros_cpp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a new file named &amp;quot;teleop_xbox360.cpp&amp;quot; within the folder &amp;quot;src&amp;quot; of the created ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cpp enclose=div&amp;gt;&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;  &lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/GroupEPOSControl.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/EPOSControl.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/GroupMotorInfo.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/MotorInfo.h&amp;gt;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Pose.h&amp;quot;&lt;br /&gt;
  #include &amp;lt;tf/transform_listener.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;tf_conversions/tf_eigen.h&amp;gt;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;sensor_msgs/JointState.h&amp;quot;    &lt;br /&gt;
  #include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  // MoveIt!&lt;br /&gt;
  #include &amp;lt;moveit/robot_model_loader/robot_model_loader.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;moveit/robot_model/robot_model.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;moveit/robot_state/robot_state.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #define PI 3.14159265&lt;br /&gt;
&lt;br /&gt;
double avance = 0.005, giro = 0.05;&lt;br /&gt;
double avance_base = 0.05, giro_base = 0.1;&lt;br /&gt;
int start = 0;&lt;br /&gt;
int flanco = 0;&lt;br /&gt;
&lt;br /&gt;
geometry_msgs::Twist base;&lt;br /&gt;
&lt;br /&gt;
double pad_izquierda_x, pad_izquierda_y, gatillo_izquierda, pad_derecha_x, pad_derecha_y, gatillo_derecha;&lt;br /&gt;
int boton_a, boton_b, boton_izquierda, boton_x, boton_y, boton_derecha, boton_back, boton_start, boton_pad_izquierda, boton_pad_derecha, cruz_izquierda, cruz_derecha, cruz_arriba, cruz_abajo;&lt;br /&gt;
	 &lt;br /&gt;
 &lt;br /&gt;
  void xbox(const sensor_msgs::Joy&amp;amp; xbox_joystick)   &lt;br /&gt;
  {	&lt;br /&gt;
	&lt;br /&gt;
	::pad_izquierda_x = xbox_joystick.axes[0];&lt;br /&gt;
	::pad_izquierda_y = xbox_joystick.axes[1];&lt;br /&gt;
	::gatillo_izquierda = xbox_joystick.axes[2] -1;&lt;br /&gt;
	::pad_derecha_x = xbox_joystick.axes[3];&lt;br /&gt;
	::pad_derecha_y = xbox_joystick.axes[4];&lt;br /&gt;
	::gatillo_derecha = xbox_joystick.axes[5] -1;&lt;br /&gt;
	&lt;br /&gt;
	::boton_a = xbox_joystick.buttons[0];&lt;br /&gt;
	::boton_b = xbox_joystick.buttons[1];&lt;br /&gt;
	::boton_x = xbox_joystick.buttons[2];&lt;br /&gt;
	::boton_y = xbox_joystick.buttons[3];&lt;br /&gt;
	::boton_izquierda = xbox_joystick.buttons[4];&lt;br /&gt;
	::boton_derecha = xbox_joystick.buttons[5];&lt;br /&gt;
	::boton_back = xbox_joystick.buttons[6];&lt;br /&gt;
	::boton_start = xbox_joystick.buttons[7];&lt;br /&gt;
	::boton_pad_izquierda = xbox_joystick.buttons[9];&lt;br /&gt;
	::boton_pad_derecha = xbox_joystick.buttons[10];	&lt;br /&gt;
	::cruz_izquierda = xbox_joystick.buttons[11];&lt;br /&gt;
	::cruz_derecha = xbox_joystick.buttons[12];&lt;br /&gt;
	::cruz_arriba = xbox_joystick.buttons[13];&lt;br /&gt;
	::cruz_abajo = xbox_joystick.buttons[14];	&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;teleoperador_xbox360&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;  &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber joystick_sub_= n.subscribe(&amp;quot;joy&amp;quot;, 1, xbox); &lt;br /&gt;
  	&lt;br /&gt;
  	&lt;br /&gt;
	ros::Publisher move_pub_=n.advertise&amp;lt;cervantes_epos_manager::GroupEPOSControl&amp;gt;(&amp;quot;Group_Motor_Control&amp;quot;, 1);   &lt;br /&gt;
	&lt;br /&gt;
	ros::Publisher base_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;Base_Control&amp;quot;, 1); &lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	robot_model_loader::RobotModelLoader robot_model_loader(&amp;quot;robot_description&amp;quot;);&lt;br /&gt;
	robot_model::RobotModelPtr kinematic_model = robot_model_loader.getModel();&lt;br /&gt;
&lt;br /&gt;
	robot_state::RobotStatePtr kinematic_state(new robot_state::RobotState(kinematic_model));&lt;br /&gt;
&lt;br /&gt;
	const robot_state::JointModelGroup* joint_model_group = kinematic_model-&amp;gt;getJointModelGroup(&amp;quot;brazo&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	std::vector&amp;lt;double&amp;gt; joint_values;&lt;br /&gt;
	&lt;br /&gt;
	std::vector&amp;lt;std::string&amp;gt; joint_names;&lt;br /&gt;
	&lt;br /&gt;
	joint_names = joint_model_group-&amp;gt;getJointModelNames();&lt;br /&gt;
	&lt;br /&gt;
	Eigen::Affine3d end_effector_state, end_effector_state_i;&lt;br /&gt;
	&lt;br /&gt;
	int cont = 0;&lt;br /&gt;
		&lt;br /&gt;
        ros::Rate loop_rate(5);	&lt;br /&gt;
	&lt;br /&gt;
	while (ros::ok())&lt;br /&gt;
	{&lt;br /&gt;
	&lt;br /&gt;
		end_effector_state = kinematic_state-&amp;gt;getGlobalLinkTransform(&amp;quot;muneca_c_link&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		if (cont == 0)&lt;br /&gt;
		{			&lt;br /&gt;
			end_effector_state_i = end_effector_state;&lt;br /&gt;
			&lt;br /&gt;
			cont = 1;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			if (::boton_start != 0 &amp;amp;&amp;amp; ::flanco == 0)&lt;br /&gt;
			{&lt;br /&gt;
				flanco = 1;&lt;br /&gt;
			}&lt;br /&gt;
			else &lt;br /&gt;
			{&lt;br /&gt;
				if (::boton_start != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::flanco = 2;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::flanco = 0;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		&lt;br /&gt;
			if (::boton_start != 0 &amp;amp;&amp;amp; ::flanco == 1)&lt;br /&gt;
			{&lt;br /&gt;
				if (::start == 0)&lt;br /&gt;
				{&lt;br /&gt;
					::start = 1;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::start = 0;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			if (::start == 1)&lt;br /&gt;
			{&lt;br /&gt;
&lt;br /&gt;
				if (::pad_derecha_x &amp;gt; 0.2 || ::pad_derecha_x &amp;lt; -0.2 || pad_derecha_y &amp;gt; 0.2 || pad_derecha_y &amp;lt; -0.2 ||&lt;br /&gt;
					(::gatillo_izquierda &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_izquierda != -1) || &lt;br /&gt;
					(::gatillo_derecha &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_derecha != -1) || &lt;br /&gt;
					::cruz_izquierda !=  0 || ::cruz_derecha !=  0 || ::cruz_arriba != 0 || ::cruz_abajo != 0 || &lt;br /&gt;
					::boton_back != 0 || &lt;br /&gt;
					::boton_izquierda != 0 || ::boton_derecha != 0)&lt;br /&gt;
				{&lt;br /&gt;
				&lt;br /&gt;
					if (::boton_back != 0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state = end_effector_state_i;&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					if (::pad_derecha_x &amp;gt; 0.2 || ::pad_derecha_x &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(0, 0, ::pad_derecha_x * avance));&lt;br /&gt;
					}&lt;br /&gt;
		&lt;br /&gt;
					if (::pad_derecha_y &amp;gt; 0.2 || ::pad_derecha_y &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(0, -::pad_derecha_y * avance, 0));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::gatillo_izquierda &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_izquierda != -1)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(::gatillo_izquierda * (avance/2), 0, 0));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::gatillo_derecha &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_derecha != -1)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(-::gatillo_derecha * (avance/2), 0, 0));&lt;br /&gt;
					} &lt;br /&gt;
					&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_arriba !=  0)&lt;br /&gt;
					{					&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(-giro, Eigen::Vector3d::UnitZ()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_abajo !=  0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(giro, Eigen::Vector3d::UnitZ()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_derecha !=  0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(giro, Eigen::Vector3d::UnitY()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_izquierda !=  0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(-giro, Eigen::Vector3d::UnitY()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_derecha != 0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(giro, Eigen::Vector3d::UnitX()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_izquierda != 0)&lt;br /&gt;
					{   	  &lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(-giro, Eigen::Vector3d::UnitX()));&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					bool found_ik = kinematic_state-&amp;gt;setFromIK(joint_model_group, end_effector_state, 5, 0.1);&lt;br /&gt;
		&lt;br /&gt;
					if (found_ik)&lt;br /&gt;
					{&lt;br /&gt;
						cervantes_epos_manager::GroupEPOSControl arm;&lt;br /&gt;
						std::vector&amp;lt;cervantes_epos_manager::EPOSControl&amp;gt; motor_group;&lt;br /&gt;
						cervantes_epos_manager::EPOSControl motor_control;	&lt;br /&gt;
						kinematic_state-&amp;gt;copyJointGroupPositions(joint_model_group, joint_values);&lt;br /&gt;
						&lt;br /&gt;
						for(int i = 0; i &amp;lt; joint_names.size(); i++)&lt;br /&gt;
						{&lt;br /&gt;
							if (joint_names[i] == &amp;quot;hombro_a&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 3;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;hombro_b&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 5;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;codo_a&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 4;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;codo_b&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 6;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;muneca_a&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 7;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(270*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;muneca_b&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 9;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(270*16);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;muneca_c&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 8;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(270*16);&lt;br /&gt;
							}&lt;br /&gt;
							&lt;br /&gt;
							motor_control.control_mode = 3;&lt;br /&gt;
							motor_group.push_back(motor_control);&lt;br /&gt;
				&lt;br /&gt;
						}&lt;br /&gt;
						&lt;br /&gt;
						arm.motor_group = motor_group;&lt;br /&gt;
						&lt;br /&gt;
						move_pub_.publish(arm);&lt;br /&gt;
						&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						ROS_INFO(&amp;quot;Did not find IK solution&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					if (::boton_a != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::avance_base = ::avance_base - 0.01;&lt;br /&gt;
						&lt;br /&gt;
						if (::avance_base &amp;lt; 0.01)&lt;br /&gt;
						{&lt;br /&gt;
							::avance_base = 0.01;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_b != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::avance_base = ::avance_base + 0.1;&lt;br /&gt;
						&lt;br /&gt;
						if (::avance_base &amp;gt; 0.1)&lt;br /&gt;
						{&lt;br /&gt;
							::avance_base = 0.1;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::pad_izquierda_y &amp;gt; 0.2 || ::pad_izquierda_y &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						::base.linear.x = ::avance_base * ::pad_izquierda_y;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						::base.linear.x = 0.0;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_x != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::giro_base = ::giro_base - 0.01;&lt;br /&gt;
						&lt;br /&gt;
						if (::giro_base &amp;lt; 0.05)&lt;br /&gt;
						{&lt;br /&gt;
							::giro_base = 0.05;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_y != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::giro_base = ::giro_base + 0.01;&lt;br /&gt;
						&lt;br /&gt;
						if (::giro_base &amp;gt; 1)&lt;br /&gt;
						{&lt;br /&gt;
							::giro_base = 1;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::pad_izquierda_x &amp;gt; 0.2 || ::pad_izquierda_x &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						::base.angular.z = ::giro_base * ::pad_izquierda_x;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						::base.angular.z = 0.0;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		ros::spinOnce();&lt;br /&gt;
	&lt;br /&gt;
		loop_rate.sleep();&lt;br /&gt;
	}		  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will add the next code line to the file &amp;quot;CMakeLists.txt&amp;quot; of the created ''package'' where we indicate the name of the executable and the path of the file to compile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;add_executable(teleop_xbox360 src/teleop_xbox360.cpp)&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(teleop_xbox360&lt;br /&gt;
  ${catkin_LIBRARIES}&lt;br /&gt;
)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal, placed in the root folder of the our catkin work space, in order to compile and generate the executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd cervantes_teleop&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;teleop_xbox360.launch&amp;quot; within the folder &amp;quot;launch&amp;quot; of the created ''package'' with the content that is shown below in order to start all the necessary programs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find cervantes_epos_manager)/launch/cervantes_bringup.launch&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;joy&amp;quot; type=&amp;quot;joy_node&amp;quot; name=&amp;quot;joystick&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;node name=&amp;quot;teleop_xbox360&amp;quot; pkg=&amp;quot;cervantes_teleop&amp;quot; type=&amp;quot;teleop_xbox360&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start the teleoperator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch cervantes_teleop teleop_xbox360.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the next video we can see de teleoperation of CeRVaNTeS in the [http://gazebosim.org/ gazebo] simulator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;wF_gKr1KWfg#t=13&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=wF_gKr1KWfg#t=13 Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm and base control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_arm_and_base_control_(maxon%2bepos2)&amp;diff=4231</id>
		<title>CeRVaNTeS' arm and base control (maxon+epos2)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_arm_and_base_control_(maxon%2bepos2)&amp;diff=4231"/>
				<updated>2014-10-02T15:44:40Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: /* Base */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Maxon motors arm and base=&lt;br /&gt;
&lt;br /&gt;
The drives of the arm and base are compound by the elements shown below:&lt;br /&gt;
&lt;br /&gt;
==Arm==&lt;br /&gt;
&lt;br /&gt;
* Shoulder (turn/tilt) = 2 motors[http://www.maxonmotorusa.com/maxon/view/content/index Maxon] RE 30 (60W) + 2 Epos2 controllers + 2 Planetary Gearheads 246:1 + 2 incremental encoders 1024cpt&lt;br /&gt;
* Elbow (turn/tilt) = 2 motors [http://www.maxonmotorusa.com/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 Epos2 controllers + 2 Planetary Gearheads 246:1 + 2 incremental encoders 1024cpt&lt;br /&gt;
* Wrist(turn) = 1 motor [http://www.maxonmotorusa.com/maxon/view/content/index Maxon] A-max 22 (6W) + 1 controller Epos2 + 1 Planetary Gearhead 270:1 + 1 incremental encoder 1024cpt&lt;br /&gt;
* Wrist (tilt/inclination) = 2 motors [http://www.maxonmotorusa.com/maxon/view/content/index Maxon] EC 20 flat (5W) + + 2 Epos2 controllers + 2 Planetary Gearheads 270:1 + sensor [http://en.wikipedia.org/wiki/Hall_effect_sensor Hall] 16cpt&lt;br /&gt;
&lt;br /&gt;
'''Note''': There is a potentiometer in each joint of the arm connected to Gearhead's output in order to know the absolute position of the arm joints.&lt;br /&gt;
&lt;br /&gt;
==Base==&lt;br /&gt;
&lt;br /&gt;
* Base (left/right wheel) = 2 motors [http://www.maxonmotorusa.com/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 Epos2 controllers + 2 Planetary Gearheads 86:1 + 2 incremental encoders  2048cpt&lt;br /&gt;
&lt;br /&gt;
'''Note''': The Epos2 controllers are connected to the CANopen bus, each controller have a unique ID. The PC is plugged to USB port of the initial controller and it works like master.&lt;br /&gt;
&lt;br /&gt;
=ROS y Epos2=&lt;br /&gt;
&lt;br /&gt;
We have based on [https://code.google.com/p/wpi-rover/ wpi-rover] project to realize the driver for the communication between [http://wiki.ros.org/ ROS] and the [http://www.maxonmotor.es/maxon/view/content/index Maxon's] Epos2 controllers. This project consists of a [http://wiki.ros.org/ ROS] ''wrapper'' or ''package'' that uses the Epos2's [http://www.linux.com/ linux] libraries.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_arm_and_base_control_(maxon%2bepos2)&amp;diff=4230</id>
		<title>CeRVaNTeS' arm and base control (maxon+epos2)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_arm_and_base_control_(maxon%2bepos2)&amp;diff=4230"/>
				<updated>2014-10-02T15:43:58Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: /* Maxon motors arm and base */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Maxon motors arm and base=&lt;br /&gt;
&lt;br /&gt;
The drives of the arm and base are compound by the elements shown below:&lt;br /&gt;
&lt;br /&gt;
==Arm==&lt;br /&gt;
&lt;br /&gt;
* Shoulder (turn/tilt) = 2 motors[http://www.maxonmotorusa.com/maxon/view/content/index Maxon] RE 30 (60W) + 2 Epos2 controllers + 2 Planetary Gearheads 246:1 + 2 incremental encoders 1024cpt&lt;br /&gt;
* Elbow (turn/tilt) = 2 motors [http://www.maxonmotorusa.com/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 Epos2 controllers + 2 Planetary Gearheads 246:1 + 2 incremental encoders 1024cpt&lt;br /&gt;
* Wrist(turn) = 1 motor [http://www.maxonmotorusa.com/maxon/view/content/index Maxon] A-max 22 (6W) + 1 controller Epos2 + 1 Planetary Gearhead 270:1 + 1 incremental encoder 1024cpt&lt;br /&gt;
* Wrist (tilt/inclination) = 2 motors [http://www.maxonmotorusa.com/maxon/view/content/index Maxon] EC 20 flat (5W) + + 2 Epos2 controllers + 2 Planetary Gearheads 270:1 + sensor [http://en.wikipedia.org/wiki/Hall_effect_sensor Hall] 16cpt&lt;br /&gt;
&lt;br /&gt;
'''Note''': There is a potentiometer in each joint of the arm connected to Gearhead's output in order to know the absolute position of the arm joints.&lt;br /&gt;
&lt;br /&gt;
==Base==&lt;br /&gt;
&lt;br /&gt;
* Base (left/right wheel) = 2 motors [http://www.maxonmotorusa.com/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 Epos2 controllers + 2 Planetary Gearheads 86:1 + 2 incremental encoders  2048cpt&lt;br /&gt;
&lt;br /&gt;
'''Note''': The Epos2 controllers are connected to a CANopen bus, each controller have a unique ID. The PC is plugged to USB port of the initial controller and it works like master.&lt;br /&gt;
&lt;br /&gt;
=ROS y Epos2=&lt;br /&gt;
&lt;br /&gt;
We have based on [https://code.google.com/p/wpi-rover/ wpi-rover] project to realize the driver for the communication between [http://wiki.ros.org/ ROS] and the [http://www.maxonmotor.es/maxon/view/content/index Maxon's] Epos2 controllers. This project consists of a [http://wiki.ros.org/ ROS] ''wrapper'' or ''package'' that uses the Epos2's [http://www.linux.com/ linux] libraries.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Control_brazo_y_base_CeRVaNTeS_(maxon%2bepos2)&amp;diff=4229</id>
		<title>Control brazo y base CeRVaNTeS (maxon+epos2)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Control_brazo_y_base_CeRVaNTeS_(maxon%2bepos2)&amp;diff=4229"/>
				<updated>2014-10-02T15:41:15Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: /* Brazo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Brazo y base motores Maxon=&lt;br /&gt;
&lt;br /&gt;
Los accionamientos del brazo y la base están compuestos por los siguientes elementos:&lt;br /&gt;
&lt;br /&gt;
==Brazo==&lt;br /&gt;
&lt;br /&gt;
* Hombro (giro/inclinación) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE 30 (60W) + 2 controladoras Epos2 + 2 reductoras planetarias 246:1 + 2 encoder incrementales 1024ppv&lt;br /&gt;
* Codo (giro/inclinación) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 controladoras Epos2 + 2 reductoras planetarias 246:1 + 2 encoder incrementales 1024ppv&lt;br /&gt;
* Muñeca (giro) = 1 motor [http://www.maxonmotor.es/maxon/view/content/index Maxon] A-max 22 (6W) + 1 controladora Epos2 + 1 reductora planetaria 270:1 + 1 encoder incremental 1024ppv&lt;br /&gt;
* Muñeca (inclinación/ladeo) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] EC 20 flat (5W) + + 2 controladoras Epos2 + 2 reductoras planetarias 270:1 + sensor [http://es.wikipedia.org/wiki/Sensor_de_efecto_Hall Hall] 16ppv&lt;br /&gt;
&lt;br /&gt;
'''Nota''': Para conocer la posición absoluta de las articulaciones del brazo se dispone de un potenciómetro conectado a la salida de la reductora, en cada una.&lt;br /&gt;
&lt;br /&gt;
==Base==&lt;br /&gt;
&lt;br /&gt;
* Base (rueda izquierda/derecha) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 controladoras Epos2 + 2 reductoras planetarias 86:1 + 2 encoder incrementales 2048ppv&lt;br /&gt;
&lt;br /&gt;
'''Nota''': Las controladoras Epos2 se conectan en serie a través del puerto CANopen, cada una tiene una ID diferente. El PC actúa de maestro y se conecta al puerto USB de la primera controladora del conjunto.&lt;br /&gt;
&lt;br /&gt;
=ROS y Epos2=&lt;br /&gt;
&lt;br /&gt;
Para la realización del driver de comunicación entre [http://wiki.ros.org/ ROS] y las controladoras Epos2 de [http://www.maxonmotor.es/maxon/view/content/index Maxon] nos hemos basado en el proyecto [https://code.google.com/p/wpi-rover/ wpi-rover], el cual consiste en un ''wrapper'' o ''package'' de [http://wiki.ros.org/ ROS] que utiliza las librerias para [http://www.linux.com/ linux] de Epos2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Control_brazo_y_base_CeRVaNTeS_(maxon%2bepos2)&amp;diff=4228</id>
		<title>Control brazo y base CeRVaNTeS (maxon+epos2)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Control_brazo_y_base_CeRVaNTeS_(maxon%2bepos2)&amp;diff=4228"/>
				<updated>2014-10-02T15:38:59Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: /* Base */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Brazo y base motores Maxon=&lt;br /&gt;
&lt;br /&gt;
Los accionamientos del brazo y la base están compuestos por los siguientes elementos:&lt;br /&gt;
&lt;br /&gt;
==Brazo==&lt;br /&gt;
&lt;br /&gt;
* Hombro (giro/inclinación) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE 30 (60W) + 2 controladoras Epos2 + 2 reductoras planetarias 246:1 + 2 encoder incrementales 1024ppv&lt;br /&gt;
* Codo (giro/inclinación) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 controladoras Epos2 + 2 reductoras planetarias 246:1 + 2 encoder incrementales 1024ppv&lt;br /&gt;
* Muñeca (giro) = 1 motor [http://www.maxonmotor.es/maxon/view/content/index Maxon] A-max 22 (6W) + 1 controladora Epos2 + 1 reductora planetaria 270:1 + 1 encoder incremental 1024ppv&lt;br /&gt;
* Muñeca (inclinación/ladeo) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] EC 20 flat (5W) + + 2 controladoras Epos2 + 2 reductoras planetarias 270:1 + sensor [http://es.wikipedia.org/wiki/Sensor_de_efecto_Hall Hall] 16ppv&lt;br /&gt;
&lt;br /&gt;
'''Nota''': Para conocer la posición absoluta de las articulaciones del brazo se dispone de un potenciómetro en cada una.&lt;br /&gt;
&lt;br /&gt;
==Base==&lt;br /&gt;
&lt;br /&gt;
* Base (rueda izquierda/derecha) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 controladoras Epos2 + 2 reductoras planetarias 86:1 + 2 encoder incrementales 2048ppv&lt;br /&gt;
&lt;br /&gt;
'''Nota''': Las controladoras Epos2 se conectan en serie a través del puerto CANopen, cada una tiene una ID diferente. El PC actúa de maestro y se conecta al puerto USB de la primera controladora del conjunto.&lt;br /&gt;
&lt;br /&gt;
=ROS y Epos2=&lt;br /&gt;
&lt;br /&gt;
Para la realización del driver de comunicación entre [http://wiki.ros.org/ ROS] y las controladoras Epos2 de [http://www.maxonmotor.es/maxon/view/content/index Maxon] nos hemos basado en el proyecto [https://code.google.com/p/wpi-rover/ wpi-rover], el cual consiste en un ''wrapper'' o ''package'' de [http://wiki.ros.org/ ROS] que utiliza las librerias para [http://www.linux.com/ linux] de Epos2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_arm_and_base_control_(maxon%2bepos2)&amp;diff=4227</id>
		<title>CeRVaNTeS' arm and base control (maxon+epos2)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_arm_and_base_control_(maxon%2bepos2)&amp;diff=4227"/>
				<updated>2014-10-01T09:27:55Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: /* Maxon motors arm and base */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Maxon motors arm and base=&lt;br /&gt;
&lt;br /&gt;
The drives of the arm and base are compound by the elements shown below:&lt;br /&gt;
&lt;br /&gt;
==Arm==&lt;br /&gt;
&lt;br /&gt;
* Shoulder (turn/tilt) = 2 motors[http://www.maxonmotorusa.com/maxon/view/content/index Maxon] RE 30 (60W) + 2 Epos2 controllers + 2 Planetary Gearheads 246:1 + 2 incremental encoders 1024cpt&lt;br /&gt;
* Elbow (turn/tilt) = 2 motors [http://www.maxonmotorusa.com/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 Epos2 controllers + 2 Planetary Gearheads 246:1 + 2 incremental encoders 1024cpt&lt;br /&gt;
* Wrist(turn) = 1 motor [http://www.maxonmotorusa.com/maxon/view/content/index Maxon] A-max 22 (6W) + 1 controladora Epos2 + 1 reductora planetaria 270:1 + 1 incremental encoder 1024cpt&lt;br /&gt;
* Wrist (tilt/inclination) = 2 motors [http://www.maxonmotorusa.com/maxon/view/content/index Maxon] EC 20 flat (5W) + + 2 Epos2 controllers + 2 Planetary Gearheads 270:1 + sensor [http://en.wikipedia.org/wiki/Hall_effect_sensor Hall] 16cpt&lt;br /&gt;
&lt;br /&gt;
'''Note''': There is a potentiometer in each joint of the arm in order to know the absolute position of the arm joints.&lt;br /&gt;
&lt;br /&gt;
==Base==&lt;br /&gt;
&lt;br /&gt;
* Base (left/right wheel) = 2 motors [http://www.maxonmotorusa.com/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 Epos2 controllers + 2 Planetary Gearheads 86:1 + 2 incremental encoders  2048cpt&lt;br /&gt;
&lt;br /&gt;
'''Note''': The Epos2 controllers are connected to a CANopen bus, each controller have a unique ID. The PC is plugged to USB port of the initial controller and it works like master.&lt;br /&gt;
&lt;br /&gt;
=ROS y Epos2=&lt;br /&gt;
&lt;br /&gt;
We have based on [https://code.google.com/p/wpi-rover/ wpi-rover] project to realize the driver for the communication between [http://wiki.ros.org/ ROS] and the [http://www.maxonmotor.es/maxon/view/content/index Maxon's] Epos2 controllers. This project consists of a [http://wiki.ros.org/ ROS] ''wrapper'' or ''package'' that uses the Epos2's [http://www.linux.com/ linux] libraries.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Control_brazo_y_base_CeRVaNTeS_(maxon%2bepos2)&amp;diff=4226</id>
		<title>Control brazo y base CeRVaNTeS (maxon+epos2)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Control_brazo_y_base_CeRVaNTeS_(maxon%2bepos2)&amp;diff=4226"/>
				<updated>2014-09-30T20:13:11Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: /* Brazo y base motores Maxon */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Brazo y base motores Maxon=&lt;br /&gt;
&lt;br /&gt;
Los accionamientos del brazo y la base están compuestos por los siguientes elementos:&lt;br /&gt;
&lt;br /&gt;
==Brazo==&lt;br /&gt;
&lt;br /&gt;
* Hombro (giro/inclinación) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE 30 (60W) + 2 controladoras Epos2 + 2 reductoras planetarias 246:1 + 2 encoder incrementales 1024ppv&lt;br /&gt;
* Codo (giro/inclinación) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 controladoras Epos2 + 2 reductoras planetarias 246:1 + 2 encoder incrementales 1024ppv&lt;br /&gt;
* Muñeca (giro) = 1 motor [http://www.maxonmotor.es/maxon/view/content/index Maxon] A-max 22 (6W) + 1 controladora Epos2 + 1 reductora planetaria 270:1 + 1 encoder incremental 1024ppv&lt;br /&gt;
* Muñeca (inclinación/ladeo) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] EC 20 flat (5W) + + 2 controladoras Epos2 + 2 reductoras planetarias 270:1 + sensor [http://es.wikipedia.org/wiki/Sensor_de_efecto_Hall Hall] 16ppv&lt;br /&gt;
&lt;br /&gt;
'''Nota''': Para conocer la posición absoluta de las articulaciones del brazo se dispone de un potenciómetro en cada una.&lt;br /&gt;
&lt;br /&gt;
==Base==&lt;br /&gt;
&lt;br /&gt;
* Base (rueda izquierda/derecha) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 controladoras Epos2 + 2 reductoras planetarias 86:1 + 2 encoder incrementales 2048ppv&lt;br /&gt;
&lt;br /&gt;
'''Nota''': Las controladoras Epos2 se conectan en serie a través del puerto CANopen, cada una tiene una ID diferente. El PC actúa de maestro y se conectan al puerto USB de la primera controladora del conjunto.&lt;br /&gt;
&lt;br /&gt;
=ROS y Epos2=&lt;br /&gt;
&lt;br /&gt;
Para la realización del driver de comunicación entre [http://wiki.ros.org/ ROS] y las controladoras Epos2 de [http://www.maxonmotor.es/maxon/view/content/index Maxon] nos hemos basado en el proyecto [https://code.google.com/p/wpi-rover/ wpi-rover], el cual consiste en un ''wrapper'' o ''package'' de [http://wiki.ros.org/ ROS] que utiliza las librerias para [http://www.linux.com/ linux] de Epos2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Control_brazo_y_base_CeRVaNTeS_(maxon%2bepos2)&amp;diff=4225</id>
		<title>Control brazo y base CeRVaNTeS (maxon+epos2)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Control_brazo_y_base_CeRVaNTeS_(maxon%2bepos2)&amp;diff=4225"/>
				<updated>2014-09-30T20:05:29Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: /* Brazo y base motores Maxon */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Brazo y base motores Maxon=&lt;br /&gt;
&lt;br /&gt;
Los accionamientos del brazo y la base están compuestos por los siguientes elementos:&lt;br /&gt;
&lt;br /&gt;
==Brazo==&lt;br /&gt;
&lt;br /&gt;
* Hombro (giro/inclinación) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE 30 (60W) + 2 controladoras Epos2 + 2 reductoras planetarias 246:1 + 2 encoder relativos 1024ppv&lt;br /&gt;
* Codo (giro/inclinación) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 controladoras Epos2 + 2 reductoras planetarias 246:1 + 2 encoder relativos 1024ppv&lt;br /&gt;
* Muñeca (giro) = 1 motor [http://www.maxonmotor.es/maxon/view/content/index Maxon] A-max 22 (6W) + 1 controladora Epos2 + 1 reductora planetaria 270:1 + 1 encoder relativo 1024ppv&lt;br /&gt;
* Muñeca (inclinación/ladeo) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] EC 20 flat (5W) + + 2 controladoras Epos2 + 2 reductoras planetarias 270:1 + sensor [http://es.wikipedia.org/wiki/Sensor_de_efecto_Hall Hall] 16ppv&lt;br /&gt;
&lt;br /&gt;
'''Nota''': Para conocer la posición absoluta de las articulaciones del brazo se dispone de un potenciómetro en cada una.&lt;br /&gt;
&lt;br /&gt;
==Base==&lt;br /&gt;
&lt;br /&gt;
* Base (rueda izquierda/derecha) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 controladoras Epos2 + 2 reductoras planetarias 86:1 + 2 encoder relativos 2048ppv&lt;br /&gt;
&lt;br /&gt;
'''Nota''': Las controladoras Epos2 se conectan en serie a través del puerto CANopen, cada una tiene una ID diferente. El PC actúa de maestro y se conectan al puerto USB de la primera controladora del conjunto.&lt;br /&gt;
&lt;br /&gt;
=ROS y Epos2=&lt;br /&gt;
&lt;br /&gt;
Para la realización del driver de comunicación entre [http://wiki.ros.org/ ROS] y las controladoras Epos2 de [http://www.maxonmotor.es/maxon/view/content/index Maxon] nos hemos basado en el proyecto [https://code.google.com/p/wpi-rover/ wpi-rover], el cual consiste en un ''wrapper'' o ''package'' de [http://wiki.ros.org/ ROS] que utiliza las librerias para [http://www.linux.com/ linux] de Epos2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Control_brazo_y_base_CeRVaNTeS_(maxon%2bepos2)&amp;diff=4224</id>
		<title>Control brazo y base CeRVaNTeS (maxon+epos2)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Control_brazo_y_base_CeRVaNTeS_(maxon%2bepos2)&amp;diff=4224"/>
				<updated>2014-09-30T19:52:52Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: /* Brazo y base motores Maxon */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Brazo y base motores Maxon=&lt;br /&gt;
&lt;br /&gt;
Los accionamientos del brazo y la base están compuestos por los siguientes elementos:&lt;br /&gt;
&lt;br /&gt;
==Brazo==&lt;br /&gt;
&lt;br /&gt;
* Hombro (giro/inclinación) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE 30 (60W) + 2 controladoras Epos2 + 2 reductoras planetarias 246:1 + 2 encoder relativos 1024ppv&lt;br /&gt;
* Codo (giro/inclinación) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 controladoras Epos2 + 2 reductoras planetarias 246:1 + 2 encoder relativos 1024ppv&lt;br /&gt;
* Muñeca (giro) = 1 motor [http://www.maxonmotor.es/maxon/view/content/index Maxon] A-max 22 (6W) + 1 controladora Epos2 + 1 reductora planetaria 270:1 + 1 encoder relativo 1024ppv&lt;br /&gt;
* Muñeca (inclinación/ladeo) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] EC 20 flat (5W) + + 2 controladoras Epos2 + 2 reductoras planetarias 270:1 + sensor [http://es.wikipedia.org/wiki/Sensor_de_efecto_Hall Hall] 16ppv&lt;br /&gt;
&lt;br /&gt;
==Base==&lt;br /&gt;
&lt;br /&gt;
* Base (rueda izquierda/derecha) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 controladoras Epos2 + 2 reductoras planetarias 86:1 + 2 encoder relativos 2048ppv&lt;br /&gt;
&lt;br /&gt;
'''Nota''': Para conocer la posición absoluta de las articulaciones del brazo se dispone de un potenciómetro en cada una.&lt;br /&gt;
&lt;br /&gt;
=ROS y Epos2=&lt;br /&gt;
&lt;br /&gt;
Para la realización del driver de comunicación entre [http://wiki.ros.org/ ROS] y las controladoras Epos2 de [http://www.maxonmotor.es/maxon/view/content/index Maxon] nos hemos basado en el proyecto [https://code.google.com/p/wpi-rover/ wpi-rover], el cual consiste en un ''wrapper'' o ''package'' de [http://wiki.ros.org/ ROS] que utiliza las librerias para [http://www.linux.com/ linux] de Epos2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Control_brazo_y_base_CeRVaNTeS_(maxon%2bepos2)&amp;diff=4223</id>
		<title>Control brazo y base CeRVaNTeS (maxon+epos2)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Control_brazo_y_base_CeRVaNTeS_(maxon%2bepos2)&amp;diff=4223"/>
				<updated>2014-09-30T19:46:19Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: /* Brazo y base motores Maxon */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Brazo y base motores Maxon=&lt;br /&gt;
&lt;br /&gt;
==Brazo==&lt;br /&gt;
&lt;br /&gt;
* Hombro (giro/inclinación) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE 30 (60W) + 2 controladoras Epos2 + 2 reductoras planetarias 246:1 + 2 encoder absolutos 1024ppv&lt;br /&gt;
* Codo (giro/inclinación) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 controladoras Epos2 + 2 reductoras planetarias 246:1 + 2 encoder absolutos 1024ppv&lt;br /&gt;
* Muñeca (giro) = 1 motor [http://www.maxonmotor.es/maxon/view/content/index Maxon] A-max 22 (6W) + 1 controladora Epos2 + 1 reductora planetaria 270:1 + 1 encoder absoluto 1024ppv&lt;br /&gt;
* Muñeca (inclinación/ladeo) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] EC 20 flat (5W) + + 2 controladoras Epos2 + 2 reductoras planetarias 270:1 + sensor [http://es.wikipedia.org/wiki/Sensor_de_efecto_Hall Hall] 16ppv&lt;br /&gt;
&lt;br /&gt;
==Base==&lt;br /&gt;
&lt;br /&gt;
* Base (rueda izquierda/derecha) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 controladoras Epos2 + 2 reductoras planetarias 86:1 + 2 encoder absolutos 2048ppv&lt;br /&gt;
&lt;br /&gt;
=ROS y Epos2=&lt;br /&gt;
&lt;br /&gt;
Para la realización del driver de comunicación entre [http://wiki.ros.org/ ROS] y las controladoras Epos2 de [http://www.maxonmotor.es/maxon/view/content/index Maxon] nos hemos basado en el proyecto [https://code.google.com/p/wpi-rover/ wpi-rover], el cual consiste en un ''wrapper'' o ''package'' de [http://wiki.ros.org/ ROS] que utiliza las librerias para [http://www.linux.com/ linux] de Epos2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Control_brazo_y_base_CeRVaNTeS_(maxon%2bepos2)&amp;diff=4222</id>
		<title>Control brazo y base CeRVaNTeS (maxon+epos2)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Control_brazo_y_base_CeRVaNTeS_(maxon%2bepos2)&amp;diff=4222"/>
				<updated>2014-09-30T19:40:47Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: /* Brazo y base motores Maxon */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Brazo y base motores Maxon=&lt;br /&gt;
&lt;br /&gt;
==Brazo==&lt;br /&gt;
&lt;br /&gt;
* Hombro (giro/inclinación) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE 30 (60W) + 2 controladoras Epos2 + 2 reductoras planetarias 246:1 + 2 encoder absolutos 256ppv&lt;br /&gt;
* Codo (giro/inclinación) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] RE-max 29 (22W) + 2 controladoras Epos2 + 2 reductoras planetarias 246:1 + 2 encoder absolutos 256ppv&lt;br /&gt;
* Muñeca (giro) = 1 motor [http://www.maxonmotor.es/maxon/view/content/index Maxon] A-max 22 (6W) + 1 controladora Epos2 + 1 reductora planetaria 270:1 + 1 encoder absoluto 256ppv&lt;br /&gt;
* Muñeca (inclinación/ladeo) = 2 motores [http://www.maxonmotor.es/maxon/view/content/index Maxon] EC 20 flat (5W) + + 2 controladoras Epos2 + 2 reductoras planetarias 270:1 + sensor [http://es.wikipedia.org/wiki/Sensor_de_efecto_Hall Hall] 16ppv&lt;br /&gt;
&lt;br /&gt;
=ROS y Epos2=&lt;br /&gt;
&lt;br /&gt;
Para la realización del driver de comunicación entre [http://wiki.ros.org/ ROS] y las controladoras Epos2 de [http://www.maxonmotor.es/maxon/view/content/index Maxon] nos hemos basado en el proyecto [https://code.google.com/p/wpi-rover/ wpi-rover], el cual consiste en un ''wrapper'' o ''package'' de [http://wiki.ros.org/ ROS] que utiliza las librerias para [http://www.linux.com/ linux] de Epos2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Control_brazo_y_base_CeRVaNTeS_(maxon%2bepos2)&amp;diff=4221</id>
		<title>Control brazo y base CeRVaNTeS (maxon+epos2)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Control_brazo_y_base_CeRVaNTeS_(maxon%2bepos2)&amp;diff=4221"/>
				<updated>2014-09-30T17:55:30Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: /* Brazo y base Motores Maxon */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Brazo y base motores Maxon=&lt;br /&gt;
&lt;br /&gt;
=ROS y Epos2=&lt;br /&gt;
&lt;br /&gt;
Para la realización del driver de comunicación entre [http://wiki.ros.org/ ROS] y las controladoras Epos2 de [http://www.maxonmotor.es/maxon/view/content/index Maxon] nos hemos basado en el proyecto [https://code.google.com/p/wpi-rover/ wpi-rover], el cual consiste en un ''wrapper'' o ''package'' de [http://wiki.ros.org/ ROS] que utiliza las librerias para [http://www.linux.com/ linux] de Epos2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=MYRAbot%27s_Teleoperation_with_xbox360_wireless_controller_(xbox360_controller%2bjoy)&amp;diff=4220</id>
		<title>MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=MYRAbot%27s_Teleoperation_with_xbox360_wireless_controller_(xbox360_controller%2bjoy)&amp;diff=4220"/>
				<updated>2014-09-29T11:12:21Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Teleoperation of MYRAbot=&lt;br /&gt;
&lt;br /&gt;
We need a teleoperation system in order to take the control of the robot to make specific tasks. Currently we use the [http://es.wikipedia.org/wiki/Secure_Shell ssh] connection between the robot PC and our PC, using the keyboard. This method use a [http://es.wikipedia.org/wiki/Wi-Fi wifi] network that can fail or not available. For this reason the best option is to use a device plugged in to the PC robot with its own network. The well-chosen device is the [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows xbox360 wireless controller of microsoft].&lt;br /&gt;
&lt;br /&gt;
=xbox360 controller=&lt;br /&gt;
&lt;br /&gt;
==Description of buttons and axes==&lt;br /&gt;
&lt;br /&gt;
This controller has 6 axes and 14 buttons that are distributed like is shown below:&lt;br /&gt;
&lt;br /&gt;
* Left pad: 2 axes and 1 button.&lt;br /&gt;
* Right pad: 2 axes and 1 button.&lt;br /&gt;
* Left trigger: 1 axe.&lt;br /&gt;
* Right trigger: 1 axe.&lt;br /&gt;
* Cross: 4 buttons.&lt;br /&gt;
* Left side buttons: 4 buttons.&lt;br /&gt;
* Left button: 1 button.&lt;br /&gt;
* Right button: 1 button.&lt;br /&gt;
* &amp;quot;Back&amp;quot; button: 1 button.&lt;br /&gt;
* &amp;quot;Start&amp;quot; button: 1 button.&lt;br /&gt;
&lt;br /&gt;
The function assigned to the buttons and axes of the [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows xbox360 controller] for teleoperation of MYRAbot is shown in the next picture:&lt;br /&gt;
&lt;br /&gt;
[[file:controlador_xbox360_MYRAbot-EN.jpg|thumb|center|800px|Funcionalidad [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows xbox360 controller] for MYRAbot.]]&lt;br /&gt;
&lt;br /&gt;
==Program==&lt;br /&gt;
&lt;br /&gt;
The program assigns the function to the buttons and axes. The program subscribes to the ''topic'' &amp;quot;joy&amp;quot; where is published the state of the buttons and axes and publishes the ''topics'' &amp;quot;cmd_vel&amp;quot;, &amp;quot;move_arm&amp;quot; and &amp;quot;hand_arm&amp;quot; for the control of [http://www.irobot.com/global/es/store/Roomba.aspx?gclid=CMfZy73s570CFTMetAodW3UA7A roomba] and the [[MYRAbot's arm control (bioloid+arduino)|arm]]. We have to execute the next command in a terminal in order to create a new ''package'' named &amp;quot;myrabot_teleop&amp;quot; within our workspace:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscreate-pkg myrabot_teleop brazo_fer geometry_msgs sensor_msgs std_msgs ros_cpp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a new file named &amp;quot;teleoperador_xbox360.cpp&amp;quot; within the folder &amp;quot;src&amp;quot; of the created ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cpp enclose=div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/brazo_fer.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;    &lt;br /&gt;
  #include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
myrabot_arm_base::Servos p, e, c, pinza;&lt;br /&gt;
geometry_msgs::Point punto;&lt;br /&gt;
int pinza_incli = 0;&lt;br /&gt;
int paso = 5;&lt;br /&gt;
int cont = 0;&lt;br /&gt;
	&lt;br /&gt;
myrabot_arm_base::WriteServos teleop;&lt;br /&gt;
myrabot_arm_base::WriteServos teleop_pinza;&lt;br /&gt;
&lt;br /&gt;
float avance = 0.2, giro = 0.5;&lt;br /&gt;
int velocidad = 50;&lt;br /&gt;
int start = 0;&lt;br /&gt;
int flanco;&lt;br /&gt;
&lt;br /&gt;
geometry_msgs::Twist base;&lt;br /&gt;
&lt;br /&gt;
float pad_izquierda_x, pad_izquierda_y, gatillo_izquierda, pad_derecha_x, pad_derecha_y, gatillo_derecha;&lt;br /&gt;
int boton_a, boton_b, boton_izquierda, boton_x, boton_y, boton_derecha, boton_back, boton_start, boton_pad_izquierda, boton_pad_derecha, cruz_izquierda, cruz_derecha, cruz_arriba, cruz_abajo;&lt;br /&gt;
 &lt;br /&gt;
  void posicion_estado_corriente(const myrabot_arm_base::ReadServos&amp;amp; pec)   &lt;br /&gt;
  {&lt;br /&gt;
	&lt;br /&gt;
	::p = pec.posicion;&lt;br /&gt;
	::e = pec.estado;&lt;br /&gt;
	::c = pec.corriente;&lt;br /&gt;
	  &lt;br /&gt;
  }	  	 &lt;br /&gt;
 &lt;br /&gt;
  void xbox(const sensor_msgs::Joy&amp;amp; xbox_joystick)   &lt;br /&gt;
  {	&lt;br /&gt;
	&lt;br /&gt;
	::pad_izquierda_x = xbox_joystick.axes[0];&lt;br /&gt;
	::pad_izquierda_y = xbox_joystick.axes[1];&lt;br /&gt;
	::gatillo_izquierda = xbox_joystick.axes[2] -1;&lt;br /&gt;
	::pad_derecha_x = xbox_joystick.axes[3];&lt;br /&gt;
	::pad_derecha_y = xbox_joystick.axes[4];&lt;br /&gt;
	::gatillo_derecha = xbox_joystick.axes[5] -1;&lt;br /&gt;
	&lt;br /&gt;
	::boton_a = xbox_joystick.buttons[0];&lt;br /&gt;
	::boton_b = xbox_joystick.buttons[1];&lt;br /&gt;
	::boton_x = xbox_joystick.buttons[2];&lt;br /&gt;
	::boton_y = xbox_joystick.buttons[3];&lt;br /&gt;
	::boton_izquierda = xbox_joystick.buttons[4];&lt;br /&gt;
	::boton_derecha = xbox_joystick.buttons[5];&lt;br /&gt;
	::boton_back = xbox_joystick.buttons[6];&lt;br /&gt;
	::boton_start = xbox_joystick.buttons[7];&lt;br /&gt;
	::boton_pad_izquierda = xbox_joystick.buttons[9];&lt;br /&gt;
	::boton_pad_derecha = xbox_joystick.buttons[10];	&lt;br /&gt;
	::cruz_izquierda = xbox_joystick.buttons[11];&lt;br /&gt;
	::cruz_derecha = xbox_joystick.buttons[12];&lt;br /&gt;
	::cruz_arriba = xbox_joystick.buttons[13];&lt;br /&gt;
	::cruz_abajo = xbox_joystick.buttons[14];	&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;teleoperador_xbox360&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
	&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber pose_sub_= n.subscribe(&amp;quot;pose_arm&amp;quot;, 1, posicion_estado_corriente);   &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber joystick_sub_= n.subscribe(&amp;quot;joy&amp;quot;, 1, xbox); &lt;br /&gt;
  	&lt;br /&gt;
  	&lt;br /&gt;
	ros::Publisher move_pub_=n.advertise&amp;lt;myrabot_arm_base::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
&lt;br /&gt;
	ros::Publisher hand_pub_=n.advertise&amp;lt;myrabot_arm_base::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);&lt;br /&gt;
	&lt;br /&gt;
	ros::Publisher base_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1); &lt;br /&gt;
		&lt;br /&gt;
    ros::Rate loop_rate(5);	&lt;br /&gt;
	&lt;br /&gt;
	while (ros::ok())&lt;br /&gt;
	{&lt;br /&gt;
	&lt;br /&gt;
		myrabot_arm_base::Servos pose = ::p;	&lt;br /&gt;
		&lt;br /&gt;
		if (::cont == 0 &amp;amp;&amp;amp; (pose.base != 0 &amp;amp;&amp;amp; pose.arti1 != 0 &amp;amp;&amp;amp; pose.arti2 != 0 &amp;amp;&amp;amp; pose.arti3 != 0))&lt;br /&gt;
		{&lt;br /&gt;
			::punto = home(::p, ::c);	&lt;br /&gt;
		&lt;br /&gt;
			::cont = 1;&lt;br /&gt;
		&lt;br /&gt;
			::pinza.pinza = 511;&lt;br /&gt;
		&lt;br /&gt;
			::teleop = inversa(::punto, ::pinza_incli, ::p, ::velocidad);		&lt;br /&gt;
		&lt;br /&gt;
			::teleop_pinza = control_pinza(::pinza, ::p, ::c);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (::pad_izquierda_y &amp;gt; 0.2 || ::pad_izquierda_y &amp;lt; -0.2 || ::pad_izquierda_x &amp;gt; 0.2 || ::pad_izquierda_x &amp;lt; -0.2 || ::pad_derecha_x &amp;gt; 0.2 || ::pad_derecha_x &amp;lt; -0.2 || pad_derecha_y &amp;gt; 0.2 || pad_derecha_y &amp;lt; -0.2 || (::gatillo_izquierda &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_izquierda != -1) || (::gatillo_derecha &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_derecha != -1) || ::cruz_izquierda !=  0 || ::cruz_derecha !=  0 || ::cruz_arriba != 0 || ::cruz_abajo != 0 || ::boton_back != 0 || ::boton_start != 0 || ::boton_a != 0 || ::boton_b != 0 || ::boton_x != 0 || ::boton_y != 0 || ::boton_izquierda != 0 || ::boton_derecha != 0)&lt;br /&gt;
		{&lt;br /&gt;
		&lt;br /&gt;
			if (::boton_start != 0 &amp;amp;&amp;amp; ::flanco == 0)&lt;br /&gt;
			{&lt;br /&gt;
				flanco = 1;&lt;br /&gt;
			}&lt;br /&gt;
			else &lt;br /&gt;
			{&lt;br /&gt;
				if (::boton_start != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::flanco = 2;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::flanco = 0;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		&lt;br /&gt;
			if (::boton_start != 0 &amp;amp;&amp;amp; ::flanco == 1)&lt;br /&gt;
			{&lt;br /&gt;
				if (::start == 0)&lt;br /&gt;
				{&lt;br /&gt;
					::start = 1;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::start = 0;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			if (::start == 1)&lt;br /&gt;
			{&lt;br /&gt;
			&lt;br /&gt;
				if (::boton_back != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::cont = 0;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::cruz_izquierda != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::velocidad = ::velocidad - 10;&lt;br /&gt;
					&lt;br /&gt;
					if (::velocidad &amp;lt; 10)&lt;br /&gt;
					{&lt;br /&gt;
						::velocidad = 10;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::cruz_derecha != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::velocidad = ::velocidad + 10;&lt;br /&gt;
					&lt;br /&gt;
					if (::velocidad &amp;gt; 100)&lt;br /&gt;
					{&lt;br /&gt;
						::velocidad = 100;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				if (::pad_derecha_x &amp;gt; 0.2 || ::pad_derecha_x &amp;lt; -0.2)&lt;br /&gt;
				{&lt;br /&gt;
					float f_pad_derecha_x = ::pad_derecha_x;&lt;br /&gt;
					::punto.x = ::punto.x + (f_pad_derecha_x * ::paso);&lt;br /&gt;
					::teleop = inversa(::punto, ::pinza_incli, pose, ::velocidad);&lt;br /&gt;
					if (::teleop.posicion.base == pose.base &amp;amp;&amp;amp; ::teleop.posicion.arti1 == pose.arti1 &amp;amp;&amp;amp; ::teleop.posicion.arti2 == pose.arti2 &amp;amp;&amp;amp; ::teleop.posicion.arti3 == pose.arti3) &lt;br /&gt;
					{::punto.x = ::punto.x - (f_pad_derecha_x * ::paso);}&lt;br /&gt;
					else&lt;br /&gt;
					{move_pub_.publish(::teleop);}&lt;br /&gt;
				}&lt;br /&gt;
	&lt;br /&gt;
				if (pad_derecha_y &amp;gt; 0.2 || pad_derecha_y &amp;lt; -0.2)&lt;br /&gt;
				{&lt;br /&gt;
					float f_pad_derecha_y = ::pad_derecha_y;&lt;br /&gt;
					::punto.y = ::punto.y + (f_pad_derecha_y * ::paso);&lt;br /&gt;
					::teleop = inversa(::punto, ::pinza_incli, pose, ::velocidad);&lt;br /&gt;
					if (::teleop.posicion.base == pose.base &amp;amp;&amp;amp; ::teleop.posicion.arti1 == pose.arti1 &amp;amp;&amp;amp; ::teleop.posicion.arti2 == pose.arti2 &amp;amp;&amp;amp; ::teleop.posicion.arti3 == pose.arti3) &lt;br /&gt;
					{::punto.y = ::punto.y - (f_pad_derecha_y * ::paso);}&lt;br /&gt;
					else&lt;br /&gt;
					{move_pub_.publish(::teleop);}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::gatillo_izquierda &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_izquierda != -1)&lt;br /&gt;
				{&lt;br /&gt;
					float f_gatillo_izquierda = ::gatillo_izquierda;&lt;br /&gt;
					::punto.z = ::punto.z + (f_gatillo_izquierda  * (::paso/2));&lt;br /&gt;
					::teleop = inversa(::punto, ::pinza_incli, pose, ::velocidad);&lt;br /&gt;
					if (::teleop.posicion.base == pose.base &amp;amp;&amp;amp; ::teleop.posicion.arti1 == pose.arti1 &amp;amp;&amp;amp; ::teleop.posicion.arti2 == pose.arti2 &amp;amp;&amp;amp; ::teleop.posicion.arti3 == pose.arti3) &lt;br /&gt;
					{::punto.z = ::punto.z - (f_gatillo_izquierda * (::paso/2));}&lt;br /&gt;
					else&lt;br /&gt;
					{move_pub_.publish(::teleop);}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::gatillo_derecha &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_derecha != -1)&lt;br /&gt;
				{&lt;br /&gt;
					float f_gatillo_derecha = ::gatillo_derecha;&lt;br /&gt;
					::punto.z = ::punto.z - (f_gatillo_derecha  * (::paso/2));&lt;br /&gt;
					::teleop = inversa(::punto, ::pinza_incli, pose, ::velocidad);&lt;br /&gt;
					if (::teleop.posicion.base == pose.base &amp;amp;&amp;amp; ::teleop.posicion.arti1 == pose.arti1 &amp;amp;&amp;amp; ::teleop.posicion.arti2 == pose.arti2 &amp;amp;&amp;amp; ::teleop.posicion.arti3 == pose.arti3) &lt;br /&gt;
					{::punto.z = ::punto.z + (f_gatillo_derecha * (::paso/2));}&lt;br /&gt;
					else&lt;br /&gt;
					{move_pub_.publish(::teleop);}&lt;br /&gt;
				}		&lt;br /&gt;
				&lt;br /&gt;
				if (::cruz_arriba !=  0)&lt;br /&gt;
				{&lt;br /&gt;
					::pinza_incli = ::pinza_incli - (::paso * ::cruz_arriba);&lt;br /&gt;
					teleop = inversa(::punto, ::pinza_incli, pose, ::velocidad);&lt;br /&gt;
					if (teleop.posicion.base == pose.base &amp;amp;&amp;amp; teleop.posicion.arti1 == pose.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == pose.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == pose.arti3) &lt;br /&gt;
					{::pinza_incli = ::pinza_incli + (::paso * ::cruz_arriba);}&lt;br /&gt;
					else&lt;br /&gt;
					{move_pub_.publish(::teleop);}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::cruz_abajo !=  0)&lt;br /&gt;
				{&lt;br /&gt;
					::pinza_incli = ::pinza_incli + (::paso * ::cruz_abajo);&lt;br /&gt;
					::teleop = inversa(::punto, ::pinza_incli, pose, ::velocidad);&lt;br /&gt;
					if (teleop.posicion.base == pose.base &amp;amp;&amp;amp; teleop.posicion.arti1 == pose.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == pose.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == pose.arti3) &lt;br /&gt;
					{::pinza_incli = ::pinza_incli - (::paso * ::cruz_abajo);}&lt;br /&gt;
					else&lt;br /&gt;
					{move_pub_.publish(::teleop);}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::boton_izquierda != 0)&lt;br /&gt;
				{     &lt;br /&gt;
					::pinza.pinza = ::pinza.pinza - (::paso * ::boton_izquierda);&lt;br /&gt;
					::teleop_pinza = control_pinza(::pinza, pose, ::c);&lt;br /&gt;
					if (::teleop_pinza.posicion.pinza == pose.pinza) &lt;br /&gt;
					{::pinza.pinza = ::pinza.pinza + (::paso * ::boton_izquierda);}&lt;br /&gt;
					else&lt;br /&gt;
					{hand_pub_.publish(::teleop_pinza);}	&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::boton_derecha != 0)&lt;br /&gt;
				{     &lt;br /&gt;
					::pinza.pinza = ::pinza.pinza + (::paso * ::boton_derecha);&lt;br /&gt;
					::teleop_pinza = control_pinza(::pinza, pose, ::c);&lt;br /&gt;
					if (::teleop_pinza.posicion.pinza == pose.pinza) &lt;br /&gt;
					{::pinza.pinza = ::pinza.pinza - (::paso * ::boton_derecha);}&lt;br /&gt;
					else&lt;br /&gt;
					{hand_pub_.publish(::teleop_pinza);}	&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::boton_a != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::avance = ::avance - 0.05;&lt;br /&gt;
					&lt;br /&gt;
					if (::avance &amp;lt; 0.05)&lt;br /&gt;
					{&lt;br /&gt;
						::avance = 0.05;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::boton_b != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::avance = ::avance + 0.05;&lt;br /&gt;
					&lt;br /&gt;
					if (::avance &amp;gt; 0.5)&lt;br /&gt;
					{&lt;br /&gt;
						::avance = 0.5;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::pad_izquierda_y &amp;gt; 0.2 || ::pad_izquierda_y &amp;lt; -0.2)&lt;br /&gt;
				{&lt;br /&gt;
					::base.linear.x = ::avance * pad_izquierda_y;&lt;br /&gt;
					base_pub_.publish(::base);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::base.linear.x = 0;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::boton_x != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::giro = ::giro - 0.05;&lt;br /&gt;
					&lt;br /&gt;
					if (::giro &amp;lt; 0.1)&lt;br /&gt;
					{&lt;br /&gt;
						::giro = 0.1;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::boton_y != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::giro = ::giro + 0.05;&lt;br /&gt;
					&lt;br /&gt;
					if (::giro &amp;gt; 1.5)&lt;br /&gt;
					{&lt;br /&gt;
						::giro = 1.5;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::pad_izquierda_x &amp;gt; 0.2 || ::pad_izquierda_x &amp;lt; -0.2)&lt;br /&gt;
				{&lt;br /&gt;
					::base.angular.z = ::giro * pad_izquierda_x;&lt;br /&gt;
					base_pub_.publish(::base);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::base.angular.z = 0;&lt;br /&gt;
				}		&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		ros::spinOnce();&lt;br /&gt;
	&lt;br /&gt;
		loop_rate.sleep();&lt;br /&gt;
	}		  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will add the next code line to the file &amp;quot;CMakeLists.txt&amp;quot; of the created ''package'' where we indicate the name of the executable and the path of the file to compile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;rosbuild_add_executable(teleoperador_xbox360 src/teleoperador_xbox360.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next commands an a terminal in order to compile and generate the executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd myrabot_teleop&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;teleoperador_xbox360.launch&amp;quot; within the folder &amp;quot;launch&amp;quot; of the created ''package'' with the content that is shown below in order to start all the necessary programs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;serial_node&amp;quot; pkg=&amp;quot;rosserial_python&amp;quot; type=&amp;quot;serial_node.py&amp;quot; args=&amp;quot;/dev/ttyACM0&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;joy&amp;quot; type=&amp;quot;joy_node&amp;quot; name=&amp;quot;joystick&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find turtlebot_bringup)/launch/minimal.launch&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;teleoperador_xbox360&amp;quot; pkg=&amp;quot;myrabot_teleop&amp;quot; type=&amp;quot;teleoperador_xbox360&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start the teleoperator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_teleop teleoperador_xbox360.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Voice_control_(sphinx%2bfestival)&amp;diff=4219</id>
		<title>Voice control (sphinx+festival)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Voice_control_(sphinx%2bfestival)&amp;diff=4219"/>
				<updated>2014-09-29T11:11:54Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Preliminary steps=&lt;br /&gt;
&lt;br /&gt;
We use [http://cmusphinx.sourceforge.net/ CMU Pocket Sphinx] for speech recognition developed on [http://www.cmu.edu/index.shtml Carnegie Mellon University], and [http://www.cstr.ed.ac.uk/projects/festival/ Festival Speech Synthesis System] for text speech developed on [http://www.ed.ac.uk/home University of Edinburgh].&lt;br /&gt;
&lt;br /&gt;
Currently the [http://wiki.ros.org/ ROS] ''package'' [http://wiki.ros.org/pocketsphinx pocketsphinx] is available for groovy and hydro distributions. We can install it executing the next command in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get install ros-&amp;quot;groovy or hydro&amp;quot;-pocketsphinx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to install the [http://www.ubuntu.com/ ubuntu] ''package'' [http://cmusphinx.sourceforge.net/ CMU Pocket Sphinx] in previous [http://wiki.ros.org/ ROS] distributions. We will execute the next command in a terminal to install it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get install gstreamer0.10-pocketsphinx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moreover for previous [http://wiki.ros.org/ ROS] distributions, we have to download the [http://wiki.ros.org/ ROS] ''stack'' &amp;quot;rharmony&amp;quot; by [http://www.albany.edu/ University of Albany] in order to integrate [http://cmusphinx.sourceforge.net/ CMU Pocket Sphinx] in [http://wiki.ros.org/ ROS]. We will place in the [http://wiki.ros.org/ ROS] workspace and we will execute the next commands in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
svn checkout http://albany-ros-pkg.googlecode.com/svn/trunk/rharmony&lt;br /&gt;
rosmake --rosdep-install pocketsphinx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cstr.ed.ac.uk/projects/festival/ Festival Speech Synthesis System] is intigrated in the [http://wiki.ros.org/ ROS] ''package'' [http://wiki.ros.org/sound_play?distro=electric sound_play].&lt;br /&gt;
&lt;br /&gt;
=Speech recognition=&lt;br /&gt;
&lt;br /&gt;
First, we will execute the next command in a terminal within our workspace in order to create a ''package'' named &amp;quot;voz_fer&amp;quot; that will content the voice control programs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscreate-pkg voz_fer pocketsphinx sound_play std_msgs roscpp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to select the vocabulary that we use to control the robot. We use short sentences for the orders in order to reduce the recognition mistakes. We will create a file named &amp;quot;comandos_voz.txt&amp;quot; within the folder &amp;quot;config&amp;quot; of the created ''package'' with the content that is show below (each sentence must be in a new line): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
start speech&lt;br /&gt;
stop speech&lt;br /&gt;
go forward&lt;br /&gt;
go back&lt;br /&gt;
turn left&lt;br /&gt;
turn right&lt;br /&gt;
speed up&lt;br /&gt;
slow down&lt;br /&gt;
rotate left&lt;br /&gt;
rotate right&lt;br /&gt;
stop&lt;br /&gt;
point beer&lt;br /&gt;
point cocacola&lt;br /&gt;
fold arm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will upload and compile the created file &amp;quot;comandos_voz.txt&amp;quot; in the next link in order to generate the recognition vocabulary:&lt;br /&gt;
&lt;br /&gt;
[http://www.speech.cs.cmu.edu/tools/lmtool-new.html Sphinx knowledge base tool]&lt;br /&gt;
&lt;br /&gt;
We will download and rename (commandos_voz.*) the generated files within the folder &amp;quot;config&amp;quot; of the generated ''package''. We will create a file named &amp;quot;comados_voz.launch&amp;quot; within the folder &amp;quot;launch&amp;quot; of the ''package'' in order to start [http://cmusphinx.sourceforge.net/ CMU Pocket Sphinx] with our vocabulary:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;recognizer&amp;quot; pkg=&amp;quot;pocketsphinx&amp;quot; type=&amp;quot;recognizer.py&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;lm&amp;quot; value=&amp;quot;$(find voz_fer)/config/comandos.lm&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;dict&amp;quot; value=&amp;quot;$(find voz_fer)/config/comandos.dic&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start the speech recognition:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch voz_fer comandos_voz.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The results of the speech recognition are published in the ''topic'' &amp;quot;recognizer/output&amp;quot; (message type [http://docs.ros.org/api/std_msgs/html/msg/String.html std_msgs/String]). We will execute the next command in a terminal in order to see the results of the speech recognition:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic echo recognizer/output&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Text speech=&lt;br /&gt;
&lt;br /&gt;
We have to use the class sound_play::SoundClient in order to use text speech in our program. The public functions of this class are shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Sound 	builtinSound (int id)&lt;br /&gt;
 	Create a builtin Sound.&lt;br /&gt;
void 	play (int sound)&lt;br /&gt;
 	Play a buildin sound.&lt;br /&gt;
void 	playWave (const std::string &amp;amp;s)&lt;br /&gt;
 	Plays a WAV or OGG file.&lt;br /&gt;
void 	repeat (const std::string &amp;amp;s)&lt;br /&gt;
 	Say a string repeatedly.&lt;br /&gt;
void 	say (const std::string &amp;amp;s, const std::string &amp;amp;voice=&amp;quot;voice_kal_diphone&amp;quot;)&lt;br /&gt;
 	Say a string.&lt;br /&gt;
void 	setQuiet (bool state)&lt;br /&gt;
 	Turns warning messages on or off.&lt;br /&gt;
 	SoundClient (ros::NodeHandle &amp;amp;nh, const std::string &amp;amp;topic)&lt;br /&gt;
 	Create a SoundClient that publishes on the given topic.&lt;br /&gt;
 	SoundClient ()&lt;br /&gt;
 	Create a SoundClient with the default topic.&lt;br /&gt;
void 	start (int sound)&lt;br /&gt;
 	Play a buildin sound repeatedly.&lt;br /&gt;
void 	startWave (const std::string &amp;amp;s)&lt;br /&gt;
 	Plays a WAV or OGG file repeatedly.&lt;br /&gt;
void 	stop (int sound)&lt;br /&gt;
 	Stop playing a built-in sound.&lt;br /&gt;
void 	stopAll ()&lt;br /&gt;
 	Stop all currently playing sounds.&lt;br /&gt;
void 	stopSaying (const std::string &amp;amp;s)&lt;br /&gt;
 	Stop saying a string.&lt;br /&gt;
void 	stopWave (const std::string &amp;amp;s)&lt;br /&gt;
 	Stop playing a WAV or OGG file.&lt;br /&gt;
Sound 	voiceSound (const std::string &amp;amp;s)&lt;br /&gt;
 	Create a voice Sound.&lt;br /&gt;
Sound 	waveSound (const std::string &amp;amp;s)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will use the function &amp;quot;say&amp;quot; that say once a string using the default synthesized voice &amp;quot;voice_kal_diphone&amp;quot;. We have to use the function &amp;quot;sleep(seconds)&amp;quot; in order to pause the program execution to say the string.&lt;br /&gt;
&lt;br /&gt;
=Control program MYRAbot=&lt;br /&gt;
&lt;br /&gt;
This program allows us teleoperate MYRAbot and point objects with the [[MYRAbot's arm control (bioloid+arduino)|arm]] using our voice. The program is subscribe to the ''topic'' &amp;quot;recognizer/output&amp;quot; (publised by pocketsphinx) and publishes the ''topics'' &amp;quot;cmd_vel&amp;quot; (base control) and &amp;quot;selected_object&amp;quot; (point objects using the program [[Objects recognition and position calculation (webcam)#To point objects (Choose)]|choose]). We will create a file named &amp;quot;control_voz.cpp&amp;quot; within the folder &amp;quot;src&amp;quot; of the created ``package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;std_msgs/Int16.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;std_msgs/String.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;sound_play/sound_play.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  int inicio = 0;&lt;br /&gt;
  int rotate = 0;&lt;br /&gt;
  int turn = 0;&lt;br /&gt;
  int start = 0;&lt;br /&gt;
  int stop = 1;&lt;br /&gt;
  float linear_vel = 0.0;&lt;br /&gt;
  float angular_vel = 0.0;&lt;br /&gt;
  std_msgs::String comando_voz;  &lt;br /&gt;
 &lt;br /&gt;
  void sleepok(int t, ros::NodeHandle &amp;amp;n)&lt;br /&gt;
  {&lt;br /&gt;
       if (n.ok())&lt;br /&gt;
               sleep(t);&lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
  void speech(const std_msgs::String&amp;amp; voz)&lt;br /&gt;
  {&lt;br /&gt;
	::comando_voz = voz;&lt;br /&gt;
	&lt;br /&gt;
	ros::NodeHandle n;	&lt;br /&gt;
       &lt;br /&gt;
	ros::Publisher object_pub_=n.advertise&amp;lt;std_msgs::Int16&amp;gt;(&amp;quot;selected_object&amp;quot;, 1); &lt;br /&gt;
        &lt;br /&gt;
	ros::Publisher move_base_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1); &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	std_msgs::Int16 objeto;&lt;br /&gt;
	geometry_msgs::Twist mover_base;&lt;br /&gt;
	      &lt;br /&gt;
	if (::comando_voz.data == &amp;quot;start speech&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		inicio = 1;&lt;br /&gt;
				&lt;br /&gt;
	}&lt;br /&gt;
	else if (::comando_voz.data == &amp;quot;stop speech&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		inicio = 0;&lt;br /&gt;
				&lt;br /&gt;
	}&lt;br /&gt;
	else if (inicio == 1)&lt;br /&gt;
	{&lt;br /&gt;
		if (::comando_voz.data == &amp;quot;stop&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			::linear_vel = 0.0;&lt;br /&gt;
			::angular_vel = 0.0;&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;go forward&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			&lt;br /&gt;
			::linear_vel = 0.1;&lt;br /&gt;
			::angular_vel = 0.0;&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;go back&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			&lt;br /&gt;
			::linear_vel = -0.1;&lt;br /&gt;
			::angular_vel = 0.0;&lt;br /&gt;
			&lt;br /&gt;
		}	&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;turn left&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			if (::angular_vel &amp;lt;= 0 || ::rotate == 1)&lt;br /&gt;
			{&lt;br /&gt;
				::angular_vel = 0.1;&lt;br /&gt;
				&lt;br /&gt;
				::rotate = 0;&lt;br /&gt;
				::turn = 1;					&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
			&lt;br /&gt;
				::angular_vel = ::angular_vel + 0.1;&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;turn right&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			if (::angular_vel &amp;gt;= 0 || ::rotate == 1)&lt;br /&gt;
			{&lt;br /&gt;
				::angular_vel = -0.1;&lt;br /&gt;
				&lt;br /&gt;
				::rotate = 0;&lt;br /&gt;
				::turn = 1;				&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
		&lt;br /&gt;
			         ::angular_vel = ::angular_vel - 0.1;&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;rotate left&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			if (::angular_vel &amp;lt;= 0 || ::turn == 1)&lt;br /&gt;
			{&lt;br /&gt;
				::angular_vel = 0.1;&lt;br /&gt;
				&lt;br /&gt;
				::turn = 0;&lt;br /&gt;
				::rotate = 1;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			::linear_vel = 0.0;&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;rotate right&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			if (::angular_vel &amp;gt;= 0 || ::turn == 1)&lt;br /&gt;
			{&lt;br /&gt;
				::angular_vel = -0.1;&lt;br /&gt;
				&lt;br /&gt;
				::turn = 0;&lt;br /&gt;
				::rotate = 1;				&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			::linear_vel = 0.0;&lt;br /&gt;
&lt;br /&gt;
		}		&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;speed up&amp;quot;)				&lt;br /&gt;
		{&lt;br /&gt;
			if (::linear_vel == 0)&lt;br /&gt;
			{&lt;br /&gt;
				if (::angular_vel &amp;gt; 0 &amp;amp;&amp;amp; ::rotate == 1)&lt;br /&gt;
				{&lt;br /&gt;
					::angular_vel= ::angular_vel + 0.05;&lt;br /&gt;
				}&lt;br /&gt;
				else if (::rotate == 1)&lt;br /&gt;
				{&lt;br /&gt;
					::angular_vel = ::angular_vel - 0.05;&lt;br /&gt;
				}			&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				if (::linear_vel &amp;gt; 0)&lt;br /&gt;
				{&lt;br /&gt;
					::linear_vel = ::linear_vel + 0.05;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::linear_vel = ::linear_vel - 0.05;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;slow down&amp;quot;)				&lt;br /&gt;
		{&lt;br /&gt;
			if (::linear_vel == 0)&lt;br /&gt;
			{&lt;br /&gt;
				if (::angular_vel &amp;gt; 0 &amp;amp;&amp;amp; ::rotate == 1)&lt;br /&gt;
				{&lt;br /&gt;
					::angular_vel = ::angular_vel - 0.05;&lt;br /&gt;
				}&lt;br /&gt;
				else if (::rotate == 1)&lt;br /&gt;
				{&lt;br /&gt;
					::angular_vel = ::angular_vel + 0.05;&lt;br /&gt;
				}					&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				if (::linear_vel &amp;gt; 0)&lt;br /&gt;
				{&lt;br /&gt;
					::linear_vel = ::linear_vel - 0.05;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::linear_vel = ::linear_vel + 0.05;&lt;br /&gt;
				}			&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;point beer&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			objeto.data = 1;&lt;br /&gt;
			&lt;br /&gt;
			object_pub_.publish(objeto);&lt;br /&gt;
		}&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;point cocacola&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			objeto.data = 2;&lt;br /&gt;
			&lt;br /&gt;
			object_pub_.publish(objeto);&lt;br /&gt;
		}&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;fold arm&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			objeto.data = 100;&lt;br /&gt;
			&lt;br /&gt;
			object_pub_.publish(objeto);&lt;br /&gt;
		}													&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
      &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
         &lt;br /&gt;
        ros::init(argc, argv, &amp;quot;control_voz&amp;quot;);  &lt;br /&gt;
 &lt;br /&gt;
        ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
        ros::Subscriber speech_sub_= n.subscribe(&amp;quot;/recognizer/output&amp;quot;, 1, speech);&lt;br /&gt;
       &lt;br /&gt;
        ros::Publisher object_pub_=n.advertise&amp;lt;std_msgs::Int16&amp;gt;(&amp;quot;selected_object&amp;quot;, 1); &lt;br /&gt;
        &lt;br /&gt;
        ros::Publisher move_base_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1);&lt;br /&gt;
	      &lt;br /&gt;
        &lt;br /&gt;
        ros::Rate loop_rate(10);&lt;br /&gt;
        &lt;br /&gt;
        geometry_msgs::Twist mover_base;&lt;br /&gt;
        &lt;br /&gt;
        sound_play::SoundClient voz_robot;&lt;br /&gt;
        &lt;br /&gt;
		sleepok(1, n);        &lt;br /&gt;
        &lt;br /&gt;
        while (ros::ok())&lt;br /&gt;
        {		&lt;br /&gt;
			mover_base.linear.x = ::linear_vel;&lt;br /&gt;
			mover_base.angular.z = ::angular_vel; &lt;br /&gt;
			&lt;br /&gt;
			move_base_pub_.publish(mover_base);&lt;br /&gt;
			&lt;br /&gt;
			if (::comando_voz.data == &amp;quot;start speech&amp;quot; &amp;amp;&amp;amp; ::start == 0)&lt;br /&gt;
			{&lt;br /&gt;
				voz_robot.say(&amp;quot;bep bep. I am listening you&amp;quot;);&lt;br /&gt;
				&lt;br /&gt;
				sleepok(4, n);&lt;br /&gt;
				&lt;br /&gt;
				::start = 1;&lt;br /&gt;
				::stop = 0;&lt;br /&gt;
			}&lt;br /&gt;
			else if (::comando_voz.data == &amp;quot;stop speech&amp;quot; &amp;amp;&amp;amp; ::stop == 0)&lt;br /&gt;
			{&lt;br /&gt;
				voz_robot.say(&amp;quot;bep bep. I stop listening&amp;quot;);&lt;br /&gt;
				&lt;br /&gt;
				sleepok(4, n);&lt;br /&gt;
				&lt;br /&gt;
				::stop = 1;&lt;br /&gt;
				::start = 0;&lt;br /&gt;
			}			&lt;br /&gt;
			&lt;br /&gt;
			ros::spinOnce();&lt;br /&gt;
	&lt;br /&gt;
			loop_rate.sleep();			&lt;br /&gt;
        &lt;br /&gt;
		}                     &lt;br /&gt;
       &lt;br /&gt;
        ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to add the next code line to the file &amp;quot;CMakeLists.txt&amp;quot; of the ''package'' in order to compile and generate the executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosbuild_add_executable(control_voz src/control_voz.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next commands in a terminal in order to compile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
roscd voz_fer&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;control_voz.launch&amp;quot; within the folder &amp;quot;launch&amp;quot; of the ''package'' with the content that is shown below in order to start all the programs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find voz_fer)/launch/comandos_voz.launch&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;soundplay_node&amp;quot; pkg=&amp;quot;sound_play&amp;quot; type=&amp;quot;soundplay_node.py&amp;quot;/&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;control_voz&amp;quot; pkg=&amp;quot;voz_fer&amp;quot; type=&amp;quot;control_voz&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find brazo_fer)/launch/escoja.launch&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start the voice control:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch voz_fer control_voz.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can see the [[MYRAbot model for simulation (urdf+gazebo)|MYRAbot model]] in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] using the voice control in the next video:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;_hvuvlRyNt0&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=_hvuvlRyNt0 Watch in YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Integration_of_MYRAbot_in_moveIt!_(gazebo%2bmoveIt!)&amp;diff=4218</id>
		<title>Integration of MYRAbot in moveIt! (gazebo+moveIt!)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Integration_of_MYRAbot_in_moveIt!_(gazebo%2bmoveIt!)&amp;diff=4218"/>
				<updated>2014-09-29T11:11:17Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Previous steps=&lt;br /&gt;
&lt;br /&gt;
==Installation of moveIt!==&lt;br /&gt;
&lt;br /&gt;
[http://moveit.ros.org/ MoveIt!] is a ''package'' that provides a software tool for all types of manipulation tasks both industrial level and domestic level. It is available for the [http://wiki.ros.org ROS] distributions [http://wiki.ros.org/groovy groovy] and [http://wiki.ros.org/hydro hydro], for this reason we must have installed some of these. We will execute the next command in a terminal in order to install [http://moveit.ros.org/ moveIt!], where &amp;quot;ROS_DISTRIBUCION&amp;quot; is our installed distribution:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get install ros-ROS_DISTRIBUCION-moveit-full&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modification of MYRAbot model for moveIt!==&lt;br /&gt;
&lt;br /&gt;
===New URDF of the arm===&lt;br /&gt;
&lt;br /&gt;
We need to modify the type of the [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] controllers of the [[MYRAbot's arm model for simulation (urdf+gazebo)|arm]]'s joints in order to allow to [http://moveit.ros.org/ moveIt!] to take the control of these. Also we have added the 3D meshes of the real components of the arm. We will create a file named &amp;quot;brazo-macros_moveit.xacro&amp;quot; within the folder &amp;quot;urdf&amp;quot; of the ''package'' &amp;quot;brazo_fer_modelo&amp;quot; with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot; xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;property name=&amp;quot;M_PI&amp;quot; value=&amp;quot;3.14159&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;M_SCALE&amp;quot; value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;F10_HEIGHT&amp;quot; value=&amp;quot;0.004&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;F4_HEIGHT&amp;quot; value=&amp;quot;0.0525&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;F3_HEIGHT&amp;quot; value=&amp;quot;0.009&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;AX12_HEIGHT&amp;quot; value=&amp;quot;0.0385&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;AX12_WIDTH&amp;quot; value=&amp;quot;0.038&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;F2_HEIGHT&amp;quot; value=&amp;quot;0.0265&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;color rgba=&amp;quot;0.87 0.90 0.87 1.0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;material name=&amp;quot;black&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;color rgba=&amp;quot;0.0 0.0 0.0 1.0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/material&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;default_inertia&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;default_inertia_servos&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.01&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.01&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;default_dynamics&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;dynamics fricction=&amp;quot;0&amp;quot; damping=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt; &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;bioloid_F10_fixed&amp;quot; params=&amp;quot;parent name color *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package:/brazo_fer_modelo/meshes/F10.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;${color}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F10.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;finger_fixed&amp;quot; params=&amp;quot;parent name color *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0.03075 0.0 0.001 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;box size=&amp;quot;0.0865 0.038 0.002&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;${color}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0.03075 0.0 0.001 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;box size=&amp;quot;0.0865 0.038 0.002&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;bioloid_F3_fixed&amp;quot; params=&amp;quot;parent name color *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F3.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;${color}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F3.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;dynamixel_AX12_fixed&amp;quot; params=&amp;quot;parent name *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.055&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia_servos/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package:/brazo_fer_modelo/meshes/ax12_box.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;black&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package:/brazo_fer_modelo/meshes/ax12_box.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;bioloid_F3_revolute&amp;quot; params=&amp;quot;parent name color llimit ulimit vlimit *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;axis xyz=&amp;quot;0 0 -1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;limit effort=&amp;quot;100&amp;quot; velocity=&amp;quot;${vlimit}&amp;quot; lower=&amp;quot;${llimit}&amp;quot; upper=&amp;quot;${ulimit}&amp;quot; /&amp;gt;&lt;br /&gt;
	  &amp;lt;default_dynamics/&amp;gt;      &lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_brazo_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_brazo_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F3.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;${color}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F3.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;bioloid_F2_revolute&amp;quot; params=&amp;quot;parent name color llimit ulimit vlimit *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;limit effort=&amp;quot;100&amp;quot; velocity=&amp;quot;${vlimit}&amp;quot; lower=&amp;quot;${llimit}&amp;quot; upper=&amp;quot;${ulimit}&amp;quot; /&amp;gt;&lt;br /&gt;
	  &amp;lt;default_dynamics/&amp;gt;       &lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F2.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;${color}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F2.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;bioloid_F4_revolute&amp;quot; params=&amp;quot;parent name color llimit ulimit vlimit *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;limit effort=&amp;quot;100&amp;quot; velocity=&amp;quot;${vlimit}&amp;quot; lower=&amp;quot;${llimit}&amp;quot; upper=&amp;quot;${ulimit}&amp;quot; /&amp;gt;&lt;br /&gt;
	  &amp;lt;default_dynamics/&amp;gt;       &lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F4.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;${color}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F4.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;gazebo_propiedades_link&amp;quot; params=&amp;quot;nombre material&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;${nombre}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;mu1&amp;gt;100&amp;lt;/mu1&amp;gt;&lt;br /&gt;
	&amp;lt;mu2&amp;gt;100&amp;lt;/mu2&amp;gt;&lt;br /&gt;
	&amp;lt;kp&amp;gt;100000000000&amp;lt;/kp&amp;gt;&lt;br /&gt;
	&amp;lt;kd&amp;gt;1000000000&amp;lt;/kd&amp;gt;&lt;br /&gt;
	&amp;lt;material&amp;gt;${material}&amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
    &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt; &lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;gazebo_propiedades_joint&amp;quot; params=&amp;quot;nombre&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;gazebo reference=&amp;quot;${nombre}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;erp&amp;gt;0.1&amp;lt;/erp&amp;gt;&lt;br /&gt;
    &amp;lt;stopKd value=&amp;quot;100000000.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;stopKp value=&amp;quot;100000000.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;fudgeFactor value=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo&amp;gt;&lt;br /&gt;
  &amp;lt;plugin name=&amp;quot;gazebo_ros_control&amp;quot; filename=&amp;quot;libgazebo_ros_control.so&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/plugin&amp;gt;&lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;transmission name=&amp;quot;base_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;type&amp;gt;transmission_interface/SimpleTransmission&amp;lt;/type&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;base&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;base_motor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;hardwareInterface&amp;gt;EffortJointInterface&amp;lt;/hardwareInterface&amp;gt;&lt;br /&gt;
      &amp;lt;mechanicalReduction&amp;gt;1&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/transmission&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;transmission name=&amp;quot;arti1_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;type&amp;gt;transmission_interface/SimpleTransmission&amp;lt;/type&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;arti1&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;arti1_motor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;hardwareInterface&amp;gt;EffortJointInterface&amp;lt;/hardwareInterface&amp;gt;&lt;br /&gt;
      &amp;lt;mechanicalReduction&amp;gt;1&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/transmission&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;transmission name=&amp;quot;arti2_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;type&amp;gt;transmission_interface/SimpleTransmission&amp;lt;/type&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;arti2&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;arti3_motor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;hardwareInterface&amp;gt;EffortJointInterface&amp;lt;/hardwareInterface&amp;gt;&lt;br /&gt;
      &amp;lt;mechanicalReduction&amp;gt;1&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/transmission&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;transmission name=&amp;quot;arti3_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;type&amp;gt;transmission_interface/SimpleTransmission&amp;lt;/type&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;arti3&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;arti3_motor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;hardwareInterface&amp;gt;EffortJointInterface&amp;lt;/hardwareInterface&amp;gt;&lt;br /&gt;
      &amp;lt;mechanicalReduction&amp;gt;1&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/transmission&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;transmission name=&amp;quot;pinza_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;type&amp;gt;transmission_interface/SimpleTransmission&amp;lt;/type&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;pinza&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;pinza_motor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;hardwareInterface&amp;gt;EffortJointInterface&amp;lt;/hardwareInterface&amp;gt;&lt;br /&gt;
      &amp;lt;mechanicalReduction&amp;gt;1&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/transmission&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will add the next files within the folder &amp;quot;meshes&amp;quot; of the ''package'' &amp;quot;brazo_fer_modelo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/ax12_box.stl ax12_box.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/F2.stl F2.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/F3.stl F3.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/F4.stl F4.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/F10.stl F10.stl]&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;brazo_moveit.xacro&amp;quot; within the folder &amp;quot;urdf&amp;quot; of the ''package'' &amp;quot;brazo_fer_modelo&amp;quot; with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find brazo_fer_modelo)/urdf/brazo-macros_moveit.xacro&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;brazo&amp;quot; params=&amp;quot;parent *origin&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;fixed&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;fixed_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 0 1&amp;quot; /&amp;gt;  &lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;fixed_link&amp;quot;/&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- shoulder pan joint --&amp;gt;&lt;br /&gt;
    &amp;lt;dynamixel_AX12_fixed parent=&amp;quot;fixed_link&amp;quot; name=&amp;quot;servo_base&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0.019&amp;quot; rpy=&amp;quot;${M_PI/2} 0 ${-M_PI/2}&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/dynamixel_AX12_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F3_revolute parent=&amp;quot;servo_base_link&amp;quot; name=&amp;quot;base&amp;quot; color=&amp;quot;white&amp;quot; vlimit=&amp;quot;3&amp;quot; llimit=&amp;quot;-2.62&amp;quot; ulimit=&amp;quot;2.62&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 ${AX12_WIDTH/2} 0&amp;quot; rpy=&amp;quot;${-M_PI/2} ${-M_PI/2} ${-M_PI}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F3_revolute&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- shoulder lift joint --&amp;gt;&lt;br /&gt;
    &amp;lt;dynamixel_AX12_fixed parent=&amp;quot;base_brazo_link&amp;quot; name=&amp;quot;servo_arti1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${-AX12_HEIGHT-F10_HEIGHT+0.001}&amp;quot; rpy=&amp;quot;0 ${M_PI} 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/dynamixel_AX12_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F4_revolute parent=&amp;quot;servo_arti1_link&amp;quot; name=&amp;quot;arti1&amp;quot; color=&amp;quot;white&amp;quot; vlimit=&amp;quot;3&amp;quot; llimit=&amp;quot;-2.62&amp;quot; ulimit=&amp;quot;2.62&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F4_revolute&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F10_fixed parent=&amp;quot;arti1_link&amp;quot; name=&amp;quot;arti1_F10_0&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F4_HEIGHT+F10_HEIGHT/2}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F10_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F10_fixed parent=&amp;quot;arti1_F10_0_link&amp;quot; name=&amp;quot;arti1_F10_1&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F10_HEIGHT}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F10_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F10_fixed parent=&amp;quot;arti1_F10_1_link&amp;quot; name=&amp;quot;arti1_F10_2&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F10_HEIGHT}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F10_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F3_fixed parent=&amp;quot;arti1_F10_2_link&amp;quot; name=&amp;quot;arti1_F3_0&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F10_HEIGHT/2}&amp;quot; rpy=&amp;quot;0 ${M_PI} 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F3_fixed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- elbow joint --&amp;gt;&lt;br /&gt;
    &amp;lt;dynamixel_AX12_fixed parent=&amp;quot;arti1_F3_0_link&amp;quot; name=&amp;quot;servo_arti2&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${-AX12_HEIGHT-F10_HEIGHT+0.001}&amp;quot; rpy=&amp;quot;0 ${M_PI} 0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/dynamixel_AX12_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F4_revolute parent=&amp;quot;servo_arti2_link&amp;quot; name=&amp;quot;arti2&amp;quot; color=&amp;quot;white&amp;quot; vlimit=&amp;quot;3&amp;quot; llimit=&amp;quot;-2.63&amp;quot; ulimit=&amp;quot;2.63&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F4_revolute&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F10_fixed parent=&amp;quot;arti2_link&amp;quot; name=&amp;quot;arti2_F10_0&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F4_HEIGHT+F10_HEIGHT/2}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F10_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F10_fixed parent=&amp;quot;arti2_F10_0_link&amp;quot; name=&amp;quot;arti2_F10_1&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F10_HEIGHT}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F10_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F10_fixed parent=&amp;quot;arti2_F10_1_link&amp;quot; name=&amp;quot;arti2_F10_2&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F10_HEIGHT}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F10_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F3_fixed parent=&amp;quot;arti2_F10_2_link&amp;quot; name=&amp;quot;arti2_F3_0&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F10_HEIGHT/2}&amp;quot; rpy=&amp;quot;0 ${M_PI} 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F3_fixed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- wrist joint --&amp;gt;&lt;br /&gt;
    &amp;lt;dynamixel_AX12_fixed parent=&amp;quot;arti2_F3_0_link&amp;quot; name=&amp;quot;servo_arti3&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${-AX12_HEIGHT-F10_HEIGHT+0.001}&amp;quot; rpy=&amp;quot;0 ${M_PI} 0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/dynamixel_AX12_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F2_revolute parent=&amp;quot;servo_arti3_link&amp;quot; name=&amp;quot;arti3&amp;quot; color=&amp;quot;white&amp;quot; vlimit=&amp;quot;3&amp;quot; llimit=&amp;quot;-2.62&amp;quot; ulimit=&amp;quot;2.62&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F2_revolute&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F3_fixed parent=&amp;quot;arti3_link&amp;quot; name=&amp;quot;arti3_F3_0&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0.016 ${F2_HEIGHT}&amp;quot; rpy=&amp;quot;0 ${M_PI} ${-M_PI/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F3_fixed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- gripper joint --&amp;gt;&lt;br /&gt;
    &amp;lt;dynamixel_AX12_fixed parent=&amp;quot;arti3_F3_0_link&amp;quot; name=&amp;quot;servo_pinza&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;-0.02275 0 ${-AX12_WIDTH/2}&amp;quot; rpy=&amp;quot;${M_PI} ${M_PI/2} 0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/dynamixel_AX12_fixed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- finger 1 --&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;pinza&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;limit effort=&amp;quot;100&amp;quot; velocity=&amp;quot;3&amp;quot; lower=&amp;quot;-2.62&amp;quot; upper=&amp;quot;2.62&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;default_dynamics/&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;servo_pinza_link&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;pinza_movil_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;link name=&amp;quot;pinza_movil_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;default_inertia/&amp;gt;      &lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F2.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;white&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F2.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
    &amp;lt;finger_fixed parent=&amp;quot;pinza_movil_link&amp;quot; name=&amp;quot;pinza_movil_dedo&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F2_HEIGHT}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/finger_fixed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- finger 2 --&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F3_fixed parent=&amp;quot;servo_pinza_link&amp;quot; name=&amp;quot;pinza_fija&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${-AX12_HEIGHT-F10_HEIGHT+0.001}&amp;quot; rpy=&amp;quot;0 ${M_PI} 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F3_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;finger_fixed parent=&amp;quot;pinza_fija_link&amp;quot; name=&amp;quot;pinza_fija_dedo&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 ${M_PI}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/finger_fixed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;servo_base_link&amp;quot; material=&amp;quot;brazo_fer/Black&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;base_brazo_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;servo_arti1_link&amp;quot; material=&amp;quot;brazo_fer/Black&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti1_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti1_F10_0_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti1_F10_1_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti1_F10_2_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti1_F3_0_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;servo_arti2_link&amp;quot; material=&amp;quot;brazo_fer/Black&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti2_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti2_F10_0_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti2_F10_1_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti2_F10_2_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti2_F3_0_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;servo_arti3_link&amp;quot; material=&amp;quot;brazo_fer/Black&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti3_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti3_F3_0_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;servo_pinza_link&amp;quot; material=&amp;quot;brazo_fer/Black&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_movil_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;      &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_movil_dedo_link&amp;quot; material=&amp;quot;brazo_fer/WhiteTransparent&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_fija_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_fija_dedo_link&amp;quot; material=&amp;quot;brazo_fer/WhiteTransparent&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;base&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;arti1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;arti2&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;arti3&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;pinza&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
     &lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Controllers for arm simulation===&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;controller_moveit.yaml&amp;quot; within the folder &amp;quot;config&amp;quot; of the ''package'' &amp;quot;brazo_fer_modelo&amp;quot; with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  # Publish all joint states -----------------------------------&lt;br /&gt;
  joint_state_controller:&lt;br /&gt;
    type: joint_state_controller/JointStateController&lt;br /&gt;
    publish_rate: 50  &lt;br /&gt;
  &lt;br /&gt;
  # Position Controllers ---------------------------------------   &lt;br /&gt;
  pinza_pos_controller:&lt;br /&gt;
    type: effort_controllers/JointPositionController&lt;br /&gt;
    joint: pinza&lt;br /&gt;
    pid: {p: 0.8, i: 0.6, d: 0.3, i_clamp: 1}&lt;br /&gt;
&lt;br /&gt;
  brazo_controller:&lt;br /&gt;
    type: effort_controllers/JointTrajectoryController&lt;br /&gt;
    joints:&lt;br /&gt;
      - arti1&lt;br /&gt;
      - arti2&lt;br /&gt;
      - arti3&lt;br /&gt;
      - base&lt;br /&gt;
&lt;br /&gt;
    gains: # Required because we're controlling an effort interface&lt;br /&gt;
      arti1: {p: 1.0, i: 0.6, d: 0.3, i_clamp: 10}&lt;br /&gt;
      arti2: {p: 1.0, i: 0.6, d: 0.3, i_clamp: 10}&lt;br /&gt;
      arti3: {p: 1.0, i: 0.6, d: 0.3, i_clamp: 10}&lt;br /&gt;
      base: {p: 1.0, i: 0.6, d: 0.3, i_clamp: 10}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Controller for the real arm (actionlib-action server)===&lt;br /&gt;
&lt;br /&gt;
We need a actionlib-ActionServer that receives the calculated trajectories through a ''Goal'', subscribes the ''topic'' &amp;quot;pose_arm&amp;quot; (arm states) and publishes the ''topic'' &amp;quot;move_arm&amp;quot; (arm's movement), in order to communicate [http://moveit.ros.org/ moveIt!] with the [[MYRAbot's arm control (bioloid+arduino)|arm]]. We will create a file named &amp;quot;controlador_brazo.cpp&amp;quot; within the folder &amp;quot;src&amp;quot; of the ''package'' &amp;quot;brazo_fer&amp;quot; with the content tha is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ros/ros.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ros/time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;trajectory_msgs/JointTrajectoryPoint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;trajectory_msgs/JointTrajectory.h&amp;gt;&lt;br /&gt;
#include &amp;lt;myrabot_arm_base_b/WriteServos.h&amp;gt;&lt;br /&gt;
#include &amp;lt;myrabot_arm_base_b/ReadServos.h&amp;gt;&lt;br /&gt;
#include &amp;lt;actionlib/server/simple_action_server.h&amp;gt;&lt;br /&gt;
#include &amp;lt;control_msgs/FollowJointTrajectoryAction.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define PI 3.14159265&lt;br /&gt;
&lt;br /&gt;
class MYRAbotArm&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&lt;br /&gt;
  MYRAbotArm(std::string name) :&lt;br /&gt;
    as_(nh_, name, false),&lt;br /&gt;
    action_name_(name)&lt;br /&gt;
  {&lt;br /&gt;
    as_.registerGoalCallback(boost::bind(&amp;amp;MYRAbotArm::goalCB, this));&lt;br /&gt;
    as_.registerPreemptCallback(boost::bind(&amp;amp;MYRAbotArm::preemptCB, this));&lt;br /&gt;
&lt;br /&gt;
    sub_pose_arm_ = nh_.subscribe(&amp;quot;/pose_arm&amp;quot;, 1, &amp;amp;MYRAbotArm::analysisCB, this);&lt;br /&gt;
&lt;br /&gt;
    pub_move_arm_ = nh_.advertise&amp;lt;myrabot_arm_base_b::WriteServos&amp;gt;(&amp;quot;/move_arm&amp;quot;, 1, this);&lt;br /&gt;
&lt;br /&gt;
    as_.start();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ~MYRAbotArm(void)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  void goalCB()&lt;br /&gt;
  {&lt;br /&gt;
	i_ = 0;&lt;br /&gt;
&lt;br /&gt;
	goal_ = as_.acceptNewGoal()-&amp;gt;trajectory;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  void preemptCB()&lt;br /&gt;
  {&lt;br /&gt;
    ROS_INFO(&amp;quot;%s: Preempted&amp;quot;, action_name_.c_str());&lt;br /&gt;
    as_.setPreempted();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  void analysisCB(const myrabot_arm_base_b::ReadServos&amp;amp; arm)&lt;br /&gt;
  {&lt;br /&gt;
    if (!as_.isActive())&lt;br /&gt;
      return;&lt;br /&gt;
&lt;br /&gt;
    ros::Time ahora = ros::Time::now();&lt;br /&gt;
&lt;br /&gt;
    feedback_.header.stamp = ahora;&lt;br /&gt;
&lt;br /&gt;
    feedback_.joint_names.resize(4);&lt;br /&gt;
    feedback_.actual.positions.resize(4);&lt;br /&gt;
    feedback_.actual.effort.resize(4);&lt;br /&gt;
&lt;br /&gt;
	for (int i = 0; i &amp;lt; 4; i++)&lt;br /&gt;
	{&lt;br /&gt;
		switch(i)&lt;br /&gt;
		{&lt;br /&gt;
			case 3:&lt;br /&gt;
				feedback_.joint_names[i] = &amp;quot;base_brazo&amp;quot;;&lt;br /&gt;
				feedback_.actual.positions[i] = ((((arm.posicion.base * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
				feedback_.actual.effort[i] = ((((arm.corriente.base * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
			break;&lt;br /&gt;
			case 0:&lt;br /&gt;
				feedback_.joint_names[i] = &amp;quot;arti1&amp;quot;;&lt;br /&gt;
				feedback_.actual.positions[i] = ((((arm.posicion.arti1 * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
				feedback_.actual.effort[i] = ((((arm.corriente.arti1 * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
			break;&lt;br /&gt;
			case 1:&lt;br /&gt;
				feedback_.joint_names[i] = &amp;quot;arti2&amp;quot;;&lt;br /&gt;
				feedback_.actual.positions[i] = ((((arm.posicion.arti2 * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
				feedback_.actual.effort[i] = ((((arm.corriente.arti2 * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
			break;&lt;br /&gt;
			case 2:&lt;br /&gt;
				feedback_.joint_names[i] = &amp;quot;arti3&amp;quot;;&lt;br /&gt;
				feedback_.actual.positions[i] = ((((arm.posicion.arti3 * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
				feedback_.actual.effort[i] = ((((arm.corriente.arti3 * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	puntos_ = goal_.points.size();&lt;br /&gt;
&lt;br /&gt;
	if (i_ != puntos_)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	    	myrabot_arm_base_b::WriteServos move;&lt;br /&gt;
&lt;br /&gt;
	    		if (i_ == 0&lt;br /&gt;
	    		    ||((feedback_.actual.positions[0] &amp;lt;= (goal_.points[i_-1].positions[0] + 0.1) &amp;amp;&amp;amp; feedback_.actual.positions[0] &amp;gt;= (goal_.points[i_-1].positions[0] - 0.1))&lt;br /&gt;
	    		    &amp;amp;&amp;amp; (feedback_.actual.positions[1] &amp;lt;= (goal_.points[i_-1].positions[1] + 0.1) &amp;amp;&amp;amp; feedback_.actual.positions[1] &amp;gt;= (goal_.points[i_-1].positions[1] - 0.1))&lt;br /&gt;
	    		    &amp;amp;&amp;amp; (feedback_.actual.positions[2] &amp;lt;= (goal_.points[i_-1].positions[2] + 0.1) &amp;amp;&amp;amp; feedback_.actual.positions[2] &amp;gt;= (goal_.points[i_-1].positions[2] - 0.1))&lt;br /&gt;
	    		    &amp;amp;&amp;amp; (feedback_.actual.positions[3] &amp;lt;= (goal_.points[i_-1].positions[3] + 0.1) &amp;amp;&amp;amp; feedback_.actual.positions[3] &amp;gt;= (goal_.points[i_-1].positions[3] - 0.1))))&lt;br /&gt;
	    		{&lt;br /&gt;
	    			for (int j = 0; j &amp;lt; 4; j++)&lt;br /&gt;
	    			{&lt;br /&gt;
	    				switch (j)&lt;br /&gt;
	    				{&lt;br /&gt;
	    				case 3:&lt;br /&gt;
	    					move.posicion.base = ((((goal_.points[i_].positions[j]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	    					move.velocidad.base = abs(goal_.points[i_].velocities[j]*511);&lt;br /&gt;
	    					move.par.base = 1;&lt;br /&gt;
	    				break;&lt;br /&gt;
	    				case 0:&lt;br /&gt;
	    					move.posicion.arti1 = ((((goal_.points[i_].positions[j]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	    					move.velocidad.arti1 = abs(goal_.points[i_].velocities[j]*511);&lt;br /&gt;
	    					move.par.arti1 = 1;&lt;br /&gt;
	    				break;&lt;br /&gt;
	    				case 1:&lt;br /&gt;
	    					move.posicion.arti2 = ((((goal_.points[i_].positions[j]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	    					move.velocidad.arti2 = abs(goal_.points[i_].velocities[j]*511);&lt;br /&gt;
	    					move.par.arti2 = 1;&lt;br /&gt;
	    				break;&lt;br /&gt;
	    				case 2:&lt;br /&gt;
	    					move.posicion.arti3 = ((((goal_.points[i_].positions[j]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	    				        move.velocidad.arti3 = abs(goal_.points[i_].velocities[j]*511);&lt;br /&gt;
	    					move.par.arti3 = 1;&lt;br /&gt;
	    				break;&lt;br /&gt;
	    				}&lt;br /&gt;
	    			}&lt;br /&gt;
&lt;br /&gt;
	    			pub_move_arm_.publish(move);&lt;br /&gt;
&lt;br /&gt;
	    			t_inicio = ros::Time::now();&lt;br /&gt;
	    		}&lt;br /&gt;
	    		else&lt;br /&gt;
	    		{&lt;br /&gt;
	    			i_ = i_ - 1;&lt;br /&gt;
	    		}&lt;br /&gt;
&lt;br /&gt;
	    		ros::Time ahora = ros::Time::now();&lt;br /&gt;
&lt;br /&gt;
	    		ros::Duration duracion(1.0);&lt;br /&gt;
&lt;br /&gt;
	    		if (ahora &amp;gt; (t_inicio + duracion))&lt;br /&gt;
	    		{&lt;br /&gt;
	    			result_.error_code = -1;&lt;br /&gt;
	    	                as_.setAborted(result_);&lt;br /&gt;
	    		}&lt;br /&gt;
&lt;br /&gt;
			feedback_.desired = goal_.points[i_];&lt;br /&gt;
&lt;br /&gt;
			feedback_.error.positions.resize(4);&lt;br /&gt;
&lt;br /&gt;
			for (int j = 0; j &amp;lt; 4; j++)&lt;br /&gt;
			{&lt;br /&gt;
				feedback_.error.positions[j] = feedback_.desired.positions[j] - feedback_.actual.positions[j];&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
    		i_ ++;&lt;br /&gt;
  	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		result_.error_code = 0;&lt;br /&gt;
	        as_.setSucceeded(result_);&lt;br /&gt;
	}&lt;br /&gt;
	as_.publishFeedback(feedback_);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
protected:&lt;br /&gt;
&lt;br /&gt;
  ros::NodeHandle nh_;&lt;br /&gt;
  actionlib::SimpleActionServer&amp;lt;control_msgs::FollowJointTrajectoryAction&amp;gt; as_;&lt;br /&gt;
  std::string action_name_;&lt;br /&gt;
  int puntos_, i_;&lt;br /&gt;
  ros::Time t_inicio;&lt;br /&gt;
  trajectory_msgs::JointTrajectory goal_;&lt;br /&gt;
  control_msgs::FollowJointTrajectoryResult result_;&lt;br /&gt;
  control_msgs::FollowJointTrajectoryFeedback feedback_;&lt;br /&gt;
  ros::Subscriber sub_pose_arm_;&lt;br /&gt;
  ros::Publisher pub_move_arm_;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv)&lt;br /&gt;
{&lt;br /&gt;
  ros::init(argc, argv, &amp;quot;brazo_controller/follow_join_trajectory&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  MYRAbotArm brazo(ros::this_node::getName());&lt;br /&gt;
  ros::spin();&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to add the next code line in the file &amp;quot;CMakeLists.txt&amp;quot; of the ''package'' in order to compile and generate the executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;rosbuild_add_executable(controlador_brazo src/controlador_brazo.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also, we need to add the next dependences for the ''package'' in the file &amp;quot;manifest.xml&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;actionlib&lt;br /&gt;
actionlib_msgs&lt;br /&gt;
trajectory_msgs&lt;br /&gt;
control_msgs&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next commands in a terminal in order to compile and generate the executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===New URDF for xtion camera and frame===&lt;br /&gt;
&lt;br /&gt;
We have added a frame to MYRAbot in order to place the new [http://www.asus.com/Multimedia/Xtion_PRO_LIVE/ asus Xtion PRO LIVE] camera which replaces the previous [[Objects recognition and position calculation (webcam)|webcam]]. We will add the next code lines to the file &amp;quot;estructura-myrabot.xacro&amp;quot; placed within the folder &amp;quot;urdf&amp;quot; of the ''package'' &amp;quot;myrabot_fer_modelo&amp;quot; in order to add the camera frame:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;soporte_3&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_soporte_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_soporte_3_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0.065 0.61&amp;quot; rpy=&amp;quot;0.12 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_soporte_3_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.0 -0.065 ${0.06/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.135 -0.2 -0.03&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_soporte_3.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.135 -0.2 -0.03&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_soporte_3.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt; &lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_soporte_3_link&amp;quot; material=&amp;quot;myrabot_fer/LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;xtion.xacro&amp;quot; within the folder &amp;quot;urdf&amp;quot; of the ''package'' &amp;quot;myrabot_fer_modelo&amp;quot; with the content that is shown below in order to create the model of the 3D sensor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;robot xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Xacro properties --&amp;gt;&lt;br /&gt;
  &amp;lt;xacro:property name=&amp;quot;M_SCALE&amp;quot; value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;xacro:property name=&amp;quot;asus_xtion_pro_depth_rel_rgb_py&amp;quot; value=&amp;quot;0.0270&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;xacro:property name=&amp;quot;asus_xtion_pro_cam_rel_rgb_py&amp;quot;   value=&amp;quot;-0.0220&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;property name=&amp;quot;M_PI&amp;quot; value=&amp;quot;3.14159&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Parameterised in part by the values in turtlebot_properties.urdf.xacro --&amp;gt;&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;xtion&amp;quot; params=&amp;quot;parent *origin&amp;quot;&amp;gt;&lt;br /&gt;
	  &lt;br /&gt;
    &amp;lt;joint name=&amp;quot;camera_rgb_joint_xtion&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;camera_rgb_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;camera_rgb_frame_xtion&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;camera_rgb_optical_joint_xtion&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;${-M_PI/2} 0 ${-M_PI/2}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;camera_rgb_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;camera_rgb_optical_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;camera_rgb_optical_frame_xtion&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;camera_joint_xtion&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0.0175 ${asus_xtion_pro_cam_rel_rgb_py} 0.021&amp;quot;&lt;br /&gt;
              rpy=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;camera_rgb_frame_xtion&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;camera_link_xtion&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;link name=&amp;quot;camera_link_xtion&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;-0.01 0 0&amp;quot; rpy=&amp;quot;${-M_PI/2} -${M_PI} ${-M_PI/2}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/asus_xtion_pro_live.dae&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;-0.01 0 0&amp;quot; rpy=&amp;quot;${-M_PI/2} -${M_PI} ${-M_PI/2}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/asus_xtion_pro_live.dae&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;camera_depth_joint_xtion&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0.0175 ${asus_xtion_pro_depth_rel_rgb_py} 0.021&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;camera_rgb_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;camera_depth_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;camera_depth_frame_xtion&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;camera_depth_optical_joint_xtion&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;${-M_PI/2} 0 ${-M_PI/2}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;camera_depth_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;camera_depth_optical_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;camera_depth_optical_frame_xtion&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;gazebo reference=&amp;quot;camera_link_xtion&amp;quot;&amp;gt;  &lt;br /&gt;
      &amp;lt;sensor type=&amp;quot;depth&amp;quot; name=&amp;quot;xtion&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;always_on&amp;gt;true&amp;lt;/always_on&amp;gt;&lt;br /&gt;
        &amp;lt;update_rate&amp;gt;20.0&amp;lt;/update_rate&amp;gt;&lt;br /&gt;
        &amp;lt;camera&amp;gt;&lt;br /&gt;
          &amp;lt;horizontal_fov&amp;gt;${60.0*M_PI/180.0}&amp;lt;/horizontal_fov&amp;gt;&lt;br /&gt;
          &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;R8G8B8&amp;lt;/format&amp;gt;&lt;br /&gt;
            &amp;lt;width&amp;gt;640&amp;lt;/width&amp;gt;&lt;br /&gt;
            &amp;lt;height&amp;gt;480&amp;lt;/height&amp;gt;&lt;br /&gt;
          &amp;lt;/image&amp;gt;&lt;br /&gt;
          &amp;lt;clip&amp;gt;&lt;br /&gt;
            &amp;lt;near&amp;gt;0.05&amp;lt;/near&amp;gt;&lt;br /&gt;
            &amp;lt;far&amp;gt;8.0&amp;lt;/far&amp;gt;&lt;br /&gt;
          &amp;lt;/clip&amp;gt;&lt;br /&gt;
        &amp;lt;/camera&amp;gt;&lt;br /&gt;
        &amp;lt;plugin name=&amp;quot;xtion_camera_controller&amp;quot; filename=&amp;quot;libgazebo_ros_openni_kinect.so&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;cameraName&amp;gt;xtion&amp;lt;/cameraName&amp;gt;&lt;br /&gt;
          &amp;lt;alwaysOn&amp;gt;true&amp;lt;/alwaysOn&amp;gt;&lt;br /&gt;
          &amp;lt;updateRate&amp;gt;10&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
          &amp;lt;imageTopicName&amp;gt;rgb/image_raw&amp;lt;/imageTopicName&amp;gt;&lt;br /&gt;
          &amp;lt;depthImageTopicName&amp;gt;depth/image_raw&amp;lt;/depthImageTopicName&amp;gt;&lt;br /&gt;
          &amp;lt;pointCloudTopicName&amp;gt;depth/points&amp;lt;/pointCloudTopicName&amp;gt;&lt;br /&gt;
          &amp;lt;cameraInfoTopicName&amp;gt;rgb/camera_info&amp;lt;/cameraInfoTopicName&amp;gt;&lt;br /&gt;
          &amp;lt;depthImageCameraInfoTopicName&amp;gt;depth/camera_info&amp;lt;/depthImageCameraInfoTopicName&amp;gt;&lt;br /&gt;
          &amp;lt;frameName&amp;gt;camera_depth_optical_frame_xtion&amp;lt;/frameName&amp;gt;&lt;br /&gt;
          &amp;lt;baseline&amp;gt;0.1&amp;lt;/baseline&amp;gt;&lt;br /&gt;
          &amp;lt;distortion_k1&amp;gt;0.0&amp;lt;/distortion_k1&amp;gt;&lt;br /&gt;
          &amp;lt;distortion_k2&amp;gt;0.0&amp;lt;/distortion_k2&amp;gt;&lt;br /&gt;
          &amp;lt;distortion_k3&amp;gt;0.0&amp;lt;/distortion_k3&amp;gt;&lt;br /&gt;
          &amp;lt;distortion_t1&amp;gt;0.0&amp;lt;/distortion_t1&amp;gt;&lt;br /&gt;
          &amp;lt;distortion_t2&amp;gt;0.0&amp;lt;/distortion_t2&amp;gt;&lt;br /&gt;
          &amp;lt;pointCloudCutoff&amp;gt;0.4&amp;lt;/pointCloudCutoff&amp;gt;&lt;br /&gt;
        &amp;lt;/plugin&amp;gt;&lt;br /&gt;
      &amp;lt;/sensor&amp;gt;&lt;br /&gt;
    &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will add the next files within the folder &amp;quot;meshes&amp;quot; of the ''package'' &amp;quot;myrabot_fer_modelo&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_soporte_3.stl e_soporte_3.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/asus_xtion_pro_live.dae asus_xtion_pro_live.dae]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/images/asus_xtion_pro_live.png asus_xtion_pro_live.png]&lt;br /&gt;
&lt;br /&gt;
===New URDF of MYRAbot===&lt;br /&gt;
&lt;br /&gt;
As well we have to create a file named &amp;quot;myrabot_moveit.urdf.xacro&amp;quot; within the folder &amp;quot;urdf&amp;quot; of the ''package'' &amp;quot;myrabot_fer_modelo&amp;quot; with the content that is show below in order to add to the [[MYRAbot model for simulation (urdf+gazebo)|MYRAbot model]] the new [[MYRAbot's arm model for simulation (urdf+gazebo)|arm model]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot name=&amp;quot;MYRAbot&amp;quot;&lt;br /&gt;
       xmlns:xi=&amp;quot;http://www.w3.org/2001/XInclude&amp;quot;&lt;br /&gt;
       xmlns:gazebo=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#gz&amp;quot;&lt;br /&gt;
       xmlns:model=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#model&amp;quot;&lt;br /&gt;
       xmlns:sensor=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor&amp;quot;&lt;br /&gt;
       xmlns:body=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#body&amp;quot;&lt;br /&gt;
       xmlns:geom=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#geom&amp;quot;&lt;br /&gt;
       xmlns:joint=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#joint&amp;quot;&lt;br /&gt;
       xmlns:interface=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#interface&amp;quot;&lt;br /&gt;
       xmlns:rendering=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#rendering&amp;quot;&lt;br /&gt;
       xmlns:renderable=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#renderable&amp;quot;&lt;br /&gt;
       xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot;&lt;br /&gt;
       xmlns:physics=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#physics&amp;quot;&lt;br /&gt;
       xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/roomba.xacro&amp;quot; /&amp;gt;		&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/estructura-myrabot.xacro&amp;quot; /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/kinect.xacro&amp;quot; /&amp;gt;	&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find brazo_fer_modelo)/urdf/brazo_moveit.xacro&amp;quot; /&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/xtion.xacro&amp;quot; /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/ultrasonidos.xacro&amp;quot; /&amp;gt;		&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;roomba /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;estructura_myrabot parent=&amp;quot;base_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 1.57&amp;quot; xyz=&amp;quot;0 0 0.063&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/estructura_myrabot&amp;gt; &lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;kinect parent=&amp;quot;e_base_kinect_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 -1.57&amp;quot; xyz=&amp;quot;0 -0.045 0.112&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/kinect&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;brazo parent=&amp;quot;e_base_brazo_1_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 1.57&amp;quot; xyz=&amp;quot;0 -0.1015 0.075&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/brazo&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;xtion parent=&amp;quot;e_soporte_3_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0.65 -1.57&amp;quot; xyz=&amp;quot;0.021 -0.03 0.175&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/xtion&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;1&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 1.57&amp;quot; xyz=&amp;quot;0 0 ${0.04-0.007}&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;	&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;2&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 2.36&amp;quot; xyz=&amp;quot;0 0 ${0.04-0.007}&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;3&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 3.14&amp;quot; xyz=&amp;quot;0 0 ${0.04-0.007}&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;	&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;4&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 3.93&amp;quot; xyz=&amp;quot;0 0 ${0.04-0.007}&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;5&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 4.71&amp;quot; xyz=&amp;quot;0 0 ${0.04-0.007}&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;							&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;myrabot_gazebo_moveit.launcher&amp;quot; within the folder &amp;quot;launch&amp;quot; of the ''package'' &amp;quot;myrabot_fer_modelo&amp;quot; with the content that is shown below in order to load in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] the new robot model adapted to [http://moveit.ros.org/ moveIt!]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find gazebo_ros)/launch/empty_world.launch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;arg name=&amp;quot;paused&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;arg name=&amp;quot;use_sim_time&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;arg name=&amp;quot;debug&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;arg name=&amp;quot;world_name&amp;quot; value=&amp;quot;$(find turtlebot_gazebo)/worlds/empty.world&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/include&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;robot_description&amp;quot; command=&amp;quot;$(find xacro)/xacro.py '$(find myrabot_fer_modelo)/urdf/myrabot_moveit.urdf.xacro'&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_myrabot&amp;quot; pkg=&amp;quot;gazebo_ros&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-urdf -param robot_description -model MYRAbot&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;rosparam file=&amp;quot;$(find brazo_fer_modelo)/config/controller_moveit.yaml&amp;quot; command=&amp;quot;load&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;controller_spawner&amp;quot; pkg=&amp;quot;controller_manager&amp;quot; type=&amp;quot;spawner&amp;quot; args=&amp;quot;pinza_pos_controller brazo_controller joint_state_controller&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;node name=&amp;quot;robot_state_publisher&amp;quot; pkg=&amp;quot;robot_state_publisher&amp;quot; type=&amp;quot;state_publisher&amp;quot; /&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;robot_pose_ekf&amp;quot; type=&amp;quot;robot_pose_ekf&amp;quot; name=&amp;quot;robot_pose_ekf&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;freq&amp;quot; value=&amp;quot;30.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;sensor_timeout&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;publish_tf&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;odom_used&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;imu_used&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;vo_used&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;output_frame&amp;quot; value=&amp;quot;odom&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;pointcloud_throttle&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudThrottle openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;max_rate&amp;quot; value=&amp;quot;20.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud_in&amp;quot; to=&amp;quot;/camera/depth/points&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud_out&amp;quot; to=&amp;quot;cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;kinect_laser&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudToScan openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;output_frame_id&amp;quot; value=&amp;quot;/camera_depth_frame&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;!-- heights are in the (optical?) frame of the kinect --&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;min_height&amp;quot; value=&amp;quot;-0.15&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;max_height&amp;quot; value=&amp;quot;0.15&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud&amp;quot; to=&amp;quot;/cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;kinect_laser_narrow&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudToScan openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;output_frame_id&amp;quot; value=&amp;quot;/camera_depth_frame&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;!-- heights are in the (optical?) frame of the kinect --&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;min_height&amp;quot; value=&amp;quot;-0.025&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;max_height&amp;quot; value=&amp;quot;0.025&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud&amp;quot; to=&amp;quot;/cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;scan&amp;quot; to=&amp;quot;/narrow_scan&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Configuration of MYRAbot in moveIt!=&lt;br /&gt;
&lt;br /&gt;
==Setup assistant==&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start the setup assistant of [http://moveit.ros.org/ moveIt!]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch moveit_setup_assistant setup_assistant.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can choose between &amp;quot;Create New MoveIt Configuration Package&amp;quot; or &amp;quot;Edit existing MoveIt Configuration Package&amp;quot; in the assistant window that is shown below:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[file:myrabot_moveit_asistente_01.png|thumb|400px|center|[http://moveit.ros.org/ MoveIt!] setup asistant start window]]&lt;br /&gt;
||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Click on &amp;quot;Create New MoveIt Configuration Package&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Select the [http://wiki.ros.org/urdf/Tutorials URDF] file of the [[MYRAbot model for simulation (urdf+gazebo)|MYRAbot model]] clicking on &amp;quot;Browse&amp;quot; &amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||[[file:myrabot_moveit_asistente_02.png|thumb|400px|center|Creation of New [http://moveit.ros.org/ moveIt!] Configuration Package window]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
We will click on &amp;quot;Load Files&amp;quot; in order to load our robot model in the [http://moveit.ros.org/ moveIt!] setup assistant. When the load process ends, we can see in the right side of the window the robot model. This is shown in the next picture:&lt;br /&gt;
&lt;br /&gt;
[[file:myrabot_moveit_asistente_03.png|thumb|400px|center|[http://moveit.ros.org/ MoveIt!] setup assistant load model window]]&lt;br /&gt;
&lt;br /&gt;
Now, we will select &amp;quot;Self-Collision&amp;quot; in the menu of the left side of the window and we will click on &amp;quot;Regenerate Default Collision Mtrix&amp;quot; in order to calculate the collision matrix of our model. The result is shown in the next picture:&lt;br /&gt;
&lt;br /&gt;
[[file:myrabot_moveit_asistente_04.png|thumb|400px|center|[http://moveit.ros.org/ MoveIt!] setup assistant Self-Collision window]]&lt;br /&gt;
&lt;br /&gt;
We will select &amp;quot;Virtual Joints&amp;quot; in the menu of the left side of the window and we will click on &amp;quot;Add Virtual Joint&amp;quot;. We will write '''virtual_joint''' in the field &amp;quot;Virtual Joint Name&amp;quot;, we will select the ''link'' '''base_footprint''' in the field &amp;quot;Child_Link&amp;quot;, we will write '''odom''' in the field &amp;quot;Parent Frame Name&amp;quot; and we will write '''planar''' in the field. The procedure is shown in the next pictures:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[file:myrabot_moveit_asistente_05.png|thumb|400px|center|[http://moveit.ros.org/ MoveIt!] setup assistant &amp;quot;Add Virtual Joint&amp;quot; window]]&lt;br /&gt;
||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Click on &amp;quot;Save&amp;quot; to add the &amp;quot;Virtual Joint&amp;quot;&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||[[file:myrabot_moveit_asistente_06.png|thumb|400px|center|[http://moveit.ros.org/ MoveIt!] setup assistant &amp;quot;Virtual Joints&amp;quot; window]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
We will select &amp;quot;Planning Groups&amp;quot; in the menu of the left side of the window and we will click on &amp;quot;Add Group&amp;quot;. We will write '''brazo''' in the field &amp;quot;Group Name&amp;quot;, we will select '''kdl_kinematics_plugin/KDLKinematicsPlugin''' in the field &amp;quot;Kinematic Solver&amp;quot; and we will leave the rest of fields with the default value. The procedure is shown in the next pictures:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[file:myrabot_moveit_asistente_07.png|thumb|300px|center|[http://moveit.ros.org/ MoveIt!] setup assistant &amp;quot;Add Group&amp;quot; window]]&lt;br /&gt;
||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Click on &amp;quot;Add Joints&amp;quot; to add the group joints&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Select from the list the joints of the arm (&amp;lt;font style=&amp;quot;font-weight: bold&amp;quot;&amp;gt;base, arti1, arti2, arti3&amp;lt;/font&amp;gt;)&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||[[file:myrabot_moveit_asistente_08.png|thumb|300px|center|[http://moveit.ros.org/ MoveIt!] setup assistant &amp;quot;Add Joints&amp;quot; to &amp;quot;Group&amp;quot; window]]&lt;br /&gt;
||||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Click on &amp;quot;Save&amp;quot; to add &amp;quot;Joints&amp;quot; and &amp;quot;Group&amp;quot;&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||||[[file:myrabot_moveit_asistente_09.png|thumb|300px|center|[http://moveit.ros.org/ MoveIt!] setup assistant &amp;quot;Planning Group&amp;quot; window]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
As well we must add the gripper group clicking on &amp;quot;Add Group&amp;quot;. We will write '''pinza''' in the field &amp;quot;Group Name&amp;quot;, we will select '''None''' in the field &amp;quot;Kinematic Solver&amp;quot; and we will leave the rest of fields with the default value. The procedure is shown in the next pictures: &lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[file:myrabot_moveit_asistente_10.png|thumb|300px|center|[http://moveit.ros.org/ MoveIt!] setup assistant &amp;quot;Add Group&amp;quot; window]]&lt;br /&gt;
||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Click on &amp;quot;Add Links&amp;quot; to add the group links&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Select from the list the links of the gripper&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||[[file:myrabot_moveit_asistente_11.png|thumb|300px|center|[http://moveit.ros.org/ MoveIt!] setup assistant &amp;quot;Add Links&amp;quot; to &amp;quot;Group&amp;quot; window]]&lt;br /&gt;
||||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Click on &amp;quot;Save&amp;quot; to add &amp;quot;Links&amp;quot; and &amp;quot;Group&amp;quot;&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||||[[file:myrabot_moveit_asistente_12.png|thumb|300px|center|[http://moveit.ros.org/ MoveIt!] setup assistant &amp;quot;Planning Group&amp;quot; window]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
We can store regular poses for the arm group in order to set this poses in the future. We will select &amp;quot;Robot Poses&amp;quot; in the menu of the left side of the window and we will click on &amp;quot;Add Pose&amp;quot;. We will write '''home''' in the field &amp;quot;Pose Name&amp;quot; and we will select '''brazo''' in the field &amp;quot;Planning Group&amp;quot;. We can modify the position of each joint using the slider. The procedure is shown in the next pictures:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[file:myrabot_moveit_asistente_13.png|thumb|400px|center|[http://moveit.ros.org/ MoveIt!] setup assistant &amp;quot;Add Pose&amp;quot; window]]&lt;br /&gt;
||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Click on &amp;quot;Save&amp;quot; to add the &amp;quot;Robot Pose&amp;quot;&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||[[file:myrabot_moveit_asistente_14.png|thumb|400px|center|[http://moveit.ros.org/ MoveIt!] setup assistant &amp;quot;Robot Pose&amp;quot; window]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
We will select &amp;quot;End Effectors&amp;quot; in the menu of the left side of the window and we will click on &amp;quot;Add End Effector&amp;quot;. We will write '''pinza_eef''' in the field &amp;quot;End Effector Name&amp;quot;, we will select ''''pinza''' in the field &amp;quot;End Effector Group&amp;quot;, we will select '''arti3_link''' in the field &amp;quot;Parent Link&amp;quot; and we will leave blank the field &amp;quot;Parent Group&amp;quot;. The procedure is shown in the next pictures:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[file:myrabot_moveit_asistente_15.png|thumb|400px|center|[http://moveit.ros.org/ MoveIt!] setup assistant &amp;quot;Add End Effector&amp;quot; window]]&lt;br /&gt;
||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Click on &amp;quot;Save&amp;quot; to add the &amp;quot;End Effector&amp;quot;&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||[[file:myrabot_moveit_asistente_16.png|thumb|400px|center|[http://moveit.ros.org/ MoveIt!] setup assistant &amp;quot;End Effectors&amp;quot; window]]&lt;br /&gt;
|}&lt;br /&gt;
To finish, we will select &amp;quot;Configuration Files&amp;quot; in the menu of the left side of the window and we will click on &amp;quot;Browse&amp;quot; in order to select the path and the name for the configuration ''package''. We will click on &amp;quot;Generate Package&amp;quot; to generate the ''package''. The result is shown in the next picture:&lt;br /&gt;
&lt;br /&gt;
[[file:myrabot_moveit_asistente_18.png|thumb|400px|center|[http://moveit.ros.org/ MoveIt!] setup assistant final window]]&lt;br /&gt;
&lt;br /&gt;
==Integration of arm's controllers==&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;controllers.yaml&amp;quot; within the folder &amp;quot;config&amp;quot; of the generated [http://moveit.ros.org/ moveIt!] ''package'' with the content that is show below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
controller_list:&lt;br /&gt;
 - name: brazo_controller&lt;br /&gt;
   action_ns: follow_joint_trajectory&lt;br /&gt;
   type: FollowJointTrajectory&lt;br /&gt;
   default: true&lt;br /&gt;
   joints:&lt;br /&gt;
     - arti1&lt;br /&gt;
     - arti2&lt;br /&gt;
     - arti3&lt;br /&gt;
     - base&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to add the nest code lines in the file &amp;quot;MYRAbot_moveit_controller_manager.launch.xml&amp;quot; placed in the folder &amp;quot;launch&amp;quot; of the generated [http://moveit.ros.org/ moveIt!] ''package'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!-- Set the param that trajectory_execution_manager needs to find the controller plugin --&amp;gt;&lt;br /&gt;
 &amp;lt;arg name=&amp;quot;moveit_controller_manager&amp;quot; default=&amp;quot;moveit_simple_controller_manager/MoveItSimpleControllerManager&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;param name=&amp;quot;moveit_controller_manager&amp;quot; value=&amp;quot;$(arg moveit_controller_manager)&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;!-- load controller_list --&amp;gt;&lt;br /&gt;
 &amp;lt;rosparam file=&amp;quot;$(find myrabot_moveit_generated)/config/controllers.yaml&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Integration of perception sensors==&lt;br /&gt;
&lt;br /&gt;
We can use the [http://www.asus.com/Multimedia/Xtion_PRO_LIVE/ asus xtion pro live] or the [http://www.microsoft.com/en-us/kinectforwindows/ kinect] in MYRAbot, we configure both in the same way. We will create a file named &amp;quot;xtion.yaml&amp;quot; within the folder &amp;quot;config&amp;quot; of the generated [http://moveit.ros.org/ moveIt!] ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sensors:&lt;br /&gt;
  - sensor_plugin: occupancy_map_monitor/PointCloudOctomapUpdater&lt;br /&gt;
    point_cloud_topic: /xtion/depth/points&lt;br /&gt;
    max_range: 5.0&lt;br /&gt;
    point_subsample: 1&lt;br /&gt;
    padding_offset: 0.1&lt;br /&gt;
    padding_scale: 1.0&lt;br /&gt;
    filtered_cloud_topic: filtered_cloud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to add the nest code lines in the file &amp;quot;MYRAbot_moveit_sensor_manager.launch.xml&amp;quot; placed in the folder &amp;quot;launch&amp;quot; of the generated [http://moveit.ros.org/ moveIt!] ''package'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rosparam command=&amp;quot;load&amp;quot; file=&amp;quot;$(find myrabot_moveit_generated)/config/xtion.yaml&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;param name=&amp;quot;octomap_frame&amp;quot; type=&amp;quot;string&amp;quot; value=&amp;quot;odom&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;param name=&amp;quot;octomap_resolution&amp;quot; type=&amp;quot;double&amp;quot; value=&amp;quot;0.05&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;param name=&amp;quot;max_range&amp;quot; type=&amp;quot;double&amp;quot; value=&amp;quot;5.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to add the value '''move_group/MoveGroupGetPlanningSceneService'' in the parameter &amp;quot;papabilities&amp;quot; in the file &amp;quot;move_group.launch&amp;quot; placed in the folder &amp;quot;launch&amp;quot; of the generated [http://moveit.ros.org/ moveIt!] ''package'', like is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- MoveGroup capabilities to load --&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;capabilities&amp;quot; value=&amp;quot;move_group/MoveGroupCartesianPathService&lt;br /&gt;
				      move_group/MoveGroupExecuteService&lt;br /&gt;
				      move_group/MoveGroupKinematicsService&lt;br /&gt;
				      move_group/MoveGroupMoveAction&lt;br /&gt;
				      move_group/MoveGroupPickPlaceAction&lt;br /&gt;
				      move_group/MoveGroupPlanService&lt;br /&gt;
				      move_group/MoveGroupQueryPlannersService&lt;br /&gt;
				      move_group/MoveGroupStateValidationService&lt;br /&gt;
				      move_group/MoveGroupGetPlanningSceneService&lt;br /&gt;
				      &amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modification of the .srdf file generated==&lt;br /&gt;
&lt;br /&gt;
We have to edit the generated file &amp;quot;MYRAbot.srdf&amp;quot; placed in the folder &amp;quot;config&amp;quot; of the generated [http://moveit.ros.org/ moveIt!] ''package'' in order to replace the commas by dots in the values of the joints in the stored group poses, like is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;group_state name=&amp;quot;home&amp;quot; group=&amp;quot;brazo&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;arti1&amp;quot; value=&amp;quot;1,3836&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;arti2&amp;quot; value=&amp;quot;-2,2458&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;arti3&amp;quot; value=&amp;quot;-0,7065&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;base&amp;quot; value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/group_state&amp;gt;&lt;br /&gt;
&lt;br /&gt;
by&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;group_state name=&amp;quot;home&amp;quot; group=&amp;quot;brazo&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;arti1&amp;quot; value=&amp;quot;1.3836&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;arti2&amp;quot; value=&amp;quot;-2.2458&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;arti3&amp;quot; value=&amp;quot;-0.7065&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;base&amp;quot; value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/group_state&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Execution=&lt;br /&gt;
&lt;br /&gt;
==Simple planning==&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to test that the MYRAbot works properly in [http://moveit.ros.org/ moveIt!]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_moveit_generated demo.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the load process finish we can see the MYRAbot model in [http://wiki.ros.org/rviz rviz] with the Motion Planning Interface of [http://moveit.ros.org/ moveIt!], like is shown in the next picture:&lt;br /&gt;
&lt;br /&gt;
[[file:myrabot_moveit_plugin_rviz.png|thumb|500px|center|MYRAbot in [http://wiki.ros.org/rviz rviz] with ''plugin'' of [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
&lt;br /&gt;
If the interact mode is selected we can see a ''interactive markers'' around the gripper. We will use the interactive markers to interact with the representation of the start state and the goal state. If we open '''Planning Request''' within of '''MotionPlanning''' we can show or hide the representation of '''Query Start State''' (arm's joints green-coloured) and '''Query Goal State''' (arm's joints orange-coloured). When a part of the arm collides with other part of the robot or other object, its colour change to red.&lt;br /&gt;
&lt;br /&gt;
We can see in the next video a simple planning, without obstacles, that moves the arm from a start pose (stored pose home) until a goal pose (using the interactive marker):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;doy6VRjzYZc&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=doy6VRjzYZc Watch in YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Planning with modelled scene==&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start [http://wiki.ros.org/rviz rviz] with the robot model and the &amp;quot;MotionPlanning&amp;quot; of [http://moveit.ros.org/ moveIt!]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_moveit_generated demo.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have created a scene with basic geometry figures that represent a table and a can. We have not used 3D meshes because they may swap randomly. We will create a file named &amp;quot;mesa_lata.scene&amp;quot; within our personal folder with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesa_Lata&lt;br /&gt;
* mesa_pata_izquierda_delantera&lt;br /&gt;
1&lt;br /&gt;
cylinder&lt;br /&gt;
0.015 0.71&lt;br /&gt;
0.20 0.97 0.355&lt;br /&gt;
0 0 0 1&lt;br /&gt;
0 0 0 1&lt;br /&gt;
* mesa_pata_derecha_delantera&lt;br /&gt;
1&lt;br /&gt;
cylinder&lt;br /&gt;
0.015 0.71&lt;br /&gt;
0.20 -0.97 0.355&lt;br /&gt;
0 0 0 1&lt;br /&gt;
0 0 0 1&lt;br /&gt;
* mesa_pata_derecha_trasera&lt;br /&gt;
1&lt;br /&gt;
cylinder&lt;br /&gt;
0.015 0.71&lt;br /&gt;
0.89 -0.97 0.355&lt;br /&gt;
0 0 0 1&lt;br /&gt;
0 0 0 1&lt;br /&gt;
* mesa_pata_izquierda_trasera&lt;br /&gt;
1&lt;br /&gt;
cylinder&lt;br /&gt;
0.015 0.71&lt;br /&gt;
0.89 0.97 0.355&lt;br /&gt;
0 0 0 1&lt;br /&gt;
0 0 0 1&lt;br /&gt;
* mesa_tablero&lt;br /&gt;
1&lt;br /&gt;
box&lt;br /&gt;
0.75 2 0.03&lt;br /&gt;
0.545 0 0.725&lt;br /&gt;
0 0 0 1&lt;br /&gt;
0.71372549 0.494117647 0.301960784 1&lt;br /&gt;
* lata&lt;br /&gt;
1&lt;br /&gt;
cylinder&lt;br /&gt;
0.03 0.12&lt;br /&gt;
0.28 0 0.8&lt;br /&gt;
0 0 0 1&lt;br /&gt;
1 0 0 1&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will load the scene clicking on '''Import From Text''' in the menu '''Scene Objects''' of '''MotionPlanning'''. We can see in the next video the load process and planning to avoid the can that is represents by a red cylinder over the table:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;oWe_jj4keXU&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=oWe_jj4keXU Watch in YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Planning with robot in gazebo==&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;myrabot_gazebo_moveit_mesa+latas.launch&amp;quot; within the folder &amp;quot;launch&amp;quot; of the ''package'' &amp;quot;myrabot_fer_modelo&amp;quot; with the content that is shown below in order to load [[MYRAbot model for simulation (urdf+gazebo)#Creation of the objects' models|the objects' models]] (table and cans):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find myrabot_fer_modelo)/launch/myrabot_gazebo_moveit.launch&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Load models table and cans --&amp;gt;&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_mesa&amp;quot; pkg=&amp;quot;gazebo_ros&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find myrabot_objects_models_b)/urdf/mesa.urdf -urdf -x 0.545 -y 0 -z 0 -Y -1.57 -model mesa&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;    &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!--node name=&amp;quot;spawn_lata_coca_cola&amp;quot; pkg=&amp;quot;gazebo_ros&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find myrabot_objects_models_b)/urdf/lata_coca_cola.urdf -urdf -x 0.32 -y -0.18 -z 0.74 -Y -1.57 -model lata_Coca_Cola&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /--&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_lata_amstel&amp;quot; pkg=&amp;quot;gazebo_ros&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find myrabot_objects_models_b)/urdf/lata_amstel.urdf -urdf -x 0.32 -y 0.0 -z 0.74 -Y -1.57 -model lata_Amstel&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;moveit_planning_execution.launch&amp;quot; within the folder &amp;quot;launch&amp;quot; of the created [http://moveit.ros.org/ moveIt!] ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
 # The planning and execution components of MoveIt! configured to &lt;br /&gt;
 # publish the current configuration of the robot (simulated or real)&lt;br /&gt;
 # and the current state of the world as seen by the planner&lt;br /&gt;
 &amp;lt;include file=&amp;quot;$(find myrabot_moveit_generated)/launch/move_group.launch&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;arg name=&amp;quot;publish_monitored_planning_scene&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/include&amp;gt;&lt;br /&gt;
 # The visualization component of MoveIt!&lt;br /&gt;
 &amp;lt;include file=&amp;quot;$(find myrabot_moveit_generated)/launch/moveit_rviz.launch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] with the robot model and objects' models:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_fer_modelo myrabot_gazebo_moveit_mesa+latas.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a new terminal in order to start [http://wiki.ros.org/rviz rviz] with the &amp;quot;Motion Planning Interface&amp;quot; of [http://moveit.ros.org/ moveIt!]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_moveit_generated moveit_planning_execution.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The represented scene in [http://wiki.ros.org/rviz rviz] corresponds with the scene captured by the perception sensor, the boxes represent the occupied space. We can see in the next video the planning to avoid the can and the replanning because the first calculated trajectory collides with the can:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;xf1Jz1L-Xyc&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=xf1Jz1L-Xyc Watch in YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Simple planning with real robot==&lt;br /&gt;
&lt;br /&gt;
We need load the robot model and start the arm controller for [http://moveit.ros.org/ moveIt!]. We will create a file named &amp;quot;controlador_moveit.launch&amp;quot; within the folder &amp;quot;launch&amp;quot; of the ''package'' &amp;quot;brazo_fer&amp;quot; with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;robot_description&amp;quot; command=&amp;quot;$(find xacro)/xacro.py '$(find myrabot_fer_modelo)/urdf/myrabot_moveit.urdf.xacro'&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;robot_state_publisher&amp;quot; pkg=&amp;quot;robot_state_publisher&amp;quot; type=&amp;quot;state_publisher&amp;quot;&amp;gt;&amp;lt;/node&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;serial_node&amp;quot; pkg=&amp;quot;rosserial_python&amp;quot; type=&amp;quot;serial_node.py&amp;quot; args=&amp;quot;/dev/ttyACM0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;joint_states_brazo&amp;quot; pkg=&amp;quot;brazo_fer&amp;quot; type=&amp;quot;joint_states_brazo&amp;quot; /&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;group ns=&amp;quot;brazo_controller&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;node name=&amp;quot;follow_joint_trajectory&amp;quot; pkg=&amp;quot;brazo_fer&amp;quot; type=&amp;quot;controlador_moveit&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;/group&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start the arm control:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer controlador_moveit.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In a new terminal we will execute the next command in order to start [http://wiki.ros.org/rviz rviz] with the &amp;quot;Motion Planning Interface&amp;quot; of [http://moveit.ros.org/ moveIt!]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_moveit_generated moveit_planning_execution.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can see in the next video the real arm executing the planned trajectories in order to reach the positions that we have indicated on robot model using ''interactive markers'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;Kz7bKL4ZP98&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=Kz7bKL4ZP98 Watch in YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=MYRAbot_model_for_simulation_(urdf%2bgazebo)&amp;diff=4217</id>
		<title>MYRAbot model for simulation (urdf+gazebo)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=MYRAbot_model_for_simulation_(urdf%2bgazebo)&amp;diff=4217"/>
				<updated>2014-09-29T11:10:18Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Components of MYRAbot model=&lt;br /&gt;
&lt;br /&gt;
We have started creating a model of the MYRAbot's structure and we have added the mobile base [http://store.irobot.com/family/index.jsp?categoryId=3358508&amp;amp;s=A-ProductAge Roomba], the [http://www.xbox.com/es-ES/Kinect kinect] camera, the [[MYRAbot's arm model for simulation (urdf+gazebo)|arm model]] and the webcam [http://www.logitech.com/es-es/support/5867?crid=405 Logitech Webcam Pro 9000].&lt;br /&gt;
&lt;br /&gt;
First, we will create a new ''package'' with the necessary dependences for our programs (urdf std_msgs sensor_msgs tf roscpp). We will execute the next commands in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd ~/ros_workspace&lt;br /&gt;
roscreate-pkg myrabot_fer_modelo urdf std_msgs sensor_msgs tf roscpp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==URDF MYRAbot's structure==&lt;br /&gt;
&lt;br /&gt;
We have made the 3D model of the structure with a [http://en.wikipedia.org/wiki/Computer-aided_design CAD] software from which we use the parts with a complex geometry.&lt;br /&gt;
&lt;br /&gt;
[[file:estructura_MYRAbot_modelo.jpg|thumb|500px|center|3D [http://en.wikipedia.org/wiki/Computer-aided_design CAD] design of MYRAbot's structure]]&lt;br /&gt;
&lt;br /&gt;
We have divided the model in two files, main file and macros file. For the main file, we will create a file named &amp;quot;estructura-myrabot.xacro&amp;quot; within the folder &amp;quot;urdf&amp;quot; of the created package with the content that is shown below: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/estructura-myrabot-macros.xacro&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;estructura_myrabot&amp;quot; params=&amp;quot;parent *origin&amp;quot;&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;world_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_base_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
       &lt;br /&gt;
  &amp;lt;link name=&amp;quot;e_base_1_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 0.135 ${0.015/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 0.135 ${0.015/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.135&amp;quot; length=&amp;quot;0.015&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;${205/255} ${133/255} ${63/255} 1&amp;quot; /&amp;gt;&lt;br /&gt;
	  &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 0.135 ${0.015/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.135&amp;quot; length=&amp;quot;0.015&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;separador_base id=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;e_separador_base id=&amp;quot;1&amp;quot; xsim=&amp;quot;1&amp;quot; ysim=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;separador_base id=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;e_separador_base id=&amp;quot;2&amp;quot; xsim=&amp;quot;1&amp;quot; ysim=&amp;quot;-1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;separador_base id=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;e_separador_base id=&amp;quot;3&amp;quot; xsim=&amp;quot;-1&amp;quot; ysim=&amp;quot;-1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;separador_base id=&amp;quot;4&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;e_separador_base id=&amp;quot;4&amp;quot; xsim=&amp;quot;-1&amp;quot; ysim=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;base_2&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_base_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_base_2_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0.135&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;e_base_2_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 0.135 ${0.02/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 0.135 ${0.02/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.135&amp;quot; length=&amp;quot;0.02&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;${205/255} ${133/255} ${63/255} 1&amp;quot; /&amp;gt;&lt;br /&gt;
	  &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 0.135 ${0.02/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.135&amp;quot; length=&amp;quot;0.02&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;pilar&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_base_2_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_pilar_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0.02&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_pilar_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.08&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.7/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_pilar.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_pilar.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;joint name=&amp;quot;ultrasonidos&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_base_2_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_ultrasonidos_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0.02&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_ultrasonidos_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.04&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.0 0.0 ${0.04/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.160 -0.135 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_robot_model/meshes/e_ultrasonidos.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.160 -0.135 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_robot_model/meshes/e_ultrasonidos.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;botonera&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_base_2_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_botonera_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0.02&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_botonera_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.06&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.1/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.1/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.2 0.09 0.1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.1/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.2 0.09 0.1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;joint name=&amp;quot;start_button_1&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_botonera_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_start_button_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;-0.06 0 0.1&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;e_start_button_1_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.002/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.002/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.009&amp;quot; length=&amp;quot;0.002&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;black&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;color rgba=&amp;quot;0 0 0 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;		  &lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.002/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.009&amp;quot; length=&amp;quot;0.002&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;joint name=&amp;quot;start_button_2&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_start_button_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_start_button_2_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0.0 0 0.002&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;e_start_button_2_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.004/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.004/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.0075&amp;quot; length=&amp;quot;0.004&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;color rgba=&amp;quot;0 1 0 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;		  &lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.004/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.0075&amp;quot; length=&amp;quot;0.004&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;joint name=&amp;quot;emergency_button_1&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_botonera_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_emergency_button_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0.06 0 0.1&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;e_emergency_button_1_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.015/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.015/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.0125&amp;quot; length=&amp;quot;0.015&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;metal&amp;quot; /&amp;gt;		  &lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.015/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.0125&amp;quot; length=&amp;quot;0.015&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;joint name=&amp;quot;emergency_button_2&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_emergency_button_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_emergency_button_2_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0.0 0 0.015&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;e_emergency_button_2_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.003/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.003/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.018&amp;quot; length=&amp;quot;0.003&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;color rgba=&amp;quot;1 0 0 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;		  &lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.003/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.018&amp;quot; length=&amp;quot;0.003&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;base_kinect&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_pilar_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_base_kinect_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 ${0.395-0.155}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_base_kinect_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.02&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.005/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_base_kinect.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_base_kinect.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;joint name=&amp;quot;base_brazo_1&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_pilar_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_base_brazo_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 ${0.708-(0.395-0.155)}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_base_brazo_1_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.03&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.005/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_base_brazo_1.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_base_brazo_1.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;separador_base_brazo id=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;e_separador_base_brazo id=&amp;quot;1&amp;quot; xsim=&amp;quot;1&amp;quot; ysim=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;separador_base_brazo id=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;e_separador_base_brazo id=&amp;quot;2&amp;quot; xsim=&amp;quot;1&amp;quot; ysim=&amp;quot;-1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;separador_base_brazo id=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;e_separador_base_brazo id=&amp;quot;3&amp;quot; xsim=&amp;quot;-1&amp;quot; ysim=&amp;quot;-1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;separador_base_brazo id=&amp;quot;4&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;e_separador_base_brazo id=&amp;quot;4&amp;quot; xsim=&amp;quot;-1&amp;quot; ysim=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;base_brazo_2&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_base_brazo_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_base_brazo_2_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0.074&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_base_brazo_2_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.005&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.005/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_base_brazo_2.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_base_brazo_2.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;soporte_1&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_pilar_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_soporte_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 ${0.995-(0.708-0.155)-(0.395-0.155)}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_soporte_1_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.64/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_soporte_1.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_soporte_1.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;joint name=&amp;quot;soporte_2&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_soporte_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_soporte_2_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0.2 0.61&amp;quot; rpy=&amp;quot;-0.12 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_soporte_2_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.06/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 -0.2 -0.03&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_soporte_2.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 -0.2 -0.03&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_soporte_2.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;monitor&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_soporte_2_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_monitor_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 -0.2 -0.09&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_monitor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.180/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_monitor.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_monitor.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;joint name=&amp;quot;pantalla&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_monitor_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_pantalla_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0.135 ${0.135-0.005-0.03-0.0001} 0.086&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_pantalla_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.0001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.22 0.0001 0.130&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;black&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.22 0.0001 0.127&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;       &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_base_1_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_base_2_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_separador_base_1_link&amp;quot; material=&amp;quot;Grey&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_separador_base_2_link&amp;quot; material=&amp;quot;Grey&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_separador_base_3_link&amp;quot; material=&amp;quot;Grey&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_separador_base_4_link&amp;quot; material=&amp;quot;Grey&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_separador_base_brazo_1_link&amp;quot; material=&amp;quot;Grey&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_separador_base_brazo_2_link&amp;quot; material=&amp;quot;Grey&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_separador_base_brazo_3_link&amp;quot; material=&amp;quot;Grey&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_separador_base_brazo_4_link&amp;quot; material=&amp;quot;Grey&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_pilar_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_base_kinect_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_base_brazo_1_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_base_brazo_2_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_botonera_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_start_button_1_link&amp;quot; material=&amp;quot;Black&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_start_button_2_link&amp;quot; material=&amp;quot;Green&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_emergency_button_1_link&amp;quot; material=&amp;quot;Grey&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_emergency_button_2_link&amp;quot; material=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_soporte_1_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_soporte_2_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_monitor_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_pantalla_link&amp;quot; material=&amp;quot;Black&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will add the next files within the folder &amp;quot;meshes&amp;quot; of our ''package'':&lt;br /&gt;
&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_pilar.stl e_pilar.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_base_kinect.stl e_base_kinect.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_base_brazo_1.stl e_base_brazo_1.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_base_brazo_2.stl e_base_brazo_2.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_soporte_1.stl e_soporte_1.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_soporte_2.stl e_soporte_2.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_monitor.stl e_monitor.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_ultrasonidos.stl e_ultrasonidos.stl]&lt;br /&gt;
&lt;br /&gt;
For the macros file, we will create a file named &amp;quot;estructura-myrabot-macros.xacro&amp;quot; within the folder &amp;quot;urdf&amp;quot; of our package with the content that is shown below: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;default_inertia_e&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;inertia ixx=&amp;quot;0.01&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.01&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;separador_base&amp;quot; params=&amp;quot;id&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;joint name=&amp;quot;separador_base_${id}&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_base_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_separador_base_${id}_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0.135 0.135 0.015&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;e_separador_base&amp;quot; params=&amp;quot;id xsim ysim&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;link name=&amp;quot;e_separador_base_${id}_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.02&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;${xsim*0.040} ${ysim*0.105} ${0.120/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;${xsim*0.040} ${ysim*0.105} ${0.120/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.0075&amp;quot; length=&amp;quot;0.120&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;metal&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;${211/255} ${211/255} ${211/255} 1&amp;quot; /&amp;gt;&lt;br /&gt;
	  &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;${xsim*0.040} ${ysim*0.105} ${0.120/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.0075&amp;quot; length=&amp;quot;0.120&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt; &lt;br /&gt;
&amp;lt;/macro&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;separador_base_brazo&amp;quot; params=&amp;quot;id&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;joint name=&amp;quot;separador_base_brazo_${id}&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_base_brazo_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_separador_base_brazo_${id}_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0.135 ${0.135-0.082} 0.075&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;e_separador_base_brazo&amp;quot; params=&amp;quot;id xsim ysim&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;link name=&amp;quot;e_separador_base_brazo_${id}_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.002&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;${xsim*0.029} ${ysim*0.019} ${0.034/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;${xsim*0.029} ${ysim*0.019} ${0.034/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.002&amp;quot; length=&amp;quot;0.034&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;metal&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;${xsim*0.029} ${ysim*0.019} ${0.034/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.002&amp;quot; length=&amp;quot;0.034&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt; &lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;gazebo_propiedades&amp;quot; params=&amp;quot;nombre material&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;${nombre}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;Gazebo/${material}&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;0.5&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;0.5&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt; &lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==URDF Roomba==&lt;br /&gt;
&lt;br /&gt;
We have used the model of the mobile base [http://store.irobot.com/family/index.jsp?categoryId=2591511&amp;amp;s=A-ProductAge create] of the robot [http://www.turtlebot.com/ turtlebot], because the vacuum [http://store.irobot.com/family/index.jsp?categoryId=3358508&amp;amp;s=A-ProductAge Roomba] has similar sensors and physics. We have to install the ''stacks'' [http://wiki.ros.org/turtlebot turtlebot] and [http://wiki.ros.org/turtlebot_simulator turtlebot_simulator] that contain the robot model and the ''plugins'' for [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]. We have divided the model in two files, main file and ''plugins'' file. For the main file, we will create a file named &amp;quot;roomba.xacro&amp;quot; within the folder &amp;quot;urdf&amp;quot; of the created package with the content that is shown below: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/roomba-gazebo.xacro&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;roomba&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;material name=&amp;quot;Green&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;color rgba=&amp;quot;0.0 0.8 0.0 1.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;base_footprint&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
              iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot; &lt;br /&gt;
              izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.001 0.001 0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;Green&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0.017&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
       &amp;lt;box size=&amp;quot;0.001 0.001 0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;base_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;3.6&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${0.063/2}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.01&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.01&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot; 0 0 ${0.063/2}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder length=&amp;quot;0.063&amp;quot; radius=&amp;quot;0.17&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
	    &amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot; /&amp;gt;  &lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0.0 0.0 ${0.063/2}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder length=&amp;quot;0.063&amp;quot; radius=&amp;quot;0.17&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;wall_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;left_cliff_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;right_cliff_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;leftfront_cliff_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;1.0&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.01&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;rightfront_cliff_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;base_footprint_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0.017&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;        &lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_footprint&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;base_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;base_wall_sensor_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0.09 -0.120 0.042&amp;quot; rpy=&amp;quot;0 0 -1.0&amp;quot; /&amp;gt;        &lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;wall_sensor_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;base_left_cliff_sensor_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0.07 0.14 0.01&amp;quot; rpy=&amp;quot;0 1.57079 0&amp;quot; /&amp;gt;        &lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;left_cliff_sensor_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;base_right_cliff_sensor_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0.07 -0.14 0.01&amp;quot; rpy=&amp;quot;0 1.57079 0&amp;quot; /&amp;gt;        &lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;right_cliff_sensor_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;base_leftfront_cliff_sensor_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0.15 0.04 0.01&amp;quot; rpy=&amp;quot;0 1.57079 0&amp;quot; /&amp;gt;        &lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;leftfront_cliff_sensor_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;base_rightfront_cliff_sensor_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0.15 -0.04 0.01&amp;quot; rpy=&amp;quot;0 1.57079 0&amp;quot; /&amp;gt;        &lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;rightfront_cliff_sensor_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;left_wheel_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.5707 1.5707&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.033&amp;quot; length = &amp;quot;0.023&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.5707 1.5707&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.033&amp;quot; length = &amp;quot;0.023&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;left_wheel_joint&amp;quot; type=&amp;quot;continuous&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0.13 0.015&amp;quot; rpy=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;left_wheel_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;right_wheel_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.5707 1.5707&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.033&amp;quot; length = &amp;quot;0.023&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.5707 1.5707&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.033&amp;quot; length = &amp;quot;0.023&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;right_wheel_joint&amp;quot; type=&amp;quot;continuous&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 -0.13 0.015&amp;quot; rpy=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;right_wheel_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;rear_wheel_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.5707 1.5707&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;sphere radius=&amp;quot;0.015&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.5707 1.5707&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;sphere radius=&amp;quot;0.015&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;rear_castor_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;-0.13 0 0.0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;rear_wheel_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;front_wheel_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.5707 1.5707&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;sphere radius=&amp;quot;0.018&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.5707 1.5707&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;sphere radius=&amp;quot;0.018&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;front_castor_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0.13 0 0.0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;front_wheel_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;gyro_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0.04&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;gyro_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &amp;lt;link name=&amp;quot;gyro_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0&amp;quot; ixz=&amp;quot;0&amp;quot; iyy=&amp;quot;0.000001&amp;quot; iyz=&amp;quot;0&amp;quot; izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;laser_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;-0.065 0 0.57&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;laser&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;laser&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gaezebo&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;Gazebo/White&amp;lt;/material&amp;gt;&lt;br /&gt;
&amp;lt;/gaezebo&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;myrabot_sim_imu/&amp;gt;&lt;br /&gt;
  &amp;lt;myrabot_sim_laser/&amp;gt;&lt;br /&gt;
  &amp;lt;myrabot_sim_roomba/&amp;gt;&lt;br /&gt;
  &amp;lt;myrabot_sim_wall_sensors/&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/robot&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the ''plugins'' file, we will create a file named &amp;quot;roomba-gazebo.xacro&amp;quot; within the folder &amp;quot;urdf&amp;quot; of our package with the content that is shown below: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot; xmlns:interface=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#interface&amp;quot; xmlns:sensor=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor&amp;quot; xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;myrabot_sim_imu&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;gazebo&amp;gt;&lt;br /&gt;
    &amp;lt;controller:gazebo_ros_imu name=&amp;quot;imu_controller&amp;quot; plugin=&amp;quot;libgazebo_ros_imu.so&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;robotNamespace&amp;gt;/&amp;lt;/robotNamespace&amp;gt;&lt;br /&gt;
      &amp;lt;alwaysOn&amp;gt;true&amp;lt;/alwaysOn&amp;gt;&lt;br /&gt;
      &amp;lt;updateRate&amp;gt;30&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
      &amp;lt;bodyName&amp;gt;gyro_link&amp;lt;/bodyName&amp;gt;&lt;br /&gt;
      &amp;lt;topicName&amp;gt;imu/data&amp;lt;/topicName&amp;gt;&lt;br /&gt;
      &amp;lt;gaussianNoise&amp;gt;${0.0017*0.0017}&amp;lt;/gaussianNoise&amp;gt;&lt;br /&gt;
      &amp;lt;xyzOffsets&amp;gt;0 0 0&amp;lt;/xyzOffsets&amp;gt; &lt;br /&gt;
      &amp;lt;rpyOffsets&amp;gt;0 0 0&amp;lt;/rpyOffsets&amp;gt;&lt;br /&gt;
      &amp;lt;interface:position name=&amp;quot;imu_position&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/controller:gazebo_ros_imu&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;myrabot_sim_laser&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;laser&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor:ray name=&amp;quot;laser&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;rayCount&amp;gt;180&amp;lt;/rayCount&amp;gt;&lt;br /&gt;
      &amp;lt;rangeCount&amp;gt;180&amp;lt;/rangeCount&amp;gt;&lt;br /&gt;
      &amp;lt;laserCount&amp;gt;1&amp;lt;/laserCount&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
      &amp;lt;origin&amp;gt;0.0 0.0 0.0&amp;lt;/origin&amp;gt;&lt;br /&gt;
      &amp;lt;displayRays&amp;gt;false&amp;lt;/displayRays&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
      &amp;lt;minAngle&amp;gt;-${60/2}&amp;lt;/minAngle&amp;gt;&lt;br /&gt;
      &amp;lt;maxAngle&amp;gt;${60/2}&amp;lt;/maxAngle&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
      &amp;lt;minRange&amp;gt;0.08&amp;lt;/minRange&amp;gt;&lt;br /&gt;
      &amp;lt;maxRange&amp;gt;5.0&amp;lt;/maxRange&amp;gt;&lt;br /&gt;
      &amp;lt;resRange&amp;gt;0.01&amp;lt;/resRange&amp;gt;&lt;br /&gt;
      &amp;lt;updateRate&amp;gt;20&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
      &amp;lt;controller:gazebo_ros_laser name=&amp;quot;gazebo_ros_laser_controller&amp;quot; plugin=&amp;quot;libgazebo_ros_laser.so&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;robotNamespace&amp;gt;/&amp;lt;/robotNamespace&amp;gt;&lt;br /&gt;
        &amp;lt;gaussianNoise&amp;gt;0.005&amp;lt;/gaussianNoise&amp;gt;&lt;br /&gt;
	&amp;lt;alwaysOn&amp;gt;true&amp;lt;/alwaysOn&amp;gt;&lt;br /&gt;
	&amp;lt;updateRate&amp;gt;20&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
	&amp;lt;topicName&amp;gt;scan&amp;lt;/topicName&amp;gt;&lt;br /&gt;
	&amp;lt;frameName&amp;gt;laser&amp;lt;/frameName&amp;gt;&lt;br /&gt;
	&amp;lt;interface:laser name=&amp;quot;gazebo_ros_laser_iface&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/controller:gazebo_ros_laser&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor:ray&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;myrabot_sim_roomba&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;gazebo&amp;gt;&lt;br /&gt;
    &amp;lt;controller:gazebo_ros_roomba name=&amp;quot;roomba_controller&amp;quot; plugin=&amp;quot;libgazebo_ros_roomba.so&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;alwaysOn&amp;gt;true&amp;lt;/alwaysOn&amp;gt;&lt;br /&gt;
      &amp;lt;node_namespace&amp;gt;turtlebot_node&amp;lt;/node_namespace&amp;gt;&lt;br /&gt;
      &amp;lt;left_wheel_joint&amp;gt;left_wheel_joint&amp;lt;/left_wheel_joint&amp;gt;&lt;br /&gt;
      &amp;lt;right_wheel_joint&amp;gt;right_wheel_joint&amp;lt;/right_wheel_joint&amp;gt;&lt;br /&gt;
      &amp;lt;front_castor_joint&amp;gt;front_castor_joint&amp;lt;/front_castor_joint&amp;gt;&lt;br /&gt;
      &amp;lt;rear_castor_joint&amp;gt;rear_castor_joint&amp;lt;/rear_castor_joint&amp;gt;&lt;br /&gt;
      &amp;lt;wheel_separation&amp;gt;.260&amp;lt;/wheel_separation&amp;gt;&lt;br /&gt;
      &amp;lt;wheel_diameter&amp;gt;0.066&amp;lt;/wheel_diameter&amp;gt;&lt;br /&gt;
      &amp;lt;base_geom&amp;gt;base_link_geom_base_link&amp;lt;/base_geom&amp;gt;&lt;br /&gt;
      &amp;lt;updateRate&amp;gt;40&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
      &amp;lt;torque&amp;gt;1.0&amp;lt;/torque&amp;gt;&lt;br /&gt;
    &amp;lt;/controller:gazebo_ros_roomba&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;myrabot_sim_wall_sensors&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;wall_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor:ray name=&amp;quot;wall_sensor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;alwaysActive&amp;gt;true&amp;lt;/alwaysActive&amp;gt;&lt;br /&gt;
      &amp;lt;rayCount&amp;gt;1&amp;lt;/rayCount&amp;gt;&lt;br /&gt;
      &amp;lt;rangeCount&amp;gt;1&amp;lt;/rangeCount&amp;gt;&lt;br /&gt;
      &amp;lt;resRange&amp;gt;0.1&amp;lt;/resRange&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minAngle&amp;gt;0&amp;lt;/minAngle&amp;gt;&lt;br /&gt;
      &amp;lt;maxAngle&amp;gt;0&amp;lt;/maxAngle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minRange&amp;gt;0.0160&amp;lt;/minRange&amp;gt;&lt;br /&gt;
      &amp;lt;maxRange&amp;gt;0.04&amp;lt;/maxRange&amp;gt;&lt;br /&gt;
      &amp;lt;displayRays&amp;gt;false&amp;lt;/displayRays&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor:ray&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;left_cliff_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor:ray name=&amp;quot;left_cliff_sensor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;alwaysActive&amp;gt;true&amp;lt;/alwaysActive&amp;gt;&lt;br /&gt;
      &amp;lt;rayCount&amp;gt;1&amp;lt;/rayCount&amp;gt;&lt;br /&gt;
      &amp;lt;rangeCount&amp;gt;1&amp;lt;/rangeCount&amp;gt;&lt;br /&gt;
      &amp;lt;resRange&amp;gt;0.1&amp;lt;/resRange&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minAngle&amp;gt;0&amp;lt;/minAngle&amp;gt;&lt;br /&gt;
      &amp;lt;maxAngle&amp;gt;0&amp;lt;/maxAngle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minRange&amp;gt;0.01&amp;lt;/minRange&amp;gt;&lt;br /&gt;
      &amp;lt;maxRange&amp;gt;0.04&amp;lt;/maxRange&amp;gt;&lt;br /&gt;
      &amp;lt;displayRays&amp;gt;false&amp;lt;/displayRays&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor:ray&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;right_cliff_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor:ray name=&amp;quot;right_cliff_sensor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;alwaysActive&amp;gt;true&amp;lt;/alwaysActive&amp;gt;&lt;br /&gt;
      &amp;lt;rayCount&amp;gt;1&amp;lt;/rayCount&amp;gt;&lt;br /&gt;
      &amp;lt;rangeCount&amp;gt;1&amp;lt;/rangeCount&amp;gt;&lt;br /&gt;
      &amp;lt;resRange&amp;gt;0.1&amp;lt;/resRange&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minAngle&amp;gt;0&amp;lt;/minAngle&amp;gt;&lt;br /&gt;
      &amp;lt;maxAngle&amp;gt;0&amp;lt;/maxAngle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minRange&amp;gt;0.01&amp;lt;/minRange&amp;gt;&lt;br /&gt;
      &amp;lt;maxRange&amp;gt;0.04&amp;lt;/maxRange&amp;gt;&lt;br /&gt;
      &amp;lt;displayRays&amp;gt;false&amp;lt;/displayRays&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor:ray&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;leftfront_cliff_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor:ray name=&amp;quot;leftfront_cliff_sensor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;alwaysActive&amp;gt;true&amp;lt;/alwaysActive&amp;gt;&lt;br /&gt;
      &amp;lt;rayCount&amp;gt;1&amp;lt;/rayCount&amp;gt;&lt;br /&gt;
      &amp;lt;rangeCount&amp;gt;1&amp;lt;/rangeCount&amp;gt;&lt;br /&gt;
      &amp;lt;resRange&amp;gt;0.1&amp;lt;/resRange&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minAngle&amp;gt;0&amp;lt;/minAngle&amp;gt;&lt;br /&gt;
      &amp;lt;maxAngle&amp;gt;0&amp;lt;/maxAngle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minRange&amp;gt;0.01&amp;lt;/minRange&amp;gt;&lt;br /&gt;
      &amp;lt;maxRange&amp;gt;0.04&amp;lt;/maxRange&amp;gt;&lt;br /&gt;
      &amp;lt;displayRays&amp;gt;false&amp;lt;/displayRays&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor:ray&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;rightfront_cliff_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor:ray name=&amp;quot;rightfront_cliff_sensor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;alwaysActive&amp;gt;true&amp;lt;/alwaysActive&amp;gt;&lt;br /&gt;
      &amp;lt;rayCount&amp;gt;1&amp;lt;/rayCount&amp;gt;&lt;br /&gt;
      &amp;lt;rangeCount&amp;gt;1&amp;lt;/rangeCount&amp;gt;&lt;br /&gt;
      &amp;lt;resRange&amp;gt;0.1&amp;lt;/resRange&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minAngle&amp;gt;0&amp;lt;/minAngle&amp;gt;&lt;br /&gt;
      &amp;lt;maxAngle&amp;gt;0&amp;lt;/maxAngle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minRange&amp;gt;0.01&amp;lt;/minRange&amp;gt;&lt;br /&gt;
      &amp;lt;maxRange&amp;gt;0.04&amp;lt;/maxRange&amp;gt;&lt;br /&gt;
      &amp;lt;displayRays&amp;gt;fan&amp;lt;/displayRays&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor:ray&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;left_wheel_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;mu1 value=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;mu2 value=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;kp value=&amp;quot;100000000.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;kd value=&amp;quot;10000.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;fdir value=&amp;quot;1 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;right_wheel_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;mu1 value=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;mu2 value=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;kp value=&amp;quot;100000000.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;kd value=&amp;quot;10000.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;fdir value=&amp;quot;1 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;rear_wheel_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;mu1 value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;mu2 value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;kp value=&amp;quot;100000000.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;kd value=&amp;quot;10000.0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;front_wheel_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;mu1 value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;mu2 value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;kp value=&amp;quot;100000000.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;kd value=&amp;quot;10000.0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==URDF kinect==&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;kinect.xacro&amp;quot; within the folder &amp;quot;urdf&amp;quot; of our ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot; xmlns:interface=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#interface&amp;quot; xmlns:sensor=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor&amp;quot; xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;property name=&amp;quot;M_PI&amp;quot; value=&amp;quot;3.14159&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;kinect&amp;quot; params=&amp;quot;parent *origin&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;base_camera_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;${parent}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;camera_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;camera_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/kinect.dae&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0.0 0.0 0.0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/kinect.dae&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;camera_depth_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0.018 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;camera_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;camera_depth_frame&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;camera_depth_frame&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;camera_depth_optical_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;${-M_PI/2} 0 ${-M_PI/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;camera_depth_frame&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;camera_depth_optical_frame&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;camera_depth_optical_frame&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;camera_rgb_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 -0.005 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;camera_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;camera_rgb_frame&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;camera_rgb_frame&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;camera_rgb_optical_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;${-M_PI/2} 0 ${-M_PI/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;camera_rgb_frame&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;camera_rgb_optical_frame&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;camera_rgb_optical_frame&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;camera_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor:camera name=&amp;quot;camera&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;imageFormat&amp;gt;R8G8B8&amp;lt;/imageFormat&amp;gt;&lt;br /&gt;
      &amp;lt;imageSize&amp;gt;640 480&amp;lt;/imageSize&amp;gt;&lt;br /&gt;
      &amp;lt;hfov&amp;gt;60&amp;lt;/hfov&amp;gt;&lt;br /&gt;
      &amp;lt;nearClip&amp;gt;0.05&amp;lt;/nearClip&amp;gt;&lt;br /&gt;
      &amp;lt;farClip&amp;gt;5&amp;lt;/farClip&amp;gt;&lt;br /&gt;
      &amp;lt;updateRate&amp;gt;20&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
      &amp;lt;baseline&amp;gt;0.1&amp;lt;/baseline&amp;gt;&lt;br /&gt;
      &amp;lt;controller:gazebo_ros_openni_kinect name=&amp;quot;kinect_camera_controller&amp;quot; plugin=&amp;quot;libgazebo_ros_openni_kinect.so&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alwaysOn&amp;gt;true&amp;lt;/alwaysOn&amp;gt;&lt;br /&gt;
        &amp;lt;updateRate&amp;gt;20&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
        &amp;lt;robotNamespace&amp;gt;/&amp;lt;/robotNamespace&amp;gt; &lt;br /&gt;
        &amp;lt;imageTopicName&amp;gt;/camera/image_raw&amp;lt;/imageTopicName&amp;gt;&lt;br /&gt;
        &amp;lt;pointCloudTopicName&amp;gt;/camera/depth/points&amp;lt;/pointCloudTopicName&amp;gt;&lt;br /&gt;
        &amp;lt;cameraInfoTopicName&amp;gt;/camera/camera_info&amp;lt;/cameraInfoTopicName&amp;gt;&lt;br /&gt;
        &amp;lt;frameName&amp;gt;camera_depth_optical_frame&amp;lt;/frameName&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_k1&amp;gt;0.0&amp;lt;/distortion_k1&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_k2&amp;gt;0.0&amp;lt;/distortion_k2&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_k3&amp;gt;0.0&amp;lt;/distortion_k3&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_t1&amp;gt;0.0&amp;lt;/distortion_t1&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_t2&amp;gt;0.0&amp;lt;/distortion_t2&amp;gt;&lt;br /&gt;
      &amp;lt;/controller:gazebo_ros_openni_kinect&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor:camera&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==URDF webcam==&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;webcam.xacro&amp;quot; within the folder &amp;quot;urdf&amp;quot; of our ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot; xmlns:interface=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#interface&amp;quot; xmlns:sensor=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor&amp;quot; xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;webcam&amp;quot; params=&amp;quot;parent *origin&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;webcam_1&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;${parent}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;e_webcam_1_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;e_webcam_1_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_robot_model/meshes/webcam_1.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;black&amp;quot;&amp;gt;&lt;br /&gt;
	    &amp;lt;color rgba=&amp;quot;0 0 0 1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0.0 0.0 0.0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_robot_model/meshes/webcam_1.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;webcam_2&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 ${0.135-0.04-(0.02-0.009)} ${(0.185/2)+0.0045}&amp;quot; rpy=&amp;quot;0.82 0 0&amp;quot; /&amp;gt;	&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;e_webcam_1_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;e_webcam_2_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;e_webcam_2_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 -${0.135-0.04-(0.02-0.009)} -${(0.185/2)+0.0045}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 -${0.135-0.04-(0.02-0.009)} -${(0.185/2)+0.0045}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_robot_model/meshes/webcam_2.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;black&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 -${0.135-0.04-(0.02-0.009)} -${(0.185/2)+0.0045}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_robot_model/meshes/webcam_2.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;webcam_optica&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0.135 -0.0285 0&amp;quot; rpy=&amp;quot;0 0 -1.57&amp;quot; /&amp;gt;	&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;e_webcam_2_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;e_webcam_optica_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;e_webcam_optica_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.57 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.017&amp;quot; length=&amp;quot;0.004&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.57 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.017&amp;quot; length=&amp;quot;0.004&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;e_webcam_1_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;myrabot_fer/Black&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;0.5&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;0.5&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt; &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;e_webcam_2_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;myrabot_fer/Black&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;0.5&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;0.5&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt; &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;e_webcam_optica_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;myrabot_fer/White&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;0.5&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;0.5&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt; &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;e_webcam_optica_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor:camera name=&amp;quot;webcam&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;imageFormat&amp;gt;R8G8B8&amp;lt;/imageFormat&amp;gt;&lt;br /&gt;
      &amp;lt;imageSize&amp;gt;640 480&amp;lt;/imageSize&amp;gt;&lt;br /&gt;
      &amp;lt;hfov&amp;gt;63.09&amp;lt;/hfov&amp;gt;&lt;br /&gt;
      &amp;lt;nearClip&amp;gt;0.02&amp;lt;/nearClip&amp;gt;&lt;br /&gt;
      &amp;lt;farClip&amp;gt;3&amp;lt;/farClip&amp;gt;&lt;br /&gt;
      &amp;lt;updateRate&amp;gt;20&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
      &amp;lt;baseline&amp;gt;0.1&amp;lt;/baseline&amp;gt;&lt;br /&gt;
      &amp;lt;controller:gazebo_ros_openni_kinect name=&amp;quot;webcam_camera_controller&amp;quot; filename=&amp;quot;libgazebo_ros_openni_kinect.so&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alwaysOn&amp;gt;true&amp;lt;/alwaysOn&amp;gt;&lt;br /&gt;
        &amp;lt;updateRate&amp;gt;20&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
        &amp;lt;robotNamespace&amp;gt;/&amp;lt;/robotNamespace&amp;gt;&lt;br /&gt;
        &amp;lt;imageTopicName&amp;gt;/webcam/image_raw&amp;lt;/imageTopicName&amp;gt;&lt;br /&gt;
        &amp;lt;pointCloudTopicName&amp;gt;/webcam/depth/points&amp;lt;/pointCloudTopicName&amp;gt;     &lt;br /&gt;
        &amp;lt;cameraInfoTopicName&amp;gt;/webcam/camera_info&amp;lt;/cameraInfoTopicName&amp;gt;&lt;br /&gt;
        &amp;lt;frameName&amp;gt;e_webcam_optica_link&amp;lt;/frameName&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_k1&amp;gt;0.0&amp;lt;/distortion_k1&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_k2&amp;gt;0.0&amp;lt;/distortion_k2&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_k3&amp;gt;0.0&amp;lt;/distortion_k3&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_t1&amp;gt;0.0&amp;lt;/distortion_t1&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_t2&amp;gt;0.0&amp;lt;/distortion_t2&amp;gt;&lt;br /&gt;
      &amp;lt;/controller:gazebo_ros_openni_kinect&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor:camera&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will add the next files within the folder &amp;quot;meshes&amp;quot; of our ''package'':&lt;br /&gt;
&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/webcam_1.stl webcam_1.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/webcam_2.stl webcam_2.stl]&lt;br /&gt;
&lt;br /&gt;
==URDF ultrasound sensor==&lt;br /&gt;
&lt;br /&gt;
===Creation of a gazebo plugin===&lt;br /&gt;
&lt;br /&gt;
we will create a new ''package'' with the necessary dependences for our plugins (gazebo sensor_msgs roscpp). We will execute the next commands in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd ~/ros_workspace&lt;br /&gt;
roscreate-pkg myrabot_gazebo_plugins gazebo sensor_msgs roscpp&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;gazebo_ros_sonar.cpp&amp;quot; within the folder &amp;quot;src&amp;quot; of the created ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Software License Agreement (Modified BSD License)&lt;br /&gt;
 *&lt;br /&gt;
 *  Copyright (c) 2012, PAL Robotics, S.L.&lt;br /&gt;
 *  All rights reserved.&lt;br /&gt;
 *&lt;br /&gt;
 *  Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 *  modification, are permitted provided that the following conditions&lt;br /&gt;
 *  are met:&lt;br /&gt;
 *&lt;br /&gt;
 *   * Redistributions of source code must retain the above copyright&lt;br /&gt;
 *     notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 *   * Redistributions in binary form must reproduce the above&lt;br /&gt;
 *     copyright notice, this list of conditions and the following&lt;br /&gt;
 *     disclaimer in the documentation and/or other materials provided&lt;br /&gt;
 *     with the distribution.&lt;br /&gt;
 *   * Neither the name of PAL Robotics, S.L. nor the names of its&lt;br /&gt;
 *     contributors may be used to endorse or promote products derived&lt;br /&gt;
 *     from this software without specific prior written permission.&lt;br /&gt;
 *&lt;br /&gt;
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS&lt;br /&gt;
 *  &amp;quot;AS IS&amp;quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT&lt;br /&gt;
 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS&lt;br /&gt;
 *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE&lt;br /&gt;
 *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,&lt;br /&gt;
 *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,&lt;br /&gt;
 *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;&lt;br /&gt;
 *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER&lt;br /&gt;
 *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT&lt;br /&gt;
 *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN&lt;br /&gt;
 *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;br /&gt;
 *  POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;gazebo/Sensor.hh&amp;gt;&lt;br /&gt;
#include &amp;lt;gazebo/Global.hh&amp;gt;&lt;br /&gt;
#include &amp;lt;gazebo/XMLConfig.hh&amp;gt;&lt;br /&gt;
#include &amp;lt;gazebo/Simulator.hh&amp;gt;&lt;br /&gt;
#include &amp;lt;gazebo/gazebo.h&amp;gt;&lt;br /&gt;
#include &amp;lt;gazebo/GazeboError.hh&amp;gt;&lt;br /&gt;
#include &amp;lt;gazebo/ControllerFactory.hh&amp;gt;&lt;br /&gt;
#include &amp;lt;limits&amp;gt;&lt;br /&gt;
#include &amp;lt;myrabot_gazebo_plugin/gazebo_ros_sonar.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace gazebo;&lt;br /&gt;
&lt;br /&gt;
GZ_REGISTER_DYNAMIC_CONTROLLER(&amp;quot;gazebo_ros_sonar&amp;quot;, GazeboRosSonar)&lt;br /&gt;
&lt;br /&gt;
GazeboRosSonar::GazeboRosSonar(Entity *parent) : Controller(parent)&lt;br /&gt;
{&lt;br /&gt;
  sensor_ = dynamic_cast&amp;lt;RaySensor*&amp;gt;(parent);&lt;br /&gt;
  if (!sensor_) gzthrow(&amp;quot;GazeboRosSonar controller requires a RaySensor as its parent&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Param::Begin(&amp;amp;parameters);&lt;br /&gt;
  topic_param_ = new ParamT&amp;lt;std::string&amp;gt;(&amp;quot;topicName&amp;quot;, &amp;quot;sonar&amp;quot;, false);&lt;br /&gt;
  frame_id_param_ = new ParamT&amp;lt;std::string&amp;gt;(&amp;quot;frameId&amp;quot;, &amp;quot;&amp;quot;, false);&lt;br /&gt;
  radiation_param_ = new ParamT&amp;lt;std::string&amp;gt;(&amp;quot;radiation&amp;quot;,&amp;quot;ultrasound&amp;quot;,false);&lt;br /&gt;
  fov_param_ = new ParamT&amp;lt;double&amp;gt;(&amp;quot;fov&amp;quot;, 0.05, false);&lt;br /&gt;
  gaussian_noise_ = new ParamT&amp;lt;double&amp;gt;(&amp;quot;gaussianNoise&amp;quot;, 0.0, 0);&lt;br /&gt;
  Param::End();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Destructor&lt;br /&gt;
GazeboRosSonar::~GazeboRosSonar()&lt;br /&gt;
{&lt;br /&gt;
  delete topic_param_;&lt;br /&gt;
  delete frame_id_param_;&lt;br /&gt;
  delete radiation_param_;&lt;br /&gt;
  delete fov_param_;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Load the controller&lt;br /&gt;
void GazeboRosSonar::LoadChild(XMLConfigNode *node)&lt;br /&gt;
{&lt;br /&gt;
  ROS_INFO(&amp;quot;INFO: gazebo_ros_ir plugin loading&amp;quot; );&lt;br /&gt;
  topic_param_-&amp;gt;Load(node);&lt;br /&gt;
  frame_id_param_-&amp;gt;Load(node);&lt;br /&gt;
  radiation_param_-&amp;gt;Load(node);&lt;br /&gt;
  fov_param_-&amp;gt;Load(node);&lt;br /&gt;
  gaussian_noise_-&amp;gt;Load(node);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////&lt;br /&gt;
// Initialize the controller&lt;br /&gt;
void GazeboRosSonar::InitChild()&lt;br /&gt;
{&lt;br /&gt;
  Range.header.frame_id = **frame_id_param_;&lt;br /&gt;
&lt;br /&gt;
  if (**radiation_param_==std::string(&amp;quot;ultrasound&amp;quot;))&lt;br /&gt;
      Range.radiation_type = sensor_msgs::Range::ULTRASOUND;&lt;br /&gt;
  else&lt;br /&gt;
      Range.radiation_type = sensor_msgs::Range::INFRARED;&lt;br /&gt;
&lt;br /&gt;
  Range.field_of_view = **fov_param_;&lt;br /&gt;
  Range.max_range = sensor_-&amp;gt;GetMaxRange();&lt;br /&gt;
  Range.min_range = sensor_-&amp;gt;GetMinRange();&lt;br /&gt;
&lt;br /&gt;
  sensor_-&amp;gt;SetActive(false);&lt;br /&gt;
  node_handle_ = new ros::NodeHandle(&amp;quot;&amp;quot;);&lt;br /&gt;
  publisher_ = node_handle_-&amp;gt;advertise&amp;lt;sensor_msgs::Range&amp;gt;(**topic_param_, 10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Utility for adding noise&lt;br /&gt;
double GazeboRosSonar::GaussianKernel(double mu,double sigma)&lt;br /&gt;
{&lt;br /&gt;
    // using Box-Muller transform to generate two independent standard normally disbributed normal variables&lt;br /&gt;
    // see wikipedia&lt;br /&gt;
    double U = (double)rand()/(double)RAND_MAX; // normalized uniform random variable&lt;br /&gt;
    double V = (double)rand()/(double)RAND_MAX; // normalized uniform random variable&lt;br /&gt;
    double X = sqrt(-2.0 * ::log(U)) * cos( 2.0*M_PI * V);&lt;br /&gt;
    //double Y = sqrt(-2.0 * ::log(U)) * sin( 2.0*M_PI * V); // the other indep. normal variable&lt;br /&gt;
    // we'll just use X&lt;br /&gt;
    // scale to our mu and sigma&lt;br /&gt;
    X = sigma * X + mu;&lt;br /&gt;
    return X;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Update the controller&lt;br /&gt;
void GazeboRosSonar::UpdateChild()&lt;br /&gt;
{&lt;br /&gt;
  if (!sensor_-&amp;gt;IsActive()) sensor_-&amp;gt;SetActive(true);&lt;br /&gt;
&lt;br /&gt;
  Range.header.stamp.sec  = (Simulator::Instance()-&amp;gt;GetSimTime()).sec;&lt;br /&gt;
  Range.header.stamp.nsec = (Simulator::Instance()-&amp;gt;GetSimTime()).nsec;&lt;br /&gt;
  Range.range = std::numeric_limits&amp;lt;sensor_msgs::Range::_range_type&amp;gt;::max();&lt;br /&gt;
&lt;br /&gt;
  for(int i = 0; i &amp;lt; sensor_-&amp;gt;GetRangeCount(); ++i) {&lt;br /&gt;
    double ray = sensor_-&amp;gt;GetRange(i);&lt;br /&gt;
    if (ray &amp;lt; Range.range) Range.range = ray;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Range.range = std::min(Range.range + this-&amp;gt;GaussianKernel(0,**gaussian_noise_), sensor_-&amp;gt;GetMaxRange());&lt;br /&gt;
  publisher_.publish(Range);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Finalize the controller&lt;br /&gt;
void GazeboRosSonar::FiniChild()&lt;br /&gt;
{&lt;br /&gt;
  sensor_-&amp;gt;SetActive(false);&lt;br /&gt;
  node_handle_-&amp;gt;shutdown();&lt;br /&gt;
  delete node_handle_;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;gazebo_ros_sonar.h&amp;quot; within the path &amp;quot;include/myrabot_gazebo_plugins/&amp;quot; of the created ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Software License Agreement (Modified BSD License)&lt;br /&gt;
 *&lt;br /&gt;
 *  Copyright (c) 2012, PAL Robotics, S.L.&lt;br /&gt;
 *  All rights reserved.&lt;br /&gt;
 *&lt;br /&gt;
 *  Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 *  modification, are permitted provided that the following conditions&lt;br /&gt;
 *  are met:&lt;br /&gt;
 *&lt;br /&gt;
 *   * Redistributions of source code must retain the above copyright&lt;br /&gt;
 *     notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 *   * Redistributions in binary form must reproduce the above&lt;br /&gt;
 *     copyright notice, this list of conditions and the following&lt;br /&gt;
 *     disclaimer in the documentation and/or other materials provided&lt;br /&gt;
 *     with the distribution.&lt;br /&gt;
 *   * Neither the name of PAL Robotics, S.L. nor the names of its&lt;br /&gt;
 *     contributors may be used to endorse or promote products derived&lt;br /&gt;
 *     from this software without specific prior written permission.&lt;br /&gt;
 *&lt;br /&gt;
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS&lt;br /&gt;
 *  &amp;quot;AS IS&amp;quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT&lt;br /&gt;
 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS&lt;br /&gt;
 *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE&lt;br /&gt;
 *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,&lt;br /&gt;
 *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,&lt;br /&gt;
 *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;&lt;br /&gt;
 *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER&lt;br /&gt;
 *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT&lt;br /&gt;
 *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN&lt;br /&gt;
 *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;br /&gt;
 *  POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ros/ros.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;gazebo.hh&amp;gt;&lt;br /&gt;
#include &amp;lt;gazebo/common/Plugin.hh&amp;gt;&lt;br /&gt;
#include &amp;lt;gazebo/sensors/RaySensor.hh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ros/callback_queue.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sensor_msgs/Range.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
namespace gazebo&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
class GazeboRosSonar : public  gazebo::SensorPlugin&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  GazeboRosSonar();&lt;br /&gt;
  virtual ~GazeboRosSonar();&lt;br /&gt;
&lt;br /&gt;
protected:&lt;br /&gt;
  virtual void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf);&lt;br /&gt;
  virtual void Update();&lt;br /&gt;
&lt;br /&gt;
  /// \brief Gaussian noise generator&lt;br /&gt;
private:&lt;br /&gt;
  double GaussianKernel(double mu,double sigma);&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
  gazebo::sensors::RaySensorPtr sensor_;&lt;br /&gt;
&lt;br /&gt;
  ros::NodeHandle* node_handle_;&lt;br /&gt;
  ros::Publisher publisher_;&lt;br /&gt;
&lt;br /&gt;
  sensor_msgs::Range range_;&lt;br /&gt;
&lt;br /&gt;
  std::string namespace_;&lt;br /&gt;
  std::string topic_name_;&lt;br /&gt;
  std::string frame_id_;&lt;br /&gt;
  std::string radiation_;&lt;br /&gt;
  double fov_;&lt;br /&gt;
  double gaussian_noise_;&lt;br /&gt;
&lt;br /&gt;
  gazebo::physics::WorldPtr parent_;&lt;br /&gt;
&lt;br /&gt;
  common::Time last_time;&lt;br /&gt;
&lt;br /&gt;
  gazebo::event::ConnectionPtr updateConnection;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
} // namespace gazebo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to add the next lines at the end within the file CMakeLists.txt of the plugins ''package'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosbuild_add_library(gazebo_ros_sonar src/gazebo_ros_sonar.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also, we have to add the next lines before the tag &amp;lt;/package&amp;gt; within the file &amp;quot;manifest.xml&amp;quot; of the plugins ''package'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;export&amp;gt;&lt;br /&gt;
    &amp;lt;cpp cflags=&amp;quot;-I${prefix}/include&amp;quot; lflags=&amp;quot;-Wl,-rpath,${prefix}/lib -L${prefix}/lib&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;gazebo plugin_path=&amp;quot;${prefix}/lib&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/export&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next commands in a terminal in order to compile the plugin:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
roscd myrabot_gazebo_plugins&lt;br /&gt;
make&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===URDF===&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;ultrasonidos.xacro&amp;quot; within the folder &amp;quot;urdf&amp;quot; of our robot model ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot; xmlns:interface=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#interface&amp;quot; xmlns:sensor=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor&amp;quot; xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;ultrasonidos&amp;quot; params=&amp;quot;id parent d_centro *origin&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;ultrasonidos_${id}_joint_fisico&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;ultrasonidos_${id}_link_fisico&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
       &lt;br /&gt;
  &amp;lt;link name=&amp;quot;ultrasonidos_${id}_link_fisico&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;1.57 0 0&amp;quot; xyz=&amp;quot;0 -${d_centro} ${0.015/2}&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.0001&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;1.57 0 0&amp;quot; xyz=&amp;quot;0 -${d_centro} ${0.015/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;${0.015/2}&amp;quot; length=&amp;quot;0.015&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;black&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;0 0 0 1&amp;quot; /&amp;gt;&lt;br /&gt;
	  &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;1.57 0 0&amp;quot; xyz=&amp;quot;0 -${d_centro} ${0.015/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;${0.015/2}&amp;quot; length=&amp;quot;0.015&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;joint name=&amp;quot;ultrasonidos_${id}_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;ultrasonidos_${id}_link_fisico&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;ultrasonidos_${id}_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 -1.57&amp;quot; xyz=&amp;quot;0 -${d_centro+(0.015/2)} ${0.015/2}&amp;quot;/&amp;gt; &lt;br /&gt;
&amp;lt;/joint&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;link name=&amp;quot;ultrasonidos_${id}_link&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/link&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;ultrasonidos_${id}_link_fisico&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;myrabot_fer/Black&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;0.5&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;0.5&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt; &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
    &amp;lt;gazebo reference=&amp;quot;ultrasonidos_${id}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;sensor:ray name=&amp;quot;ultrasonidos_${id}&amp;quot;&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
        &amp;lt;displayRays&amp;gt;false&amp;lt;/displayRays&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;rayCount&amp;gt;5&amp;lt;/rayCount&amp;gt;&lt;br /&gt;
        &amp;lt;rangeCount&amp;gt;5&amp;lt;/rangeCount&amp;gt;&lt;br /&gt;
        &amp;lt;verticalRayCount&amp;gt;1&amp;lt;/verticalRayCount&amp;gt;&lt;br /&gt;
        &amp;lt;verticalRangeCount&amp;gt;1&amp;lt;/verticalRangeCount&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;minAngle&amp;gt;-16&amp;lt;/minAngle&amp;gt;&lt;br /&gt;
        &amp;lt;verticalMinAngle&amp;gt;-16&amp;lt;/verticalMinAngle&amp;gt;&lt;br /&gt;
        &amp;lt;maxAngle&amp;gt;16&amp;lt;/maxAngle&amp;gt;&lt;br /&gt;
        &amp;lt;verticalMaxAngle&amp;gt;16&amp;lt;/verticalMaxAngle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;minRange&amp;gt;0&amp;lt;/minRange&amp;gt;&lt;br /&gt;
        &amp;lt;maxRange&amp;gt;7&amp;lt;/maxRange&amp;gt;&lt;br /&gt;
        &amp;lt;resRange&amp;gt;0.01&amp;lt;/resRange&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;updateRate&amp;gt;20&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controller:gazebo_ros_sonar name=&amp;quot;gazebo_ros_ultrasonidos_${id}_controller&amp;quot; plugin=&amp;quot;libgazebo_ros_sonar.so&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;robotNamespace&amp;gt;/&amp;lt;/robotNamespace&amp;gt;&lt;br /&gt;
          &amp;lt;gaussianNoise&amp;gt;0.005&amp;lt;/gaussianNoise&amp;gt;&lt;br /&gt;
          &amp;lt;alwaysOn&amp;gt;true&amp;lt;/alwaysOn&amp;gt;&lt;br /&gt;
          &amp;lt;updateRate&amp;gt;20&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
          &amp;lt;topicName&amp;gt;ultrasonidos_${id}&amp;lt;/topicName&amp;gt;&lt;br /&gt;
          &amp;lt;frameId&amp;gt;ultrasonidos_${id}_link&amp;lt;/frameId&amp;gt;&lt;br /&gt;
          &amp;lt;radiation&amp;gt;ultrasound&amp;lt;/radiation&amp;gt;&lt;br /&gt;
          &amp;lt;fov&amp;gt;32&amp;lt;/fov&amp;gt;&lt;br /&gt;
                  &lt;br /&gt;
        &amp;lt;/controller:gazebo_ros_sonar&amp;gt;&lt;br /&gt;
      &amp;lt;/sensor:ray&amp;gt;&lt;br /&gt;
    &amp;lt;/gazebo&amp;gt; &lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Assembled of MYRAbot model=&lt;br /&gt;
&lt;br /&gt;
We have to join all the parts that form the MYRAbot. We have to set the parent link and origin of each part. We will create a file named &amp;quot;myrabot.urdf.xacro&amp;quot; within the folder &amp;quot;urdf&amp;quot; of our ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot name=&amp;quot;MYRAbot&amp;quot;&lt;br /&gt;
       xmlns:xi=&amp;quot;http://www.w3.org/2001/XInclude&amp;quot;&lt;br /&gt;
       xmlns:gazebo=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#gz&amp;quot;&lt;br /&gt;
       xmlns:model=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#model&amp;quot;&lt;br /&gt;
       xmlns:sensor=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor&amp;quot;&lt;br /&gt;
       xmlns:body=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#body&amp;quot;&lt;br /&gt;
       xmlns:geom=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#geom&amp;quot;&lt;br /&gt;
       xmlns:joint=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#joint&amp;quot;&lt;br /&gt;
       xmlns:interface=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#interface&amp;quot;&lt;br /&gt;
       xmlns:rendering=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#rendering&amp;quot;&lt;br /&gt;
       xmlns:renderable=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#renderable&amp;quot;&lt;br /&gt;
       xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot;&lt;br /&gt;
       xmlns:physics=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#physics&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/roomba.xacro&amp;quot; /&amp;gt;		&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/estructura-myrabot.xacro&amp;quot; /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/kinect.xacro&amp;quot; /&amp;gt;	&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;include filename=&amp;quot;$(find brazo_fer_modelo)/urdf/brazo.xacro&amp;quot; /&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/webcam.xacro&amp;quot; /&amp;gt;		&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;roomba /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;estructura_myrabot parent=&amp;quot;base_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 1.57&amp;quot; xyz=&amp;quot;0.135 -0.135 0.063&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/estructura_myrabot&amp;gt; &lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;kinect parent=&amp;quot;e_base_kinect_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 -1.57&amp;quot; xyz=&amp;quot;0.135 0.090 0.112&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/kinect&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;brazo parent=&amp;quot;e_base_brazo_1_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 3.1416&amp;quot; xyz=&amp;quot;0.135 0.0335 0.075&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/brazo&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;webcam parent=&amp;quot;e_monitor_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.185/2}&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/webcam&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;1&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 1.57&amp;quot; xyz=&amp;quot;0.135 0.135 0.02&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;	&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;2&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 2.36&amp;quot; xyz=&amp;quot;0.135 0.135 0.02&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;3&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 3.14&amp;quot; xyz=&amp;quot;0.135 0.135 0.02&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;	&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;4&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 3.93&amp;quot; xyz=&amp;quot;0.135 0.135 0.02&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;5&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 4.71&amp;quot; xyz=&amp;quot;0.135 0.135 0.02&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;		&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Display of the model in rviz==&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;myrabot_rviz.launch&amp;quot; within the folder &amp;quot;launch&amp;quot; of our ''package'' with the content that is shown below, in order to test in [http://wiki.ros.org/rviz rviz] the correct assembly of the model and the correct performance of the joints.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;param name=&amp;quot;robot_description&amp;quot; command=&amp;quot;$(find xacro)/xacro.py '$(find myrabot_fer_modelo)/urdf/myrabot.urdf.xacro'&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;node name=&amp;quot;joint_state_publisher&amp;quot; pkg=&amp;quot;joint_state_publisher&amp;quot; type=&amp;quot;joint_state_publisher&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;param name=&amp;quot;use_gui&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;node name=&amp;quot;robot_state_publisher&amp;quot; pkg=&amp;quot;robot_state_publisher&amp;quot; type=&amp;quot;state_publisher&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;node name=&amp;quot;rviz&amp;quot; pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start the ''launcher'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_fer_modelo myrabot_rviz.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ''launcher'' starts [http://wiki.ros.org/rviz rviz] and the [http://en.wikipedia.org/wiki/Graphical_user_interface GUI] of [http://wiki.ros.org/joint_state_publisher joint_state_publisher]. We have to set in &amp;quot;Global Options&amp;quot; the field &amp;quot;Fixed Frame&amp;quot; to &amp;quot;/base_footprint&amp;quot; ''link''. We can change the position of the joints using the sliders of the [http://en.wikipedia.org/wiki/Graphical_user_interface GUI] of [http://wiki.ros.org/joint_state_publisher joint_state_publisher]. We must obtain something similar to the following: &lt;br /&gt;
&lt;br /&gt;
[[file:modelo_MYRAbot_rviz.png|thumb|500px|center|MYRAbot model in [http://wiki.ros.org/rviz rviz] and [http://wiki.ros.org/joint_state_publisher joint_state_publisher] interface]]&lt;br /&gt;
&lt;br /&gt;
=Load of the model in gazebo=&lt;br /&gt;
&lt;br /&gt;
==Using an only''topic'' for joint states==&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;remap_joint_states.cpp&amp;quot; within the folder &amp;quot;src&amp;quot; of our ''package'' with the content that is shown below, in order to publish the joint states of the arm (brazo/joint_states) and the mobile base (joint_states) in a only ''topic'' (joint_states_myrabot):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;ros/time.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;sensor_msgs/JointState.h&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  sensor_msgs::JointState joint_states_todo;&lt;br /&gt;
  int cont_brazo = 0;&lt;br /&gt;
  int cont_roomba = 0;&lt;br /&gt;
  std::string name[9];&lt;br /&gt;
  float position[9];&lt;br /&gt;
  float velocity[9];&lt;br /&gt;
  float effort[9];&lt;br /&gt;
&lt;br /&gt;
  void brazo(const sensor_msgs::JointState&amp;amp; brazo_states)&lt;br /&gt;
  {	&lt;br /&gt;
	int tam = brazo_states.name.size();&lt;br /&gt;
	&lt;br /&gt;
	if (::cont_brazo == 0)&lt;br /&gt;
	{	&lt;br /&gt;
		for (int i = 0; i &amp;lt; tam; i++)&lt;br /&gt;
		{&lt;br /&gt;
			::name[i] = brazo_states.name[i];&lt;br /&gt;
			::position[i] = brazo_states.position[i];&lt;br /&gt;
			::velocity[i] = brazo_states.velocity[i];&lt;br /&gt;
			::effort[i] = brazo_states.effort[i];&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		::cont_brazo = 1;&lt;br /&gt;
	}		  	  	  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void roomba(const sensor_msgs::JointState&amp;amp; roomba_states)&lt;br /&gt;
  {&lt;br /&gt;
	int tam = roomba_states.name.size();&lt;br /&gt;
	&lt;br /&gt;
	if (::cont_roomba == 0)&lt;br /&gt;
	{&lt;br /&gt;
		for (int i = 0; i &amp;lt; tam; i++)&lt;br /&gt;
		{&lt;br /&gt;
			::name[i+5] = roomba_states.name[i];&lt;br /&gt;
			::position[i+5] = roomba_states.position[i];&lt;br /&gt;
			::velocity[i+5] = roomba_states.velocity[i];&lt;br /&gt;
			::effort[i+5] = roomba_states.effort[i];&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		::cont_roomba = 1;&lt;br /&gt;
	}	  	  	  &lt;br /&gt;
  }    &lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;remap_joint_states&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber joint_states_brazo_sub_= n.subscribe(&amp;quot;brazo/joint_states&amp;quot;, 1, brazo);&lt;br /&gt;
  	ros::Subscriber joint_states_roomba_sub_= n.subscribe(&amp;quot;joint_states&amp;quot;, 1, roomba);   	 &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher joint_states_pub_=n.advertise&amp;lt;sensor_msgs::JointState&amp;gt;(&amp;quot;joint_states_myrabot&amp;quot;, 1);  	 &lt;br /&gt;
  	&lt;br /&gt;
        ros::Rate loop_rate(100);&lt;br /&gt;
    &lt;br /&gt;
	ros::Time ahora;&lt;br /&gt;
    &lt;br /&gt;
	::joint_states_todo.name = std::vector&amp;lt;std::string&amp;gt;(9);&lt;br /&gt;
	::joint_states_todo.position = std::vector&amp;lt;double&amp;gt;(9);&lt;br /&gt;
	::joint_states_todo.velocity = std::vector&amp;lt;double&amp;gt;(9);&lt;br /&gt;
	::joint_states_todo.effort = std::vector&amp;lt;double&amp;gt;(9);		  	      	&lt;br /&gt;
&lt;br /&gt;
    while (ros::ok())&lt;br /&gt;
    {	&lt;br /&gt;
		&lt;br /&gt;
		if (::cont_brazo == 1 &amp;amp;&amp;amp; ::cont_roomba == 1)&lt;br /&gt;
		{	&lt;br /&gt;
			for (int i = 0; i &amp;lt; 9; i++)&lt;br /&gt;
			{&lt;br /&gt;
				::joint_states_todo.name[i] = ::name[i];&lt;br /&gt;
				::joint_states_todo.position[i] = ::position[i];&lt;br /&gt;
				::joint_states_todo.velocity[i] = ::velocity[i];&lt;br /&gt;
				::joint_states_todo.effort[i] = ::effort[i];&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			ahora = ros::Time::now();&lt;br /&gt;
			&lt;br /&gt;
			::joint_states_todo.header.stamp = ahora; 			&lt;br /&gt;
			&lt;br /&gt;
			joint_states_pub_.publish(::joint_states_todo);&lt;br /&gt;
			&lt;br /&gt;
			::cont_brazo = 0;&lt;br /&gt;
			::cont_roomba = 0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
			ros::spinOnce();&lt;br /&gt;
	&lt;br /&gt;
			loop_rate.sleep();			&lt;br /&gt;
	}   &lt;br /&gt;
   	   &lt;br /&gt;
 &lt;br /&gt;
	ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Load in gazebo==&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;myrabot_gazebo.launch&amp;quot; within the folder &amp;quot;launch&amp;quot; of our ''package'' with the content that is shown below in order to start [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] and to load the model and the controllers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;/use_sim_time&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;gazebo&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;gazebo&amp;quot; args=&amp;quot;-u $(find turtlebot_gazebo)/worlds/empty.world&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;node name=&amp;quot;gazebo_gui&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;gui&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;group ns=&amp;quot;brazo&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;param name=&amp;quot;robot_description&amp;quot; command=&amp;quot;$(find xacro)/xacro.py '$(find myrabot_robot_model)/urdf/myrabot.urdf.xacro'&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_myrabot&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-urdf -param robot_description -model MYRAbot&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;rosparam file=&amp;quot;$(find myrabot_arm_model)/controller.yaml&amp;quot; command=&amp;quot;load&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_controller&amp;quot; pkg=&amp;quot;pr2_controller_manager&amp;quot; type=&amp;quot;spawner&amp;quot; args=&amp;quot;base_pos_controller arti1_pos_controller arti2_pos_controller arti3_pos_controller pinza_pos_controller base_vel_controller arti1_vel_controller arti2_vel_controller arti3_vel_controller pinza_vel_controller&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/group&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;modelo_brazo&amp;quot; pkg=&amp;quot;myrabot_arm_model&amp;quot; type=&amp;quot;modelo_brazo&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;remap_joint_states&amp;quot; pkg=&amp;quot;myrabot_robot_model&amp;quot; type=&amp;quot;remap_joint_states&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;robot_pose_ekf&amp;quot; type=&amp;quot;robot_pose_ekf&amp;quot; name=&amp;quot;robot_pose_ekf&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;freq&amp;quot; value=&amp;quot;30.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;sensor_timeout&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;publish_tf&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;odom_used&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;imu_used&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;vo_used&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;output_frame&amp;quot; value=&amp;quot;odom&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;pointcloud_throttle&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudThrottle openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;max_rate&amp;quot; value=&amp;quot;20.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud_in&amp;quot; to=&amp;quot;/camera/depth/points&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud_out&amp;quot; to=&amp;quot;cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;kinect_laser&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudToScan openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;output_frame_id&amp;quot; value=&amp;quot;/camera_depth_frame&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;min_height&amp;quot; value=&amp;quot;-0.15&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;max_height&amp;quot; value=&amp;quot;0.15&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud&amp;quot; to=&amp;quot;/cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;kinect_laser_narrow&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudToScan openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;output_frame_id&amp;quot; value=&amp;quot;/camera_depth_frame&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;min_height&amp;quot; value=&amp;quot;-0.025&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;max_height&amp;quot; value=&amp;quot;0.025&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud&amp;quot; to=&amp;quot;/cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;scan&amp;quot; to=&amp;quot;/narrow_scan&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start the ''launcher'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_fer_modelo myrabot_gazebo.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can see the MYRAbot model in vertical position placed in the point xyz=(0 0 0) of a empty world in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]. &lt;br /&gt;
&lt;br /&gt;
[[file:modelo_MYRAbot_gazebo.png|thumb|500px|center|MYRAbot model in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]]]&lt;br /&gt;
&lt;br /&gt;
==Test program (around the bullring)==&lt;br /&gt;
&lt;br /&gt;
We have made a little program to test the performance of the MYRAbot model. When we push the start button the model revolves in circle and the arm rotates from side to side in vertical position. First, we will create a new ''package'' with the necessary dependences for our programs ([[Control brazo MYRAbot (bioloid+arduino)|brazo_fer]] geometry_msgs std_msgs nav_msgs sensor_msgs image_transport roscpp). We will execute the next commands in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd ~/ros_workspace&lt;br /&gt;
roscreate-pkg myrabot_fer brazo_fer geometry_msgs std_msgs nav_msgs sensor_msgs image_transport roscpp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;vuelta_al_ruedo.cpp&amp;quot; within the folder &amp;quot;src&amp;quot; of the created ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; anclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;std_msgs/Bool.h&amp;quot;  &lt;br /&gt;
&lt;br /&gt;
  int cont = 0;&lt;br /&gt;
  int cont1= 0;&lt;br /&gt;
  int encendido = 0;&lt;br /&gt;
  brazo_fer::Servos move, on, vel;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
  void home()&lt;br /&gt;
  {&lt;br /&gt;
	if (cont1 == 0)&lt;br /&gt;
	{&lt;br /&gt;
		ros::NodeHandle n;&lt;br /&gt;
&lt;br /&gt;
		ros::Publisher move_arm_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);&lt;br /&gt;
		ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);  		&lt;br /&gt;
		ros::Publisher move_base_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1);   &lt;br /&gt;
		&lt;br /&gt;
		brazo_fer::WriteServos home;&lt;br /&gt;
		&lt;br /&gt;
		::move.base = 511;&lt;br /&gt;
		::move.arti1 = 511;&lt;br /&gt;
		::move.arti2 = 511;&lt;br /&gt;
		::move.arti3 = 511;&lt;br /&gt;
		::move.pinza = 511;&lt;br /&gt;
		&lt;br /&gt;
		::on.base = 1;&lt;br /&gt;
		::on.arti1 = 1;&lt;br /&gt;
		::on.arti2 = 1;&lt;br /&gt;
		::on.arti3 = 1;&lt;br /&gt;
		::on.pinza = 1;&lt;br /&gt;
		&lt;br /&gt;
		::vel.base = 400;&lt;br /&gt;
		::vel.arti1 = 400;&lt;br /&gt;
		::vel.arti2 = 400;&lt;br /&gt;
		::vel.arti3 = 400;&lt;br /&gt;
		::vel.pinza = 400;&lt;br /&gt;
		&lt;br /&gt;
		home.posicion = ::move;&lt;br /&gt;
		home.par = ::on;&lt;br /&gt;
		home.velocidad = ::vel;&lt;br /&gt;
		&lt;br /&gt;
		move_arm_pub_.publish(home);&lt;br /&gt;
		hand_pub_.publish(home);&lt;br /&gt;
		&lt;br /&gt;
		::cont1 = 1;&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void inicio(const std_msgs::Bool&amp;amp; inicio)&lt;br /&gt;
  {&lt;br /&gt;
	if (inicio.data == true &amp;amp;&amp;amp; ::cont == 0)&lt;br /&gt;
	{&lt;br /&gt;
		::encendido = 1;&lt;br /&gt;
		::cont = 1;&lt;br /&gt;
	}&lt;br /&gt;
	else if (inicio.data == true &amp;amp;&amp;amp; ::cont == 1)&lt;br /&gt;
	{&lt;br /&gt;
		::encendido = 0;&lt;br /&gt;
		::cont = 0;&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void posicion(const brazo_fer::ReadServos&amp;amp; posicion)&lt;br /&gt;
  {&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
&lt;br /&gt;
  	ros::Publisher move_arm_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);&lt;br /&gt;
  	ros::Publisher move_base_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1);    	 	&lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::Servos p = posicion.posicion;&lt;br /&gt;
	brazo_fer::WriteServos mover_brazo;&lt;br /&gt;
	&lt;br /&gt;
	home();&lt;br /&gt;
	&lt;br /&gt;
	if (::encendido == 1)&lt;br /&gt;
	{	&lt;br /&gt;
		geometry_msgs::Twist mover_base;&lt;br /&gt;
		&lt;br /&gt;
		mover_base.linear.x = 0.1;&lt;br /&gt;
		mover_base.angular.z = 0.3;&lt;br /&gt;
		&lt;br /&gt;
		move_base_pub_.publish(mover_base);		&lt;br /&gt;
		&lt;br /&gt;
		if (::cont1 ==  1)&lt;br /&gt;
		{&lt;br /&gt;
			::move.base = 718;&lt;br /&gt;
			::cont1 = 2;&lt;br /&gt;
			mover_brazo.posicion = ::move;&lt;br /&gt;
			mover_brazo.par = ::on;&lt;br /&gt;
			mover_brazo.velocidad = ::vel;&lt;br /&gt;
			move_arm_pub_.publish(mover_brazo);&lt;br /&gt;
		}&lt;br /&gt;
		else if ((p.base-110) &amp;lt; ::move.base &amp;amp;&amp;amp; ::move.base &amp;lt; (p.base+110))		&lt;br /&gt;
		{&lt;br /&gt;
			if (::cont1 ==  2)&lt;br /&gt;
			{&lt;br /&gt;
				::move.base = 304;&lt;br /&gt;
				::cont1 = 3;&lt;br /&gt;
				mover_brazo.posicion = ::move;&lt;br /&gt;
				mover_brazo.par = ::on;&lt;br /&gt;
				mover_brazo.velocidad = ::vel;&lt;br /&gt;
				move_arm_pub_.publish(mover_brazo);				&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				::cont1 = 1;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;vuelta_al_ruedo&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber pose_sub_= n.subscribe(&amp;quot;pose_arm&amp;quot;, 1, posicion); &lt;br /&gt;
  	ros::Subscriber button_sub_= n.subscribe(&amp;quot;start_button&amp;quot;, 1, inicio); &lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_arm_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);&lt;br /&gt;
  	ros::Publisher move_base_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1);  	 	   &lt;br /&gt;
 &lt;br /&gt;
	ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
We have to add the next line to the file &amp;quot;CMakeLists.txt&amp;quot; of our ''package'' in order to compile and create the executable file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosbuild_add_executable(vuelta_al_ruedo src/vuelta_al_ruedo.cpp)&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
We will execute the next commands in a terminal in order to compile and create the executable file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
roscd myrabot_fer&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to launch [http://wiki.ros.org/simulator_gazebo gazebo] with the robot model:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_fer_modelo myrabot_gazebo.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a new terminal in order to launch the test program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun myrabot_fer vuelta_al_ruedo&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We start the program publishing &amp;quot;true&amp;quot; value in the ''topic'' &amp;quot;start_button&amp;quot;. We will execute the next command in a new terminal in order to simulate the start button of the real robot:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub start_button std_msgs/Bool '{data: true}' --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The robot model will start to revolve in circle and the arm to rotate from side to side in vertical position. We can see this in the next video:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;IY63zJgQYGI&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=IY63zJgQYGI Watch in YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Execution of the program (between the beer and the cola, the platform) choose=&lt;br /&gt;
&lt;br /&gt;
We need to create the objects' models (cans and table) in order to execute the program [[Objects recognition and position calculation (webcam)#To point objects (Choose)|Choose]] in the [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] simulator using the MYRAbot model.&lt;br /&gt;
&lt;br /&gt;
==Creation of the objects' models==&lt;br /&gt;
&lt;br /&gt;
First, we will create a new ''package'' with the necessary dependences for our programs (geometry_msgs gazebo urdf roscpp). We will execute the next commands in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd ~/ros_workspace&lt;br /&gt;
roscreate-pkg objetos_fer_modelos geometry_msgs gazebo urdf roscpp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Table===&lt;br /&gt;
&lt;br /&gt;
We have crated a table with the dimensions 200x75x74 cm (length x width x height). We will create a file named &amp;quot;mesa.xacro&amp;quot; within the folder &amp;quot;urdf&amp;quot; of the created ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot name=&amp;quot;mesa&amp;quot; xmlns:xacro=&amp;quot;http://www.ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;world&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;mesa&amp;quot; type=&amp;quot;floating&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;world&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;mesa_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;mesa_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;visual&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;box size=&amp;quot;2 0.75 0.03&amp;quot; /&amp;gt; &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${(0.03/2)+0.71}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;${205/255} ${133/255} ${63/255} 1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;/visual&amp;gt;&lt;br /&gt;
  &amp;lt;collision&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${(0.03/2)+0.71}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;box size=&amp;quot;2 0.75 0.03&amp;quot; /&amp;gt; &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
  &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;inertial&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${(0.03/2)+0.71}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mass value=&amp;quot;5&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.1&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.1&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.1&amp;quot;/&amp;gt;  &lt;br /&gt;
  &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;pata&amp;quot; params=&amp;quot;id refx refy&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint name=&amp;quot;pata_${id}&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;mesa_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;pata_${id}_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;${refx*((2/2)-0.045)} ${refy*((0.75/2)-0.045)} 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;pata_${id}_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;visual&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.025&amp;quot; length=&amp;quot;0.71&amp;quot; /&amp;gt;    &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.71/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;material name=&amp;quot;black&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;color rgba=&amp;quot;0 0 0 1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;/visual&amp;gt;&lt;br /&gt;
  &amp;lt;collision&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.71/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.025&amp;quot; length=&amp;quot;0.71&amp;quot; /&amp;gt; &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
  &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;inertial&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.71/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mass value=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.1&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.1&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.1&amp;quot;/&amp;gt;  &lt;br /&gt;
  &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&amp;lt;/link&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:pata id=&amp;quot;1&amp;quot; refx=&amp;quot;1&amp;quot; refy=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;xacro:pata id=&amp;quot;2&amp;quot; refx=&amp;quot;1&amp;quot; refy=&amp;quot;-1&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;xacro:pata id=&amp;quot;3&amp;quot; refx=&amp;quot;-1&amp;quot; refy=&amp;quot;-1&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;xacro:pata id=&amp;quot;4&amp;quot; refx=&amp;quot;-1&amp;quot; refy=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;mesa_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;Gazebo/LightWood&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;10&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;10&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;gazebo_pata&amp;quot; params=&amp;quot;id&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;pata_${id}_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;PR2/Black&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;0.9&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;0.9&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:gazebo_pata id=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;xacro:gazebo_pata id=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;xacro:gazebo_pata id=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;xacro:gazebo_pata id=&amp;quot;4&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:modelo_mesa.png|thumb|200px|center|Table model in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]]]&lt;br /&gt;
&lt;br /&gt;
We have used the default materials included in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] for the table, but we need create new materials with texture for the labels of the cans.&lt;br /&gt;
&lt;br /&gt;
===Creation of new materials for gazebo===&lt;br /&gt;
&lt;br /&gt;
First, we have to add the next lines within the file &amp;quot;manifest.xml&amp;quot; of the created ''package'' in order to add the ''package'' path to the [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] path:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;export&amp;gt;&lt;br /&gt;
     &amp;lt;gazebo gazebo_media_path=&amp;quot;${prefix}&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/export&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] uses the graphics engine [http://www.ogre3d.org/ OGRE]. We will create a file named &amp;quot;myrabot_fer.material&amp;quot; within the objects ''package'' in the relative path &amp;quot;Media/materials/scripts/&amp;quot; with the content that is shown below in order to define a new material with texture:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
material material_fer/NEW_MATERIAL_NAME&lt;br /&gt;
{&lt;br /&gt;
	technique&lt;br /&gt;
	{&lt;br /&gt;
		pass&lt;br /&gt;
		{&lt;br /&gt;
                        lighting off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                        ambient 1 1 1 1&lt;br /&gt;
			diffuse 1 1 1 1&lt;br /&gt;
			specular 0 0 0 0&lt;br /&gt;
			emissive 0 0 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			alpha_rejection greater 128&lt;br /&gt;
			depth_write on&lt;br /&gt;
&lt;br /&gt;
			texture_unit&lt;br /&gt;
			{&lt;br /&gt;
				texture OUR_IMAGE_FILE&lt;br /&gt;
				tex_coord_set 0&lt;br /&gt;
				colour_op modulate&lt;br /&gt;
				rotate 180&lt;br /&gt;
				scale 1 1&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The image file must be in the relative path &amp;quot;Media/materials/textures/&amp;quot; within the objects ''package''.&lt;br /&gt;
&lt;br /&gt;
===Cans===&lt;br /&gt;
&lt;br /&gt;
====Can of beer====&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;lata_cerveza.xacro&amp;quot; within the folder &amp;quot;urdf&amp;quot; of the objects ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot name=&amp;quot;lata_cerveza&amp;quot; xmlns:xacro=&amp;quot;http://www.ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;world&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;lata&amp;quot; type=&amp;quot;floating&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;world&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;lata_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;lata_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;visual&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.1115&amp;quot; /&amp;gt;    &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${(0.1115/2)+0.007}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;material name=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;color rgba=&amp;quot;1 0 0 1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;/visual&amp;gt;&lt;br /&gt;
  &amp;lt;collision&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${(0.1115/2)+0.007}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.1115&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
  &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;inertial&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${(0.1115/2)+0.007}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot;/&amp;gt;  &lt;br /&gt;
  &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;lata_top&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;lata_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;lata_top_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0.1185&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;lata_top_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;visual&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.0015&amp;quot; /&amp;gt;    &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.0015/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;material name=&amp;quot;grey&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;color rgba=&amp;quot;0.8 0.8 0.8 1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;/visual&amp;gt;&lt;br /&gt;
  &amp;lt;collision&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.0015/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.0015&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
  &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;inertial&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.0015/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.0001&amp;quot;/&amp;gt;  &lt;br /&gt;
  &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;lata_bottom&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;lata_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;lata_bottom_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;lata_bottom_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;visual&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.007&amp;quot; /&amp;gt;    &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.007/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;material name=&amp;quot;grey&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;color rgba=&amp;quot;0.8 0.8 0.8 1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;/visual&amp;gt;&lt;br /&gt;
  &amp;lt;collision&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.007/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.007&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
  &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;inertial&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.007/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.0001&amp;quot;/&amp;gt;  &lt;br /&gt;
  &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;lata_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;material_fer/Amstel&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;100&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;100&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;lata_top_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;PR2/Grey0&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;100&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;100&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;lata_bottom_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;PR2/Grey0&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;100&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;100&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to add the next lines within the file &amp;quot;myrabot_fer.material&amp;quot; in order to add the new material named &amp;quot;Amstel&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
material material_fer/Amstel&lt;br /&gt;
{&lt;br /&gt;
	technique&lt;br /&gt;
	{&lt;br /&gt;
		pass&lt;br /&gt;
		{&lt;br /&gt;
                        lighting off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                        ambient 1 1 1 1&lt;br /&gt;
			diffuse 1 1 1 1&lt;br /&gt;
			specular 0 0 0 0&lt;br /&gt;
			emissive 0 0 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			alpha_rejection greater 128&lt;br /&gt;
			depth_write on&lt;br /&gt;
&lt;br /&gt;
			texture_unit&lt;br /&gt;
			{&lt;br /&gt;
				texture amstel.png&lt;br /&gt;
				tex_coord_set 0&lt;br /&gt;
				colour_op modulate&lt;br /&gt;
				rotate 180&lt;br /&gt;
				scale 1 1&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As follows, we can see the image file used for the texture and a screenshot of the can model in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]:&lt;br /&gt;
&lt;br /&gt;
[[file:amstel.png|thumb|200px|center|Texture of the Can of beer]]&lt;br /&gt;
&lt;br /&gt;
[[file:modelo_lata_cerveza.png|thumb|200px|center|Can of beer in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Can of cola====&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;lata_cola.xacro&amp;quot; within the folder &amp;quot;urdf&amp;quot; of the objects ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot name=&amp;quot;lata_cola&amp;quot; xmlns:xacro=&amp;quot;http://www.ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;world&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;lata&amp;quot; type=&amp;quot;floating&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;world&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;lata_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;lata_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;visual&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.1115&amp;quot; /&amp;gt;    &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${(0.1115/2)+0.007}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;material name=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;color rgba=&amp;quot;1 0 0 1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;/visual&amp;gt;&lt;br /&gt;
  &amp;lt;collision&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${(0.1115/2)+0.007}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.1115&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
  &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;inertial&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${(0.1115/2)+0.007}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot;/&amp;gt;  &lt;br /&gt;
  &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;lata_top&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;lata_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;lata_top_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0.1185&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;lata_top_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;visual&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.0015&amp;quot; /&amp;gt;    &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.0015/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;material name=&amp;quot;grey&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;color rgba=&amp;quot;0.8 0.8 0.8 1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;/visual&amp;gt;&lt;br /&gt;
  &amp;lt;collision&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.0015/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.0015&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
  &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;inertial&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.0015/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.0001&amp;quot;/&amp;gt;  &lt;br /&gt;
  &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;lata_bottom&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;lata_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;lata_bottom_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;lata_bottom_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;visual&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.007&amp;quot; /&amp;gt;    &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.007/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;material name=&amp;quot;grey&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;color rgba=&amp;quot;0.8 0.8 0.8 1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;/visual&amp;gt;&lt;br /&gt;
  &amp;lt;collision&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.007/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.007&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
  &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;inertial&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.007/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.0001&amp;quot;/&amp;gt;  &lt;br /&gt;
  &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;lata_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;material_fer/CocaCola&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;10&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;10&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;lata_top_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;PR2/Grey0&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;10&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;10&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;lata_bottom_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;PR2/Grey0&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;10&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;10&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to add the next lines within the file &amp;quot;myrabot_fer.material&amp;quot; in order to add the new material named &amp;quot;CocaCola&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
material Gazebo/CocaCola&lt;br /&gt;
{&lt;br /&gt;
	technique&lt;br /&gt;
	{&lt;br /&gt;
		pass&lt;br /&gt;
		{&lt;br /&gt;
                        lighting off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                        ambient 1 1 1 1&lt;br /&gt;
			diffuse 1 1 1 1&lt;br /&gt;
			specular 0 0 0 0&lt;br /&gt;
			emissive 0 0 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			alpha_rejection greater 128&lt;br /&gt;
			depth_write on&lt;br /&gt;
&lt;br /&gt;
			texture_unit&lt;br /&gt;
			{&lt;br /&gt;
				texture coca_cola.png&lt;br /&gt;
				tex_coord_set 0&lt;br /&gt;
				colour_op modulate&lt;br /&gt;
				rotate 180&lt;br /&gt;
				scale 1 1&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As follows, we can see the image file used for the texture and a screenshot of the can model in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]:&lt;br /&gt;
&lt;br /&gt;
[[file:coca_cola.png|thumb|200px|center|Texture of the can of cola]]&lt;br /&gt;
&lt;br /&gt;
[[file:modelo_lata_cola.png|thumb|200px|center|Can of cola in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Note''': We have to convert the .xacro files into .urdf in order to load the models in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]. We will execute the next commands in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
roscd objetos_fer_modelos&lt;br /&gt;
cd urdf&lt;br /&gt;
rosrun xacro xacro.py OBJECT_NAME.xacro &amp;gt; OBJECT_NAME.urdf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Execution==&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;myrabot_latas.launch&amp;quot; within the &amp;quot;myrabot_fer&amp;quot; ''package'' with the content that is shown below in order to load the models of the objects and the robot in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;/use_sim_time&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;gazebo&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;gazebo&amp;quot; args=&amp;quot;$(find gazebo_worlds)/worlds/empty.world&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_mesa&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find objetos_fer_modelos)/urdf/mesa.urdf -urdf -x 0.55 -y 0 -z 0 -Y -1.57 -model mesa&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;    &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_lata_coca_cola&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find objetos_fer_modelos)/urdf/lata_cola.urdf -urdf -x 0.38 -y -0.18 -z 0.74 -Y -1.57 -model lata_cocacola&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_lata_amstel&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find objetos_fer_modelos)/urdf/lata_cerveza.urdf -urdf -x 0.38 -y 0.17 -z 0.74 -Y -1.57 -model lata_amstel&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find myrabot_fer_modelo)/launch/myrabot_gazebo.launch&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute in a terminal the next commad in order to launch [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] with the robot model and the objects:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_fer myrabot_latas.launch&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
We will execute in a new terminal the next command in order to start the program [[Objects recognition and position calculation (webcam)#To point objects (Choose)|Choose]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer escoja.launch&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to publish the identifier of the selected object in the ''topic'' &amp;quot;selected_object&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub selected_object std_msgs/Int16 1 --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The arm points the selected object and after a time the arm returns to the home position. We can see this in the next video:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;lp2FUFlsFV4&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=lp2FUFlsFV4 Watch in YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Execution of the program tracking objects=&lt;br /&gt;
&lt;br /&gt;
==Program to move objects in gazebo using the keyboard==&lt;br /&gt;
&lt;br /&gt;
We will create a new file named &amp;quot;mover_objetos.cpp&amp;quot; within the folder &amp;quot;src&amp;quot; of the objects ''package'' with yhe content that is shown below, in order to move an object model (the default object model is Lata_amstel) in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] publishing its position in the ''topic'' &amp;quot;gazebo/set_model_state&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;gazebo/ModelState.h&amp;quot;&lt;br /&gt;
  #include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;termios.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  #define PI 3.14159265&lt;br /&gt;
  #define L1 104&lt;br /&gt;
  #define L2 104&lt;br /&gt;
  #define Lp 60&lt;br /&gt;
  &lt;br /&gt;
  #define KEYCODE_Xmas 0x43 &lt;br /&gt;
  #define KEYCODE_Xmenos 0x44&lt;br /&gt;
  #define KEYCODE_Ymas 0x41&lt;br /&gt;
  #define KEYCODE_Ymenos 0x42&lt;br /&gt;
  #define KEYCODE_Zmas 0x77&lt;br /&gt;
  #define KEYCODE_Zmenos 0x73&lt;br /&gt;
  #define KEYCODE_XgiroMas 0x61&lt;br /&gt;
  #define KEYCODE_XgiroMenos 0x64&lt;br /&gt;
  #define KEYCODE_YgiroMas 0x65&lt;br /&gt;
  #define KEYCODE_YgiroMenos 0x71  &lt;br /&gt;
  &lt;br /&gt;
struct termios cooked, raw; &lt;br /&gt;
&lt;br /&gt;
int cont = 0;&lt;br /&gt;
&lt;br /&gt;
double retardo = 0.1;&lt;br /&gt;
&lt;br /&gt;
gazebo::ModelState objeto;  &lt;br /&gt;
 &lt;br /&gt;
void quit(int sig)&lt;br /&gt;
{&lt;br /&gt;
  tcsetattr(0, TCSANOW, &amp;amp;cooked);&lt;br /&gt;
  ros::shutdown();&lt;br /&gt;
  exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void callback(const ros::TimerEvent&amp;amp;)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;   	&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher object_pub_=n.advertise&amp;lt;gazebo::ModelState&amp;gt;(&amp;quot;gazebo/set_model_state&amp;quot;, 1);&lt;br /&gt;
&lt;br /&gt;
        std::string modelo_objeto;&lt;br /&gt;
&lt;br /&gt;
        ros::NodeHandle nh(&amp;quot;~&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        nh.param(&amp;quot;modelo_objeto&amp;quot;, modelo_objeto, std::string(&amp;quot;Lata_amstel&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	ros::Time anterior;&lt;br /&gt;
&lt;br /&gt;
	if (::cont == 0)&lt;br /&gt;
        {&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		&lt;br /&gt;
		::objeto.model_name = modelo_objeto;&lt;br /&gt;
  &lt;br /&gt;
		::objeto.reference_frame = &amp;quot;world&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		::objeto.pose.position.x = 0;&lt;br /&gt;
		&lt;br /&gt;
		::objeto.pose.position.y = 0.5;&lt;br /&gt;
		&lt;br /&gt;
		::objeto.pose.position.z = 0.74;&lt;br /&gt;
		&lt;br /&gt;
		::objeto.pose.orientation.x = 0;&lt;br /&gt;
		&lt;br /&gt;
		::objeto.pose.orientation.y = 0;&lt;br /&gt;
		&lt;br /&gt;
		::objeto.pose.orientation.z = 0;&lt;br /&gt;
		&lt;br /&gt;
		::objeto.pose.orientation.w = 1;												 &lt;br /&gt;
		&lt;br /&gt;
		::cont = 1;&lt;br /&gt;
&lt;br /&gt;
		object_pub_.publish(::objeto);		&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
  char c;&lt;br /&gt;
&lt;br /&gt;
  // get the console in raw mode                                                              &lt;br /&gt;
  tcgetattr(0, &amp;amp;cooked);&lt;br /&gt;
  memcpy(&amp;amp;raw, &amp;amp;cooked, sizeof(struct termios));&lt;br /&gt;
  raw.c_lflag &amp;amp;=~ (ICANON | ECHO);&lt;br /&gt;
  // Setting a new line, then end of file                         &lt;br /&gt;
  raw.c_cc[VEOL] = 1;&lt;br /&gt;
  raw.c_cc[VEOF] = 2;&lt;br /&gt;
  tcsetattr(0, TCSANOW, &amp;amp;raw);&lt;br /&gt;
&lt;br /&gt;
  puts(&amp;quot;&amp;quot;); &lt;br /&gt;
  puts(&amp;quot;#####################################################&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;                   CONTROLES OBJETO&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;#####################################################&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;&amp;quot;);  &lt;br /&gt;
  puts(&amp;quot;Up arrow:_______________________ Move up object&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Down arrow:_____________________ Move down object&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Left arrow:_____________________ Move left object&amp;quot;); &lt;br /&gt;
  puts(&amp;quot;Right arrow:____________________ Move right object&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;W key:__________________________ Move forward object&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;S key:__________________________ Move backward object&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;A key:__________________________ Tilt + x axis object&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;D key:__________________________ Tilt - x axis object&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Q key:__________________________ Tilt + y axis object&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;E key:__________________________ Tilt - y axis object&amp;quot;);                               &lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
    while (ros::ok())&lt;br /&gt;
    {&lt;br /&gt;
		&lt;br /&gt;
			&lt;br /&gt;
    // get the next event from the keyboard  &lt;br /&gt;
    if(read(0, &amp;amp;c, 1) &amp;lt; 0)&lt;br /&gt;
    {&lt;br /&gt;
      perror(&amp;quot;read():&amp;quot;);&lt;br /&gt;
      exit(-1);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
      if (c == KEYCODE_Xmas)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.position.x = ::objeto.pose.position.x + 0.005;&lt;br /&gt;
			&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}		&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Xmenos)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.position.x = ::objeto.pose.position.x - 0.005;&lt;br /&gt;
&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}				&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Ymas)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.position.z = ::objeto.pose.position.z + 0.005;&lt;br /&gt;
			&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}					    &lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Ymenos)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.position.z = ::objeto.pose.position.z - 0.005;&lt;br /&gt;
			&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}						&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Zmas)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.position.y = ::objeto.pose.position.y + 0.005;&lt;br /&gt;
			&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}					&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Zmenos)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.position.y = ::objeto.pose.position.y - 0.005;&lt;br /&gt;
			&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}				&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_XgiroMas)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.orientation.x = ::objeto.pose.orientation.x + 0.1;&lt;br /&gt;
			&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}	&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_XgiroMenos)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.orientation.x = ::objeto.pose.orientation.x - 0.1;&lt;br /&gt;
			&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}	&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_YgiroMas)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.orientation.y = ::objeto.pose.orientation.y + 0.1;&lt;br /&gt;
			&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}	&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_YgiroMenos)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.orientation.y = ::objeto.pose.orientation.y - 0.1;&lt;br /&gt;
&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}	&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      object_pub_.publish(::objeto);&lt;br /&gt;
&lt;br /&gt;
	}	&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;mover_objetos&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher object_pub_=n.advertise&amp;lt;gazebo::ModelState&amp;gt;(&amp;quot;gazebo/set_model_state&amp;quot;, 1);    	 	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	signal(SIGINT,quit); &lt;br /&gt;
	&lt;br /&gt;
	ros::Timer timer = n.createTimer(ros::Duration(1), callback);&lt;br /&gt;
    &lt;br /&gt;
   	   &lt;br /&gt;
 &lt;br /&gt;
	ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to add the next line at the end of the file &amp;quot;CMakeLists.txt&amp;quot; of the objects ''package'' in order to compile the program and make the executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosbuild_add_executable(mover_objetos src/mover_objetos.cpp)&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
We will execute the nest commands in a terminal in order to compile the program and make the executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
roscd objetos_fer_modelos&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Execution==&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;myrabot_lata.launch&amp;quot; within the folder &amp;quot;launch&amp;quot; of the &amp;quot;myrabot_fer&amp;quot; ''package'' with the content that is shown below, in order to load the models in the corrects positions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;/use_sim_time&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;gazebo&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;gazebo&amp;quot; args=&amp;quot;$(find gazebo_worlds)/worlds/empty.world&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_mesa&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find objetos_fer_modelos)/urdf/mesa.urdf -urdf -x 0.55 -y 0 -z 0 -Y -1.57 -model mesa&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_lata_amstel&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find objetos_fer_modelos)/urdf/lata_cerveza.urdf -urdf -x 0.5 -y 0 -z 0.74 -Y -1.57 -model lata_amstel&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find myrabot_fer_modelo)/launch/myrabot_gazebo.launch&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start the launcher:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_fer myrabot_lata.launch&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a new terminal in order to launch the [[Objects recognition and position calculation (webcam)#Tracking objects|tracking objects]] program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer seguir.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a new terminal in order to publish the object to tracking in the ''topic'' &amp;quot;selected_object&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub selected_object std_msgs/Int16 1 --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a new terminal in order to launch the &amp;quot;mover_objetos&amp;quot; program with the parameter &amp;quot;modelo_objeto&amp;quot; equal to &amp;quot;lata_amstel&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun objetos_fer_modelos mover_objetos _modelo_objeto:=lata_amstel&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The arm follows the selected object. We can see this in the next video:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;kLfgfHo8OnI&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=kLfgfHo8OnI Watch in YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=MYRAbot%27s_arm_model_for_simulation_(urdf%2bgazebo)&amp;diff=4216</id>
		<title>MYRAbot's arm model for simulation (urdf+gazebo)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=MYRAbot%27s_arm_model_for_simulation_(urdf%2bgazebo)&amp;diff=4216"/>
				<updated>2014-09-29T11:08:51Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Creation of URDF model=&lt;br /&gt;
&lt;br /&gt;
[http://wiki.ros.org/urdf/Tutorials URDF] (Unified Robot Description Format) is the format used to define the model of the [[MYRAbot's arm control (bioloid+arduino)|arm]] ([http://es.wikipedia.org/wiki/Extensible_Markup_Language xml]) in order to simulate it in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]. It consists of a tree of geometrical elements (''links'') plugged through joints(''joints''). This joints can be fixed or mobile, the mobile joints can be rotating, linear or floating.&lt;br /&gt;
&lt;br /&gt;
First, we will create a new ''package'' with the necessary dependences for our programs (urdf [[Control brazo MYRAbot (bioloid+arduino)|brazo_fer]] std_msgs sensor_msgs tf roscpp). We will execute the next commands in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd ~/ros_workspace&lt;br /&gt;
roscreate-pkg brazo_fer_modelo urdf brazo_fer std_msgs sensor_msgs tf roscpp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have divided the model in three files, main file, ''macros'' file and placement file. For the main file, we will create a file named &amp;quot;brazo.xacro&amp;quot; within the folder &amp;quot;urdf&amp;quot; of the created ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;include filename=&amp;quot;$(find brazo_fer_modelo)/urdf/brazo-macros.xacro&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;brazo&amp;quot; params=&amp;quot;parent *origin&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;fixed&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;base_brazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 0 1&amp;quot; /&amp;gt;  &lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;link name=&amp;quot;base_brazo_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.032 0.05 0.04&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 -0.0135 0.020&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;black&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;color rgba=&amp;quot;0 0 0 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 -0.0135 0.020&amp;quot;/&amp;gt;		&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.032 0.05 0.04&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 -0.0135 0.020&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.055&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia_servos /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;       &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;base&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_brazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;hombro_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0.04&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 0 1&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;default_limit /&amp;gt;&lt;br /&gt;
	&amp;lt;default_dynamics /&amp;gt;          &lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;hombro_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.04 0.032 0.05&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.025&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;black&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.025&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.04 0.032 0.05&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;       &lt;br /&gt;
    &amp;lt;/collision&amp;gt; &lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.025&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.055&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia_servos /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;        &lt;br /&gt;
  &amp;lt;/link&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;arti1&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;hombro_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;brazo_link&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0.0385&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;default_limit /&amp;gt;&lt;br /&gt;
	&amp;lt;default_dynamics /&amp;gt;        &lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;!--Brazo--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;servo nombre=&amp;quot;brazo&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti1_B&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;brazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;brazo_link_B&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;base nombre=&amp;quot;brazo&amp;quot; /&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti1_D&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;brazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;brazo_link_SI&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;soporte nombre=&amp;quot;brazo&amp;quot; simetrico=&amp;quot;1&amp;quot; lado=&amp;quot;I&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti1_I&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;brazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;brazo_link_SD&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;soporte nombre=&amp;quot;brazo&amp;quot; simetrico=&amp;quot;-1&amp;quot; lado=&amp;quot;D&amp;quot; /&amp;gt;     &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;arti2&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;brazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;antebrazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0.104&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;default_limit /&amp;gt;&lt;br /&gt;
	&amp;lt;default_dynamics /&amp;gt;            &lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;!--Antebrazo--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;servo nombre=&amp;quot;antebrazo&amp;quot; /&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti2_B&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;antebrazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;antebrazo_link_B&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;base nombre=&amp;quot;antebrazo&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti2_D&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;antebrazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;antebrazo_link_SI&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;soporte nombre=&amp;quot;antebrazo&amp;quot; simetrico=&amp;quot;1&amp;quot; lado=&amp;quot;I&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti2_I&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;antebrazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;antebrazo_link_SD&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;soporte nombre=&amp;quot;antebrazo&amp;quot; simetrico=&amp;quot;-1&amp;quot; lado=&amp;quot;D&amp;quot; /&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;arti3&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;antebrazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;muneca_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0.104&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;default_limit /&amp;gt;&lt;br /&gt;
	&amp;lt;default_dynamics /&amp;gt;             &lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;!--Muñeca--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;muneca_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.05 0.04 0.032&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.00625 0 0.06&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;black&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.00625 0 0.06&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.05 0.04 0.032&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.00625 0 0.06&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.055&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia_servos /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;            &lt;br /&gt;
  &amp;lt;/link&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti3_B&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;muneca_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;muneca_link_B&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;muneca_link_B&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.05325 0.04 0.005&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.004625 0 0.0415&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.004625 0 0.0415&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.05325 0.04 0.005&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.004625 0 0.0415&amp;quot;/&amp;gt;		&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.0005&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;              &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti3_D&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;muneca_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;muneca_link_SI&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;muneca_link_SI&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.032 0.0555&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.021 0 0.01625&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.021 0 0.01625&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.032 0.0555&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.021 0 0.01625&amp;quot;/&amp;gt;		&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.0005&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;           &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti3_I&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;muneca_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;muneca_link_SD&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;muneca_link_SD&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.032 0.0555&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.021 0 0.01625&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.021 0 0.01625&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.032 0.0555&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.021 0 0.01625&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.0005&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;            &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti3_P&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;muneca_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;muneca_link_P&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Pinza fija--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;muneca_link_P&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.04 0.092&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.03425 0 0.090&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.03425 0 0.090&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.04 0.092&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.03425 0 0.090&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;           &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti3_PS&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;muneca_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;muneca_link_PS&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;muneca_link_PS&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.04 0.037&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.03225 0 0.0575&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.03225 0 0.0575&amp;quot;/&amp;gt;	&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.04 0.037&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.03225 0 0.0575&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.0005&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;            &lt;br /&gt;
  &amp;lt;/link&amp;gt;             &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;pinza&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;muneca_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;pinza_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;-0.00725 0 0.06&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;default_limit /&amp;gt;&lt;br /&gt;
	&amp;lt;default_dynamics /&amp;gt;     &lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;!--Pinza móvil--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;pinza_link&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.04 0.092&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.027 0 0.030&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.027 0 0.030&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.04 0.092&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.027 0 0.030&amp;quot;/&amp;gt;		&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
 	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;           &lt;br /&gt;
  &amp;lt;/link&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_pinza_B&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;pinza_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;pinza_link_B&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;pinza_link_B&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.04 0.032&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.025 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.025 0 0&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.04 0.032&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.025 0 0&amp;quot;/&amp;gt;		&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.0005&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;           &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_pinza_D&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;pinza_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;pinza_link_SI&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;pinza_link_SI&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.0375 0.002 0.032&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.00725 0.021 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.00725 0.021 0&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.0375 0.002 0.032&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.00725 0.021 0&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.0005&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;        &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_pinza_I&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;pinza_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;pinza_link_SD&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;pinza_link_SD&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.0375 0.002 0.032&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.00725 -0.021 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.00725 -0.021 0&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.0375 0.002 0.032&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.00725 -0.021 0&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.0005&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;            &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
     &lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the ''macros'' file, we will create a file named &amp;quot;brazo-macros.xacro&amp;quot; within the folder &amp;quot;src&amp;quot; of our ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;default_inertia&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;default_inertia_servos&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.01&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.01&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;default_limit&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;limit effort=&amp;quot;100.0&amp;quot; lower=&amp;quot;-2.62&amp;quot; upper=&amp;quot;2.62&amp;quot; velocity=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;default_dynamics&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;dynamics fricction=&amp;quot;0&amp;quot; damping=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;servo&amp;quot; params=&amp;quot;nombre&amp;quot;&amp;gt;  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;${nombre}_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.04 0.032 0.05&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.0905&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;black&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.0905&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.04 0.032 0.05&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.0905&amp;quot;/&amp;gt;		&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.055&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia_servos /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;             &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;base&amp;quot; params=&amp;quot;nombre&amp;quot;&amp;gt;    &lt;br /&gt;
  &amp;lt;link name=&amp;quot;${nombre}_link_B&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.04 0.032 0.020&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.0555&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.0555&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.04 0.032 0.02&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.0555&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;           &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;soporte&amp;quot; params=&amp;quot;nombre simetrico lado&amp;quot;&amp;gt;    &lt;br /&gt;
  &amp;lt;link name=&amp;quot;${nombre}_link_S${lado}&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.032 0.067&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;${simetrico*0.021} 0 0.022&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;${simetrico*0.021} 0 0.022&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.032 0.067&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;${simetrico*0.021} 0 0.022&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;           &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the placement file, we will create a file named &amp;quot;brazo.urdf.xacro&amp;quot; within the folder &amp;quot;src&amp;quot; of our ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot name=&amp;quot;MYRAbot-arm&amp;quot;&lt;br /&gt;
       xmlns:xi=&amp;quot;http://www.w3.org/2001/XInclude&amp;quot;&lt;br /&gt;
       xmlns:gazebo=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#gz&amp;quot;&lt;br /&gt;
       xmlns:model=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#model&amp;quot;&lt;br /&gt;
       xmlns:sensor=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor&amp;quot;&lt;br /&gt;
       xmlns:body=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#body&amp;quot;&lt;br /&gt;
       xmlns:geom=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#geom&amp;quot;&lt;br /&gt;
       xmlns:joint=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#joint&amp;quot;&lt;br /&gt;
       xmlns:interface=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#interface&amp;quot;&lt;br /&gt;
       xmlns:rendering=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#rendering&amp;quot;&lt;br /&gt;
       xmlns:renderable=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#renderable&amp;quot;&lt;br /&gt;
       xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot;&lt;br /&gt;
       xmlns:physics=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#physics&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;include filename=&amp;quot;$(find brazo_fer_modelo)/urdf/brazo.xacro&amp;quot; /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;link name=&amp;quot;world&amp;quot; /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;brazo parent=&amp;quot;world&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/brazo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Model analysis==&lt;br /&gt;
&lt;br /&gt;
As we have used [http://wiki.ros.org/xacro xacro] in order to simplify and to make the code more editable, we will execute the next commands in a terminal in order to obtain the [http://wiki.ros.org/urdf/Tutorials URDF] file processed:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer_modelo&lt;br /&gt;
cd urdf&lt;br /&gt;
rosrun xacro xacro.py brazo.urdf.xacro &amp;gt; brazo.urdf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal to check the model:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun urdf_parser check_urdf brazo.urdf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We must obtain something similar to the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
robot name is: MYRAbot_arm&lt;br /&gt;
---------- Successfully Parsed XML ---------------&lt;br /&gt;
root Link: world has 1 child(ren)&lt;br /&gt;
    child(1):  base_link&lt;br /&gt;
        child(1):  hombro_link&lt;br /&gt;
            child(1):  brazo_link&lt;br /&gt;
                child(1):  antebrazo_link&lt;br /&gt;
                    child(1):  muneca_link&lt;br /&gt;
                        child(1):  pinza_link&lt;br /&gt;
                            child(1):  pinza_link_B&lt;br /&gt;
                            child(2):  pinza_link_SI&lt;br /&gt;
                            child(3):  pinza_link_SD&lt;br /&gt;
                        child(2):  muneca_link_B&lt;br /&gt;
                        child(3):  muneca_link_SI&lt;br /&gt;
                        child(4):  muneca_link_SD&lt;br /&gt;
                        child(5):  muneca_link_P&lt;br /&gt;
                        child(6):  muneca_link_PS&lt;br /&gt;
                    child(2):  antebrazo_link_B&lt;br /&gt;
                    child(3):  antebrazo_link_SI&lt;br /&gt;
                    child(4):  antebrazo_link_SD&lt;br /&gt;
                child(2):  brazo_link_B&lt;br /&gt;
                child(3):  brazo_link_SI&lt;br /&gt;
                child(4):  brazo_link_SD&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to see the graphic tree generated in a .pdf file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun urdf_parser urdf_to_graphiz brazo.urdf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We must obtain something similar to the following:&lt;br /&gt;
&lt;br /&gt;
[[file:modelo_brazo_MYRAbot_arbol_relaciones.jpg|thumb|500px|center|Árbol de relaciones modelo URBF para el brazo del MYRAbot]]&lt;br /&gt;
&lt;br /&gt;
=Visual test of the model=&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;brazo_rviz.launch&amp;quot; within the folder &amp;quot;launch&amp;quot; of our ''package'' with the content that is shown below in order to display the model and to check the ''joints'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;robot_description&amp;quot; command=&amp;quot;$(find xacro)/xacro.py '$(find brazo_fer_modelo)/urdf/brazo.urdf.xacro'&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;joint_state_publisher&amp;quot; pkg=&amp;quot;joint_state_publisher&amp;quot; type=&amp;quot;joint_state_publisher&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;use_gui&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;robot_state_publisher&amp;quot; pkg=&amp;quot;robot_state_publisher&amp;quot; type=&amp;quot;state_publisher&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;rviz&amp;quot; pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start the ''launcher'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer_modelo brazo_rviz.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ''launcher'' starts [http://wiki.ros.org/rviz rviz] and the [http://en.wikipedia.org/wiki/Graphical_user_interface GUI] of [http://wiki.ros.org/joint_state_publisher joint_state_publisher]. We have to set in &amp;quot;Global Options&amp;quot; the field &amp;quot;Fixed Frame&amp;quot; to &amp;quot;/world&amp;quot; ''link''. We can change the position of the joints using the sliders of the [http://en.wikipedia.org/wiki/Graphical_user_interface GUI] of [http://wiki.ros.org/joint_state_publisher joint_state_publisher]. We must obtain something similar to the following: &lt;br /&gt;
&lt;br /&gt;
[[file:modelo_brazo_MYRAbot_rviz.png|thumb|500px|center|Loaded model in [http://wiki.ros.org/rviz rviz] and the [http://en.wikipedia.org/wiki/Graphical_user_interface GUI] of [http://wiki.ros.org/joint_state_publisher joint_state_publisher]]]&lt;br /&gt;
&lt;br /&gt;
=Control of the joints for simulation=&lt;br /&gt;
&lt;br /&gt;
We have to add a controller to each mobile joint in order to simulate the servo motors [http://support.robotis.com/en/product/dynamixel/ax_series/dxl_ax_actuator.htm Dynamixel AX-12A] in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]&lt;br /&gt;
&lt;br /&gt;
==Previous steps==&lt;br /&gt;
&lt;br /&gt;
We will execute the next commands in a terminal in order to install the control ''stacks'' of the [http://wiki.ros.org/Robots/PR2 PR2] robot ([http://wiki.ros.org/pr2_simulator?distro=electric pr2_simulator], [http://wiki.ros.org/pr2_mechanism pr2_mechanism] and [http://wiki.ros.org/pr2_controllers pr2_controllers):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
sudo atp-get update&lt;br /&gt;
sudo apt-get install ros-VERSIÓN_ROS-pr2-simulator ros-VERSIÓN_ROS-pr2-mechanism ros-VERSIÓN_ROS-pr2-controllers&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==To add controllers to mobile joints==&lt;br /&gt;
&lt;br /&gt;
===Modification of the URDF===&lt;br /&gt;
&lt;br /&gt;
We have to set the materials, properties, transmissions and controllers for our [http://wiki.ros.org/urdf/Tutorials URDF] model in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]. &lt;br /&gt;
&lt;br /&gt;
We will add the next code lines before the tag &amp;quot;&amp;lt;/robot&amp;gt;&amp;quot; within the file &amp;quot;brazo-macros.xacro&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;gazebo_propiedades_link&amp;quot; params=&amp;quot;nombre material&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;${nombre}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;mu1&amp;gt;0.5&amp;lt;/mu1&amp;gt;&lt;br /&gt;
	&amp;lt;mu2&amp;gt;0.5&amp;lt;/mu2&amp;gt;&lt;br /&gt;
	&amp;lt;material&amp;gt;Gazebo/${material}&amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
    &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt; &lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;gazebo_propiedades_joint&amp;quot; params=&amp;quot;nombre&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;gazebo reference=&amp;quot;${nombre}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;erp&amp;gt;0.1&amp;lt;/erp&amp;gt;&lt;br /&gt;
    &amp;lt;stopKd value=&amp;quot;1000000.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;stopKp value=&amp;quot;10000000.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;fudgeFactor value=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo&amp;gt;   &lt;br /&gt;
     &amp;lt;controller:gazebo_ros_controller_manager name=&amp;quot;gazebo_ros_controller_manager&amp;quot; plugin=&amp;quot;libgazebo_ros_controller_manager.so&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;alwaysOn&amp;gt;true&amp;lt;/alwaysOn&amp;gt;&lt;br /&gt;
          &amp;lt;updateRate&amp;gt;1000.0&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
          &amp;lt;robotNamespace&amp;gt;brazo&amp;lt;/robotNamespace&amp;gt;&lt;br /&gt;
     &amp;lt;/controller:gazebo_ros_controller_manager&amp;gt;&lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;transmission type=&amp;quot;pr2_mechanism_model/SimpleTransmission&amp;quot; name=&amp;quot;base_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;base_motor&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;base&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mechanicalReduction&amp;gt;1.0&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;motorTorqueConstant&amp;gt;1.0&amp;lt;/motorTorqueConstant&amp;gt;&lt;br /&gt;
 &amp;lt;/transmission&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;transmission type=&amp;quot;pr2_mechanism_model/SimpleTransmission&amp;quot; name=&amp;quot;arti1_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;arti1_motor&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;arti1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mechanicalReduction&amp;gt;1.0&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;motorTorqueConstant&amp;gt;1.0&amp;lt;/motorTorqueConstant&amp;gt;&lt;br /&gt;
 &amp;lt;/transmission&amp;gt;              &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;transmission type=&amp;quot;pr2_mechanism_model/SimpleTransmission&amp;quot; name=&amp;quot;arti2_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;arti2_motor&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;arti2&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mechanicalReduction&amp;gt;1.0&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;motorTorqueConstant&amp;gt;1.0&amp;lt;/motorTorqueConstant&amp;gt;&lt;br /&gt;
 &amp;lt;/transmission&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;transmission type=&amp;quot;pr2_mechanism_model/SimpleTransmission&amp;quot; name=&amp;quot;arti3_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;arti3_motor&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;arti3&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mechanicalReduction&amp;gt;1.0&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;motorTorqueConstant&amp;gt;1.0&amp;lt;/motorTorqueConstant&amp;gt;&lt;br /&gt;
 &amp;lt;/transmission&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;transmission type=&amp;quot;pr2_mechanism_model/SimpleTransmission&amp;quot; name=&amp;quot;pinza_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;pinza_motor&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;pinza&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mechanicalReduction&amp;gt;1.0&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;motorTorqueConstant&amp;gt;1.0&amp;lt;/motorTorqueConstant&amp;gt;&lt;br /&gt;
 &amp;lt;/transmission&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will add the next code lines before the tag &amp;quot;&amp;lt;/macro&amp;gt;&amp;quot; within the file &amp;quot;brazo.xacro&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;base_brazo_link&amp;quot; material=&amp;quot;Black&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;hombro_link&amp;quot; material=&amp;quot;Black&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;brazo_link&amp;quot; material=&amp;quot;Black&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;antebrazo_link&amp;quot; material=&amp;quot;Black&amp;quot; /&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;muneca_link&amp;quot; material=&amp;quot;Black&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;brazo_link_B&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;brazo_link_SI&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;brazo_link_SD&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;antebrazo_link_B&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;antebrazo_link_SI&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;antebrazo_link_SD&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;muneca_link_B&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;muneca_link_SI&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;muneca_link_SD&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;muneca_link_P&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;muneca_link_PS&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;     &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_link&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_link_B&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_link_SI&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
   &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_link_SD&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;base&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;arti1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;arti2&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;arti3&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;pinza&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Creation of the configuration file===&lt;br /&gt;
&lt;br /&gt;
We have used two [http://wiki.ros.org/robot_mechanism_controllers?distro=electric controllers] for each mobile joint, one for velocity control and one for position control. Each controller is a [http://es.wikipedia.org/wiki/Proporcional_integral_derivativo PID] regulator. We will create a file named &amp;quot;controllers.yaml&amp;quot; within our ''package'' with the content that is shown below in order to configure the [http://es.wikipedia.org/wiki/Proporcional_integral_derivativo PID] regulators of each mobile joint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
base_pos_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointPositionController&lt;br /&gt;
  joint: base&lt;br /&gt;
  pid: &amp;amp;base_pos&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    d: 0.0&lt;br /&gt;
    i_clamp: 10.0&lt;br /&gt;
&lt;br /&gt;
arti1_pos_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointPositionController&lt;br /&gt;
  joint: arti1&lt;br /&gt;
  pid: &amp;amp;arti1_pos&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    d: 0.0&lt;br /&gt;
    i_clamp: 10.0&lt;br /&gt;
&lt;br /&gt;
arti2_pos_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointPositionController&lt;br /&gt;
  joint: arti2&lt;br /&gt;
  pid: &amp;amp;arti2_pos&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    d: 0.0&lt;br /&gt;
    i_clamp: 10.0&lt;br /&gt;
&lt;br /&gt;
arti3_pos_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointPositionController&lt;br /&gt;
  joint: arti3&lt;br /&gt;
  pid: &amp;amp;arti3_pos&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    d: 0.0&lt;br /&gt;
    i_clamp: 10.0&lt;br /&gt;
&lt;br /&gt;
pinza_pos_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointPositionController&lt;br /&gt;
  joint: pinza&lt;br /&gt;
  pid: &amp;amp;pinza_pos&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    d: 0.0&lt;br /&gt;
    i_clamp: 10.0&lt;br /&gt;
&lt;br /&gt;
base_vel_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointVelocityController&lt;br /&gt;
  joint: base&lt;br /&gt;
  pid: &amp;amp;base_vel&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    i_clamp: 10.0&lt;br /&gt;
    &lt;br /&gt;
arti1_vel_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointVelocityController&lt;br /&gt;
  joint: arti1&lt;br /&gt;
  pid: &amp;amp;arti1_vel&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    i_clamp: 10.0         &lt;br /&gt;
&lt;br /&gt;
arti2_vel_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointVelocityController&lt;br /&gt;
  joint: arti2&lt;br /&gt;
  pid: &amp;amp;arti2_vel&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    i_clamp: 10.0 &lt;br /&gt;
    &lt;br /&gt;
arti3_vel_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointVelocityController&lt;br /&gt;
  joint: arti3&lt;br /&gt;
  pid: &amp;amp;arti3_vel&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    i_clamp: 10.0   &lt;br /&gt;
    &lt;br /&gt;
pinza_vel_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointVelocityController&lt;br /&gt;
  joint: pinza&lt;br /&gt;
  pid: &amp;amp;pinza_vel&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    i_clamp: 10.0 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Loading the model in gazebo==&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;brazo_gazebo.launch&amp;quot; within the folder &amp;quot;launch&amp;quot; of our ''package'' with the content that is shown below in order to start [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] and to load the model and the controllers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;/use_sim_time&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;gazebo&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;gazebo&amp;quot; args=&amp;quot;-u $(find turtlebot_gazebo)/worlds/empty.world&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;node name=&amp;quot;gazebo_gui&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;gui&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;group ns=&amp;quot;brazo&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;robot_description&amp;quot; command=&amp;quot;$(find xacro)/xacro.py '$(find myrabot_arm_model)/urdf/brazo.urdf.xacro'&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_brazo&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-urdf -param robot_description -model brazo&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;rosparam file=&amp;quot;$(find myrabot_arm_model)/controller.yaml&amp;quot; command=&amp;quot;load&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_controller_brazo&amp;quot; pkg=&amp;quot;pr2_controller_manager&amp;quot; type=&amp;quot;spawner&amp;quot; args=&amp;quot;base_pos_controller arti1_pos_controller arti2_pos_controller arti3_pos_controller pinza_pos_controller base_vel_controller arti1_vel_controller arti2_vel_controller arti3_vel_controller pinza_vel_controller&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/group&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start the ''launcher'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer_modelo brazo.gazebo.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can see the arm model in vertical position placed in the point xyz=(0 0 0) of a empty world in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo].&lt;br /&gt;
&lt;br /&gt;
[[file:modelo_brazo_MYRAbot_gazebo.png|thumb|500px|center|MYRAbot's arm model in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]]]&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a new terminal in order to check that the controllers have been loaded properly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic echo&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We must obtain something similar to the following, where the ''topic'' NAME_CONTROLLER/command is the set point and the ''topic'' NAME_CONTROLLER/state is the status data: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
/brazo/arti1_pos_controller/command&lt;br /&gt;
/brazo/arti1_pos_controller/state&lt;br /&gt;
/brazo/arti1_vel_controller/command&lt;br /&gt;
/brazo/arti1_vel_controller/state&lt;br /&gt;
/brazo/arti2_pos_controller/command&lt;br /&gt;
/brazo/arti2_pos_controller/state&lt;br /&gt;
/brazo/arti2_vel_controller/command&lt;br /&gt;
/brazo/arti2_vel_controller/state&lt;br /&gt;
/brazo/arti3_pos_controller/command&lt;br /&gt;
/brazo/arti3_pos_controller/state&lt;br /&gt;
/brazo/arti3_vel_controller/command&lt;br /&gt;
/brazo/arti3_vel_controller/state&lt;br /&gt;
/brazo/base_pos_controller/command&lt;br /&gt;
/brazo/base_pos_controller/state&lt;br /&gt;
/brazo/base_vel_controller/command&lt;br /&gt;
/brazo/base_vel_controller/state&lt;br /&gt;
/brazo/joint_states&lt;br /&gt;
/brazo/mechanism_statistics&lt;br /&gt;
/brazo/pinza_pos_controller/command&lt;br /&gt;
/brazo/pinza_pos_controller/state&lt;br /&gt;
/brazo/pinza_vel_controller/command&lt;br /&gt;
/brazo/pinza_vel_controller/state&lt;br /&gt;
/clock&lt;br /&gt;
/gazebo/link_states&lt;br /&gt;
/gazebo/model_states&lt;br /&gt;
/gazebo/parameter_descriptions&lt;br /&gt;
/gazebo/parameter_updates&lt;br /&gt;
/gazebo/set_link_state&lt;br /&gt;
/gazebo/set_model_state&lt;br /&gt;
/rosout&lt;br /&gt;
/rosout_agg&lt;br /&gt;
/tf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interface program (gazebo-control programs)==&lt;br /&gt;
&lt;br /&gt;
We have created a program that communicates the [[MYRAbot's arm control (bioloid+arduino)#Control programs|arm's control programs]] with [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] controllers. We will create a file named &amp;quot;control_modelo.cpp&amp;quot; within the folder &amp;quot;src&amp;quot; of our ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;std_msgs/Float64.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;sensor_msgs/JointState.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  #define PI 3.14159265&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
  void mover(const brazo_fer::WriteServos&amp;amp; move)&lt;br /&gt;
  {	&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
   	ros::Publisher base_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/base_pos_controller/command&amp;quot;, 1);   &lt;br /&gt;
  	ros::Publisher arti1_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti1_pos_controller/command&amp;quot;, 1); &lt;br /&gt;
   	ros::Publisher arti2_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti2_pos_controller/command&amp;quot;, 1);  	   &lt;br /&gt;
   	ros::Publisher arti3_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti3_pos_controller/command&amp;quot;, 1);&lt;br /&gt;
   	&lt;br /&gt;
   	ros::Publisher base_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/base_vel_controller/command&amp;quot;, 1);   &lt;br /&gt;
  	ros::Publisher arti1_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti1_vel_controller/command&amp;quot;, 1); &lt;br /&gt;
   	ros::Publisher arti2_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti2_vel_controller/command&amp;quot;, 1);  	   &lt;br /&gt;
   	ros::Publisher arti3_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti3_vel_controller/command&amp;quot;, 1);   	&lt;br /&gt;
   	 &lt;br /&gt;
	brazo_fer::Servos position = move.posicion;&lt;br /&gt;
	brazo_fer::Servos speed = move.velocidad;&lt;br /&gt;
	brazo_fer::Servos torque = move.par;&lt;br /&gt;
	&lt;br /&gt;
	std_msgs::Float64 base_pos_command, arti1_pos_command, arti2_pos_command, arti3_pos_command;&lt;br /&gt;
	std_msgs::Float64 base_vel_command, arti1_vel_command, arti2_vel_command, arti3_vel_command;	&lt;br /&gt;
	&lt;br /&gt;
	if (torque.base != 0 &amp;amp;&amp;amp; (position.base &amp;gt;= 0 &amp;amp;&amp;amp; position.base &amp;lt;= 1023) &amp;amp;&amp;amp; (speed.base &amp;gt;= 0 &amp;amp;&amp;amp; speed.base &amp;lt;= 1023))&lt;br /&gt;
	{		&lt;br /&gt;
		base_pos_command.data = ((((position.base * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
		base_vel_command.data = speed.base/511;&lt;br /&gt;
	}&lt;br /&gt;
	if (torque.arti1 != 0 &amp;amp;&amp;amp; (position.arti1 &amp;gt;= 0 &amp;amp;&amp;amp; position.arti1 &amp;lt;= 1023) &amp;amp;&amp;amp; (speed.arti1 &amp;gt;= 0 &amp;amp;&amp;amp; speed.arti1 &amp;lt;= 1023))&lt;br /&gt;
	{&lt;br /&gt;
		arti1_pos_command.data = ((((position.arti1*300)/1023)*PI)/180)-2.62;&lt;br /&gt;
		arti1_vel_command.data = speed.arti1/511;		&lt;br /&gt;
	}&lt;br /&gt;
	if (torque.arti2 != 0 &amp;amp;&amp;amp; (position.arti2 &amp;gt;= 0 &amp;amp;&amp;amp; position.arti2 &amp;lt;= 1023) &amp;amp;&amp;amp; (speed.arti2 &amp;gt;= 0 &amp;amp;&amp;amp; speed.arti2 &amp;lt;= 1023))&lt;br /&gt;
	{&lt;br /&gt;
		arti2_pos_command.data = ((((position.arti2*300)/1023)*PI)/180)-2.62;&lt;br /&gt;
		arti2_vel_command.data = speed.arti2/511;		&lt;br /&gt;
	}&lt;br /&gt;
	if (torque.arti3 != 0 &amp;amp;&amp;amp; (position.arti3 &amp;gt;= 0 &amp;amp;&amp;amp; position.arti3 &amp;lt;= 1023) &amp;amp;&amp;amp; (speed.arti3 &amp;gt;= 0 &amp;amp;&amp;amp; speed.arti3 &amp;lt;= 1023))&lt;br /&gt;
	{&lt;br /&gt;
		arti3_pos_command.data = ((((position.arti3*300)/1023)*PI)/180)-2.62;&lt;br /&gt;
		arti3_vel_command.data = speed.arti3/511;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	base_pos_pub_.publish(base_pos_command);&lt;br /&gt;
	arti1_pos_pub_.publish(arti1_pos_command);&lt;br /&gt;
	arti2_pos_pub_.publish(arti2_pos_command);&lt;br /&gt;
	arti3_pos_pub_.publish(arti3_pos_command);&lt;br /&gt;
&lt;br /&gt;
	base_vel_pub_.publish(base_vel_command);&lt;br /&gt;
	arti1_vel_pub_.publish(arti1_vel_command);&lt;br /&gt;
	arti2_vel_pub_.publish(arti2_vel_command);&lt;br /&gt;
	arti3_vel_pub_.publish(arti3_vel_command);					&lt;br /&gt;
 &lt;br /&gt;
  } &lt;br /&gt;
  void pinza(const brazo_fer::WriteServos&amp;amp; pinza)&lt;br /&gt;
  {	 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
   	ros::Publisher pinza_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/pinza_pos_controller/command&amp;quot;, 1);&lt;br /&gt;
 	   &lt;br /&gt;
   	ros::Publisher pinza_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/pinza_vel_controller/command&amp;quot;, 1);   	 	 &lt;br /&gt;
	  &lt;br /&gt;
	brazo_fer::Servos position = pinza.posicion;&lt;br /&gt;
	brazo_fer::Servos speed = pinza.velocidad;&lt;br /&gt;
	brazo_fer::Servos torque = pinza.par;&lt;br /&gt;
	&lt;br /&gt;
	std_msgs::Float64 pinza_pos_command;&lt;br /&gt;
	std_msgs::Float64 pinza_vel_command;	&lt;br /&gt;
	&lt;br /&gt;
 	if (torque.pinza != 0 &amp;amp;&amp;amp; (position.pinza &amp;gt;= 0 &amp;amp;&amp;amp; position.pinza &amp;lt;= 1023) &amp;amp;&amp;amp; (speed.pinza &amp;gt;= 0 &amp;amp;&amp;amp; speed.pinza &amp;lt;= 1023))&lt;br /&gt;
	{&lt;br /&gt;
		pinza_pos_command.data = ((((position.pinza*300)/1023)*PI)/180)-2.62;&lt;br /&gt;
		pinza_vel_command.data = speed.pinza/511;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	pinza_pos_pub_.publish(pinza_pos_command);&lt;br /&gt;
	pinza_vel_pub_.publish(pinza_vel_command);	&lt;br /&gt;
		&lt;br /&gt;
  }&lt;br /&gt;
  void pe(const sensor_msgs::JointState&amp;amp; pe)&lt;br /&gt;
  {&lt;br /&gt;
	ros::NodeHandle n;	  &lt;br /&gt;
	  &lt;br /&gt;
	ros::Publisher pose_pub_=n.advertise&amp;lt;brazo_fer::ReadServos&amp;gt;(&amp;quot;pose_arm&amp;quot;, 1);   &lt;br /&gt;
	  &lt;br /&gt;
	brazo_fer::ReadServos estado;&lt;br /&gt;
	  &lt;br /&gt;
	estado.posicion.base = ((((pe.position[0]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	estado.posicion.arti1 = ((((pe.position[1]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	estado.posicion.arti2 = ((((pe.position[2]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	estado.posicion.arti3 = ((((pe.position[3]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	estado.posicion.pinza = ((((pe.position[4]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	&lt;br /&gt;
	estado.corriente.base = pe.effort[0]*1000;&lt;br /&gt;
	estado.corriente.arti1 = pe.effort[1]*1000;&lt;br /&gt;
	estado.corriente.arti2 = pe.effort[2]*1000;&lt;br /&gt;
	estado.corriente.arti3 = pe.effort[3]*1000;&lt;br /&gt;
	estado.corriente.pinza = pe.effort[4]*1000;&lt;br /&gt;
	&lt;br /&gt;
	pose_pub_.publish(estado);				&lt;br /&gt;
	&lt;br /&gt;
  }	  &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
	  &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;modelo_brazo&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber move_sub_= n.subscribe(&amp;quot;move_arm&amp;quot;, 1, mover);&lt;br /&gt;
  	ros::Subscriber hand_sub_= n.subscribe(&amp;quot;hand_arm&amp;quot;, 1, pinza);&lt;br /&gt;
  	ros::Subscriber pe_sub_= n.subscribe(&amp;quot;brazo/joint_states&amp;quot;, 1, pe);&lt;br /&gt;
  	  	   	 &lt;br /&gt;
 &lt;br /&gt;
   	ros::Publisher base_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/base_pos_controller/command&amp;quot;, 1);   &lt;br /&gt;
  	ros::Publisher arti1_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti1_pos_controller/command&amp;quot;, 1); &lt;br /&gt;
   	ros::Publisher arti2_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti2_pos_controller/command&amp;quot;, 1);  	   &lt;br /&gt;
   	ros::Publisher arti3_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti3_pos_controller/command&amp;quot;, 1);&lt;br /&gt;
   	ros::Publisher pinza_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/pinza_pos_controller/command&amp;quot;, 1);&lt;br /&gt;
 	    	&lt;br /&gt;
   	ros::Publisher base_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/base_vel_controller/command&amp;quot;, 1);   &lt;br /&gt;
  	ros::Publisher arti1_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti1_vel_controller/command&amp;quot;, 1); &lt;br /&gt;
   	ros::Publisher arti2_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti2_vel_controller/command&amp;quot;, 1);  	   &lt;br /&gt;
   	ros::Publisher arti3_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti3_vel_controller/command&amp;quot;, 1);  &lt;br /&gt;
   	ros::Publisher pinza_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/pinza_vel_controller/command&amp;quot;, 1); &lt;br /&gt;
   	&lt;br /&gt;
   	ros::Publisher pose_pub_=n.advertise&amp;lt;brazo_fer::ReadServos&amp;gt;(&amp;quot;pose_arm&amp;quot;, 1);   	   	  &lt;br /&gt;
	&lt;br /&gt;
	ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to add the next line to the file &amp;quot;CMakeLists.txt&amp;quot; of our ''package'' in order to compile and create the executable file: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;rosbuild_add_executable(control_modelo src/control_modelo.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next commands in a terminal in order to compile and create the executable file: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer_modelo&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Simulation of control programs=&lt;br /&gt;
&lt;br /&gt;
First we have to add the next code line before the tag &amp;quot;&amp;lt;/launch&amp;gt;&amp;quot; within the file &amp;quot;brazo_gazebo.launch&amp;quot; in order to launch the previous interface program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;control_modelo&amp;quot; pkg=&amp;quot;brazo_fer_modelo&amp;quot; type=&amp;quot;control_modelo&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==First control program (Come here)==&lt;br /&gt;
&lt;br /&gt;
We use the same [[MYRAbot's arm control (bioloid+arduino)#Third program (Came here)|control program]] that we had created for the real arm. First we will execute the next command in a terminal in order to launch the simulator with the arm model:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer_modelo brazo_gazebo.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the [http://wiki.ros.org/simulator_gazebo?distro=electric simulator gazebo] is started, we will execute the next command in a new terminal in order to start the control program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun brazo_fer control_v01&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a new terminal in order to publish the goal point in the ''topic'' &amp;quot;point&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub point geometry_msgs/Point '{x: 100, y: 0, z: 180}' --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The arm will move to the goal point. We can see the arm moving from the start point to the goal point in the next video:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;S9kUKYysm0M&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=S9kUKYysm0M Watch in YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Second control program (Grasp the tin)==&lt;br /&gt;
&lt;br /&gt;
First we will create a file named &amp;quot;lata.urdf&amp;quot; within the folder &amp;quot;urdf&amp;quot; of our ''package'' with the content that is shown below in order to create the tin model:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot name=&amp;quot;lata&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;world&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;fixed&amp;quot; type=&amp;quot;floating&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;world&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;lata_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;lata_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;visual&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.03&amp;quot; length=&amp;quot;0.125&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.0625&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;material name=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;color rgba=&amp;quot;1 0 0 1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;/visual&amp;gt;&lt;br /&gt;
  &amp;lt;collision&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.0625&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.03&amp;quot; length=&amp;quot;0.125&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
  &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;inertial&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.0625&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot;/&amp;gt;  &lt;br /&gt;
  &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;lata_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;Gazebo/Red&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;0.9&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;0.9&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also we have to add the next code line to the file &amp;quot;brazo_gazebo.launch&amp;quot; in order to launch the tin model in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] in the position xyz = (-0.15 0.21 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&amp;lt;node name=&amp;quot;spawn_lata&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find brazo_fer_modelo)/lata.urdf -urdf -x -0.15 -y 0.21 -model lata&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We use the same [[MYRAbot's arm control (bioloid+arduino)#Fourth program (Grasp the bottle)|control program]] that we had created for the real arm. First we will execute the next command in a terminal in order to launch the simulator with the arm model:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer_modelo brazo_gazebo.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the [http://wiki.ros.org/simulator_gazebo?distro=electric simulator gazebo] is started, we will execute the next command in a new terminal in order to start the control program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun brazo_fer control_v02&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a new terminal in order to publish the placement point of the tin in the ''topic'' &amp;quot;pick_point&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub point geometry_msgs/Point '{x: 145, y: 0, z: 180}' --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The arm will move to the initial position. When we publish the placement point of the tin, the arm will move to grasp the tin. We can see the arm moving to initial position and grasping the tin in the next video:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;16aR8XXHnmw&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=16aR8XXHnmw Watch in YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Objects_recognition_and_position_calculation_(webcam)&amp;diff=4215</id>
		<title>Objects recognition and position calculation (webcam)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Objects_recognition_and_position_calculation_(webcam)&amp;diff=4215"/>
				<updated>2014-09-29T11:08:17Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Objects recognition=&lt;br /&gt;
&lt;br /&gt;
We have used the ''package'' [http://code.google.com/p/find-object/ find_object_2d] which has been develop by [https://introlab.3it.usherbrooke.ca/mediawiki-introlab/index.php/Mathieu_Labb%C3%A9 Mathieu Labbé] (Université de Sherbrooke). The program can recognizes objects in the scene using an image of the object. The program has a graphical user interface which allow to capture an image of the scene and save it.&lt;br /&gt;
&lt;br /&gt;
[[file:find_object_2d.png|thumb|500px|center|Screenshot [http://code.google.com/p/find-object/ find_object_2d]]] &lt;br /&gt;
&lt;br /&gt;
In the screenshot that is shown above, we can see how the recognized object is within a boundary box which coincide with the corners of the object image.&lt;br /&gt;
&lt;br /&gt;
The program provides several data of each found object in the scene. We will use the next data:&lt;br /&gt;
&lt;br /&gt;
* Width of the object image (number of pixels).&lt;br /&gt;
* Height of the object image (number of pixels).&lt;br /&gt;
* Position of the corners of the object image in the scene. &lt;br /&gt;
&lt;br /&gt;
==Utilization of a new OpenCV version in ROS Electric==&lt;br /&gt;
&lt;br /&gt;
The previous ''package'' needs in order to compile the [http://opencv.org/ OpenCV] version 2.4.3 or higher, but [http://wiki.ros.org/ ROS] Electric has the [http://opencv.org/ OpenCV] version 2.3.1. We will install the [http://opencv.org/ OpenCV] version 2.4.3, modify the ''package'' [http://wiki.ros.org/cv_bridge?distro=electric cv_bridge] and modify the ''package'' [http://code.google.com/p/find-object/ find_object_2d].&lt;br /&gt;
&lt;br /&gt;
===Installation of OpenCV===&lt;br /&gt;
&lt;br /&gt;
First we will [http://opencv.org/downloads.html download] the [http://opencv.org/ OpenCV] version 2.4.3 by the official web. We will extract the content of the downloaded file in the personal folder. We will execute the next commands in a terminal in order to update the [http://www.ubuntu.com/ ubuntu] ''packages'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get upgrade&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When finish the update/upgrade, we will place us in the [http://opencv.org/ OpenCV] folder in a terminal and execute the next commands in the terminal in order to compile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
cmake -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_OPENGL=ON ..&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in the terminal in order to configure [http://opencv.org/ OpenCV]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo gedit /etc/ld.so.conf.d/opencv.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We add the next code line to the opened file and save the changes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;/usr/local/lib&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, we will execute the next commands in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
sudo gedit /etc/bash.bashrc &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We add the next code lines at the end of the opened file and save the changes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig&lt;br /&gt;
export PKG_CONFIG_PATH&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will restart the PC to finish the installation.&lt;br /&gt;
&lt;br /&gt;
===Modification of the ''package'' cv_bridge===&lt;br /&gt;
&lt;br /&gt;
We must modify the file &amp;quot;manifest.xml&amp;quot; of the ''package'' [http://wiki.ros.org/cv_bridge?distro=electric cv_bridge] in order to avoid the use of the previous version of [http://opencv.org/ OpenCV]. We will execute the next commands in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
roscd cv_bridge&lt;br /&gt;
sudo gedit manifest.xml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will delete or comment the next code lines of the opened file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;depend package=&amp;quot;opencv2&amp;quot; /&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;rosdep name=&amp;quot;opencv2.3&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modification of the ''package'' find_object_2d===&lt;br /&gt;
&lt;br /&gt;
We must modify the file &amp;quot;CMakeLists.txt&amp;quot; of the package [http://code.google.com/p/find-object/ find_object_2d] in order to avoid the use of the previous version of OpenCV for the compilation. We will execute the next commands in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
roscd find_object_2d&lt;br /&gt;
sudo gedit CMakeLists.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will modify the next code line of the opened file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;find_package(OpenCV REQUIRED)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;find_package(OpenCV 2.4 REQUIRED)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to add the next code lines to the file &amp;quot;CMakeLists.txt&amp;quot; in order to use a external [http://opencv.org/ OpenCV] library to [http://wiki.ros.org/ ROS], if the file don't have this lines.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
find_package(OpenCV &amp;quot;VERSION&amp;quot; REQUIRED)&lt;br /&gt;
include_directories(${OpenCV_INCLUDE_DIRS})&lt;br /&gt;
...&lt;br /&gt;
target_link_libraries(&amp;quot;PROGRAM_NAME&amp;quot; ${OpenCV_LIBS})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Position calculation=&lt;br /&gt;
&lt;br /&gt;
We will use the data provided by the ''package'' [http://code.google.com/p/find-object/ find_object_2d] in order to calculate the approximate position of the objects towards the [[Control brazo MYRAbot (bioloid+arduino) |MYRAbot's arm]] coordinates. We have to know the next physical parameters:&lt;br /&gt;
&lt;br /&gt;
* Position of the webcam towards the arm (h, d).&lt;br /&gt;
* Tilt angle of the webcam towards the horizontal (&amp;amp;alpha;).&lt;br /&gt;
* Perpendicular distance to the webcam lens of the objects when we take the capture (''dZ0'').&lt;br /&gt;
&lt;br /&gt;
[[file:webcam_MYRAbot_esquema.jpg|thumb|500px|center|Sketch position calculation]]&lt;br /&gt;
&lt;br /&gt;
We have used the variation of area of the boundary box in order to calculate the distance between the recognized object and the webcam lens. The obtained equations are shown below, we have calculated the parameters using different known positions of an object:&lt;br /&gt;
&lt;br /&gt;
[[file:Webcam MYRAbot ecuaciones-en.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Program to publish the position of the objects==&lt;br /&gt;
&lt;br /&gt;
First [[MYRAbot's arm control (bioloid+arduino)#Creating custom messages in ROS|we will create some custom messages]] within the ''package'' &amp;quot;[http://code.google.com/p/find-object/ find_object_2d]&amp;quot; in order to publish the position of the recognized objects in the scene. We will create the basis message that contains the identifier and the placement point of the recognized object. We will create a file named &amp;quot;Point_id.msg&amp;quot; with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;int16 id&lt;br /&gt;
geometry_msgs/Point punto&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;PointObjects.msg&amp;quot; with the content that is shown below, in order to contain an array with the previous messages for each recognized object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;Point_id[] objeto&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The program subscribes the ''topic'' &amp;quot;objects&amp;quot; (published by &amp;quot;find_object_2d_node&amp;quot;) and publishes the ''topic'' &amp;quot;point&amp;quot;. We will create a file named &amp;quot;objects_detected.cpp&amp;quot; within the ''package'' &amp;quot;[http://code.google.com/p/find-object/ find_object_2d]&amp;quot; with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;ros/ros.h&amp;gt;&lt;br /&gt;
#include &amp;lt;std_msgs/Float32MultiArray.h&amp;gt;&lt;br /&gt;
#include &amp;lt;opencv2/opencv.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;QTransform&amp;gt;&lt;br /&gt;
#include &amp;lt;geometry_msgs/Point.h&amp;gt;&lt;br /&gt;
#include &amp;lt;std_msgs/Int16.h&amp;gt;&lt;br /&gt;
#include &amp;lt;find_object_2d/PointObjects.h&amp;gt;&lt;br /&gt;
#include &amp;lt;find_object_2d/Point_id.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define dZ0 450&lt;br /&gt;
#define alfa 40&lt;br /&gt;
#define h 310&lt;br /&gt;
#define d 50&lt;br /&gt;
#define PI 3.14159265&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void objectsDetectedCallback(const std_msgs::Float32MultiArray&amp;amp; msg)&lt;br /&gt;
{&lt;br /&gt;
    ros::NodeHandle nh;&lt;br /&gt;
    ros::Publisher position_pub_=nh.advertise&amp;lt;find_object_2d::PointObjects&amp;gt;(&amp;quot;point&amp;quot;, 1);&lt;br /&gt;
   &lt;br /&gt;
    find_object_2d::PointObjects p_objects;&lt;br /&gt;
    find_object_2d::Point_id objeto;&lt;br /&gt;
           &lt;br /&gt;
    p_objects.objeto = std::vector&amp;lt;find_object_2d::Point_id&amp;gt;(msg.data.size()/12);&lt;br /&gt;
           &lt;br /&gt;
    for(unsigned int i=0; i&amp;lt;msg.data.size(); i+=12)&lt;br /&gt;
    {&lt;br /&gt;
        // get data&lt;br /&gt;
        int id = (int)msg.data[i];&lt;br /&gt;
        float objectWidth = msg.data[i+1];&lt;br /&gt;
        float objectHeight = msg.data[i+2];&lt;br /&gt;
&lt;br /&gt;
        // Find corners Qt&lt;br /&gt;
        QTransform qtHomography(msg.data[i+3], msg.data[i+4], msg.data[i+5],&lt;br /&gt;
                                msg.data[i+6], msg.data[i+7], msg.data[i+8],&lt;br /&gt;
                                msg.data[i+9], msg.data[i+10], msg.data[i+11]);&lt;br /&gt;
&lt;br /&gt;
        QPointF qtTopLeft = qtHomography.map(QPointF(0,0));&lt;br /&gt;
        QPointF qtTopRight = qtHomography.map(QPointF(objectWidth,0));&lt;br /&gt;
        QPointF qtBottomLeft = qtHomography.map(QPointF(0,objectHeight));&lt;br /&gt;
        QPointF qtBottomRight = qtHomography.map(QPointF(objectWidth,objectHeight));&lt;br /&gt;
       &lt;br /&gt;
        geometry_msgs::Point punto;&lt;br /&gt;
       &lt;br /&gt;
	float widthTop = sqrt(pow(qtTopRight.x() - qtTopLeft.x(),2) + pow(qtTopRight.y() - qtTopLeft.y(),2));&lt;br /&gt;
	float widthBottom = sqrt(pow(qtBottomRight.x() - qtBottomLeft.x(),2) + pow(qtBottomRight.y() - qtBottomLeft.y(),2));&lt;br /&gt;
	float heightLeft = sqrt(pow(qtBottomLeft.x() - qtTopLeft.x(),2) + pow(qtBottomLeft.y() - qtTopLeft.y(),2));&lt;br /&gt;
	float heightRight = sqrt(pow(qtBottomRight.x() - qtTopRight.x(),2) + pow(qtBottomRight.y() - qtTopRight.y(),2));&lt;br /&gt;
		&lt;br /&gt;
        float dArea_0 = (objectHeight*objectWidth) - (((widthTop + widthBottom)/2) * ((heightLeft + heightRight)/2));&lt;br /&gt;
&lt;br /&gt;
        float dZ_0 = dZ0 + (dArea_0/10);&lt;br /&gt;
        &lt;br /&gt;
        float dY_0 = (((480/2) - (((qtTopLeft.y() + qtTopRight.y())/2) + ((heightLeft + heightRight)/4)))*dZ_0)/585;                &lt;br /&gt;
        &lt;br /&gt;
        float beta_0 = atan2(dY_0,dZ_0);        &lt;br /&gt;
        &lt;br /&gt;
        objectHeight = objectHeight/cos((alfa*PI)/180);&lt;br /&gt;
        &lt;br /&gt;
        float height = ((heightLeft + heightRight)/2)/cos(((alfa*PI)/180)-beta_0);                    &lt;br /&gt;
        &lt;br /&gt;
        float dArea = (objectHeight*objectWidth) - (((widthTop + widthBottom)/2) * height);&lt;br /&gt;
&lt;br /&gt;
        float dZ = dZ0 + (dArea/38);&lt;br /&gt;
       &lt;br /&gt;
        float dX = (((640/2) - (((qtTopLeft.x() + qtBottomLeft.x())/2) + ((widthTop + widthBottom)/4)))*dZ)/585;&lt;br /&gt;
       &lt;br /&gt;
        float dY = (((480/2) - (((qtTopLeft.y() + qtTopRight.y())/2) + ((heightLeft + heightRight)/4)))*dZ)/585;&lt;br /&gt;
       &lt;br /&gt;
        float beta = atan2(dY,dZ);&lt;br /&gt;
       &lt;br /&gt;
        punto.x = dX;&lt;br /&gt;
        punto.y = h-((dZ/cos(beta))*sin(((alfa*PI)/180)-beta));&lt;br /&gt;
        punto.z = ((dZ/cos(beta))*cos(((alfa*PI)/180)-beta))-d;&lt;br /&gt;
        &lt;br /&gt;
        //Validate detection&lt;br /&gt;
        int paralelepipedo;&lt;br /&gt;
        &lt;br /&gt;
        if (abs(widthTop - widthBottom) &amp;lt; 20 &amp;amp;&amp;amp; abs(heightLeft - heightRight) &amp;lt; 15)&lt;br /&gt;
        {&lt;br /&gt;
			paralelepipedo = 1;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			paralelepipedo = 0;&lt;br /&gt;
		}&lt;br /&gt;
        &lt;br /&gt;
        if (paralelepipedo == 1)&lt;br /&gt;
        {       &lt;br /&gt;
			objeto.punto = punto;&lt;br /&gt;
			objeto.id = id;&lt;br /&gt;
       &lt;br /&gt;
			p_objects.objeto[i/12] = objeto;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    position_pub_.publish(p_objects);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv)&lt;br /&gt;
{&lt;br /&gt;
    ros::init(argc, argv, &amp;quot;objects_detected&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    ros::NodeHandle nh;&lt;br /&gt;
    ros::Subscriber subs = nh.subscribe(&amp;quot;objects&amp;quot;, 1, objectsDetectedCallback);&lt;br /&gt;
&lt;br /&gt;
    ros::Publisher position_pub_=nh.advertise&amp;lt;find_object_2d::PointObjects&amp;gt;(&amp;quot;point&amp;quot;, 1);  &lt;br /&gt;
&lt;br /&gt;
    ros::spin();&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compiling the program===&lt;br /&gt;
&lt;br /&gt;
We have to add the next code lines at the end to the file &amp;quot;CMakeLists.txt&amp;quot; of the ''package'' &amp;quot;[http://code.google.com/p/find-object/ find_object_2d]&amp;quot;, in order to compile and create the executable file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
rosbuild_add_executable(objects_detected src/objects_detected.cpp)&lt;br /&gt;
target_link_libraries(objects_detected ${LIBRARIES})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next commands in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
roscd find_object_2d&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Executing the program===&lt;br /&gt;
&lt;br /&gt;
We have to install the ''package'' &amp;quot;[http://wiki.ros.org/camera_umd?distro=electric camera_umd]&amp;quot; in order to launch our [http://en.wikipedia.org/wiki/USB USB] webcam. We will execute the next command in a terminal in order to launch the webcam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun uvc_camera camera_node&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ''note:'' If we have plugged several [http://en.wikipedia.org/wiki/USB USB] webcams, we have to set the webcam that we want to use (default webcam is &amp;quot;/dev/video0&amp;quot;). We will execute the next command in a terminal in order to change the used device:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosparam set uvc_camera/device /dev/video&amp;quot;DEVICE_NUMBER&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;encontrar_objetos.launch&amp;quot; within the folder &amp;quot;launch&amp;quot; of the ''package'' &amp;quot;[http://code.google.com/p/find-object/ find_object_2d]&amp;quot; with the content that is shown below, in order to launch the webcam, the [http://code.google.com/p/find-object/ find_object_2d] program and our program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;node name=&amp;quot;camera_node&amp;quot; pkg=&amp;quot;uvc_camera&amp;quot; type=&amp;quot;camera_node&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;/device&amp;quot; value=&amp;quot;/dev/videoNÚMERO_DE_NUESTRO_DISPOSITIVO&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;node name=&amp;quot;find_object_2d&amp;quot; pkg=&amp;quot;find_object_2d&amp;quot; type=&amp;quot;find_object_2d&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;image&amp;quot; to=&amp;quot;image_raw&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;node name=&amp;quot;objects_detected&amp;quot; pkg=&amp;quot;find_object_2d&amp;quot; type=&amp;quot;objects_detected&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start the ''launcher'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch find_object_2d encontrar_objetos.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=To point objects (Choose)=&lt;br /&gt;
&lt;br /&gt;
We will use the previous program in order to control the [[MYRAbot's arm control (bioloid+arduino)|arm]] to point the selected object. The program subscribes the ''topics'' &amp;quot;point&amp;quot; (published by the previous program), &amp;quot;selected_object&amp;quot; (where we publish the identifier of the selected object) and &amp;quot;pose_arm&amp;quot; (where the states of the [[MYRAbot's arm control (bioloid+arduino)|arm]] are published). Also the program publishes the ''topics'' &amp;quot;move_arm&amp;quot; and &amp;quot;hand_arm&amp;quot; in order to control the [[MYRAbot's arm control (bioloid+arduino)|arm]]. When we start the program, the [[MYRAbot's arm control (bioloid+arduino)|arm]] goes to the initial position. When we publish the identifier of the selected object in the ''topic'' &amp;quot;selected_object&amp;quot; (we use the identifier 100 to return the arm to the initial position), the arm moves to point the object if it is present in the scene. Passed a short time, the [[MYRAbot's arm control (bioloid+arduino)|arm]] returns to the initial position. We will create a file named &amp;quot;escoja.cpp&amp;quot; within the folder &amp;quot;src&amp;quot; of the ''package'' &amp;quot;[[MYRAbot's arm control (bioloid+arduino)#Control programs|brazo_fer]]&amp;quot; with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;find_object_2d/PointObjects.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;find_object_2d/Point_id.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;std_msgs/Int16.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  #define PI 3.14159265&lt;br /&gt;
  #define L1 104&lt;br /&gt;
  #define L2 104&lt;br /&gt;
  #define Lp 60&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos move, vel, pg, eg, cg;&lt;br /&gt;
  find_object_2d::PointObjects p_objects;&lt;br /&gt;
  &lt;br /&gt;
  int cont = 0;&lt;br /&gt;
  int cont_obj = 0;&lt;br /&gt;
  int nuevo_punto = 0;&lt;br /&gt;
  &lt;br /&gt;
  int id_0 = 0;&lt;br /&gt;
  int id_1 = 0;&lt;br /&gt;
  &lt;br /&gt;
  double x = 0;&lt;br /&gt;
  double y = 0;&lt;br /&gt;
  double z = 0;&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos inversa(geometry_msgs::Point destino)&lt;br /&gt;
  {&lt;br /&gt;
    &lt;br /&gt;
   	double z = destino.z; &lt;br /&gt;
        double x = destino.x;&lt;br /&gt;
	double y = destino.y;&lt;br /&gt;
	&lt;br /&gt;
	y = y + z*tan(atan2(45,250));&lt;br /&gt;
 &lt;br /&gt;
	int coordenadas_correctas = 1;&lt;br /&gt;
 &lt;br /&gt;
	double alfa, beta, beta_a, beta_p, gamma, delta, delta_a, delta_p;&lt;br /&gt;
	double z_p;&lt;br /&gt;
	double L_a, L;&lt;br /&gt;
 &lt;br /&gt;
	alfa = (atan2(x,z)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
	z_p = sqrt(pow(z,2)+pow(x,2));&lt;br /&gt;
 &lt;br /&gt;
	L = sqrt(pow(z_p,2)+pow(y,2));&lt;br /&gt;
 &lt;br /&gt;
	L_a = sqrt(pow(y,2)+pow(z_p-Lp,2));&lt;br /&gt;
 &lt;br /&gt;
	beta_p = atan2(y,z_p-Lp);&lt;br /&gt;
 &lt;br /&gt;
	beta_a = acos((pow(L1,2)+pow(L_a,2)-pow(L2,2))/(2*L1*L_a));&lt;br /&gt;
 &lt;br /&gt;
	beta = ((beta_p+beta_a)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
	gamma = acos((pow(L1,2)+pow(L2,2)-pow(L_a,2))/(2*L1*L2));&lt;br /&gt;
 &lt;br /&gt;
	delta_a = PI-(beta_a+gamma);&lt;br /&gt;
 &lt;br /&gt;
	gamma = (gamma*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
        delta_p = acos((pow(L_a,2)+pow(Lp,2)-pow(L,2))/(2*L_a*Lp));&lt;br /&gt;
 &lt;br /&gt;
	if (y&amp;lt;0) {&lt;br /&gt;
		delta = ((2*PI-(delta_p-delta_a))*180)/PI;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		delta = ((delta_p+delta_a)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
		if (isnan(delta)) {&lt;br /&gt;
			delta = ((PI+delta_a)*180)/PI;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	if (isnan(gamma)) &lt;br /&gt;
	{&lt;br /&gt;
		coordenadas_correctas = 0; &lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	::move.base = ((alfa+150)*1023)/300;&lt;br /&gt;
	::move.arti1 = ((beta+60)*1023)/300;&lt;br /&gt;
	::move.arti2 = ((gamma-30)*1023)/300;&lt;br /&gt;
	::move.arti3 = ((delta-30)*1023)/300;&lt;br /&gt;
	::move.pinza = 511;&lt;br /&gt;
	&lt;br /&gt;
	::vel.base = abs(::move.base - ::pg.base)/5;&lt;br /&gt;
	::vel.arti1 = abs(::move.arti1 - ::pg.arti1)/5;	&lt;br /&gt;
	::vel.arti2 = abs(::move.arti2 - ::pg.arti2)/5;&lt;br /&gt;
	::vel.arti3 = abs(::move.arti3 - ::pg.arti3)/5;&lt;br /&gt;
	::vel.pinza = abs(::move.pinza - ::pg.pinza);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	if (coordenadas_correctas == 1 &amp;amp;&amp;amp; (205 &amp;lt;= ::move.base &amp;amp;&amp;amp; ::move.base &amp;lt;= 818) &amp;amp;&amp;amp; (120 &amp;lt;= ::move.arti1 &amp;amp;&amp;amp; ::move.arti1 &amp;lt;= 920) &amp;amp;&amp;amp; ::move.arti2 &amp;gt;= 50  &amp;amp;&amp;amp; ::move.arti3 &amp;lt;= 828) {&lt;br /&gt;
		return ::move;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		std::cout&amp;lt;&amp;lt;&amp;quot;Error, invalid coordinates or unattainable point&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		&lt;br /&gt;
		::nuevo_punto = 0;	&lt;br /&gt;
		::id_1 = ::id_0;		&lt;br /&gt;
		return ::pg;				&lt;br /&gt;
	}  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void indicar(geometry_msgs::Point indicado)&lt;br /&gt;
  {&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1); &lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);&lt;br /&gt;
	  	&lt;br /&gt;
	  	brazo_fer::Servos mover;&lt;br /&gt;
		&lt;br /&gt;
		double x0 = indicado.x;&lt;br /&gt;
		double z0 = indicado.z;&lt;br /&gt;
		&lt;br /&gt;
		indicado.z = indicado.z - 100*cos(atan2(x0,z0));&lt;br /&gt;
		indicado.x = indicado.x - 100*sin(atan2(x0,z0)); &lt;br /&gt;
		&lt;br /&gt;
		mover = inversa(indicado);&lt;br /&gt;
		&lt;br /&gt;
		brazo_fer::WriteServos indicar;&lt;br /&gt;
		&lt;br /&gt;
		indicar.posicion = mover;&lt;br /&gt;
		&lt;br /&gt;
		indicar.velocidad = ::vel;&lt;br /&gt;
		&lt;br /&gt;
		indicar.par.base = 1;&lt;br /&gt;
		indicar.par.arti1 = 1;&lt;br /&gt;
		indicar.par.arti2 = 1;&lt;br /&gt;
		indicar.par.arti3 = 1;&lt;br /&gt;
		indicar.par.pinza = 1;		&lt;br /&gt;
						&lt;br /&gt;
		move_pub_.publish(indicar);&lt;br /&gt;
		hand_pub_.publish(indicar);&lt;br /&gt;
		&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void home()&lt;br /&gt;
  {&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1); &lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);&lt;br /&gt;
	  	&lt;br /&gt;
	  	brazo_fer::Servos mover;&lt;br /&gt;
		&lt;br /&gt;
		geometry_msgs::Point home;&lt;br /&gt;
		&lt;br /&gt;
		home.x = 0;&lt;br /&gt;
		home.y = 80;&lt;br /&gt;
		home.z = 50;&lt;br /&gt;
		&lt;br /&gt;
		mover = inversa(home);&lt;br /&gt;
		&lt;br /&gt;
		brazo_fer::WriteServos inicio;&lt;br /&gt;
		&lt;br /&gt;
		inicio.posicion = mover;&lt;br /&gt;
		&lt;br /&gt;
		inicio.velocidad = ::vel;&lt;br /&gt;
		&lt;br /&gt;
		inicio.par.base = 1;&lt;br /&gt;
		inicio.par.arti1 = 1;&lt;br /&gt;
		inicio.par.arti2 = 1;&lt;br /&gt;
		inicio.par.arti3 = 1;&lt;br /&gt;
		inicio.par.pinza = 1;		&lt;br /&gt;
						&lt;br /&gt;
		move_pub_.publish(inicio);&lt;br /&gt;
		hand_pub_.publish(inicio);&lt;br /&gt;
		&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  void posicion(const brazo_fer::ReadServos&amp;amp; pose)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
    brazo_fer::Servos p = pose.posicion;&lt;br /&gt;
	&lt;br /&gt;
    ::pg = pose.posicion;&lt;br /&gt;
    ::eg = pose.estado;&lt;br /&gt;
    ::cg = pose.corriente;&lt;br /&gt;
    &lt;br /&gt;
    if (::cont == 0) &lt;br /&gt;
    {&lt;br /&gt;
		home();&lt;br /&gt;
		::cont = 1;&lt;br /&gt;
	}&lt;br /&gt;
	else if (::nuevo_punto &amp;gt; 8)&lt;br /&gt;
	{&lt;br /&gt;
		if (((p.base-15) &amp;lt; ::move.base &amp;amp;&amp;amp; ::move.base &amp;lt; (p.base+15)) &amp;amp;&amp;amp; ((p.arti1-15) &amp;lt; ::move.arti1 &amp;amp;&amp;amp; ::move.arti1 &amp;lt; (p.arti1+15)) &amp;amp;&amp;amp; ((p.arti2-15) &amp;lt; ::move.arti2 &amp;amp;&amp;amp; ::move.arti2 &amp;lt; (p.arti2+15)) &amp;amp;&amp;amp; ((p.arti3-15) &amp;lt; ::move.arti3 &amp;amp;&amp;amp; ::move.arti3 &amp;lt; (p.arti3+15)))&lt;br /&gt;
		{&lt;br /&gt;
			ros::Time ahora;&lt;br /&gt;
			&lt;br /&gt;
			ahora = ros::Time::now();  &lt;br /&gt;
 &lt;br /&gt;
			while (ros::Time::now() &amp;lt; (ahora + ros::Duration(1)))&lt;br /&gt;
			{}&lt;br /&gt;
			&lt;br /&gt;
			home();&lt;br /&gt;
			&lt;br /&gt;
			::nuevo_punto = 0;	&lt;br /&gt;
			::id_1 = ::id_0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  void punto(const find_object_2d::PointObjects&amp;amp; point)&lt;br /&gt;
  {	&lt;br /&gt;
	::p_objects = point;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	if (::id_0 == ::id_1)&lt;br /&gt;
	{&lt;br /&gt;
		::cont_obj = 0;&lt;br /&gt;
			  &lt;br /&gt;
		::x = 0;&lt;br /&gt;
		::y = 0;&lt;br /&gt;
		::z = 0; &lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		if (::id_1 == 100)&lt;br /&gt;
		{	&lt;br /&gt;
			home();&lt;br /&gt;
			::nuevo_punto = 0;		&lt;br /&gt;
			::id_1 = ::id_0;&lt;br /&gt;
		} &lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			int max = ::p_objects.objeto.size();&lt;br /&gt;
			&lt;br /&gt;
			if (::nuevo_punto &amp;lt; 8)&lt;br /&gt;
			{&lt;br /&gt;
				for (int i=0; i &amp;lt; max; i++)&lt;br /&gt;
				{&lt;br /&gt;
					if (::p_objects.objeto[i].id == ::id_1)&lt;br /&gt;
					{&lt;br /&gt;
						::x = ::x + ::p_objects.objeto[i].punto.x;&lt;br /&gt;
						::y = ::y + ::p_objects.objeto[i].punto.y;&lt;br /&gt;
						::z = ::z + ::p_objects.objeto[i].punto.z;&lt;br /&gt;
										&lt;br /&gt;
						::cont_obj = ::cont_obj + 1;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				::nuevo_punto = ::nuevo_punto + 1;			&lt;br /&gt;
			}	&lt;br /&gt;
			else&lt;br /&gt;
			{		&lt;br /&gt;
				if (::cont_obj == 0)&lt;br /&gt;
				{&lt;br /&gt;
					std::cout&amp;lt;&amp;lt;&amp;quot;Object is not in the scene&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
					::nuevo_punto = 0;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					geometry_msgs::Point punto_medio;&lt;br /&gt;
				&lt;br /&gt;
					punto_medio.x = ::x/::cont_obj;&lt;br /&gt;
					punto_medio.y = ::y/::cont_obj;&lt;br /&gt;
					punto_medio.z = ::z/::cont_obj;&lt;br /&gt;
			&lt;br /&gt;
					indicar(punto_medio);&lt;br /&gt;
					&lt;br /&gt;
					::nuevo_punto = ::nuevo_punto + 1;										&lt;br /&gt;
				}&lt;br /&gt;
				::id_1 = ::id_0;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
  void objeto(const std_msgs::Int16&amp;amp; id)&lt;br /&gt;
  {&lt;br /&gt;
	::id_1 = id.data;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;indicar_objetos&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber pose_sub_= n.subscribe(&amp;quot;pose_arm&amp;quot;, 1, posicion); &lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber point_sub_= n.subscribe(&amp;quot;point&amp;quot;, 1, punto);&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber object_sub_= n.subscribe(&amp;quot;selected_object&amp;quot;, 1, objeto);  	 &lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1); &lt;br /&gt;
  	   &lt;br /&gt;
 &lt;br /&gt;
	ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to add the next line to the file &amp;quot;CMakeLists.txt&amp;quot; of the ''package'' &amp;quot;[[MYRAbot's arm control (bioloid+arduino)#Control programs|brazo_fer]]&amp;quot; in order to compile and create the executable file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;rosbuild_add_executable(escoja src/escoja.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next commands in a terminal in order to compile and create the executable file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;escoja.launch&amp;quot; within the folder &amp;quot;launch&amp;quot; of the package &amp;quot;[[MYRAbot's arm control (bioloid+arduino)#Control programs|brazo_fer]]&amp;quot; with the content that is shown below, in order to launch the communication node with[http://www.arduino.cc/es/ arduino], the previous ''launcher'' &amp;quot;encontrar_objetos.launch&amp;quot; and our program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;serial_node&amp;quot; pkg=&amp;quot;rosserial_python&amp;quot; type=&amp;quot;serial_node.py&amp;quot; args=&amp;quot;/dev/ttyACM0&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;indicar&amp;quot; pkg=&amp;quot;brazo_fer&amp;quot; type=&amp;quot;escoja&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find find_object_2d)/launch/encontrar_objetos.launch&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start the ''launcher'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer escoja.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
En la sección &amp;quot;[[Modelo para simulación MYRAbot (urdf+gazebo)#Ejecución del programa (entre la cerveza y la cola, la plataforma) escoja|Ejecución del programa (entre la cerveza y la cola, la plataforma) escoja]]&amp;quot; del apartado dedicado al [[Modelo para simulación MYRAbot (urdf+gazebo)|modelo para simulación MYRAbot]], puede verse un vídeo de la ejecución del programa en el simulador [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo].&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tracking objects=&lt;br /&gt;
&lt;br /&gt;
The program subscribes the ''topics'' &amp;quot;selected_object&amp;quot; (where we publish the identifier of the selected object) and &amp;quot;pose_arm&amp;quot; (where the states of the [[MYRAbot's arm control (bioloid+arduino)|arm]] are published). Also the program publishes the ''topics'' &amp;quot;move_arm&amp;quot; and &amp;quot;hand_arm&amp;quot; in order to control the [[MYRAbot's arm control (bioloid+arduino)|arm]]. When we start the program, the [[MYRAbot's arm control (bioloid+arduino)|arm]] goes to the initial position. When we publish the identifier of the selected object in the ''topic'' &amp;quot;selected_object&amp;quot; (we use the identifier 100 to return the arm to the initial position), the arm moves to track the object if it is present in the scene. We will create a file named &amp;quot;seguir_objetos.cpp&amp;quot; within the folder &amp;quot;src&amp;quot; of the ''package'' &amp;quot;[[MYRAbot's arm control (bioloid+arduino)#Control programs|brazo_fer]]&amp;quot; with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;find_object_2d/PointObjects.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;find_object_2d/Point_id.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;std_msgs/Int16.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  #define PI 3.14159265&lt;br /&gt;
  #define L1 104&lt;br /&gt;
  #define L2 104&lt;br /&gt;
  #define Lp 60&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos move_0, move_1, vel, pg, eg, cg;&lt;br /&gt;
  find_object_2d::PointObjects p_objects;&lt;br /&gt;
  geometry_msgs::Point punto_obj_0;&lt;br /&gt;
  &lt;br /&gt;
  int cont = 0;&lt;br /&gt;
  int cont_obj = 0;&lt;br /&gt;
  &lt;br /&gt;
  int id;&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos inversa(geometry_msgs::Point destino)&lt;br /&gt;
  {&lt;br /&gt;
    &lt;br /&gt;
   	double z = destino.z; &lt;br /&gt;
    double x = destino.x;&lt;br /&gt;
	double y = destino.y;&lt;br /&gt;
	&lt;br /&gt;
	y = y + z*tan(atan2(45,250)); //Compensación para alcanzar la &amp;quot;y&amp;quot; intruducida, ya que la real es menor debido al peso del conjunto.&lt;br /&gt;
 &lt;br /&gt;
	int coordenadas_correctas = 1;&lt;br /&gt;
 &lt;br /&gt;
	double alfa, beta, beta_a, beta_p, gamma, delta, delta_a, delta_p;&lt;br /&gt;
	double z_p;&lt;br /&gt;
	double L_a, L;&lt;br /&gt;
 &lt;br /&gt;
	alfa = (atan2(x,z)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
	z_p = sqrt(pow(z,2)+pow(x,2));&lt;br /&gt;
 &lt;br /&gt;
	L = sqrt(pow(z_p,2)+pow(y,2));&lt;br /&gt;
 &lt;br /&gt;
	L_a = sqrt(pow(y,2)+pow(z_p-Lp,2));&lt;br /&gt;
 &lt;br /&gt;
	beta_p = atan2(y,z_p-Lp);&lt;br /&gt;
 &lt;br /&gt;
	beta_a = acos((pow(L1,2)+pow(L_a,2)-pow(L2,2))/(2*L1*L_a));&lt;br /&gt;
 &lt;br /&gt;
	beta = ((beta_p+beta_a)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
	gamma = acos((pow(L1,2)+pow(L2,2)-pow(L_a,2))/(2*L1*L2));&lt;br /&gt;
 &lt;br /&gt;
	delta_a = PI-(beta_a+gamma);&lt;br /&gt;
 &lt;br /&gt;
	gamma = (gamma*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
        delta_p = acos((pow(L_a,2)+pow(Lp,2)-pow(L,2))/(2*L_a*Lp));&lt;br /&gt;
 &lt;br /&gt;
	if (y&amp;lt;0) {&lt;br /&gt;
		delta = ((2*PI-(delta_p-delta_a))*180)/PI;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		delta = ((delta_p+delta_a)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
		if (isnan(delta)) {&lt;br /&gt;
			delta = ((PI+delta_a)*180)/PI;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	if (isnan(gamma)) // si no hay solución&lt;br /&gt;
	{&lt;br /&gt;
		coordenadas_correctas = 0; &lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	::move_1.base = ((alfa+150)*1023)/300;&lt;br /&gt;
	::move_1.arti1 = ((beta+60)*1023)/300;&lt;br /&gt;
	::move_1.arti2 = ((gamma-30)*1023)/300;&lt;br /&gt;
	::move_1.arti3 = ((delta-30)*1023)/300;&lt;br /&gt;
	::move_1.pinza = 511;&lt;br /&gt;
	&lt;br /&gt;
	::vel.base = abs(::move_1.base - ::pg.base)/5;&lt;br /&gt;
	::vel.arti1 = abs(::move_1.arti1 - ::pg.arti1)/5;	&lt;br /&gt;
	::vel.arti2 = abs(::move_1.arti2 - ::pg.arti2)/5;&lt;br /&gt;
	::vel.arti3 = abs(::move_1.arti3 - ::pg.arti3)/5;&lt;br /&gt;
	::vel.pinza = abs(::move_1.pinza - ::pg.pinza);		&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	if (coordenadas_correctas == 1 &amp;amp;&amp;amp; (205 &amp;lt;= ::move_1.base &amp;amp;&amp;amp; ::move_1.base &amp;lt;= 818) &amp;amp;&amp;amp; (120 &amp;lt;= ::move_1.arti1 &amp;amp;&amp;amp; ::move_1.arti1 &amp;lt;= 920) &amp;amp;&amp;amp; ::move_1.arti2 &amp;gt;= 50  &amp;amp;&amp;amp; ::move_1.arti3 &amp;lt;= 828) {&lt;br /&gt;
		move_0 = move_1;&lt;br /&gt;
		&lt;br /&gt;
		return ::move_0;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		std::cout&amp;lt;&amp;lt;&amp;quot;error coordenadas no validas o punto fuera del alcance&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
			&lt;br /&gt;
		return ::move_0;				&lt;br /&gt;
	}  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void indicar(geometry_msgs::Point indicado)&lt;br /&gt;
  {&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1); &lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);&lt;br /&gt;
	  	&lt;br /&gt;
	  	brazo_fer::Servos mover;&lt;br /&gt;
		&lt;br /&gt;
		double x0 = indicado.x;&lt;br /&gt;
		double z0 = indicado.z;&lt;br /&gt;
		&lt;br /&gt;
		indicado.z = indicado.z - 150*cos(atan2(x0,z0));&lt;br /&gt;
		indicado.x = indicado.x - 150*sin(atan2(x0,z0)); &lt;br /&gt;
		&lt;br /&gt;
		mover = inversa(indicado);&lt;br /&gt;
		&lt;br /&gt;
		brazo_fer::WriteServos indicar;&lt;br /&gt;
		&lt;br /&gt;
		indicar.posicion = mover;&lt;br /&gt;
		&lt;br /&gt;
		indicar.velocidad = ::vel;&lt;br /&gt;
		&lt;br /&gt;
		indicar.par.base = 1;&lt;br /&gt;
		indicar.par.arti1 = 1;&lt;br /&gt;
		indicar.par.arti2 = 1;&lt;br /&gt;
		indicar.par.arti3 = 1;&lt;br /&gt;
		indicar.par.pinza = 1;		&lt;br /&gt;
						&lt;br /&gt;
		move_pub_.publish(indicar);&lt;br /&gt;
		hand_pub_.publish(indicar);&lt;br /&gt;
		&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void home()&lt;br /&gt;
  {&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1); &lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);&lt;br /&gt;
	  	&lt;br /&gt;
	  	brazo_fer::Servos mover;&lt;br /&gt;
		&lt;br /&gt;
		geometry_msgs::Point home;&lt;br /&gt;
		&lt;br /&gt;
		home.x = 0;&lt;br /&gt;
		home.y = 80;&lt;br /&gt;
		home.z = 50;&lt;br /&gt;
		&lt;br /&gt;
		mover = inversa(home);&lt;br /&gt;
		&lt;br /&gt;
		brazo_fer::WriteServos inicio;&lt;br /&gt;
		&lt;br /&gt;
		inicio.posicion = mover;&lt;br /&gt;
		&lt;br /&gt;
		inicio.velocidad = ::vel;&lt;br /&gt;
		&lt;br /&gt;
		inicio.par.base = 1;&lt;br /&gt;
		inicio.par.arti1 = 1;&lt;br /&gt;
		inicio.par.arti2 = 1;&lt;br /&gt;
		inicio.par.arti3 = 1;&lt;br /&gt;
		inicio.par.pinza = 1;		&lt;br /&gt;
						&lt;br /&gt;
		move_pub_.publish(inicio);&lt;br /&gt;
		hand_pub_.publish(inicio);&lt;br /&gt;
		&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  void posicion(const brazo_fer::ReadServos&amp;amp; pose)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	brazo_fer::Servos p = pose.posicion;&lt;br /&gt;
	&lt;br /&gt;
	::pg = pose.posicion;&lt;br /&gt;
        ::eg = pose.estado;&lt;br /&gt;
        ::cg = pose.corriente;&lt;br /&gt;
 &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  void punto(const find_object_2d::PointObjects&amp;amp; point)&lt;br /&gt;
  {	&lt;br /&gt;
	::p_objects = point;&lt;br /&gt;
	&lt;br /&gt;
	geometry_msgs::Point punto_obj_1;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	if (::id == 100 || ::cont == 0)&lt;br /&gt;
	{	&lt;br /&gt;
		home();&lt;br /&gt;
	&lt;br /&gt;
		::cont = ::cont + 1;&lt;br /&gt;
	} &lt;br /&gt;
&lt;br /&gt;
	int max = ::p_objects.objeto.size();&lt;br /&gt;
&lt;br /&gt;
	for (int i=0; i &amp;lt; max; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (::p_objects.objeto[i].id == ::id)&lt;br /&gt;
		{&lt;br /&gt;
			punto_obj_1 = ::p_objects.objeto[i].punto;&lt;br /&gt;
			&lt;br /&gt;
			::cont_obj = 1;&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if (::cont_obj == 0)&lt;br /&gt;
	{&lt;br /&gt;
		std::cout&amp;lt;&amp;lt;&amp;quot;Objeto no presente en la escena&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	else if (abs(punto_obj_1.x - ::punto_obj_0.x) &amp;gt; 20 || abs(punto_obj_1.y - ::punto_obj_0.y) &amp;gt; 20 || abs(punto_obj_1.z - ::punto_obj_0.z) &amp;gt; 20)&lt;br /&gt;
	{&lt;br /&gt;
		indicar(punto_obj_1);&lt;br /&gt;
		&lt;br /&gt;
		::punto_obj_0 = punto_obj_1;									&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	::cont_obj = 0;&lt;br /&gt;
&lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
  void objeto(const std_msgs::Int16&amp;amp; id)&lt;br /&gt;
  {&lt;br /&gt;
	::id = id.data;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;seguir_objetos&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber pose_sub_= n.subscribe(&amp;quot;pose_arm&amp;quot;, 1, posicion); &lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber point_sub_= n.subscribe(&amp;quot;point&amp;quot;, 1, punto);&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber object_sub_= n.subscribe(&amp;quot;selected_object&amp;quot;, 1, objeto);  	 &lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1); &lt;br /&gt;
  	   &lt;br /&gt;
 &lt;br /&gt;
	ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to add the next line to the file &amp;quot;CMakeLists.txt&amp;quot; of the ''package'' &amp;quot;[[MYRAbot's arm control (bioloid+arduino)#Control programs|brazo_fer]]&amp;quot; in order to compile and create the executable file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;rosbuild_add_executable(seguir src/seguir.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next commands in a terminal in order to compile and create the executable file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;seguir.launch&amp;quot; within the folder &amp;quot;launch&amp;quot; of the package &amp;quot;[[MYRAbot's arm control (bioloid+arduino)#Control programs|brazo_fer]]&amp;quot; with the content that is shown below, in order to launch the communication node with[http://www.arduino.cc/es/ arduino], the previous ''launcher'' &amp;quot;encontrar_objetos.launch&amp;quot; and our program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;serial_node&amp;quot; pkg=&amp;quot;rosserial_python&amp;quot; type=&amp;quot;serial_node.py&amp;quot; args=&amp;quot;/dev/ttyACM0&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;seguir&amp;quot; pkg=&amp;quot;brazo_fer&amp;quot; type=&amp;quot;seguir_objetos&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find find_object_2d)/launch/encontrar_objetos.launch&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start the ''launcher'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer seguir.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can see in this [[MYRAbot model for simulation (urdf+gazebo)#Execution_2|video]] the execution of this program in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] simlator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=MYRAbot%27s_arm_control_(bioloid%2barduino)&amp;diff=4214</id>
		<title>MYRAbot's arm control (bioloid+arduino)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=MYRAbot%27s_arm_control_(bioloid%2barduino)&amp;diff=4214"/>
				<updated>2014-09-29T11:07:05Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Bioloid arm=&lt;br /&gt;
&lt;br /&gt;
The arm that we will use is that Carlos Rodríguez Hernández developed in the project [[Carlos-TFM-MYRABot01 | MYRA Robot: Hardware Update ]]. The main components are:&lt;br /&gt;
[[file:IMG_4871_b.JPG|thumb|200px|Photograph of [http://www.robotis.com/xe/BIOLOID_main_en Bioloid] arm.]]&lt;br /&gt;
&lt;br /&gt;
* [http://arduino.cc/en/Main/ArduinoBoardMega2560 Arduino mega 2560] board.&lt;br /&gt;
* [http://www.futurlec.com/74LS/74LS241.shtml 74LS241] chip (tree-state Buffer).&lt;br /&gt;
* Voltage regulator circuit.&lt;br /&gt;
* 5 serial servo motors [http://support.robotis.com/en/product/dynamixel/ax_series/dxl_ax_actuator.htm Dynamixel AX-12A].&lt;br /&gt;
* Mounting components of Bioloid kit.&lt;br /&gt;
* Parts made for the gripper and to fix to MYRAbot.&lt;br /&gt;
&lt;br /&gt;
=Arduino IDE and rosserial=&lt;br /&gt;
&lt;br /&gt;
For the communication among  [http://www.arduino.cc arduino] and [http://www.ros.org ROS], we install [http://www.arduino.cc arduino] IDE and rosserial (''package'' de [http://www.ros.org ROS] which include the ''package'' rosserial_arduino with the libraries for [http://www.arduino.cc arduino]. We will start to installing [http://www.arduino.cc arduino] IDE, for this, we will execute the next commands in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get update&lt;br /&gt;
sudo apt-get install arduino arduino-core&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
When the installation of [http://www.arduino.cc arduino] software ends, we will install the [http://www.ros.org ROS] ''package''. For this, we will execute the next command in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get install ros-ROS_DISTRO-rosserial&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When we will have installed [http://www.arduino.cc arduino] IDE and the ''stack'' rosserial, we must copy the libraries for the ''package'' rosserial_arduino to the sketchbook of [http://www.arduino.cc arduino]. For this, we will execute the next commands in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd rosserial_arduino/libraries&lt;br /&gt;
cp -r ros_lib /home/”SESSION_NAME”/sketchbook/libraries/ros_lib&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Creating a package for our programs==&lt;br /&gt;
&lt;br /&gt;
Previously, we must have created a [[Fernando-TFM-ROS02#Creando un espacio de trabajo|workspace]] for our [http://www.ros.org ROS] distribution. We will create a ''package'' in order to compile and send our programs to [http://www.arduino.cc arduino] board. We will make a ''package'' named &amp;quot;arduino_fer&amp;quot; with the the necessary dependences for our programs, for this, we will execute the next commands in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;cd ~/ros_workspace&lt;br /&gt;
roscreate-pkg arduino_fer rosserial_arduino std_msgs&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We must change the content of the file &amp;quot;CMakeLists.txt&amp;quot; of our ''package'' for the next lines:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;cmake_minimum_required(VERSION 2.4.6)&lt;br /&gt;
include($ENV{ROS_ROOT}/core/rosbuild/rosbuild.cmake)&lt;br /&gt;
&lt;br /&gt;
rosbuild_find_ros_package(rosserial_arduino)&lt;br /&gt;
include(${rosserial_arduino_PACKAGE_PATH}/cmake_scripts/rosserial.cmake)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next commands in a terminal in order to finalize the creation of the package:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd arduino_fer&lt;br /&gt;
cmake .&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==First program (To whole power)==&lt;br /&gt;
&lt;br /&gt;
We will make the first program that publishes a ''topic'' named &amp;quot;cifra&amp;quot; and subscribe a ''topic'' named &amp;quot;resultado&amp;quot;. When we publish a number in the ''topic'' &amp;quot;cifra&amp;quot; the program multiplies the number by itself and publishes the result in the ''topic'' &amp;quot;resultado&amp;quot;. The code of the program is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;ros.h&amp;gt; &lt;br /&gt;
#include &amp;lt;std_msgs/Int16.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
ros::NodeHandle nh; &lt;br /&gt;
int pot; &lt;br /&gt;
&lt;br /&gt;
void potencia( const std_msgs::Int16&amp;amp; cifra){ &lt;br /&gt;
&lt;br /&gt;
::pot = cifra.data*cifra.data; &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
ros::Subscriber&amp;lt;std_msgs::Int16&amp;gt; sub(&amp;quot;cifra&amp;quot;, &amp;amp;potencia ); &lt;br /&gt;
std_msgs::Int16 res; &lt;br /&gt;
&lt;br /&gt;
ros::Publisher pub(&amp;quot;resultado&amp;quot;, &amp;amp;res); &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{ &lt;br /&gt;
  nh.initNode(); &lt;br /&gt;
  nh.subscribe(sub);  &lt;br /&gt;
  nh.advertise(pub); &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void loop() &lt;br /&gt;
{ &lt;br /&gt;
  res.data = ::pot; &lt;br /&gt;
  pub.publish( &amp;amp;res ); &lt;br /&gt;
  nh.spinOnce(); &lt;br /&gt;
  delay(1000); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We must add to the file &amp;quot;CMakeLists.txt&amp;quot; the lines indicated below in order in order to compile the program and send to [http://www.arduino.cc arduino] board:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;set(FIRMWARE_NAME potencia)&lt;br /&gt;
&lt;br /&gt;
set(${FIRMWARE_NAME}_BOARD MODELO_NUESTRA_PLACA)   # Model of arduino board&lt;br /&gt;
set(${FIRMWARE_NAME}_SRCS src/potencia.cpp )&lt;br /&gt;
set(${FIRMWARE_NAME}_PORT /dev/ttyACM0)            # Serial port to upload&lt;br /&gt;
generate_ros_firmware(${FIRMWARE_NAME})&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is set the name for the program, type of [http://www.arduino.cc arduino] board (uno, atmega328 o mega2560), name and address of the file, and serial port of the PC used to communicate with the board. We have to execute the next commands in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd arduino_fer&lt;br /&gt;
make potencia-upload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We must launch the [http://www.ros.org ROS] core in a terminal in order to allow the execution of the program, if it is not already launched. We will execute the next command in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscore&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In other terminal, we will execute the node that communicates [http://www.ros.org ROS] with the [http://www.arduino.cc arduino] board, we set the port that is used to communication. In order to know the port that is used, we can see the port used in the menu &amp;quot;Tools&amp;quot;&amp;gt;&amp;quot;Serial port&amp;quot; of the software [http://www.arduino.cc arduino] IDE, the board must be plugged. In this case the port is &amp;quot;ttyACM0&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun rosserial_python serial_node.py /dev/ttyACM0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute in other terminal the next command in order to publish a number in the ''topic'' &amp;quot;cifra&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub cifra std_msgs/Int16 NUMBER --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute in other terminal the next command in order to test that the program calculates the square of the published number in the ''topic'' &amp;quot;cifra&amp;quot; and publishes the result in the ''topic'' &amp;quot;resultado&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic echo resultado&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Arduino and servo motors Dinamixel=&lt;br /&gt;
&lt;br /&gt;
In [http://savageelectronics.blogspot.com.es/2011/01/arduino-y-dynamixel-ax-12.html Savage Electronics] we can find the hardware adaptations to communicate the [http://arduino.cc/en/Main/ArduinoBoardMega2560 arduino mega 2560] board with the servo motors [http://support.robotis.com/en/product/dynamixel/ax_series/dxl_ax_actuator.htm Dynamixel AX-12A] of [http://www.robotis.com/xe/ ROBOTICS]. Here also we can find the libraries for programming ([http://savageelectronics.blogspot.com.es/2011/08/actualizacion-biblioteca-dynamixel.html DynamixelSerial]).&lt;br /&gt;
&lt;br /&gt;
==Second program (Move)==&lt;br /&gt;
&lt;br /&gt;
This program is a test of the communications between [http://arduino.cc/en/Main/ArduinoBoardMega2560 arduino mega 2560] board and servo motor [http://support.robotis.com/en/product/dynamixel/ax_series/dxl_ax_actuator.htm Dynamixel AX-12A]. The program publishes the ''topic'' &amp;quot;angulo&amp;quot; which contains the position of the servo motor (between 0 and 1023) and subscribes the ''topic'' &amp;quot;giro&amp;quot; which receives the goal position (between 0 and 1023). The servo motor will move with a constant velocity of 128 (Integer between 0 and 1023). The code of the program is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;ros.h&amp;gt;&lt;br /&gt;
#include &amp;lt;std_msgs/Int16.h&amp;gt;&lt;br /&gt;
#include &amp;lt;DynamixelSerial1.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ros::NodeHandle nh;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void mover( const std_msgs::Int16&amp;amp; giro){&lt;br /&gt;
&lt;br /&gt;
  Dynamixel.moveSpeed(1,giro.data,128);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ros::Subscriber&amp;lt;std_msgs::Int16&amp;gt; sub(&amp;quot;giro&amp;quot;, &amp;amp;mover );&lt;br /&gt;
&lt;br /&gt;
std_msgs::Int16 ang;&lt;br /&gt;
ros::Publisher pub(&amp;quot;angulo&amp;quot;, &amp;amp;ang);&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  nh.initNode();&lt;br /&gt;
  nh.subscribe(sub);  &lt;br /&gt;
  nh.advertise(pub);&lt;br /&gt;
  Dynamixel.begin(1000000,2);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  int posicion = Dynamixel.readPosition(1);&lt;br /&gt;
  ang.data = posicion;&lt;br /&gt;
  pub.publish( &amp;amp;ang );&lt;br /&gt;
  nh.spinOnce();&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can't use the [[#Creating a package for our programs|previously made ''package'']] in order to compile and send the program to the [http://www.arduino.cc arduino] board. We must use the [http://www.arduino.cc arduino] IDE software due to that we use a external library to [http://www.ros.org ROS] system. When the program was uploaded we will execute the next command in a terminal, to launch the core system:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscore&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in other terminal in order to launch the communication node [http://www.ros.org ROS]-[http://www.arduino.cc arduino]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun rosserial_python serial_node.py /dev/ttyACM0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in other terminal in order to publish the goal position of the servo motor in the ''topic'' &amp;quot;giro&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub giro std_msgs/Int16 GOAL_POSITION --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The servo motor will immediately move to the goal position. We can execute the next command in other terminal in order to see the position value of the servo motor at any time:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic echo angulo&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Arm's kinematics model=&lt;br /&gt;
&lt;br /&gt;
We need to know the spatial position of the arm for the correct placement of the gripper. The position depends on the position angle of the servo motors (direct kinematics). We know the goal point and we must obtain the position angle of the servo motors to achieve it (inverse kinematics). The arm have 5 joints (1 to open-close gripper) and all work in the same plane, for this reason we don't need use the [http://en.wikipedia.org/wiki/Denavit%E2%80%93Hartenberg_parameters Denavit-Hartenberg parameters].&lt;br /&gt;
&lt;br /&gt;
[[file:brazo_cinematica.jpg|thumb|500px|center|Diagrams for kinematics study]]&lt;br /&gt;
&lt;br /&gt;
==Inverse kinematic==&lt;br /&gt;
&lt;br /&gt;
We use the diagram shown above to obtain the inverse kinematics. Where ''x'', ''y'' and ''z'' are the goal point coordinates, and &amp;amp;epsilon; is the angle that the gripper forms with x-z plane. The obtained equations are shown below:&lt;br /&gt;
&lt;br /&gt;
[[file:brazo_ecuaciones.jpg]]&lt;br /&gt;
&lt;br /&gt;
We have to calculate the value of position angle for the servo motors [http://support.robotis.com/en/product/dynamixel/ax_series/dxl_ax_actuator.htm Dynamixel AX-12A] according its turn limits (1023 positions throughout 300º):&lt;br /&gt;
&lt;br /&gt;
[[file:brazo_dynamixel_AX-12.jpg|thumb|250px|Diagrama de ángulos servomotor [http://support.robotis.com/en/product/dynamixel/ax_series/dxl_ax_actuator.htm Dynamixel AX-12A]]]&lt;br /&gt;
&lt;br /&gt;
[[file:brazo_ecuacion_base.jpg]] We add 150º from the position angle in order to set the 0º coincident with z axis.&lt;br /&gt;
&lt;br /&gt;
[[file:brazo_ecuacion_arti1.jpg]] We add 60º from the position angle in order to set the 0º coincident with z axis.&lt;br /&gt;
&lt;br /&gt;
[[file:brazo_ecuacion_arti2.jpg]] We subtract 30º from the position angle in order to set the 0º coincident with the longitudinal axis of servo motor.&lt;br /&gt;
&lt;br /&gt;
[[file:brazo_ecuacion_arti3.jpg]] We subtract 30º from the position angle in order to set the 0º coincident with the longitudinal axis of servo motor.&lt;br /&gt;
&lt;br /&gt;
==Direct kinematics==&lt;br /&gt;
&lt;br /&gt;
We can use the previous equations to obtain the placement point through the position angle of the servo motors. The equations are shown below:&lt;br /&gt;
&lt;br /&gt;
[[file:brazo_ecuaciones_directa.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Arm workspace and boundaries==&lt;br /&gt;
&lt;br /&gt;
We need to set the boundaries of the position angles of the servo motors to avoid self collisions and collision with other parts of MYRAbot. We have made a spreadsheet using the equations for inverse and direct kinematics. The spreadsheet shows the spacial placement of the arm in two dispersion graphs.&lt;br /&gt;
&lt;br /&gt;
[[file:brazo_cinematica_excel.jpg|thumb|750px|center|Spreadsheet of inverse and direct kinematics, [http://www.fernando.casadogarcia.es/files/cinematica_brazo_MYRAbot.xlsx download]]]&lt;br /&gt;
&lt;br /&gt;
=Control programs=&lt;br /&gt;
&lt;br /&gt;
==Third program (Come here)==&lt;br /&gt;
&lt;br /&gt;
We place a interface program in [http://www.arduino.cc arduino] board that communicates the servo motor with the control programs in [http://www.ros.org ROS]. We need publish and subscribe the data of 5 servo motors so we will create own messages.&lt;br /&gt;
&lt;br /&gt;
===Creating custom messages in ROS===&lt;br /&gt;
&lt;br /&gt;
First, we will create a new ''package'' with the necessary dependences for our programs (std_msgs geometry_msgs roscpp). We will execute the next commands in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd ~/ros_workspace&lt;br /&gt;
roscreate-pkg brazo_fer std_msgs geometry_msgs roscpp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a folder named &amp;quot;msg&amp;quot; within the created ''package'', here we place the next description files for our messages (data type and field name).&lt;br /&gt;
&lt;br /&gt;
We will create the basis message that contains the data for each servo motor. We will create a file named &amp;quot;Servos.msg&amp;quot; with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;int16 base&lt;br /&gt;
int16 arti1&lt;br /&gt;
int16 arti2&lt;br /&gt;
int16 arti3&lt;br /&gt;
int16 pinza&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will use the previous message in order to define the data type. We will create a file named &amp;quot;WriteServos.msg&amp;quot; to send data to the servo motors (position, velocity and torque) with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;Servos posicion&lt;br /&gt;
Servos velocidad&lt;br /&gt;
Servos par&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;ReadServos.msg&amp;quot; in order to receive data to the servo motors (position, status and current) with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;Servos posicion&lt;br /&gt;
Servos estado&lt;br /&gt;
Servos corriente&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to edit the file &amp;quot;CMakeLists.tx&amp;quot; in our ''package'' in order to allow the creation the [http://www.ros.org ROS] messages. We will delete the symbol &amp;quot;#&amp;quot; in the line that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;# rosbuild_gensrv()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next commands in a terminal in order to compile and create the messages, where &amp;quot;brazo_fer&amp;quot; is the name of the created ''package'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to add this messages to the [http://www.arduino.cc arduino] libraries in &amp;quot;rosserial&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun rosserial_client make_library.py ~/sketchbook/libraries brazo_fer&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Arduino program===&lt;br /&gt;
&lt;br /&gt;
The program for [http://www.arduino.cc arduino] board subscribes the ''topic'' &amp;quot;move_arm&amp;quot; which receives the orders for the servo motors and publishes the &amp;quot;topic&amp;quot; &amp;quot;pose_arm&amp;quot; which sends the servo motors information. The code of the program is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ros.h&amp;gt;&lt;br /&gt;
#include &amp;lt;brazo_fer/Servos.h&amp;gt;&lt;br /&gt;
#include &amp;lt;brazo_fer/WriteServos.h&amp;gt;&lt;br /&gt;
#include &amp;lt;brazo_fer/ReadServos.h&amp;gt;&lt;br /&gt;
#include &amp;lt;std_msgs/Bool.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;DynamixelSerial1.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
ros::NodeHandle nh;&lt;br /&gt;
 &lt;br /&gt;
void mover(const brazo_fer::WriteServos&amp;amp; brazo){&lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos par = brazo.par;&lt;br /&gt;
  &lt;br /&gt;
  brazo_fer::Servos vel = brazo.velocidad;&lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos move = brazo.posicion;&lt;br /&gt;
 &lt;br /&gt;
  int posicion[4];&lt;br /&gt;
  &lt;br /&gt;
  if (par.base == 0){&lt;br /&gt;
    Dynamixel.torqueStatus(1,OFF);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    Dynamixel.torqueStatus(1,ON);&lt;br /&gt;
 &lt;br /&gt;
    Dynamixel.moveSpeed(1,move.base,vel.base);  &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  if (par.arti1 == 0){&lt;br /&gt;
    Dynamixel.torqueStatus(2,OFF);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    Dynamixel.torqueStatus(2,ON);&lt;br /&gt;
 &lt;br /&gt;
    Dynamixel.moveSpeed(2,move.arti1,vel.arti1);  &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  if (par.arti2 == 0){&lt;br /&gt;
    Dynamixel.torqueStatus(3,OFF);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    Dynamixel.torqueStatus(3,ON);&lt;br /&gt;
 &lt;br /&gt;
    Dynamixel.moveSpeed(3,move.arti2,vel.arti2);  &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  if (par.arti3 == 0){&lt;br /&gt;
    Dynamixel.torqueStatus(4,OFF);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    Dynamixel.torqueStatus(4,ON);    &lt;br /&gt;
 &lt;br /&gt;
    Dynamixel.moveSpeed(4,move.arti3,vel.arti3);  &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void pinza(const brazo_fer::WriteServos&amp;amp; pinza){&lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos par = pinza.par;&lt;br /&gt;
  &lt;br /&gt;
  brazo_fer::Servos vel = pinza.velocidad;&lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos move = pinza.posicion;&lt;br /&gt;
  &lt;br /&gt;
  int posicion;&lt;br /&gt;
  &lt;br /&gt;
  if (par.pinza == 0){&lt;br /&gt;
    Dynamixel.torqueStatus(5,OFF);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    Dynamixel.torqueStatus(5,ON);    &lt;br /&gt;
 &lt;br /&gt;
    Dynamixel.moveSpeed(5,move.pinza,vel.pinza);  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
ros::Subscriber&amp;lt;brazo_fer::WriteServos&amp;gt; move_sub(&amp;quot;move_arm&amp;quot;, &amp;amp;mover );&lt;br /&gt;
ros::Subscriber&amp;lt;brazo_fer::WriteServos&amp;gt; hand_sub(&amp;quot;hand_arm&amp;quot;, &amp;amp;pinza );&lt;br /&gt;
 &lt;br /&gt;
brazo_fer::ReadServos pec;&lt;br /&gt;
std_msgs::Bool pulsador;&lt;br /&gt;
 &lt;br /&gt;
ros::Publisher pose_pub(&amp;quot;pose_arm&amp;quot;, &amp;amp;pec);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  nh.initNode();&lt;br /&gt;
  nh.subscribe(move_sub);&lt;br /&gt;
  nh.subscribe(hand_sub);  &lt;br /&gt;
  nh.advertise(pose_pub);&lt;br /&gt;
  &lt;br /&gt;
  Dynamixel.begin(1000000,2);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  brazo_fer::Servos pos;&lt;br /&gt;
  brazo_fer::Servos est;&lt;br /&gt;
  brazo_fer::Servos cor; &lt;br /&gt;
 &lt;br /&gt;
  pos.base = Dynamixel.readPosition(1);&lt;br /&gt;
  pos.arti1 = Dynamixel.readPosition(2);&lt;br /&gt;
  pos.arti2 = Dynamixel.readPosition(3);&lt;br /&gt;
  pos.arti3 = Dynamixel.readPosition(4);&lt;br /&gt;
  pos.pinza = Dynamixel.readPosition(5);&lt;br /&gt;
 &lt;br /&gt;
  est.base = Dynamixel.moving(1);&lt;br /&gt;
  est.arti1 = Dynamixel.moving(2);&lt;br /&gt;
  est.arti2 = Dynamixel.moving(3);&lt;br /&gt;
  est.arti3 = Dynamixel.moving(4);&lt;br /&gt;
  est.pinza = Dynamixel.moving(5);      &lt;br /&gt;
 &lt;br /&gt;
  cor.base = Dynamixel.readLoad(1);&lt;br /&gt;
  cor.arti1 = Dynamixel.readLoad(2);&lt;br /&gt;
  cor.arti2 = Dynamixel.readLoad(3);&lt;br /&gt;
  cor.arti3 = Dynamixel.readLoad(4);&lt;br /&gt;
  cor.pinza = Dynamixel.readLoad(5);    &lt;br /&gt;
 &lt;br /&gt;
  pec.posicion = pos;&lt;br /&gt;
  pec.estado = est;&lt;br /&gt;
  pec.corriente = cor;  &lt;br /&gt;
 &lt;br /&gt;
  pose_pub.publish( &amp;amp;pec );&lt;br /&gt;
  &lt;br /&gt;
  nh.spinOnce();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will use [http://www.arduino.cc arduino] IDE software to compile and send the program to the board. We will use this program for the next control programs since it is a interface between the servo motors and [http://www.ros.org ROS] system.&lt;br /&gt;
&lt;br /&gt;
===ROS program===&lt;br /&gt;
&lt;br /&gt;
This program uses the equations of the inverse kinematics to set the position angle of the servo motors in order to reach the goal point that is within the workspace. The program subscribe the ''topic'' &amp;quot;point&amp;quot; which receives the goal point, also it subscribes the ''topic'' &amp;quot;pose_arm&amp;quot; which receives the information of servo motors, and publish the ''topic' &amp;quot;move_arm&amp;quot; which indicates to the [http://www.arduino.cc arduino] program the position, velocity and torque of for the servo motors. We will create a file named &amp;quot;control_v01.cpp&amp;quot; with the content that is shown below within the folder &amp;quot;src&amp;quot; of our ''package'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  #define PI 3.14159265&lt;br /&gt;
  #define L1 104&lt;br /&gt;
  #define L2 104&lt;br /&gt;
  #define Lp 60&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos move, vel, p, e, c;&lt;br /&gt;
 &lt;br /&gt;
  void posicion(const brazo_fer::ReadServos&amp;amp; pose)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
    ::p = pose.posicion;&lt;br /&gt;
    ::e = pose.estado;&lt;br /&gt;
    ::c = pose.corriente;&lt;br /&gt;
 &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  void punto(const geometry_msgs::Point&amp;amp; point)&lt;br /&gt;
  {	&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
 &lt;br /&gt;
  	double x = point.x;&lt;br /&gt;
  	double y = point.y;&lt;br /&gt;
	double z = point.z;&lt;br /&gt;
	&lt;br /&gt;
	y = y + z*tan(atan2(45,250));&lt;br /&gt;
 &lt;br /&gt;
	int coordenadas_correctas = 1;&lt;br /&gt;
 &lt;br /&gt;
	double alfa, beta, beta_a, beta_p, beta_pp, gamma, delta, delta_a, delta_p, epsilon;&lt;br /&gt;
	double z_p;&lt;br /&gt;
	double L_a, L;&lt;br /&gt;
 &lt;br /&gt;
	epsilon = 0; &lt;br /&gt;
 &lt;br /&gt;
	alfa = (atan2(x,z)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
	z_p = sqrt(pow(z,2)+pow(x,2));&lt;br /&gt;
 &lt;br /&gt;
	L = sqrt(pow(z_p,2)+pow(y,2));&lt;br /&gt;
 &lt;br /&gt;
	L_a = sqrt(pow(y+(Lp*sin(epsilon)),2)+pow(z_p-(Lp*cos(epsilon)),2));&lt;br /&gt;
 &lt;br /&gt;
	beta_p = atan2(y+(Lp*sin(epsilon)),z_p-(Lp*cos(epsilon)));&lt;br /&gt;
	&lt;br /&gt;
	beta_pp = atan2(y,z_p);&lt;br /&gt;
 &lt;br /&gt;
	beta_a = acos((pow(L1,2)+pow(L_a,2)-pow(L2,2))/(2*L1*L_a));&lt;br /&gt;
 &lt;br /&gt;
	beta = ((beta_p+beta_a)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
	gamma = acos((pow(L1,2)+pow(L2,2)-pow(L_a,2))/(2*L1*L2));&lt;br /&gt;
 &lt;br /&gt;
	delta_a = PI-(beta_a+gamma);&lt;br /&gt;
 &lt;br /&gt;
	gamma = (gamma*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
        delta_p = acos((pow(L_a,2)+pow(Lp,2)-pow(L,2))/(2*L_a*Lp));       &lt;br /&gt;
 &lt;br /&gt;
	if (beta_pp &amp;gt; beta_p) {&lt;br /&gt;
		delta = ((2*PI-(delta_p-delta_a))*180)/PI;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		delta = ((delta_p+delta_a)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
		if (isnan(delta)) {&lt;br /&gt;
			delta = ((PI+delta_a)*180)/PI;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	if (isnan(gamma)) // si no hay solución&lt;br /&gt;
	{&lt;br /&gt;
		coordenadas_correctas = 0; &lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	::move.base = ((alfa+150)*1023)/300;&lt;br /&gt;
	::move.arti1 = ((beta+60)*1023)/300;&lt;br /&gt;
	::move.arti2 = ((gamma-30)*1023)/300;&lt;br /&gt;
	::move.arti3 = ((delta-30)*1023)/300;&lt;br /&gt;
	::move.pinza = 511;&lt;br /&gt;
&lt;br /&gt;
	::vel.base = abs(::move.base - ::p.base)/5;&lt;br /&gt;
	::vel.arti1 = abs(::move.arti1 - ::p.arti1)/5;&lt;br /&gt;
	::vel.arti2 = abs(::move.arti2 - ::p.arti2)/5;&lt;br /&gt;
	::vel.arti3 = abs(::move.arti3 - ::p.arti3)/5;&lt;br /&gt;
	::vel.pinza = abs(::move.pinza - ::p.pinza);&lt;br /&gt;
 &lt;br /&gt;
	if (coordenadas_correctas == 1 &amp;amp;&amp;amp; (205 &amp;lt;= ::move.base &amp;amp;&amp;amp; ::move.base &amp;lt;= 818) &amp;amp;&amp;amp; (120 &amp;lt;= ::move.arti1 &amp;amp;&amp;amp; ::move.arti1 &amp;lt;= 920) &amp;amp;&amp;amp; ::move.arti2 &amp;gt;= 50  &amp;amp;&amp;amp; ::move.arti3 &amp;lt;= 828) {&lt;br /&gt;
 &lt;br /&gt;
                brazo_fer::WriteServos mover;&lt;br /&gt;
 &lt;br /&gt;
                mover.posicion = ::move;                &lt;br /&gt;
                 &lt;br /&gt;
                mover.velocidad = ::vel;&lt;br /&gt;
				&lt;br /&gt;
		mover.par.base = 1;&lt;br /&gt;
		mover.par.arti1 = 1;&lt;br /&gt;
		mover.par.arti2 = 1;&lt;br /&gt;
		mover.par.arti3 = 1;&lt;br /&gt;
		mover.par.pinza = 1;&lt;br /&gt;
                &lt;br /&gt;
                move_pub_.publish(mover);&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		std::cout&amp;lt;&amp;lt;&amp;quot;Error, invalid coordinates or unattainable point&amp;quot;&amp;lt;&amp;lt;std::endl;				&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;control_brazo&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber pose_sub_= n.subscribe(&amp;quot;pose_arm&amp;quot;, 1, posicion); &lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber point_sub_= n.subscribe(&amp;quot;point&amp;quot;, 1, punto); &lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to add the next line to the file &amp;quot;CMakeLists.txt&amp;quot; of our ''package'' in order to compile and create the executable file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;rosbuild_add_executable(contro_v01 src/control_v01.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next commands in a terminal in order to compile and create the executable file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running the program===&lt;br /&gt;
&lt;br /&gt;
First we will execute the next command in a terminal in order to launch the [http://www.ros.org ROS] core, if it has not launched previously.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscore&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in other terminal in order to launch the communication node [http://www.ros.org ROS]-[http://www.arduino.cc arduino]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun rosserial_python serial_node.py /dev/ttyACM0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to launch the control program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun brazo_fer control_v01&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to publish in the ''topic'' &amp;quot;point&amp;quot; the goal point:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub point geometry_msgs/Point '{x: 50, y: 100, z: 150}' --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The arm will move to the goal point. We can see the arm moving from the start point to the goal point in the next video:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;iwAcutO3C8g&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=iwAcutO3C8g Watch in YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fourth program (Grasp the bottle)==&lt;br /&gt;
&lt;br /&gt;
===Include file with functions===&lt;br /&gt;
&lt;br /&gt;
We have created a file with the control fuctions for the arm in orther to simplify and make more legible the programs. We will create a file named &amp;quot;brazo_fer.h&amp;quot; within the folder &amp;quot;include/brazo_fer&amp;quot; of the created ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifndef brazo_fer_H&lt;br /&gt;
#define brazo_fer_H&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;std_msgs/Int16.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot; &lt;br /&gt;
  &lt;br /&gt;
  #define PI 3.14159265&lt;br /&gt;
  #define L1 104&lt;br /&gt;
  #define L2 104&lt;br /&gt;
  #define Lp 60  &lt;br /&gt;
&lt;br /&gt;
geometry_msgs::Point directa(brazo_fer::Servos posicion_servos_0, int inclinacion_pinza)&lt;br /&gt;
  {&lt;br /&gt;
	&lt;br /&gt;
	double alfa, beta, beta_a, beta_p, beta_pp, gamma, delta, delta_a, delta_p1, delta_p2, epsilon;&lt;br /&gt;
	double z_p;&lt;br /&gt;
	double L_a, L;&lt;br /&gt;
	double a, b;&lt;br /&gt;
	double x, y, z;&lt;br /&gt;
	&lt;br /&gt;
	alfa = (((posicion_servos_0.base*300)/1023)-150)*PI/180;&lt;br /&gt;
	beta = (((posicion_servos_0.arti1*300)/1023)-60)*PI/180;&lt;br /&gt;
	gamma = (((posicion_servos_0.arti2*300)/1023)+30)*PI/180;&lt;br /&gt;
	delta = (((posicion_servos_0.arti3*300)/1023)+30)*PI/180;&lt;br /&gt;
	&lt;br /&gt;
	epsilon = (inclinacion_pinza*PI)/180;	&lt;br /&gt;
	&lt;br /&gt;
	L_a = sqrt(pow(L1,2)+pow(L2,2)-2*L1*L2*cos(gamma));&lt;br /&gt;
	&lt;br /&gt;
	beta_a = acos((pow(L1,2)+pow(L_a,2)-pow(L2,2))/(2*L1*L_a));&lt;br /&gt;
	&lt;br /&gt;
	beta_p = beta - beta_a;&lt;br /&gt;
	&lt;br /&gt;
	delta_a = PI - (beta_a + gamma);&lt;br /&gt;
	&lt;br /&gt;
	delta_p1 = delta - delta_a;&lt;br /&gt;
	&lt;br /&gt;
	delta_p2 = 2*PI - (delta - delta_a);&lt;br /&gt;
	&lt;br /&gt;
	if (delta_p1 &amp;lt; delta_p2) &lt;br /&gt;
	{&lt;br /&gt;
		L = sqrt(pow(L_a,2)+pow(Lp,2)-2*L_a*Lp*cos(delta_p1));&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		L = sqrt(pow(L_a,2)+pow(Lp,2)-2*L_a*Lp*cos(delta_p2));&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	z_p = L_a*cos(beta_p) + Lp*cos(epsilon);&lt;br /&gt;
	&lt;br /&gt;
	beta_pp = acos(z_p/L);&lt;br /&gt;
	&lt;br /&gt;
	a = L1*sin(beta);&lt;br /&gt;
	&lt;br /&gt;
	b = L2*sin(beta+gamma)+Lp*sin(epsilon);&lt;br /&gt;
	&lt;br /&gt;
	if (a &amp;gt;= b) &lt;br /&gt;
	{&lt;br /&gt;
		y = L*sin(beta_pp);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		y = -L*sin(beta_pp);&lt;br /&gt;
	}	&lt;br /&gt;
	&lt;br /&gt;
	z = z_p*cos(alfa);&lt;br /&gt;
	&lt;br /&gt;
	x = z_p*sin(alfa);&lt;br /&gt;
	&lt;br /&gt;
	geometry_msgs::Point punto;&lt;br /&gt;
	&lt;br /&gt;
	punto.x = x;&lt;br /&gt;
	punto.y = y;&lt;br /&gt;
	punto.z = z;&lt;br /&gt;
	&lt;br /&gt;
	return punto; &lt;br /&gt;
  } &lt;br /&gt;
  &lt;br /&gt;
brazo_fer::WriteServos inversa(geometry_msgs::Point destino, int inclinacion_pinza, brazo_fer::Servos posicion_servos_0, int velocidad) &lt;br /&gt;
  {&lt;br /&gt;
	  &lt;br /&gt;
	double x = destino.x;&lt;br /&gt;
  	double y = destino.y;&lt;br /&gt;
	double z = destino.z;&lt;br /&gt;
&lt;br /&gt;
	int coordenadas_correctas = 1;&lt;br /&gt;
&lt;br /&gt;
	double alfa, beta, beta_a, beta_p, beta_pp, gamma, delta, delta_a, delta_p, epsilon;&lt;br /&gt;
	double z_p;&lt;br /&gt;
	double L_a, L;&lt;br /&gt;
 &lt;br /&gt;
	epsilon = (inclinacion_pinza*PI)/180;&lt;br /&gt;
 &lt;br /&gt;
	alfa = (atan2(x,z)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
	z_p = sqrt(pow(z,2)+pow(x,2));&lt;br /&gt;
 &lt;br /&gt;
	L = sqrt(pow(z_p,2)+pow(y,2));&lt;br /&gt;
 &lt;br /&gt;
	L_a = sqrt(pow(y+(Lp*sin(epsilon)),2)+pow(z_p-(Lp*cos(epsilon)),2));&lt;br /&gt;
 &lt;br /&gt;
	beta_p = atan2(y+(Lp*sin(epsilon)),z_p-(Lp*cos(epsilon)));&lt;br /&gt;
	&lt;br /&gt;
	beta_pp = atan2(y,z_p);&lt;br /&gt;
 &lt;br /&gt;
	beta_a = acos((pow(L1,2)+pow(L_a,2)-pow(L2,2))/(2*L1*L_a));&lt;br /&gt;
 &lt;br /&gt;
	beta = ((beta_p+beta_a)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
	gamma = acos((pow(L1,2)+pow(L2,2)-pow(L_a,2))/(2*L1*L2));&lt;br /&gt;
 &lt;br /&gt;
	delta_a = PI-(beta_a+gamma);&lt;br /&gt;
 &lt;br /&gt;
	gamma = (gamma*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
        delta_p = acos((pow(L_a,2)+pow(Lp,2)-pow(L,2))/(2*L_a*Lp));       &lt;br /&gt;
 &lt;br /&gt;
	if (beta_pp &amp;gt; beta_p) {&lt;br /&gt;
		delta = ((2*PI-(delta_p-delta_a))*180)/PI;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		delta = ((delta_p+delta_a)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
		if (isnan(delta)) {&lt;br /&gt;
			delta = ((PI+delta_a)*180)/PI;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	if (isnan(gamma))&lt;br /&gt;
	{&lt;br /&gt;
		coordenadas_correctas = 0; &lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	brazo_fer::Servos posicion_servos_1;&lt;br /&gt;
	brazo_fer::Servos velocidad_servos;&lt;br /&gt;
	brazo_fer::Servos par_servos;	&lt;br /&gt;
	&lt;br /&gt;
	posicion_servos_1.base = ((alfa+150)*1023)/300;&lt;br /&gt;
	posicion_servos_1.arti1 = ((beta+60)*1023)/300;&lt;br /&gt;
	posicion_servos_1.arti2 = ((gamma-30)*1023)/300;&lt;br /&gt;
	posicion_servos_1.arti3 = ((delta-30)*1023)/300;	&lt;br /&gt;
	&lt;br /&gt;
	if (velocidad == 0)&lt;br /&gt;
	{&lt;br /&gt;
		velocidad_servos.base = abs(posicion_servos_1.base - posicion_servos_0.base)/5;&lt;br /&gt;
		if (velocidad_servos.base &amp;gt; 1023){velocidad_servos.base = 1023;}&lt;br /&gt;
		else if (velocidad_servos.base &amp;lt; 10){velocidad_servos.base = 10;}&lt;br /&gt;
		velocidad_servos.arti1 = abs(posicion_servos_1.arti1 - posicion_servos_0.arti1)/5;&lt;br /&gt;
		if (velocidad_servos.arti1 &amp;gt; 1023){velocidad_servos.arti1 = 1023;}&lt;br /&gt;
		else if (velocidad_servos.arti1 &amp;lt; 10){velocidad_servos.arti1 = 10;}&lt;br /&gt;
		velocidad_servos.arti2 = abs(posicion_servos_1.arti2 - posicion_servos_0.arti2)/5;&lt;br /&gt;
		if (velocidad_servos.arti2 &amp;gt; 1023){velocidad_servos.arti2 = 1023;}&lt;br /&gt;
		else if (velocidad_servos.arti2 &amp;lt; 10){velocidad_servos.arti2 = 10;}&lt;br /&gt;
		velocidad_servos.arti3 = abs(posicion_servos_1.arti3 - posicion_servos_0.arti3)/5;&lt;br /&gt;
		if (velocidad_servos.arti3 &amp;gt; 1023){velocidad_servos.arti3 = 1023;}&lt;br /&gt;
		else if (velocidad_servos.arti3 &amp;lt; 10){velocidad_servos.arti3 = 10;}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		velocidad_servos.base = abs(posicion_servos_1.base - posicion_servos_0.base)*(velocidad/10);&lt;br /&gt;
		if (velocidad_servos.base &amp;gt; 1023){velocidad_servos.base = 1023;}&lt;br /&gt;
		else if (velocidad_servos.base &amp;lt; 10){velocidad_servos.base = 10;}&lt;br /&gt;
		velocidad_servos.arti1 = abs(posicion_servos_1.arti1 - posicion_servos_0.arti1)*(velocidad/10);&lt;br /&gt;
		if (velocidad_servos.arti1 &amp;gt; 1023){velocidad_servos.arti1 = 1023;}&lt;br /&gt;
		else if (velocidad_servos.arti1 &amp;lt; 10){velocidad_servos.arti1 = 10;}&lt;br /&gt;
		velocidad_servos.arti2 = abs(posicion_servos_1.arti2 - posicion_servos_0.arti2)*(velocidad/10);&lt;br /&gt;
		if (velocidad_servos.arti2 &amp;gt; 1023){velocidad_servos.arti2 = 1023;}&lt;br /&gt;
		else if (velocidad_servos.arti2 &amp;lt; 10){velocidad_servos.arti2 = 10;}&lt;br /&gt;
		velocidad_servos.arti3 = abs(posicion_servos_1.arti3 - posicion_servos_0.arti3)*(velocidad/10);&lt;br /&gt;
		if (velocidad_servos.arti3 &amp;gt; 1023){velocidad_servos.arti3 = 1023;}&lt;br /&gt;
		else if (velocidad_servos.arti3 &amp;lt; 10){velocidad_servos.arti3 = 10;}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::Servos velocidad_servos_0;&lt;br /&gt;
	&lt;br /&gt;
	velocidad_servos_0.base = 0;&lt;br /&gt;
	velocidad_servos_0.arti1 = 0;&lt;br /&gt;
	velocidad_servos_0.arti2 = 0;&lt;br /&gt;
	velocidad_servos_0.arti3 = 0;&lt;br /&gt;
		&lt;br /&gt;
	par_servos.base = 1;&lt;br /&gt;
	par_servos.arti1 = 1;&lt;br /&gt;
	par_servos.arti2 = 1;&lt;br /&gt;
	par_servos.arti3 = 1;&lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::WriteServos move_arm;			&lt;br /&gt;
	&lt;br /&gt;
	if (coordenadas_correctas == 1 &amp;amp;&amp;amp; (205 &amp;lt;= posicion_servos_1.base &amp;amp;&amp;amp; posicion_servos_1.base &amp;lt;= 818) &amp;amp;&amp;amp; (120 &amp;lt;= posicion_servos_1.arti1 &amp;amp;&amp;amp; posicion_servos_1.arti1 &amp;lt;= 920) &amp;amp;&amp;amp; posicion_servos_1.arti2 &amp;gt;= 50  &amp;amp;&amp;amp; (posicion_servos_1.arti3 &amp;lt;= 828 &amp;amp;&amp;amp; posicion_servos_1.arti3 &amp;gt;= 195)) {&lt;br /&gt;
		move_arm.posicion = posicion_servos_1;&lt;br /&gt;
		move_arm.velocidad = velocidad_servos;&lt;br /&gt;
		move_arm.par = par_servos;&lt;br /&gt;
		return move_arm;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		std::cout&amp;lt;&amp;lt;&amp;quot;error coordenadas no validas o punto fuera del alcance&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		move_arm.posicion = posicion_servos_0;&lt;br /&gt;
		move_arm.velocidad = velocidad_servos_0;&lt;br /&gt;
		move_arm.par = par_servos;&lt;br /&gt;
		return move_arm;				&lt;br /&gt;
	}	  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
brazo_fer::WriteServos  control_pinza(brazo_fer::Servos posicion_servos_1, brazo_fer::Servos posicion_servos_0, brazo_fer::Servos corriente_servos)&lt;br /&gt;
  {&lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::Servos velocidad_servos;	  &lt;br /&gt;
	brazo_fer::Servos par_servos;&lt;br /&gt;
	&lt;br /&gt;
	velocidad_servos.pinza = 50;&lt;br /&gt;
	    &lt;br /&gt;
	par_servos.pinza = 1;&lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::WriteServos hand_arm;		&lt;br /&gt;
	&lt;br /&gt;
	if ((posicion_servos_1.pinza &amp;gt;= 480 &amp;amp;&amp;amp; posicion_servos_1.pinza &amp;lt;= 680 &amp;amp;&amp;amp; corriente_servos.pinza &amp;lt;= 300) || (posicion_servos_0.pinza &amp;gt; posicion_servos_1.pinza &amp;amp;&amp;amp; posicion_servos_1.pinza &amp;gt;= 480))&lt;br /&gt;
	{&lt;br /&gt;
		hand_arm.posicion = posicion_servos_1;&lt;br /&gt;
		hand_arm.velocidad = velocidad_servos;&lt;br /&gt;
		hand_arm.par = par_servos;&lt;br /&gt;
		return hand_arm;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		std::cout&amp;lt;&amp;lt;&amp;quot;Alcanzado límite de la pinza&amp;quot;&amp;lt;&amp;lt;std::endl;		&lt;br /&gt;
		hand_arm.posicion = posicion_servos_0;&lt;br /&gt;
		hand_arm.velocidad = velocidad_servos;&lt;br /&gt;
		hand_arm.par = par_servos;&lt;br /&gt;
		return hand_arm;&lt;br /&gt;
	}&lt;br /&gt;
  }  &lt;br /&gt;
  &lt;br /&gt;
geometry_msgs::Point home(brazo_fer::Servos posicion_servos_0, brazo_fer::Servos corriente_servos)&lt;br /&gt;
  { &lt;br /&gt;
	  &lt;br /&gt;
  	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);  &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);  &lt;br /&gt;
		&lt;br /&gt;
		geometry_msgs::Point punto_0;&lt;br /&gt;
		&lt;br /&gt;
		punto_0.x = 0;&lt;br /&gt;
		punto_0.y = 80;&lt;br /&gt;
		punto_0.z = 50;&lt;br /&gt;
		&lt;br /&gt;
		int inclinacion_pinza = 0;		&lt;br /&gt;
				&lt;br /&gt;
		brazo_fer::WriteServos inicio_brazo = inversa(punto_0, inclinacion_pinza, posicion_servos_0, 0);&lt;br /&gt;
	&lt;br /&gt;
		brazo_fer::Servos posicion_servos_1;&lt;br /&gt;
		&lt;br /&gt;
		posicion_servos_1.pinza = 511;&lt;br /&gt;
	&lt;br /&gt;
		brazo_fer::WriteServos inicio_pinza = control_pinza(posicion_servos_1, posicion_servos_0, corriente_servos);&lt;br /&gt;
			&lt;br /&gt;
		move_pub_.publish(inicio_brazo);&lt;br /&gt;
		&lt;br /&gt;
		hand_pub_.publish(inicio_pinza);&lt;br /&gt;
		&lt;br /&gt;
				&lt;br /&gt;
		return punto_0;&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Program===&lt;br /&gt;
&lt;br /&gt;
This program execute the sequence to grasp a little plastic bottle (the bottle is empty since the torque of the servo motors is low, we need more servo motors on each joint in order to pick more load). The sequence steps are shown below:&lt;br /&gt;
&lt;br /&gt;
# Approach (place the gripper at 70 mm of the bottle position).&lt;br /&gt;
# Placement in the bottle position.&lt;br /&gt;
# To close the gripper (until to hold the bottle).&lt;br /&gt;
# Lifting and approach.&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;control_v02.cpp&amp;quot; with the content that is shown below within the folder &amp;quot;src&amp;quot; of our ''package'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/brazo_fer.h&amp;quot;     &lt;br /&gt;
  #include &amp;quot;std_msgs/Int16.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;std_msgs/String.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot; &lt;br /&gt;
  &lt;br /&gt;
  geometry_msgs::Point punto_0,punto_1;&lt;br /&gt;
  &lt;br /&gt;
  int cont = 0;&lt;br /&gt;
  int cont_1 = 0;&lt;br /&gt;
  int cont_2 = 0;&lt;br /&gt;
  int inclinacion_pinza = 0;&lt;br /&gt;
  int start = 0;&lt;br /&gt;
    &lt;br /&gt;
  brazo_fer::Servos pg, cg;&lt;br /&gt;
  brazo_fer::WriteServos move;&lt;br /&gt;
  brazo_fer::Servos pinza;&lt;br /&gt;
  brazo_fer::WriteServos pin;  &lt;br /&gt;
  brazo_fer::WriteServos error_coordenadas;&lt;br /&gt;
  &lt;br /&gt;
  brazo_fer::WriteServos acercar(geometry_msgs::Point cerca)&lt;br /&gt;
  {&lt;br /&gt;
  	double x = cerca.x;&lt;br /&gt;
  	double z = cerca.z; &lt;br /&gt;
  	 	&lt;br /&gt;
  	cerca.z = cerca.z - 70*cos(atan2(x,z));&lt;br /&gt;
  	cerca.x = cerca.x - 70*sin(atan2(x,z));&lt;br /&gt;
  	&lt;br /&gt;
  	brazo_fer::WriteServos move = inversa(cerca, ::inclinacion_pinza, ::pg, 0);&lt;br /&gt;
  	&lt;br /&gt;
  	return move;&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
    brazo_fer::WriteServos levantar_acercar(geometry_msgs::Point la)&lt;br /&gt;
  {&lt;br /&gt;
  	 	&lt;br /&gt;
  	la.x = 0;&lt;br /&gt;
  	la.y = la.y + 50;&lt;br /&gt;
   	la.z = 60;&lt;br /&gt;
  	&lt;br /&gt;
  	if (la.y &amp;lt; 75) {&lt;br /&gt;
		la.y = 75;&lt;br /&gt;
	}&lt;br /&gt;
  	 	&lt;br /&gt;
  	brazo_fer::WriteServos move = inversa(la, ::inclinacion_pinza, ::pg, 0);&lt;br /&gt;
  	&lt;br /&gt;
  	::punto_0 = la;&lt;br /&gt;
  	&lt;br /&gt;
  	return move;&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void posicion_estado_corriente(const brazo_fer::ReadServos&amp;amp; pec)   &lt;br /&gt;
  { &lt;br /&gt;
	  &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1); &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);   &lt;br /&gt;
  	   &lt;br /&gt;
	brazo_fer::Servos p = pec.posicion;  &lt;br /&gt;
&lt;br /&gt;
	::pg = pec.posicion;&lt;br /&gt;
	::cg = pec.corriente; 	&lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::Servos e = pec.estado;   &lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::Servos c = pec.corriente;   &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	if (::cont == 0)&lt;br /&gt;
	{&lt;br /&gt;
		::punto_0 = home(p, c);&lt;br /&gt;
		&lt;br /&gt;
		::punto_1 = ::punto_0;&lt;br /&gt;
	&lt;br /&gt;
		::cont = ::cont+1;&lt;br /&gt;
	&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if (::punto_0.x != ::punto_1.x || ::punto_0.y != ::punto_1.y || ::punto_0.z != ::punto_1.z ) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
  	if (::cont_1 == 0) {&lt;br /&gt;
  	&lt;br /&gt;
		::move = acercar(::punto_0); 	&lt;br /&gt;
  	&lt;br /&gt;
		move_pub_.publish(::move);&lt;br /&gt;
  	&lt;br /&gt;
		::cont_1 = ::cont_1+1;&lt;br /&gt;
  	&lt;br /&gt;
	}&lt;br /&gt;
  	  	&lt;br /&gt;
  	&lt;br /&gt;
  	if (((p.base-15) &amp;lt; ::move.posicion.base &amp;amp;&amp;amp; ::move.posicion.base &amp;lt; (p.base+15)) &amp;amp;&amp;amp; ((p.arti1-15) &amp;lt; ::move.posicion.arti1 &amp;amp;&amp;amp; ::move.posicion.arti1 &amp;lt; (p.arti1+15)) &amp;amp;&amp;amp; ((p.arti2-15) &amp;lt; ::move.posicion.arti2 &amp;amp;&amp;amp; ::move.posicion.arti2 &amp;lt; (p.arti2+15)) &amp;amp;&amp;amp; ((p.arti3-15) &amp;lt; ::move.posicion.arti3 &amp;amp;&amp;amp; ::move.posicion.arti3 &amp;lt; (p.arti3+15))) {	&lt;br /&gt;
			&lt;br /&gt;
			if (::cont_2 == 0) {&lt;br /&gt;
				&lt;br /&gt;
				::move = inversa(::punto_0, ::inclinacion_pinza, ::pg, 0);&lt;br /&gt;
  	&lt;br /&gt;
				move_pub_.publish(::move);&lt;br /&gt;
			 &lt;br /&gt;
				::cont_2 = ::cont_2+1;&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			}&lt;br /&gt;
			else {	 &lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			  	if (((p.base-15) &amp;lt; ::move.posicion.base &amp;amp;&amp;amp; ::move.posicion.base &amp;lt; (p.base+15)) &amp;amp;&amp;amp; ((p.arti1-15) &amp;lt; ::move.posicion.arti1 &amp;amp;&amp;amp; ::move.posicion.arti1 &amp;lt; (p.arti1+15)) &amp;amp;&amp;amp; ((p.arti2-15) &amp;lt; ::move.posicion.arti2 &amp;amp;&amp;amp; ::move.posicion.arti2 &amp;lt; (p.arti2+15)) &amp;amp;&amp;amp; ((p.arti3-15) &amp;lt; ::move.posicion.arti3 &amp;amp;&amp;amp; ::move.posicion.arti3 &amp;lt; (p.arti3+15))) {&lt;br /&gt;
				&lt;br /&gt;
				&lt;br /&gt;
				::pinza.pinza = p.pinza;&lt;br /&gt;
				&lt;br /&gt;
					if(::pin.posicion.pinza != p.pinza) {&lt;br /&gt;
					&lt;br /&gt;
						std::cout&amp;lt;&amp;lt;c.pinza&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
				&lt;br /&gt;
						::pinza.pinza = ::pinza.pinza + 20;&lt;br /&gt;
					&lt;br /&gt;
						::pin = control_pinza(::pinza, p, c);&lt;br /&gt;
					&lt;br /&gt;
						hand_pub_.publish(::pin);&lt;br /&gt;
						&lt;br /&gt;
					}&lt;br /&gt;
					else {&lt;br /&gt;
					&lt;br /&gt;
						std::cout&amp;lt;&amp;lt;&amp;quot;Agarrado&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
				&lt;br /&gt;
						::move = levantar_acercar(::punto_0);				&lt;br /&gt;
			&lt;br /&gt;
						move_pub_.publish(::move);&lt;br /&gt;
					&lt;br /&gt;
						::punto_1 = ::punto_0;&lt;br /&gt;
					&lt;br /&gt;
						::cont_1 = 0;&lt;br /&gt;
						::cont_2 = 0;&lt;br /&gt;
				}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
			&lt;br /&gt;
			std::cout&amp;lt;&amp;lt;&amp;quot;En movimiento&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	  &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  void punto(const geometry_msgs::Point&amp;amp; point)   &lt;br /&gt;
  {	&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   //Publicación del topic &amp;quot;move_arm&amp;quot;&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);   //Publicación del topic &amp;quot;hand_arm&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	::punto_0 = point;&lt;br /&gt;
&lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;control_recogida&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
	&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber pose_sub_= n.subscribe(&amp;quot;pose_arm&amp;quot;, 1, posicion_estado_corriente);&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber point_sub_= n.subscribe(&amp;quot;pick_point&amp;quot;, 1, punto);&lt;br /&gt;
  	&lt;br /&gt;
	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);&lt;br /&gt;
&lt;br /&gt;
	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);	&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	ros::spin();&lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to add the next line to the file &amp;quot;CMakeLists.txt&amp;quot; of our package in order to compile and create the executable file: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;rosbuild_add_executable(contro_v02 src/control_v02.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next commands in a terminal in order to compile and create the executable file: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running the program===&lt;br /&gt;
&lt;br /&gt;
First we will execute the next command in a terminal in order to launch the [http://www.ros.org ROS] core, if it has not launched previously.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscore&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in other terminal in order to launch the communication node [http://www.ros.org ROS]-[http://www.arduino.cc arduino]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun rosserial_python serial_node.py /dev/ttyACM0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to launch the control program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun brazo_fer control_v02&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to publish in the ''topic'' &amp;quot;pick_point&amp;quot; the bottle position (We have placed the bottle in a known position but we can use a vision system to set the bottle position):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub pick_point geometry_msgs/Point '{x: -150, y: 0, z: 150}' --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The arm will execute the pick sequence. We can see the arm grasping the bottle in the next video:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;0FcB6-i23cU&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=0FcB6-i23cU Watch in YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fifth program (Place the bottle)==&lt;br /&gt;
&lt;br /&gt;
This program execute the sequence to place the bottle. The sequence steps are shown below:&lt;br /&gt;
    &lt;br /&gt;
# Placement in the goal position.&lt;br /&gt;
# To open the gripper (until to free the bottle).&lt;br /&gt;
# Distance (place the gripper at 70 mm of the goal position).&lt;br /&gt;
# Return to initial position.&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;control_v03.cpp&amp;quot; with the content that is shown below within the folder &amp;quot;src&amp;quot; of our package: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/brazo_fer.h&amp;quot;     &lt;br /&gt;
  #include &amp;quot;std_msgs/Int16.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;std_msgs/String.h&amp;quot;   &lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  geometry_msgs::Point punto_0, punto_1;&lt;br /&gt;
  &lt;br /&gt;
  int cont = 0;&lt;br /&gt;
  int cont_1 = 0;&lt;br /&gt;
  int cont_2 = 0;&lt;br /&gt;
  int cont_3 = 0;&lt;br /&gt;
  int inclinacion_pinza = 0;&lt;br /&gt;
    &lt;br /&gt;
  brazo_fer::Servos pg, cg, pinza;&lt;br /&gt;
  brazo_fer::WriteServos move;&lt;br /&gt;
  brazo_fer::WriteServos pin;&lt;br /&gt;
  brazo_fer::WriteServos error_coordenadas;  &lt;br /&gt;
  &lt;br /&gt;
  brazo_fer::WriteServos separar(geometry_msgs::Point lejos)&lt;br /&gt;
  {&lt;br /&gt;
  	double x = lejos.x;&lt;br /&gt;
  	double z = lejos.z; &lt;br /&gt;
  	 	&lt;br /&gt;
  	lejos.z = lejos.z - 70*cos(atan2(x,z));&lt;br /&gt;
  	lejos.x = lejos.x - 70*sin(atan2(x,z));&lt;br /&gt;
  	 	&lt;br /&gt;
  	brazo_fer::WriteServos move = inversa(lejos, ::inclinacion_pinza, ::pg, 0);&lt;br /&gt;
  	&lt;br /&gt;
  	return move;&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void posicion_estado_corriente(const brazo_fer::ReadServos&amp;amp; pec)  &lt;br /&gt;
  { &lt;br /&gt;
	  &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);  &lt;br /&gt;
  	   &lt;br /&gt;
	brazo_fer::Servos p = pec.posicion;   &lt;br /&gt;
&lt;br /&gt;
	::pg = pec.posicion;&lt;br /&gt;
	::cg = pec.corriente; 	&lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::Servos e = pec.estado;   &lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::Servos c = pec.corriente;  &lt;br /&gt;
	&lt;br /&gt;
	if (::cont == 0)&lt;br /&gt;
	{&lt;br /&gt;
		::punto_0 = directa(p, inclinacion_pinza);&lt;br /&gt;
		&lt;br /&gt;
		::punto_1 = ::punto_0;&lt;br /&gt;
	&lt;br /&gt;
		::cont = ::cont+1;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if (::punto_0.x != ::punto_1.x || ::punto_0.y != ::punto_1.y || ::punto_0.z != ::punto_1.z ) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
  	if (::cont_1 == 0) {&lt;br /&gt;
  	&lt;br /&gt;
		::move = inversa(::punto_0, ::inclinacion_pinza, ::pg, 0); 	&lt;br /&gt;
  	&lt;br /&gt;
		move_pub_.publish(::move);&lt;br /&gt;
  	&lt;br /&gt;
		::cont_1 = ::cont_1+1;&lt;br /&gt;
  	&lt;br /&gt;
	}  	&lt;br /&gt;
  	&lt;br /&gt;
  	if (((p.base-15) &amp;lt; ::move.posicion.base &amp;amp;&amp;amp; ::move.posicion.base &amp;lt; (p.base+15)) &amp;amp;&amp;amp; ((p.arti1-15) &amp;lt; ::move.posicion.arti1 &amp;amp;&amp;amp; ::move.posicion.arti1 &amp;lt; (p.arti1+15)) &amp;amp;&amp;amp; ((p.arti2-15) &amp;lt; ::move.posicion.arti2 &amp;amp;&amp;amp; ::move.posicion.arti2 &amp;lt; (p.arti2+15)) &amp;amp;&amp;amp; ((p.arti3-15) &amp;lt; ::move.posicion.arti3 &amp;amp;&amp;amp; ::move.posicion.arti3 &amp;lt; (p.arti3+15))) {	&lt;br /&gt;
			&lt;br /&gt;
			if (::cont_2 == 0) {&lt;br /&gt;
				&lt;br /&gt;
				::pinza.pinza = 470;&lt;br /&gt;
				&lt;br /&gt;
				::pin = control_pinza(::pinza, p, c);&lt;br /&gt;
					&lt;br /&gt;
				hand_pub_.publish(::pin);&lt;br /&gt;
				&lt;br /&gt;
				::cont_2 = ::cont_2+1;&lt;br /&gt;
			&lt;br /&gt;
			}&lt;br /&gt;
			else {	 &lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			  	if (p.pinza &amp;lt;= 495) {&lt;br /&gt;
				&lt;br /&gt;
					if (::cont_3 == 0) {&lt;br /&gt;
					&lt;br /&gt;
						::move = separar(::punto_0);&lt;br /&gt;
		&lt;br /&gt;
						move_pub_.publish(::move);&lt;br /&gt;
						&lt;br /&gt;
						::cont_3 = ::cont_3+1;		&lt;br /&gt;
										&lt;br /&gt;
					}	&lt;br /&gt;
					&lt;br /&gt;
					else if (((p.base-15) &amp;lt; ::move.posicion.base &amp;amp;&amp;amp; ::move.posicion.base &amp;lt; (p.base+15)) &amp;amp;&amp;amp; ((p.arti1-15) &amp;lt; ::move.posicion.arti1 &amp;amp;&amp;amp; ::move.posicion.arti1 &amp;lt; (p.arti1+15)) &amp;amp;&amp;amp; ((p.arti2-15) &amp;lt; ::move.posicion.arti2 &amp;amp;&amp;amp; ::move.posicion.arti2 &amp;lt; (p.arti2+15)) &amp;amp;&amp;amp; ((p.arti3-15) &amp;lt; ::move.posicion.arti3 &amp;amp;&amp;amp; ::move.posicion.arti3 &amp;lt; (p.arti3+15))) {&lt;br /&gt;
					&lt;br /&gt;
						std::cout&amp;lt;&amp;lt;&amp;quot;Suelto&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
						&lt;br /&gt;
						::cont = 0;&lt;br /&gt;
						&lt;br /&gt;
						::cont_1 = 0;&lt;br /&gt;
						::cont_2 = 0;&lt;br /&gt;
						::cont_3 = 0;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
			&lt;br /&gt;
			std::cout&amp;lt;&amp;lt;&amp;quot;En movimiento&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
		&lt;br /&gt;
	  &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  void punto(const geometry_msgs::Point&amp;amp; point)   &lt;br /&gt;
  {	&lt;br /&gt;
	&lt;br /&gt;
	::punto_0 = point;		&lt;br /&gt;
&lt;br /&gt;
  }  &lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;control_entrega&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
	&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber pose_sub_= n.subscribe(&amp;quot;pose_arm&amp;quot;, 1, posicion_estado_corriente);  &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber point_sub_= n.subscribe(&amp;quot;place_point&amp;quot;, 1, punto);  &lt;br /&gt;
 	&lt;br /&gt;
  	&lt;br /&gt;
	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
&lt;br /&gt;
	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);  &lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	ros::spin(); &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to add the next line to the file &amp;quot;CMakeLists.txt&amp;quot; of our package in order to compile and create the executable file: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;rosbuild_add_executable(contro_v03 src/control_v03.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next commands in a terminal in order to compile and create the executable file: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running the program===&lt;br /&gt;
&lt;br /&gt;
First we will execute the next command in a terminal in order to launch the [http://www.ros.org ROS] core, if it has not launched previously.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscore&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in other terminal in order to launch the communication node [http://www.ros.org ROS]-[http://www.arduino.cc arduino]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun rosserial_python serial_node.py /dev/ttyACM0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to launch the control program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun brazo_fer control_v03&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to publish in the ''topic'' &amp;quot;place_point&amp;quot; the goal position:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub place_point geometry_msgs/Point '{x: 150, y: 0, z: 150}' --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sixth program (Follow the straight way)==&lt;br /&gt;
&lt;br /&gt;
This program move the arm following the line between the initial position and the goal position. We will create a file named &amp;quot;control_v04.cpp&amp;quot; with the content that is shown below within the folder &amp;quot;src&amp;quot; of our package: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/brazo_fer.h&amp;quot;   &lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos  p, e, c;&lt;br /&gt;
  brazo_fer::WriteServos destino, mover;  &lt;br /&gt;
  geometry_msgs::Point punto_0, punto_1, punto_i;&lt;br /&gt;
  double lambda = 0;&lt;br /&gt;
  int inclinacion_pinza = 0;&lt;br /&gt;
  int cont = 0; &lt;br /&gt;
 &lt;br /&gt;
  void posicion(const brazo_fer::ReadServos&amp;amp; pose)&lt;br /&gt;
  {&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);  &lt;br /&gt;
 &lt;br /&gt;
	::p = pose.posicion;&lt;br /&gt;
        ::e = pose.estado;&lt;br /&gt;
        ::c = pose.corriente;&lt;br /&gt;
    &lt;br /&gt;
    if (cont == 0)&lt;br /&gt;
    {&lt;br /&gt;
		::punto_0 = home(::p, ::c);&lt;br /&gt;
    &lt;br /&gt;
		::punto_1 = ::punto_0;&lt;br /&gt;
		&lt;br /&gt;
		cont = 1;&lt;br /&gt;
	}&lt;br /&gt;
    &lt;br /&gt;
	if ((::punto_0.x != ::punto_1.x || ::punto_0.y != ::punto_1.y || ::punto_0.z != ::punto_1.z) &amp;amp;&amp;amp; ((::p.base-15) &amp;lt; ::mover.posicion.base &amp;amp;&amp;amp; ::mover.posicion.base &amp;lt; (::p.base+15)) &amp;amp;&amp;amp; ((::p.arti1-15) &amp;lt; ::mover.posicion.arti1 &amp;amp;&amp;amp; ::mover.posicion.arti1 &amp;lt; (::p.arti1+15)) &amp;amp;&amp;amp; ((::p.arti2-15) &amp;lt; ::mover.posicion.arti2 &amp;amp;&amp;amp; ::mover.posicion.arti2 &amp;lt; (::p.arti2+15)) &amp;amp;&amp;amp; ((::p.arti3-15) &amp;lt; ::mover.posicion.arti3 &amp;amp;&amp;amp; ::mover.posicion.arti3 &amp;lt; (::p.arti3+15)))&lt;br /&gt;
	{	&lt;br /&gt;
    &lt;br /&gt;
		if (((::p.base-15) &amp;lt; ::destino.posicion.base &amp;amp;&amp;amp; ::destino.posicion.base &amp;lt; (::p.base+15)) &amp;amp;&amp;amp; ((::p.arti1-15) &amp;lt; ::destino.posicion.arti1 &amp;amp;&amp;amp; ::destino.posicion.arti1 &amp;lt; (::p.arti1+15)) &amp;amp;&amp;amp; ((::p.arti2-15) &amp;lt; ::destino.posicion.arti2 &amp;amp;&amp;amp; ::destino.posicion.arti2 &amp;lt; (::p.arti2+15)) &amp;amp;&amp;amp; ((::p.arti3-15) &amp;lt; ::destino.posicion.arti3 &amp;amp;&amp;amp; ::destino.posicion.arti3 &amp;lt; (::p.arti3+15))) &lt;br /&gt;
		{&lt;br /&gt;
			::punto_0 = ::punto_1;&lt;br /&gt;
			::lambda = 0;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{    &lt;br /&gt;
			geometry_msgs::Point u;&lt;br /&gt;
			&lt;br /&gt;
			//ecuación de la recta p1 = p0+lambda.u&lt;br /&gt;
			&lt;br /&gt;
			u.x = ::punto_1.x - ::punto_0.x;&lt;br /&gt;
			u.y = ::punto_1.y - ::punto_0.y;&lt;br /&gt;
			u.z = ::punto_1.z - ::punto_0.z;        &lt;br /&gt;
			&lt;br /&gt;
			double paso = abs(sqrt(pow(u.x,2)+pow(u.y,2)+pow(u.z,2))/10);&lt;br /&gt;
			   &lt;br /&gt;
			::lambda = ::lambda + 1/paso;&lt;br /&gt;
			&lt;br /&gt;
			::punto_i.x = ::punto_0.x + (::lambda)*u.x;&lt;br /&gt;
			::punto_i.y = ::punto_0.y + (::lambda)*u.y;&lt;br /&gt;
			::punto_i.z = ::punto_0.z + (::lambda)*u.z;&lt;br /&gt;
			&lt;br /&gt;
			::mover = inversa(::punto_i, ::inclinacion_pinza, ::p, 0);&lt;br /&gt;
			&lt;br /&gt;
			move_pub_.publish(::mover);&lt;br /&gt;
			 	&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  void punto(const geometry_msgs::Point&amp;amp; point)&lt;br /&gt;
  {	&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1); &lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);&lt;br /&gt;
  	&lt;br /&gt;
	::lambda = 0;    &lt;br /&gt;
    &lt;br /&gt;
        ::punto_0 = directa(::p, ::inclinacion_pinza);  	&lt;br /&gt;
	&lt;br /&gt;
	::punto_1 = point;&lt;br /&gt;
	&lt;br /&gt;
	::destino = inversa(::punto_1, ::inclinacion_pinza, ::p, 0);&lt;br /&gt;
 &lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;control_brazo&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber pose_sub_= n.subscribe(&amp;quot;pose_arm&amp;quot;, 1, posicion); &lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber point_sub_= n.subscribe(&amp;quot;point&amp;quot;, 1, punto); &lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1); &lt;br /&gt;
  	   &lt;br /&gt;
 &lt;br /&gt;
	ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to add the next line to the file &amp;quot;CMakeLists.txt&amp;quot; of our package in order to compile and create the executable file: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;rosbuild_add_executable(contro_v04 src/control_v04.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next commands in a terminal in order to compile and create the executable file: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running the program===&lt;br /&gt;
&lt;br /&gt;
First we will execute the next command in a terminal in order to launch the [http://www.ros.org ROS] core, if it has not launched previously.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscore&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in other terminal in order to launch the communication node [http://www.ros.org ROS]-[http://www.arduino.cc arduino]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun rosserial_python serial_node.py /dev/ttyACM0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to launch the control program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun brazo_fer control_v04&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to publish in the ''topic'' &amp;quot;point&amp;quot; the goal position:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub point geometry_msgs/Point '{x: 150, y: 100, z: 0}' --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Seventh program (Teleoperator)==&lt;br /&gt;
&lt;br /&gt;
This program allows to control the arm using the keyboard of the remote PC. We will create a file named &amp;quot;teleoperador_teclado.cpp&amp;quot; with the content that is shown below within the folder &amp;quot;src&amp;quot; of our package: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/brazo_fer.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;std_msgs/Int16.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;std_msgs/String.h&amp;quot;  &lt;br /&gt;
  #include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;termios.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
  #define KEYCODE_Xmas 0x43 &lt;br /&gt;
  #define KEYCODE_Xmenos 0x44&lt;br /&gt;
  #define KEYCODE_Ymas 0x41&lt;br /&gt;
  #define KEYCODE_Ymenos 0x42&lt;br /&gt;
  #define KEYCODE_Zmas 0x77&lt;br /&gt;
  #define KEYCODE_Zmenos 0x73&lt;br /&gt;
  #define KEYCODE_Pabrir 0x61&lt;br /&gt;
  #define KEYCODE_Pcerrar 0x64&lt;br /&gt;
  #define KEYCODE_PinclinarMas 0x65&lt;br /&gt;
  #define KEYCODE_PinclinarMenos 0x71  &lt;br /&gt;
  &lt;br /&gt;
struct termios cooked, raw; &lt;br /&gt;
&lt;br /&gt;
int cont = 0;&lt;br /&gt;
&lt;br /&gt;
double retardo = 0.11;&lt;br /&gt;
&lt;br /&gt;
  geometry_msgs::Point punto;&lt;br /&gt;
  brazo_fer::Servos vel;&lt;br /&gt;
  brazo_fer::Servos pinza, p, c;&lt;br /&gt;
  &lt;br /&gt;
  int pinza_incli = 0;&lt;br /&gt;
  &lt;br /&gt;
	&lt;br /&gt;
void posicion_estado_corriente(const brazo_fer::ReadServos&amp;amp; pec) &lt;br /&gt;
  { &lt;br /&gt;
	     &lt;br /&gt;
	::p = pec.posicion;  &lt;br /&gt;
	::c = pec.corriente;&lt;br /&gt;
&lt;br /&gt;
  }	  &lt;br /&gt;
 &lt;br /&gt;
void quit(int sig)&lt;br /&gt;
{&lt;br /&gt;
  tcsetattr(0, TCSANOW, &amp;amp;cooked);&lt;br /&gt;
  ros::shutdown();&lt;br /&gt;
  exit(0);&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void callback(const ros::TimerEvent&amp;amp;)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;   	&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1); &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);  	  	&lt;br /&gt;
&lt;br /&gt;
	ros::Time anterior;&lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::WriteServos teleop;&lt;br /&gt;
	brazo_fer::WriteServos teleop_pinza;	&lt;br /&gt;
&lt;br /&gt;
	if (::cont == 0)&lt;br /&gt;
    {&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		&lt;br /&gt;
		::punto = home(::p, ::c);&lt;br /&gt;
		&lt;br /&gt;
		::cont = 1;&lt;br /&gt;
		&lt;br /&gt;
		::pinza.pinza = 511;&lt;br /&gt;
		&lt;br /&gt;
		teleop = inversa(::punto, ::pinza_incli, ::p, 0);&lt;br /&gt;
		teleop_pinza = control_pinza(::pinza, ::p, ::c);&lt;br /&gt;
		&lt;br /&gt;
		//std::cout&amp;lt;&amp;lt;teleop&amp;lt;&amp;lt;&amp;quot;-&amp;quot;&amp;lt;&amp;lt;teleop_pinza&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
  char c;&lt;br /&gt;
&lt;br /&gt;
  // get the console in raw mode                                                              &lt;br /&gt;
  tcgetattr(0, &amp;amp;cooked);&lt;br /&gt;
  memcpy(&amp;amp;raw, &amp;amp;cooked, sizeof(struct termios));&lt;br /&gt;
  raw.c_lflag &amp;amp;=~ (ICANON | ECHO);&lt;br /&gt;
  // Setting a new line, then end of file                         &lt;br /&gt;
  raw.c_cc[VEOL] = 1;&lt;br /&gt;
  raw.c_cc[VEOF] = 2;&lt;br /&gt;
  tcsetattr(0, TCSANOW, &amp;amp;raw);&lt;br /&gt;
&lt;br /&gt;
  puts(&amp;quot;&amp;quot;); &lt;br /&gt;
  puts(&amp;quot;#####################################################&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;                      ARM CONTROLS&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;#####################################################&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;&amp;quot;);  &lt;br /&gt;
  puts(&amp;quot;Up arrow:___________ Move up gripper&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Down arrow:_________ Move down gripper&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Left arrow:_________ Move left gripper&amp;quot;); &lt;br /&gt;
  puts(&amp;quot;Right arrow:________ Move right gripper&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;W key:______________ Move forward gripper&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;S key:______________ Move backward gripper&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;A key:______________ Open gripper&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;D key:______________ Close gripper&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Q key:______________ Tilt up gripper&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;E key:______________ Tilt down gripper&amp;quot;);                 &lt;br /&gt;
              &lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
    while (ros::ok())&lt;br /&gt;
    {&lt;br /&gt;
				&lt;br /&gt;
    // get the next event from the keyboard  &lt;br /&gt;
    if(read(0, &amp;amp;c, 1) &amp;lt; 0)&lt;br /&gt;
    {&lt;br /&gt;
      perror(&amp;quot;read():&amp;quot;);&lt;br /&gt;
      exit(-1);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
      if (c == KEYCODE_Xmas)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
		::punto.x = ::punto.x - 5;&lt;br /&gt;
		teleop = inversa(::punto, ::pinza_incli, ::p, 0);&lt;br /&gt;
		if (teleop.posicion.base == ::p.base &amp;amp;&amp;amp; teleop.posicion.arti1 == ::p.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == ::p.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == ::p.arti3) &lt;br /&gt;
		{::punto.x = ::punto.x + 5;}&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}			&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Xmenos)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{      &lt;br /&gt;
		::punto.x = ::punto.x + 5;&lt;br /&gt;
		teleop = inversa(::punto, ::pinza_incli, ::p, 0);&lt;br /&gt;
		if (teleop.posicion.base == ::p.base &amp;amp;&amp;amp; teleop.posicion.arti1 == ::p.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == ::p.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == ::p.arti3) &lt;br /&gt;
		{::punto.x = ::punto.x - 5;}&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}				&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Ymas)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{      &lt;br /&gt;
		::punto.y = ::punto.y + 5;&lt;br /&gt;
		teleop = inversa(::punto, ::pinza_incli, ::p, 0);&lt;br /&gt;
		if (teleop.posicion.base == ::p.base &amp;amp;&amp;amp; teleop.posicion.arti1 == ::p.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == ::p.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == ::p.arti3) &lt;br /&gt;
		{::punto.y = ::punto.y - 5;}&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}					    &lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Ymenos)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{      &lt;br /&gt;
		::punto.y = ::punto.y - 5;&lt;br /&gt;
		teleop = inversa(::punto, ::pinza_incli, ::p, 0);&lt;br /&gt;
		if (teleop.posicion.base == ::p.base &amp;amp;&amp;amp; teleop.posicion.arti1 == ::p.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == ::p.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == ::p.arti3) &lt;br /&gt;
		{::punto.y = ::punto.y + 5;}		&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}						&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Zmas)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{      &lt;br /&gt;
		::punto.z = ::punto.z + 5;&lt;br /&gt;
		teleop = inversa(::punto, ::pinza_incli, ::p, 0);&lt;br /&gt;
		if (teleop.posicion.base == ::p.base &amp;amp;&amp;amp; teleop.posicion.arti1 == ::p.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == ::p.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == ::p.arti3)  &lt;br /&gt;
		{::punto.z = ::punto.z - 5;}		&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}					&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Zmenos)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{      &lt;br /&gt;
		::punto.z = ::punto.z - 5;&lt;br /&gt;
		teleop = inversa(::punto, ::pinza_incli, ::p, 0);&lt;br /&gt;
		if (teleop.posicion.base == ::p.base &amp;amp;&amp;amp; teleop.posicion.arti1 == ::p.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == ::p.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == ::p.arti3) &lt;br /&gt;
		{::punto.z = ::punto.z + 5;}	&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}				&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Pabrir)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{      &lt;br /&gt;
		::pinza.pinza = ::pinza.pinza - 5;&lt;br /&gt;
		teleop_pinza = control_pinza(::pinza, ::p, ::c);&lt;br /&gt;
		if (teleop_pinza.posicion.pinza == ::p.pinza) {::pinza.pinza = ::pinza.pinza + 5;}		&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Pcerrar)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{      &lt;br /&gt;
		::pinza.pinza = ::pinza.pinza + 5;&lt;br /&gt;
		teleop_pinza = control_pinza(::pinza, ::p, ::c);&lt;br /&gt;
		if (teleop_pinza.posicion.pinza == ::p.pinza) {::pinza.pinza = ::pinza.pinza - 5;}&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_PinclinarMas)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{      &lt;br /&gt;
		::pinza_incli = ::pinza_incli + 5;&lt;br /&gt;
		teleop = inversa(::punto, ::pinza_incli, ::p, 0);&lt;br /&gt;
		if (teleop.posicion.base == ::p.base &amp;amp;&amp;amp; teleop.posicion.arti1 == ::p.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == ::p.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == ::p.arti3) &lt;br /&gt;
		{::pinza_incli = ::pinza_incli - 5;}&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_PinclinarMenos)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{      &lt;br /&gt;
		::pinza_incli = ::pinza_incli - 5;&lt;br /&gt;
		teleop = inversa(::punto, ::pinza_incli, ::p, 0);&lt;br /&gt;
		if (teleop.posicion.base == ::p.base &amp;amp;&amp;amp; teleop.posicion.arti1 == ::p.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == ::p.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == ::p.arti3) &lt;br /&gt;
		{::pinza_incli = ::pinza_incli + 5;}&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}&lt;br /&gt;
      }                                     &lt;br /&gt;
		&lt;br /&gt;
		if (teleop.posicion.base != ::p.base || teleop.posicion.arti1 != ::p.arti1 || teleop.posicion.arti2 != ::p.arti2 || teleop.posicion.arti3 != ::p.arti3)&lt;br /&gt;
		{&lt;br /&gt;
			move_pub_.publish(teleop);			&lt;br /&gt;
		}&lt;br /&gt;
		if (teleop_pinza.posicion.pinza != ::p.pinza)&lt;br /&gt;
		{				&lt;br /&gt;
			hand_pub_.publish(teleop_pinza);&lt;br /&gt;
		}						    	&lt;br /&gt;
&lt;br /&gt;
	}	&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;teleoperador_teclado&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber pose_sub_= n.subscribe(&amp;quot;pose_arm&amp;quot;, 1, posicion_estado_corriente);  	&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);    &lt;br /&gt;
		 	 &lt;br /&gt;
&lt;br /&gt;
	signal(SIGINT,quit); &lt;br /&gt;
	&lt;br /&gt;
	ros::Timer timer = n.createTimer(ros::Duration(1), callback);  &lt;br /&gt;
   	   &lt;br /&gt;
 &lt;br /&gt;
	ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have to add the next line to the file &amp;quot;CMakeLists.txt&amp;quot; of our package in order to compile and create the executable file: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;rosbuild_add_executable(teleoperador_teclado src/teleoperador_teclado.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next commands in a terminal in order to compile and create the executable file: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running the program===&lt;br /&gt;
&lt;br /&gt;
First we will execute the next command in a terminal in order to launch the [http://www.ros.org ROS] core, if it has not launched previously.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscore&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in other terminal in order to launch the communication node [http://www.ros.org ROS]-[http://www.arduino.cc arduino]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun rosserial_python serial_node.py /dev/ttyACM0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to launch the control program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun brazo_fer teleoperador_teclado&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Teleoperaci%c3%b3n_de_MYRAbot_con_controlador_inal%c3%a1mbrico_xbox360_(controlador_xbox360%2bjoy)&amp;diff=4213</id>
		<title>Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Teleoperaci%c3%b3n_de_MYRAbot_con_controlador_inal%c3%a1mbrico_xbox360_(controlador_xbox360%2bjoy)&amp;diff=4213"/>
				<updated>2014-09-29T11:06:23Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Teleoperación de MYRAbot=&lt;br /&gt;
&lt;br /&gt;
Para la realización de determinadas tareas es necesario hacer uso de algún sistema de teleoperación para controlar el robot. Lo más habitual es haciendo uso de una conexión [http://es.wikipedia.org/wiki/Secure_Shell ssh] con el PC del robot y usando el teclado de nuestro PC. Este método emplea una red [http://es.wikipedia.org/wiki/Wi-Fi wifi] de la cual depende la conexión entre los dos equipos, la cual puede fallar o ser inexistente. Por eso la mejor opción es emplear un dispositivo conectado al PC del robot provisto de su propia red inalámbrica. El dispositivo escogido por robustez y versatilidad ha sido el [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows controlador inalámbrico xbox360 de microsoft].&lt;br /&gt;
&lt;br /&gt;
=Controlador xbox360=&lt;br /&gt;
&lt;br /&gt;
==Descripción de botones y ejes==&lt;br /&gt;
&lt;br /&gt;
Este controlador está equipado con 6 ejes de control y 14 botones, que se reparten de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Palanca izquierda: 2 ejes y 1 botón (pulsación).&lt;br /&gt;
* Palanca derecha: 2 ejes y 1 botón (pulsación).&lt;br /&gt;
* Gatillo izquierdo: 1 eje.&lt;br /&gt;
* Gatillo derecho: 1 eje.&lt;br /&gt;
* Cruz: 4 botones.&lt;br /&gt;
* Botones lado derecho: 4 botones.&lt;br /&gt;
* Botón izquierdo: 1 botón.&lt;br /&gt;
* Botón derecho: 1 botón.&lt;br /&gt;
* Botón &amp;quot;back&amp;quot;: 1 botón.&lt;br /&gt;
* Botón &amp;quot;start&amp;quot;: 1 botón.&lt;br /&gt;
&lt;br /&gt;
En la siguiente imagen se muestra la función asignada a cada botón y eje del [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows controlador xbox360] para la teleoperación de MYRAbot:&lt;br /&gt;
&lt;br /&gt;
[[file:controlador_xbox360_MYRAbot.jpg|thumb|center|800px|Funcionalidad [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows controlador xbox360] para MYRAbot.]]&lt;br /&gt;
&lt;br /&gt;
==Programa==&lt;br /&gt;
&lt;br /&gt;
Se encargará de la asignación de acciones a los diferentes botones y ejes del controlador. El programa se subscribe al ''topic'' &amp;quot;joy&amp;quot; donde se publica el estado de los botones del controlador y publica los ''topics'' &amp;quot;cmd_vel&amp;quot;, &amp;quot;move_arm&amp;quot; y &amp;quot;hand_arm&amp;quot; para el control de [http://www.irobot.com/global/es/store/Roomba.aspx?gclid=CMfZy73s570CFTMetAodW3UA7A roomba] y el [[Control brazo MYRAbot (bioloid+arduino)|brazo]]. Comenzaremos creando un nuevo ''package'' en nuestro espacio de trabajo. Nos situaremos en nuestro espacio de trabajo y ejecutaremos en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscreate-pkg myrabot_teleop brazo_fer geometry_msgs sensor_msgs std_msgs ros_cpp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;teleoperador_xbox360.cpp&amp;quot; dentro del directorio &amp;quot;src&amp;quot; del ''package'' creado con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cpp enclose=div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/brazo_fer.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;    &lt;br /&gt;
  #include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
myrabot_arm_base::Servos p, e, c, pinza;&lt;br /&gt;
geometry_msgs::Point punto;&lt;br /&gt;
int pinza_incli = 0;&lt;br /&gt;
int paso = 5;&lt;br /&gt;
int cont = 0;&lt;br /&gt;
	&lt;br /&gt;
myrabot_arm_base::WriteServos teleop;&lt;br /&gt;
myrabot_arm_base::WriteServos teleop_pinza;&lt;br /&gt;
&lt;br /&gt;
float avance = 0.2, giro = 0.5;&lt;br /&gt;
int velocidad = 50;&lt;br /&gt;
int start = 0;&lt;br /&gt;
int flanco;&lt;br /&gt;
&lt;br /&gt;
geometry_msgs::Twist base;&lt;br /&gt;
&lt;br /&gt;
float pad_izquierda_x, pad_izquierda_y, gatillo_izquierda, pad_derecha_x, pad_derecha_y, gatillo_derecha;&lt;br /&gt;
int boton_a, boton_b, boton_izquierda, boton_x, boton_y, boton_derecha, boton_back, boton_start, boton_pad_izquierda, boton_pad_derecha, cruz_izquierda, cruz_derecha, cruz_arriba, cruz_abajo;&lt;br /&gt;
 &lt;br /&gt;
  void posicion_estado_corriente(const myrabot_arm_base::ReadServos&amp;amp; pec)   &lt;br /&gt;
  {&lt;br /&gt;
	&lt;br /&gt;
	::p = pec.posicion;&lt;br /&gt;
	::e = pec.estado;&lt;br /&gt;
	::c = pec.corriente;&lt;br /&gt;
	  &lt;br /&gt;
  }	  	 &lt;br /&gt;
 &lt;br /&gt;
  void xbox(const sensor_msgs::Joy&amp;amp; xbox_joystick)   &lt;br /&gt;
  {	&lt;br /&gt;
	&lt;br /&gt;
	::pad_izquierda_x = xbox_joystick.axes[0];&lt;br /&gt;
	::pad_izquierda_y = xbox_joystick.axes[1];&lt;br /&gt;
	::gatillo_izquierda = xbox_joystick.axes[2] -1;&lt;br /&gt;
	::pad_derecha_x = xbox_joystick.axes[3];&lt;br /&gt;
	::pad_derecha_y = xbox_joystick.axes[4];&lt;br /&gt;
	::gatillo_derecha = xbox_joystick.axes[5] -1;&lt;br /&gt;
	&lt;br /&gt;
	::boton_a = xbox_joystick.buttons[0];&lt;br /&gt;
	::boton_b = xbox_joystick.buttons[1];&lt;br /&gt;
	::boton_x = xbox_joystick.buttons[2];&lt;br /&gt;
	::boton_y = xbox_joystick.buttons[3];&lt;br /&gt;
	::boton_izquierda = xbox_joystick.buttons[4];&lt;br /&gt;
	::boton_derecha = xbox_joystick.buttons[5];&lt;br /&gt;
	::boton_back = xbox_joystick.buttons[6];&lt;br /&gt;
	::boton_start = xbox_joystick.buttons[7];&lt;br /&gt;
	::boton_pad_izquierda = xbox_joystick.buttons[9];&lt;br /&gt;
	::boton_pad_derecha = xbox_joystick.buttons[10];	&lt;br /&gt;
	::cruz_izquierda = xbox_joystick.buttons[11];&lt;br /&gt;
	::cruz_derecha = xbox_joystick.buttons[12];&lt;br /&gt;
	::cruz_arriba = xbox_joystick.buttons[13];&lt;br /&gt;
	::cruz_abajo = xbox_joystick.buttons[14];	&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;teleoperador_xbox360&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
	&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber pose_sub_= n.subscribe(&amp;quot;pose_arm&amp;quot;, 1, posicion_estado_corriente);   &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber joystick_sub_= n.subscribe(&amp;quot;joy&amp;quot;, 1, xbox); &lt;br /&gt;
  	&lt;br /&gt;
  	&lt;br /&gt;
	ros::Publisher move_pub_=n.advertise&amp;lt;myrabot_arm_base::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
&lt;br /&gt;
	ros::Publisher hand_pub_=n.advertise&amp;lt;myrabot_arm_base::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);&lt;br /&gt;
	&lt;br /&gt;
	ros::Publisher base_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1); &lt;br /&gt;
		&lt;br /&gt;
    ros::Rate loop_rate(5);	&lt;br /&gt;
	&lt;br /&gt;
	while (ros::ok())&lt;br /&gt;
	{&lt;br /&gt;
	&lt;br /&gt;
		myrabot_arm_base::Servos pose = ::p;	&lt;br /&gt;
		&lt;br /&gt;
		if (::cont == 0 &amp;amp;&amp;amp; (pose.base != 0 &amp;amp;&amp;amp; pose.arti1 != 0 &amp;amp;&amp;amp; pose.arti2 != 0 &amp;amp;&amp;amp; pose.arti3 != 0))&lt;br /&gt;
		{&lt;br /&gt;
			::punto = home(::p, ::c);	&lt;br /&gt;
		&lt;br /&gt;
			::cont = 1;&lt;br /&gt;
		&lt;br /&gt;
			::pinza.pinza = 511;&lt;br /&gt;
		&lt;br /&gt;
			::teleop = inversa(::punto, ::pinza_incli, ::p, ::velocidad);		&lt;br /&gt;
		&lt;br /&gt;
			::teleop_pinza = control_pinza(::pinza, ::p, ::c);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (::pad_izquierda_y &amp;gt; 0.2 || ::pad_izquierda_y &amp;lt; -0.2 || ::pad_izquierda_x &amp;gt; 0.2 || ::pad_izquierda_x &amp;lt; -0.2 || ::pad_derecha_x &amp;gt; 0.2 || ::pad_derecha_x &amp;lt; -0.2 || pad_derecha_y &amp;gt; 0.2 || pad_derecha_y &amp;lt; -0.2 || (::gatillo_izquierda &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_izquierda != -1) || (::gatillo_derecha &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_derecha != -1) || ::cruz_izquierda !=  0 || ::cruz_derecha !=  0 || ::cruz_arriba != 0 || ::cruz_abajo != 0 || ::boton_back != 0 || ::boton_start != 0 || ::boton_a != 0 || ::boton_b != 0 || ::boton_x != 0 || ::boton_y != 0 || ::boton_izquierda != 0 || ::boton_derecha != 0)&lt;br /&gt;
		{&lt;br /&gt;
		&lt;br /&gt;
			if (::boton_start != 0 &amp;amp;&amp;amp; ::flanco == 0)&lt;br /&gt;
			{&lt;br /&gt;
				flanco = 1;&lt;br /&gt;
			}&lt;br /&gt;
			else &lt;br /&gt;
			{&lt;br /&gt;
				if (::boton_start != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::flanco = 2;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::flanco = 0;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		&lt;br /&gt;
			if (::boton_start != 0 &amp;amp;&amp;amp; ::flanco == 1)&lt;br /&gt;
			{&lt;br /&gt;
				if (::start == 0)&lt;br /&gt;
				{&lt;br /&gt;
					::start = 1;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::start = 0;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			if (::start == 1)&lt;br /&gt;
			{&lt;br /&gt;
			&lt;br /&gt;
				if (::boton_back != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::cont = 0;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::cruz_izquierda != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::velocidad = ::velocidad - 10;&lt;br /&gt;
					&lt;br /&gt;
					if (::velocidad &amp;lt; 10)&lt;br /&gt;
					{&lt;br /&gt;
						::velocidad = 10;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::cruz_derecha != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::velocidad = ::velocidad + 10;&lt;br /&gt;
					&lt;br /&gt;
					if (::velocidad &amp;gt; 100)&lt;br /&gt;
					{&lt;br /&gt;
						::velocidad = 100;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				if (::pad_derecha_x &amp;gt; 0.2 || ::pad_derecha_x &amp;lt; -0.2)&lt;br /&gt;
				{&lt;br /&gt;
					float f_pad_derecha_x = ::pad_derecha_x;&lt;br /&gt;
					::punto.x = ::punto.x + (f_pad_derecha_x * ::paso);&lt;br /&gt;
					::teleop = inversa(::punto, ::pinza_incli, pose, ::velocidad);&lt;br /&gt;
					if (::teleop.posicion.base == pose.base &amp;amp;&amp;amp; ::teleop.posicion.arti1 == pose.arti1 &amp;amp;&amp;amp; ::teleop.posicion.arti2 == pose.arti2 &amp;amp;&amp;amp; ::teleop.posicion.arti3 == pose.arti3) &lt;br /&gt;
					{::punto.x = ::punto.x - (f_pad_derecha_x * ::paso);}&lt;br /&gt;
					else&lt;br /&gt;
					{move_pub_.publish(::teleop);}&lt;br /&gt;
				}&lt;br /&gt;
	&lt;br /&gt;
				if (pad_derecha_y &amp;gt; 0.2 || pad_derecha_y &amp;lt; -0.2)&lt;br /&gt;
				{&lt;br /&gt;
					float f_pad_derecha_y = ::pad_derecha_y;&lt;br /&gt;
					::punto.y = ::punto.y + (f_pad_derecha_y * ::paso);&lt;br /&gt;
					::teleop = inversa(::punto, ::pinza_incli, pose, ::velocidad);&lt;br /&gt;
					if (::teleop.posicion.base == pose.base &amp;amp;&amp;amp; ::teleop.posicion.arti1 == pose.arti1 &amp;amp;&amp;amp; ::teleop.posicion.arti2 == pose.arti2 &amp;amp;&amp;amp; ::teleop.posicion.arti3 == pose.arti3) &lt;br /&gt;
					{::punto.y = ::punto.y - (f_pad_derecha_y * ::paso);}&lt;br /&gt;
					else&lt;br /&gt;
					{move_pub_.publish(::teleop);}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::gatillo_izquierda &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_izquierda != -1)&lt;br /&gt;
				{&lt;br /&gt;
					float f_gatillo_izquierda = ::gatillo_izquierda;&lt;br /&gt;
					::punto.z = ::punto.z + (f_gatillo_izquierda  * (::paso/2));&lt;br /&gt;
					::teleop = inversa(::punto, ::pinza_incli, pose, ::velocidad);&lt;br /&gt;
					if (::teleop.posicion.base == pose.base &amp;amp;&amp;amp; ::teleop.posicion.arti1 == pose.arti1 &amp;amp;&amp;amp; ::teleop.posicion.arti2 == pose.arti2 &amp;amp;&amp;amp; ::teleop.posicion.arti3 == pose.arti3) &lt;br /&gt;
					{::punto.z = ::punto.z - (f_gatillo_izquierda * (::paso/2));}&lt;br /&gt;
					else&lt;br /&gt;
					{move_pub_.publish(::teleop);}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::gatillo_derecha &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_derecha != -1)&lt;br /&gt;
				{&lt;br /&gt;
					float f_gatillo_derecha = ::gatillo_derecha;&lt;br /&gt;
					::punto.z = ::punto.z - (f_gatillo_derecha  * (::paso/2));&lt;br /&gt;
					::teleop = inversa(::punto, ::pinza_incli, pose, ::velocidad);&lt;br /&gt;
					if (::teleop.posicion.base == pose.base &amp;amp;&amp;amp; ::teleop.posicion.arti1 == pose.arti1 &amp;amp;&amp;amp; ::teleop.posicion.arti2 == pose.arti2 &amp;amp;&amp;amp; ::teleop.posicion.arti3 == pose.arti3) &lt;br /&gt;
					{::punto.z = ::punto.z + (f_gatillo_derecha * (::paso/2));}&lt;br /&gt;
					else&lt;br /&gt;
					{move_pub_.publish(::teleop);}&lt;br /&gt;
				}		&lt;br /&gt;
				&lt;br /&gt;
				if (::cruz_arriba !=  0)&lt;br /&gt;
				{&lt;br /&gt;
					::pinza_incli = ::pinza_incli - (::paso * ::cruz_arriba);&lt;br /&gt;
					teleop = inversa(::punto, ::pinza_incli, pose, ::velocidad);&lt;br /&gt;
					if (teleop.posicion.base == pose.base &amp;amp;&amp;amp; teleop.posicion.arti1 == pose.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == pose.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == pose.arti3) &lt;br /&gt;
					{::pinza_incli = ::pinza_incli + (::paso * ::cruz_arriba);}&lt;br /&gt;
					else&lt;br /&gt;
					{move_pub_.publish(::teleop);}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::cruz_abajo !=  0)&lt;br /&gt;
				{&lt;br /&gt;
					::pinza_incli = ::pinza_incli + (::paso * ::cruz_abajo);&lt;br /&gt;
					::teleop = inversa(::punto, ::pinza_incli, pose, ::velocidad);&lt;br /&gt;
					if (teleop.posicion.base == pose.base &amp;amp;&amp;amp; teleop.posicion.arti1 == pose.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == pose.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == pose.arti3) &lt;br /&gt;
					{::pinza_incli = ::pinza_incli - (::paso * ::cruz_abajo);}&lt;br /&gt;
					else&lt;br /&gt;
					{move_pub_.publish(::teleop);}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::boton_izquierda != 0)&lt;br /&gt;
				{     &lt;br /&gt;
					::pinza.pinza = ::pinza.pinza - (::paso * ::boton_izquierda);&lt;br /&gt;
					::teleop_pinza = control_pinza(::pinza, pose, ::c);&lt;br /&gt;
					if (::teleop_pinza.posicion.pinza == pose.pinza) &lt;br /&gt;
					{::pinza.pinza = ::pinza.pinza + (::paso * ::boton_izquierda);}&lt;br /&gt;
					else&lt;br /&gt;
					{hand_pub_.publish(::teleop_pinza);}	&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::boton_derecha != 0)&lt;br /&gt;
				{     &lt;br /&gt;
					::pinza.pinza = ::pinza.pinza + (::paso * ::boton_derecha);&lt;br /&gt;
					::teleop_pinza = control_pinza(::pinza, pose, ::c);&lt;br /&gt;
					if (::teleop_pinza.posicion.pinza == pose.pinza) &lt;br /&gt;
					{::pinza.pinza = ::pinza.pinza - (::paso * ::boton_derecha);}&lt;br /&gt;
					else&lt;br /&gt;
					{hand_pub_.publish(::teleop_pinza);}	&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::boton_a != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::avance = ::avance - 0.05;&lt;br /&gt;
					&lt;br /&gt;
					if (::avance &amp;lt; 0.05)&lt;br /&gt;
					{&lt;br /&gt;
						::avance = 0.05;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::boton_b != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::avance = ::avance + 0.05;&lt;br /&gt;
					&lt;br /&gt;
					if (::avance &amp;gt; 0.5)&lt;br /&gt;
					{&lt;br /&gt;
						::avance = 0.5;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::pad_izquierda_y &amp;gt; 0.2 || ::pad_izquierda_y &amp;lt; -0.2)&lt;br /&gt;
				{&lt;br /&gt;
					::base.linear.x = ::avance * pad_izquierda_y;&lt;br /&gt;
					base_pub_.publish(::base);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::base.linear.x = 0;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::boton_x != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::giro = ::giro - 0.05;&lt;br /&gt;
					&lt;br /&gt;
					if (::giro &amp;lt; 0.1)&lt;br /&gt;
					{&lt;br /&gt;
						::giro = 0.1;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::boton_y != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::giro = ::giro + 0.05;&lt;br /&gt;
					&lt;br /&gt;
					if (::giro &amp;gt; 1.5)&lt;br /&gt;
					{&lt;br /&gt;
						::giro = 1.5;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				if (::pad_izquierda_x &amp;gt; 0.2 || ::pad_izquierda_x &amp;lt; -0.2)&lt;br /&gt;
				{&lt;br /&gt;
					::base.angular.z = ::giro * pad_izquierda_x;&lt;br /&gt;
					base_pub_.publish(::base);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::base.angular.z = 0;&lt;br /&gt;
				}		&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		ros::spinOnce();&lt;br /&gt;
	&lt;br /&gt;
		loop_rate.sleep();&lt;br /&gt;
	}		  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilarlo y generar el ejecutable se debe añadir la siguiente línea de código al archivo &amp;quot;CMakeLists.txt&amp;quot; del ''package'' creado, donde indicamos el nombre para el ejecutable y la ruta y nombre del archivo a compilar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;rosbuild_add_executable(teleoperador_xbox360 src/teleoperador_xbox360.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilar el programa hay que situarse en el directorio del ''package''. Simplemente con ejecutar la siguiente secuencia de comandos en un terminal se compilará y creará el ejecutable, siempre que no existan errores:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd myrabot_teleop&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;teleoperador_xbox360.launch&amp;quot; dentro del directorio &amp;quot;launch&amp;quot; del ''package'' creado con el siguiente contenido, para poder iniciar en una sola ejecución todos los programas necesarios:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;serial_node&amp;quot; pkg=&amp;quot;rosserial_python&amp;quot; type=&amp;quot;serial_node.py&amp;quot; args=&amp;quot;/dev/ttyACM0&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;joy&amp;quot; type=&amp;quot;joy_node&amp;quot; name=&amp;quot;joystick&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find turtlebot_bringup)/launch/minimal.launch&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;teleoperador_xbox360&amp;quot; pkg=&amp;quot;myrabot_teleop&amp;quot; type=&amp;quot;teleoperador_xbox360&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para iniciar el teleoperador simplemente deberemos ejecutar en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_teleop teleoperador_xbox360.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=%c3%93rdenes_y_confirmaci%c3%b3n_mediante_voz_(sphinx%2bfestival)&amp;diff=4212</id>
		<title>Órdenes y confirmación mediante voz (sphinx+festival)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=%c3%93rdenes_y_confirmaci%c3%b3n_mediante_voz_(sphinx%2bfestival)&amp;diff=4212"/>
				<updated>2014-09-29T11:05:58Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Pasos previos=&lt;br /&gt;
&lt;br /&gt;
Comenzaremos recopilando el software necesario. Para reconocimiento de voz emplearemos [http://cmusphinx.sourceforge.net/ CMU Pocket Sphinx] desarrollado en [http://www.cmu.edu/index.shtml Carnegie Mellon University], y para la locución de texto emplearemos [http://www.cstr.ed.ac.uk/projects/festival/ Festival Speech Synthesis System] desarrollado en [http://www.ed.ac.uk/home University of Edinburgh].&lt;br /&gt;
&lt;br /&gt;
Actualmente se encuentra disponible para las versiones groovy e hydro de [http://wiki.ros.org/ ROS] el ''package'' [http://wiki.ros.org/pocketsphinx pocketsphinx], que podemos instalar simplemente ejecutando en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get install ros-&amp;quot;groovy o hydro&amp;quot;-pocketsphinx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para versiones anteriores necesitamos instalar el ''package'' para [http://www.ubuntu.com/ ubuntu] de [http://cmusphinx.sourceforge.net/ CMU Pocket Sphinx]. Para instalarlo ejecutaremos el siguiente comando en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get install gstreamer0.10-pocketsphinx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para obtener el ''package'' para [http://wiki.ros.org/ ROS] de [http://cmusphinx.sourceforge.net/ CMU Pocket Sphinx], usaremos el ''stack'' &amp;quot;rharmony&amp;quot; de [http://www.albany.edu/ University of Albany]. En un terminal, nos situaremos en el directorio de nuestro [[Fernando-TFM-ROS02#Creando un espacio de trabajo|espacio de trabajo]], y ejecutaremos la siguiente secuencia de comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
svn checkout http://albany-ros-pkg.googlecode.com/svn/trunk/rharmony&lt;br /&gt;
rosmake --rosdep-install pocketsphinx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cstr.ed.ac.uk/projects/festival/ Festival Speech Synthesis System] se encuentra integrado en el ''package'' de [http://wiki.ros.org/ ROS] [http://wiki.ros.org/sound_play?distro=electric sound_play].&lt;br /&gt;
&lt;br /&gt;
=Reconocimiento de voz=&lt;br /&gt;
&lt;br /&gt;
Comenzaremos creando el ''package'' que va a contener nuestros programas de control mediante la voz. [[Fernando-TFM-ROS02#Creando un package|Crearemos un ''package'']] llamado &amp;quot;voz_fer&amp;quot; con las siguientes dependencias: pocketsphinx sound_play std_msgs roscpp. Ahora tenemos que que establecer las ordenes de voz que vamos a emplear para el control, pueden ser palabras u oraciones (en inglés), el uso de oraciones reduce la aparición de falsos positivos de reconocimiento. El vocabulario seleccionado es el siguiente, que guardaremos  en el directorio &amp;quot;config&amp;quot; del ''package'' creado, en un archivo llamado &amp;quot;comandos_voz.txt&amp;quot;, donde cada palabra u oración irá en una nueva línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
start speech&lt;br /&gt;
stop speech&lt;br /&gt;
go forward&lt;br /&gt;
go back&lt;br /&gt;
turn left&lt;br /&gt;
turn right&lt;br /&gt;
speed up&lt;br /&gt;
slow down&lt;br /&gt;
rotate left&lt;br /&gt;
rotate right&lt;br /&gt;
stop&lt;br /&gt;
point beer&lt;br /&gt;
point cocacola&lt;br /&gt;
fold arm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para generar este vocabulario para el reconocimiento debemos subir nuestro archivo comandos_voz.txt al siguiente enlace y compilarlo:&lt;br /&gt;
&lt;br /&gt;
[http://www.speech.cs.cmu.edu/tools/lmtool-new.html Sphinx knowledge base tool]&lt;br /&gt;
&lt;br /&gt;
Descargaremos los archivos generados al directorio &amp;quot;config&amp;quot; del ''package'' creado y los renombraremos como &amp;quot;comandos_voz.*&amp;quot;. Vamos a crear un ''launcher'' para poder ejecutar el programa de reconocimiento usando el vocabulario que hemos creado. En el directorio &amp;quot;launch&amp;quot; el ''package'' crearemos un archivo llamado &amp;quot;comandos_voz.launch&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;recognizer&amp;quot; pkg=&amp;quot;pocketsphinx&amp;quot; type=&amp;quot;recognizer.py&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;lm&amp;quot; value=&amp;quot;$(find voz_fer)/config/comandos.lm&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;dict&amp;quot; value=&amp;quot;$(find voz_fer)/config/comandos.dic&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para iniciar el reconocimiento de voz simplemente debemos ejecutar en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch voz_fer comandos_voz.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los resultados de reconocimiento de voz se publican en el ''topic'' &amp;quot;recognizer/output&amp;quot;, en un mensaje tipo [http://docs.ros.org/api/std_msgs/html/msg/String.html std_msgs/String]. Podemos ver el resultado producido al hablar ejecutando el siguiente comando en otro terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic echo recognizer/output&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Locución de texto=&lt;br /&gt;
&lt;br /&gt;
Para poder realizar la locución de texto desde nuestro programa necesitamos hacer uso de la clase sound_play::SoundClient, en la cul se definen las siguientes funciones públicas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Sound 	builtinSound (int id)&lt;br /&gt;
 	Create a builtin Sound.&lt;br /&gt;
void 	play (int sound)&lt;br /&gt;
 	Play a buildin sound.&lt;br /&gt;
void 	playWave (const std::string &amp;amp;s)&lt;br /&gt;
 	Plays a WAV or OGG file.&lt;br /&gt;
void 	repeat (const std::string &amp;amp;s)&lt;br /&gt;
 	Say a string repeatedly.&lt;br /&gt;
void 	say (const std::string &amp;amp;s, const std::string &amp;amp;voice=&amp;quot;voice_kal_diphone&amp;quot;)&lt;br /&gt;
 	Say a string.&lt;br /&gt;
void 	setQuiet (bool state)&lt;br /&gt;
 	Turns warning messages on or off.&lt;br /&gt;
 	SoundClient (ros::NodeHandle &amp;amp;nh, const std::string &amp;amp;topic)&lt;br /&gt;
 	Create a SoundClient that publishes on the given topic.&lt;br /&gt;
 	SoundClient ()&lt;br /&gt;
 	Create a SoundClient with the default topic.&lt;br /&gt;
void 	start (int sound)&lt;br /&gt;
 	Play a buildin sound repeatedly.&lt;br /&gt;
void 	startWave (const std::string &amp;amp;s)&lt;br /&gt;
 	Plays a WAV or OGG file repeatedly.&lt;br /&gt;
void 	stop (int sound)&lt;br /&gt;
 	Stop playing a built-in sound.&lt;br /&gt;
void 	stopAll ()&lt;br /&gt;
 	Stop all currently playing sounds.&lt;br /&gt;
void 	stopSaying (const std::string &amp;amp;s)&lt;br /&gt;
 	Stop saying a string.&lt;br /&gt;
void 	stopWave (const std::string &amp;amp;s)&lt;br /&gt;
 	Stop playing a WAV or OGG file.&lt;br /&gt;
Sound 	voiceSound (const std::string &amp;amp;s)&lt;br /&gt;
 	Create a voice Sound.&lt;br /&gt;
Sound 	waveSound (const std::string &amp;amp;s)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La función que vamos a emplear es &amp;quot;say&amp;quot;, que pronuncia una cadena de texto una sola vez, usando la voz por defecto &amp;quot;voice_kal_diphone&amp;quot;. Para completar la reproducción de un archivo o cadena de texto es necesario hacer una pausa en la ejecución de nuestro código usando la función &amp;quot;sleep(segundos)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=Programa de control MYRAbot=&lt;br /&gt;
&lt;br /&gt;
Este programa permite teleoperar mediante la voz el MYRAbot, así como dar una serie de órdenes para el señalado de objetos presentes en la escena. El programa crea un ''nodo'' llamado &amp;quot;control_voz&amp;quot; el cual se suscribe al ''topic'' &amp;quot;recognizer/output&amp;quot;, publicado por pocketsphinx, y publica los ''topics'' &amp;quot;cmd_vel&amp;quot;, para el control de los movimientos de la base, y &amp;quot;selected_object&amp;quot;, para la selección de opciones de apuntado del [[Control brazo MYRAbot (bioloid+arduino)|brazo]], al que está suscrito el programa [[Detección y cálculo de posición de objetos (cámara web)#Señalar objetos (Escoja)|escoja]]. En el directorio &amp;quot;src&amp;quot; de nuestro ''package'' crearemos un archivo llamado &amp;quot;control_voz.cpp&amp;quot;, con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;std_msgs/Int16.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;std_msgs/String.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;sound_play/sound_play.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  int inicio = 0;&lt;br /&gt;
  int rotate = 0;&lt;br /&gt;
  int turn = 0;&lt;br /&gt;
  int start = 0;&lt;br /&gt;
  int stop = 1;&lt;br /&gt;
  float linear_vel = 0.0;&lt;br /&gt;
  float angular_vel = 0.0;&lt;br /&gt;
  std_msgs::String comando_voz;  &lt;br /&gt;
 &lt;br /&gt;
  void sleepok(int t, ros::NodeHandle &amp;amp;n)&lt;br /&gt;
  {&lt;br /&gt;
       if (n.ok())&lt;br /&gt;
               sleep(t);&lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
  void speech(const std_msgs::String&amp;amp; voz)&lt;br /&gt;
  {&lt;br /&gt;
	::comando_voz = voz;&lt;br /&gt;
	&lt;br /&gt;
	ros::NodeHandle n;	&lt;br /&gt;
       &lt;br /&gt;
	ros::Publisher object_pub_=n.advertise&amp;lt;std_msgs::Int16&amp;gt;(&amp;quot;selected_object&amp;quot;, 1); &lt;br /&gt;
        &lt;br /&gt;
	ros::Publisher move_base_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1); &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	std_msgs::Int16 objeto;&lt;br /&gt;
	geometry_msgs::Twist mover_base;&lt;br /&gt;
	      &lt;br /&gt;
	if (::comando_voz.data == &amp;quot;start speech&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		inicio = 1;&lt;br /&gt;
				&lt;br /&gt;
	}&lt;br /&gt;
	else if (::comando_voz.data == &amp;quot;stop speech&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		inicio = 0;&lt;br /&gt;
				&lt;br /&gt;
	}&lt;br /&gt;
	else if (inicio == 1)&lt;br /&gt;
	{&lt;br /&gt;
		if (::comando_voz.data == &amp;quot;stop&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			::linear_vel = 0.0;&lt;br /&gt;
			::angular_vel = 0.0;&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;go forward&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			&lt;br /&gt;
			::linear_vel = 0.1;&lt;br /&gt;
			::angular_vel = 0.0;&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;go back&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			&lt;br /&gt;
			::linear_vel = -0.1;&lt;br /&gt;
			::angular_vel = 0.0;&lt;br /&gt;
			&lt;br /&gt;
		}	&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;turn left&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			if (::angular_vel &amp;lt;= 0 || ::rotate == 1)&lt;br /&gt;
			{&lt;br /&gt;
				::angular_vel = 0.1;&lt;br /&gt;
				&lt;br /&gt;
				::rotate = 0;&lt;br /&gt;
				::turn = 1;					&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
			&lt;br /&gt;
				::angular_vel = ::angular_vel + 0.1;&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;turn right&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			if (::angular_vel &amp;gt;= 0 || ::rotate == 1)&lt;br /&gt;
			{&lt;br /&gt;
				::angular_vel = -0.1;&lt;br /&gt;
				&lt;br /&gt;
				::rotate = 0;&lt;br /&gt;
				::turn = 1;				&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
		&lt;br /&gt;
			         ::angular_vel = ::angular_vel - 0.1;&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;rotate left&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			if (::angular_vel &amp;lt;= 0 || ::turn == 1)&lt;br /&gt;
			{&lt;br /&gt;
				::angular_vel = 0.1;&lt;br /&gt;
				&lt;br /&gt;
				::turn = 0;&lt;br /&gt;
				::rotate = 1;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			::linear_vel = 0.0;&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;rotate right&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			if (::angular_vel &amp;gt;= 0 || ::turn == 1)&lt;br /&gt;
			{&lt;br /&gt;
				::angular_vel = -0.1;&lt;br /&gt;
				&lt;br /&gt;
				::turn = 0;&lt;br /&gt;
				::rotate = 1;				&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			::linear_vel = 0.0;&lt;br /&gt;
&lt;br /&gt;
		}		&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;speed up&amp;quot;)				&lt;br /&gt;
		{&lt;br /&gt;
			if (::linear_vel == 0)&lt;br /&gt;
			{&lt;br /&gt;
				if (::angular_vel &amp;gt; 0 &amp;amp;&amp;amp; ::rotate == 1)&lt;br /&gt;
				{&lt;br /&gt;
					::angular_vel= ::angular_vel + 0.05;&lt;br /&gt;
				}&lt;br /&gt;
				else if (::rotate == 1)&lt;br /&gt;
				{&lt;br /&gt;
					::angular_vel = ::angular_vel - 0.05;&lt;br /&gt;
				}			&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				if (::linear_vel &amp;gt; 0)&lt;br /&gt;
				{&lt;br /&gt;
					::linear_vel = ::linear_vel + 0.05;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::linear_vel = ::linear_vel - 0.05;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;slow down&amp;quot;)				&lt;br /&gt;
		{&lt;br /&gt;
			if (::linear_vel == 0)&lt;br /&gt;
			{&lt;br /&gt;
				if (::angular_vel &amp;gt; 0 &amp;amp;&amp;amp; ::rotate == 1)&lt;br /&gt;
				{&lt;br /&gt;
					::angular_vel = ::angular_vel - 0.05;&lt;br /&gt;
				}&lt;br /&gt;
				else if (::rotate == 1)&lt;br /&gt;
				{&lt;br /&gt;
					::angular_vel = ::angular_vel + 0.05;&lt;br /&gt;
				}					&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				if (::linear_vel &amp;gt; 0)&lt;br /&gt;
				{&lt;br /&gt;
					::linear_vel = ::linear_vel - 0.05;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::linear_vel = ::linear_vel + 0.05;&lt;br /&gt;
				}			&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;point beer&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			objeto.data = 1;&lt;br /&gt;
			&lt;br /&gt;
			object_pub_.publish(objeto);&lt;br /&gt;
		}&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;point cocacola&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			objeto.data = 2;&lt;br /&gt;
			&lt;br /&gt;
			object_pub_.publish(objeto);&lt;br /&gt;
		}&lt;br /&gt;
		else if (::comando_voz.data == &amp;quot;fold arm&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			objeto.data = 100;&lt;br /&gt;
			&lt;br /&gt;
			object_pub_.publish(objeto);&lt;br /&gt;
		}													&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
      &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
         &lt;br /&gt;
        ros::init(argc, argv, &amp;quot;control_voz&amp;quot;);  &lt;br /&gt;
 &lt;br /&gt;
        ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
        ros::Subscriber speech_sub_= n.subscribe(&amp;quot;/recognizer/output&amp;quot;, 1, speech);&lt;br /&gt;
       &lt;br /&gt;
        ros::Publisher object_pub_=n.advertise&amp;lt;std_msgs::Int16&amp;gt;(&amp;quot;selected_object&amp;quot;, 1); &lt;br /&gt;
        &lt;br /&gt;
        ros::Publisher move_base_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1);&lt;br /&gt;
	      &lt;br /&gt;
        &lt;br /&gt;
        ros::Rate loop_rate(10);&lt;br /&gt;
        &lt;br /&gt;
        geometry_msgs::Twist mover_base;&lt;br /&gt;
        &lt;br /&gt;
        sound_play::SoundClient voz_robot;&lt;br /&gt;
        &lt;br /&gt;
		sleepok(1, n);        &lt;br /&gt;
        &lt;br /&gt;
        while (ros::ok())&lt;br /&gt;
        {		&lt;br /&gt;
			mover_base.linear.x = ::linear_vel;&lt;br /&gt;
			mover_base.angular.z = ::angular_vel; &lt;br /&gt;
			&lt;br /&gt;
			move_base_pub_.publish(mover_base);&lt;br /&gt;
			&lt;br /&gt;
			if (::comando_voz.data == &amp;quot;start speech&amp;quot; &amp;amp;&amp;amp; ::start == 0)&lt;br /&gt;
			{&lt;br /&gt;
				voz_robot.say(&amp;quot;bep bep. I am listening you&amp;quot;);&lt;br /&gt;
				&lt;br /&gt;
				sleepok(4, n);&lt;br /&gt;
				&lt;br /&gt;
				::start = 1;&lt;br /&gt;
				::stop = 0;&lt;br /&gt;
			}&lt;br /&gt;
			else if (::comando_voz.data == &amp;quot;stop speech&amp;quot; &amp;amp;&amp;amp; ::stop == 0)&lt;br /&gt;
			{&lt;br /&gt;
				voz_robot.say(&amp;quot;bep bep. I stop listening&amp;quot;);&lt;br /&gt;
				&lt;br /&gt;
				sleepok(4, n);&lt;br /&gt;
				&lt;br /&gt;
				::stop = 1;&lt;br /&gt;
				::start = 0;&lt;br /&gt;
			}			&lt;br /&gt;
			&lt;br /&gt;
			ros::spinOnce();&lt;br /&gt;
	&lt;br /&gt;
			loop_rate.sleep();			&lt;br /&gt;
        &lt;br /&gt;
		}                     &lt;br /&gt;
       &lt;br /&gt;
        ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para poder compilar y generar el ejecutable del programa añadiremos la siguiente línea de código al final del archivo &amp;quot;CMakeLists.txt&amp;quot; de nuestro ''package'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosbuild_add_executable(control_voz src/control_voz.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para comenzar la compilación debemos ejecutar en un terminal la siguiente secuencia de comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
roscd voz_fer&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con el programa compilado y creado el ejecutable, vamos a crear un ''launcher'' para lanzar todos los programas necesarios para su ejecución. Crearemos en el directorio &amp;quot;launch&amp;quot; del ''package'' un archivo llamado &amp;quot;control_voz.launch&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find voz_fer)/launch/comandos_voz.launch&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;soundplay_node&amp;quot; pkg=&amp;quot;sound_play&amp;quot; type=&amp;quot;soundplay_node.py&amp;quot;/&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;control_voz&amp;quot; pkg=&amp;quot;voz_fer&amp;quot; type=&amp;quot;control_voz&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find brazo_fer)/launch/escoja.launch&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para iniciar el ''launcher'' simplemente deberemos ejecutar el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch voz_fer control_voz.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo puede verse el [[Modelo para simulación MYRAbot (urdf+gazebo)|modelo del MYRAbot]] en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo], mientras es teleoperado usando los comandos de voz del vocabulario seleccionado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;_hvuvlRyNt0&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=_hvuvlRyNt0 Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Integraci%c3%b3n_de_MYRAbot_en_moveIt!_(gazebo%2bmoveIt!)&amp;diff=4211</id>
		<title>Integración de MYRAbot en moveIt! (gazebo+moveIt!)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Integraci%c3%b3n_de_MYRAbot_en_moveIt!_(gazebo%2bmoveIt!)&amp;diff=4211"/>
				<updated>2014-09-29T11:04:21Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Pasos previos==&lt;br /&gt;
&lt;br /&gt;
==Instalación de moveIt!==&lt;br /&gt;
&lt;br /&gt;
[http://moveit.ros.org/ MoveIt!] es un ''package'' que proporciona una herramienta software para todo tipo de tareas de manipulación tanto a nivel industrial como doméstico. Está disponible para las distribuciones [http://wiki.ros.org/groovy groovy] e [http://wiki.ros.org/hydro hydro] de [http://wiki.ros.org ROS], por lo que tendremos que tener instalada alguna de ellas. Para instalar [http://moveit.ros.org/ moveIt!] ejecutaremos el siguiente comando en un terminal, donde &amp;quot;ROS_DISTRIBUCION&amp;quot; corresponde con la distribución que tenemos instalada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get install ros-ROS_DISTRIBUCION-moveit-full&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modificación del modelo de MYRAbot para moveIt!==&lt;br /&gt;
&lt;br /&gt;
===Nuevo URDF del brazo===&lt;br /&gt;
&lt;br /&gt;
Necesitamos modificar el tipo de controladores, de las articulaciones del [[Modelo para simulación brazo MYRAbot (urdf+gazebo)|brazo]], empleados en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] para permitir que pueda tomar el control de estos [http://moveit.ros.org/ moveIt!]. También se han añadido al [[Modelo para simulación brazo MYRAbot (urdf+gazebo)|modelo del brazo]] las mallas 3D de los componentes reales. Crearemos un archivo llamado &amp;quot;brazo-macros_moveit.xacro&amp;quot; dentro del directorio &amp;quot;urdf&amp;quot; del ''package'' &amp;quot;brazo_fer_modelo&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot; xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;property name=&amp;quot;M_PI&amp;quot; value=&amp;quot;3.14159&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;M_SCALE&amp;quot; value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;F10_HEIGHT&amp;quot; value=&amp;quot;0.004&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;F4_HEIGHT&amp;quot; value=&amp;quot;0.0525&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;F3_HEIGHT&amp;quot; value=&amp;quot;0.009&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;AX12_HEIGHT&amp;quot; value=&amp;quot;0.0385&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;AX12_WIDTH&amp;quot; value=&amp;quot;0.038&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;F2_HEIGHT&amp;quot; value=&amp;quot;0.0265&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;color rgba=&amp;quot;0.87 0.90 0.87 1.0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;material name=&amp;quot;black&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;color rgba=&amp;quot;0.0 0.0 0.0 1.0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/material&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;default_inertia&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;default_inertia_servos&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.01&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.01&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;default_dynamics&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;dynamics fricction=&amp;quot;0&amp;quot; damping=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt; &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;bioloid_F10_fixed&amp;quot; params=&amp;quot;parent name color *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package:/brazo_fer_modelo/meshes/F10.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;${color}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F10.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;finger_fixed&amp;quot; params=&amp;quot;parent name color *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0.03075 0.0 0.001 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;box size=&amp;quot;0.0865 0.038 0.002&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;${color}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0.03075 0.0 0.001 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;box size=&amp;quot;0.0865 0.038 0.002&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;bioloid_F3_fixed&amp;quot; params=&amp;quot;parent name color *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F3.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;${color}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F3.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;dynamixel_AX12_fixed&amp;quot; params=&amp;quot;parent name *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.055&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia_servos/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package:/brazo_fer_modelo/meshes/ax12_box.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;black&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package:/brazo_fer_modelo/meshes/ax12_box.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;bioloid_F3_revolute&amp;quot; params=&amp;quot;parent name color llimit ulimit vlimit *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;axis xyz=&amp;quot;0 0 -1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;limit effort=&amp;quot;100&amp;quot; velocity=&amp;quot;${vlimit}&amp;quot; lower=&amp;quot;${llimit}&amp;quot; upper=&amp;quot;${ulimit}&amp;quot; /&amp;gt;&lt;br /&gt;
	  &amp;lt;default_dynamics/&amp;gt;      &lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_brazo_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_brazo_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F3.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;${color}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F3.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;bioloid_F2_revolute&amp;quot; params=&amp;quot;parent name color llimit ulimit vlimit *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;limit effort=&amp;quot;100&amp;quot; velocity=&amp;quot;${vlimit}&amp;quot; lower=&amp;quot;${llimit}&amp;quot; upper=&amp;quot;${ulimit}&amp;quot; /&amp;gt;&lt;br /&gt;
	  &amp;lt;default_dynamics/&amp;gt;       &lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F2.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;${color}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F2.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;bioloid_F4_revolute&amp;quot; params=&amp;quot;parent name color llimit ulimit vlimit *origin&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;${name}&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;limit effort=&amp;quot;100&amp;quot; velocity=&amp;quot;${vlimit}&amp;quot; lower=&amp;quot;${llimit}&amp;quot; upper=&amp;quot;${ulimit}&amp;quot; /&amp;gt;&lt;br /&gt;
	  &amp;lt;default_dynamics/&amp;gt;       &lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;${name}_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;${name}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;default_inertia/&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F4.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;${color}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F4.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;gazebo_propiedades_link&amp;quot; params=&amp;quot;nombre material&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;${nombre}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;mu1&amp;gt;100&amp;lt;/mu1&amp;gt;&lt;br /&gt;
	&amp;lt;mu2&amp;gt;100&amp;lt;/mu2&amp;gt;&lt;br /&gt;
	&amp;lt;kp&amp;gt;100000000000&amp;lt;/kp&amp;gt;&lt;br /&gt;
	&amp;lt;kd&amp;gt;1000000000&amp;lt;/kd&amp;gt;&lt;br /&gt;
	&amp;lt;material&amp;gt;${material}&amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
    &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt; &lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;gazebo_propiedades_joint&amp;quot; params=&amp;quot;nombre&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;gazebo reference=&amp;quot;${nombre}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;erp&amp;gt;0.1&amp;lt;/erp&amp;gt;&lt;br /&gt;
    &amp;lt;stopKd value=&amp;quot;100000000.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;stopKp value=&amp;quot;100000000.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;fudgeFactor value=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo&amp;gt;&lt;br /&gt;
  &amp;lt;plugin name=&amp;quot;gazebo_ros_control&amp;quot; filename=&amp;quot;libgazebo_ros_control.so&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/plugin&amp;gt;&lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;transmission name=&amp;quot;base_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;type&amp;gt;transmission_interface/SimpleTransmission&amp;lt;/type&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;base&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;base_motor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;hardwareInterface&amp;gt;EffortJointInterface&amp;lt;/hardwareInterface&amp;gt;&lt;br /&gt;
      &amp;lt;mechanicalReduction&amp;gt;1&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/transmission&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;transmission name=&amp;quot;arti1_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;type&amp;gt;transmission_interface/SimpleTransmission&amp;lt;/type&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;arti1&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;arti1_motor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;hardwareInterface&amp;gt;EffortJointInterface&amp;lt;/hardwareInterface&amp;gt;&lt;br /&gt;
      &amp;lt;mechanicalReduction&amp;gt;1&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/transmission&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;transmission name=&amp;quot;arti2_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;type&amp;gt;transmission_interface/SimpleTransmission&amp;lt;/type&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;arti2&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;arti3_motor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;hardwareInterface&amp;gt;EffortJointInterface&amp;lt;/hardwareInterface&amp;gt;&lt;br /&gt;
      &amp;lt;mechanicalReduction&amp;gt;1&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/transmission&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;transmission name=&amp;quot;arti3_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;type&amp;gt;transmission_interface/SimpleTransmission&amp;lt;/type&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;arti3&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;arti3_motor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;hardwareInterface&amp;gt;EffortJointInterface&amp;lt;/hardwareInterface&amp;gt;&lt;br /&gt;
      &amp;lt;mechanicalReduction&amp;gt;1&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/transmission&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;transmission name=&amp;quot;pinza_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;type&amp;gt;transmission_interface/SimpleTransmission&amp;lt;/type&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;pinza&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;pinza_motor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;hardwareInterface&amp;gt;EffortJointInterface&amp;lt;/hardwareInterface&amp;gt;&lt;br /&gt;
      &amp;lt;mechanicalReduction&amp;gt;1&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/transmission&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los archivos empleados, con los modelos de malla 3D &amp;quot;.stl&amp;quot;, en la descripción del brazo se pueden descargar a continuación, deben guardarse en el directorio &amp;quot;meshes&amp;quot; del ''package'' &amp;quot;brazo_fer_modelo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/ax12_box.stl ax12_box.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/F2.stl F2.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/F3.stl F3.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/F4.stl F4.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/F10.stl F10.stl]&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;brazo_moveit.xacro&amp;quot; dentro del directorio &amp;quot;urdf&amp;quot; del ''package'' &amp;quot;brazo_fer_modelo&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find brazo_fer_modelo)/urdf/brazo-macros_moveit.xacro&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;brazo&amp;quot; params=&amp;quot;parent *origin&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;fixed&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;fixed_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 0 1&amp;quot; /&amp;gt;  &lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;fixed_link&amp;quot;/&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- shoulder pan joint --&amp;gt;&lt;br /&gt;
    &amp;lt;dynamixel_AX12_fixed parent=&amp;quot;fixed_link&amp;quot; name=&amp;quot;servo_base&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0.019&amp;quot; rpy=&amp;quot;${M_PI/2} 0 ${-M_PI/2}&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/dynamixel_AX12_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F3_revolute parent=&amp;quot;servo_base_link&amp;quot; name=&amp;quot;base&amp;quot; color=&amp;quot;white&amp;quot; vlimit=&amp;quot;3&amp;quot; llimit=&amp;quot;-2.62&amp;quot; ulimit=&amp;quot;2.62&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 ${AX12_WIDTH/2} 0&amp;quot; rpy=&amp;quot;${-M_PI/2} ${-M_PI/2} ${-M_PI}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F3_revolute&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- shoulder lift joint --&amp;gt;&lt;br /&gt;
    &amp;lt;dynamixel_AX12_fixed parent=&amp;quot;base_brazo_link&amp;quot; name=&amp;quot;servo_arti1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${-AX12_HEIGHT-F10_HEIGHT+0.001}&amp;quot; rpy=&amp;quot;0 ${M_PI} 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/dynamixel_AX12_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F4_revolute parent=&amp;quot;servo_arti1_link&amp;quot; name=&amp;quot;arti1&amp;quot; color=&amp;quot;white&amp;quot; vlimit=&amp;quot;3&amp;quot; llimit=&amp;quot;-2.62&amp;quot; ulimit=&amp;quot;2.62&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F4_revolute&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F10_fixed parent=&amp;quot;arti1_link&amp;quot; name=&amp;quot;arti1_F10_0&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F4_HEIGHT+F10_HEIGHT/2}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F10_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F10_fixed parent=&amp;quot;arti1_F10_0_link&amp;quot; name=&amp;quot;arti1_F10_1&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F10_HEIGHT}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F10_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F10_fixed parent=&amp;quot;arti1_F10_1_link&amp;quot; name=&amp;quot;arti1_F10_2&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F10_HEIGHT}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F10_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F3_fixed parent=&amp;quot;arti1_F10_2_link&amp;quot; name=&amp;quot;arti1_F3_0&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F10_HEIGHT/2}&amp;quot; rpy=&amp;quot;0 ${M_PI} 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F3_fixed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- elbow joint --&amp;gt;&lt;br /&gt;
    &amp;lt;dynamixel_AX12_fixed parent=&amp;quot;arti1_F3_0_link&amp;quot; name=&amp;quot;servo_arti2&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${-AX12_HEIGHT-F10_HEIGHT+0.001}&amp;quot; rpy=&amp;quot;0 ${M_PI} 0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/dynamixel_AX12_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F4_revolute parent=&amp;quot;servo_arti2_link&amp;quot; name=&amp;quot;arti2&amp;quot; color=&amp;quot;white&amp;quot; vlimit=&amp;quot;3&amp;quot; llimit=&amp;quot;-2.63&amp;quot; ulimit=&amp;quot;2.63&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F4_revolute&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F10_fixed parent=&amp;quot;arti2_link&amp;quot; name=&amp;quot;arti2_F10_0&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F4_HEIGHT+F10_HEIGHT/2}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F10_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F10_fixed parent=&amp;quot;arti2_F10_0_link&amp;quot; name=&amp;quot;arti2_F10_1&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F10_HEIGHT}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F10_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F10_fixed parent=&amp;quot;arti2_F10_1_link&amp;quot; name=&amp;quot;arti2_F10_2&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F10_HEIGHT}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F10_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F3_fixed parent=&amp;quot;arti2_F10_2_link&amp;quot; name=&amp;quot;arti2_F3_0&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F10_HEIGHT/2}&amp;quot; rpy=&amp;quot;0 ${M_PI} 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F3_fixed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- wrist joint --&amp;gt;&lt;br /&gt;
    &amp;lt;dynamixel_AX12_fixed parent=&amp;quot;arti2_F3_0_link&amp;quot; name=&amp;quot;servo_arti3&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${-AX12_HEIGHT-F10_HEIGHT+0.001}&amp;quot; rpy=&amp;quot;0 ${M_PI} 0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/dynamixel_AX12_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F2_revolute parent=&amp;quot;servo_arti3_link&amp;quot; name=&amp;quot;arti3&amp;quot; color=&amp;quot;white&amp;quot; vlimit=&amp;quot;3&amp;quot; llimit=&amp;quot;-2.62&amp;quot; ulimit=&amp;quot;2.62&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F2_revolute&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F3_fixed parent=&amp;quot;arti3_link&amp;quot; name=&amp;quot;arti3_F3_0&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0.016 ${F2_HEIGHT}&amp;quot; rpy=&amp;quot;0 ${M_PI} ${-M_PI/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F3_fixed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- gripper joint --&amp;gt;&lt;br /&gt;
    &amp;lt;dynamixel_AX12_fixed parent=&amp;quot;arti3_F3_0_link&amp;quot; name=&amp;quot;servo_pinza&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;-0.02275 0 ${-AX12_WIDTH/2}&amp;quot; rpy=&amp;quot;${M_PI} ${M_PI/2} 0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/dynamixel_AX12_fixed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- finger 1 --&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;pinza&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;limit effort=&amp;quot;100&amp;quot; velocity=&amp;quot;3&amp;quot; lower=&amp;quot;-2.62&amp;quot; upper=&amp;quot;2.62&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;default_dynamics/&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;servo_pinza_link&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;pinza_movil_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;link name=&amp;quot;pinza_movil_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;default_inertia/&amp;gt;      &lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F2.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;material name=&amp;quot;white&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://brazo_fer_modelo/meshes/F2.stl&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
    &amp;lt;finger_fixed parent=&amp;quot;pinza_movil_link&amp;quot; name=&amp;quot;pinza_movil_dedo&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${F2_HEIGHT}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/finger_fixed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- finger 2 --&amp;gt;&lt;br /&gt;
    &amp;lt;bioloid_F3_fixed parent=&amp;quot;servo_pinza_link&amp;quot; name=&amp;quot;pinza_fija&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${-AX12_HEIGHT-F10_HEIGHT+0.001}&amp;quot; rpy=&amp;quot;0 ${M_PI} 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bioloid_F3_fixed&amp;gt;&lt;br /&gt;
    &amp;lt;finger_fixed parent=&amp;quot;pinza_fija_link&amp;quot; name=&amp;quot;pinza_fija_dedo&amp;quot; color=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 ${M_PI}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/finger_fixed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;servo_base_link&amp;quot; material=&amp;quot;brazo_fer/Black&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;base_brazo_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;servo_arti1_link&amp;quot; material=&amp;quot;brazo_fer/Black&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti1_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti1_F10_0_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti1_F10_1_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti1_F10_2_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti1_F3_0_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;servo_arti2_link&amp;quot; material=&amp;quot;brazo_fer/Black&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti2_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti2_F10_0_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti2_F10_1_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti2_F10_2_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti2_F3_0_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;servo_arti3_link&amp;quot; material=&amp;quot;brazo_fer/Black&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti3_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;arti3_F3_0_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;servo_pinza_link&amp;quot; material=&amp;quot;brazo_fer/Black&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_movil_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;      &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_movil_dedo_link&amp;quot; material=&amp;quot;brazo_fer/WhiteTransparent&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_fija_link&amp;quot; material=&amp;quot;brazo_fer/White&amp;quot; /&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_fija_dedo_link&amp;quot; material=&amp;quot;brazo_fer/WhiteTransparent&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;base&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;arti1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;arti2&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;arti3&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;pinza&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
     &lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Controladores para simulación brazo===&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;controller_moveit.yaml&amp;quot; dentro del directorio &amp;quot;config&amp;quot; del ''package'' &amp;quot;brazo_fer_modelo&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  # Publish all joint states -----------------------------------&lt;br /&gt;
  joint_state_controller:&lt;br /&gt;
    type: joint_state_controller/JointStateController&lt;br /&gt;
    publish_rate: 50  &lt;br /&gt;
  &lt;br /&gt;
  # Position Controllers ---------------------------------------   &lt;br /&gt;
  pinza_pos_controller:&lt;br /&gt;
    type: effort_controllers/JointPositionController&lt;br /&gt;
    joint: pinza&lt;br /&gt;
    pid: {p: 0.8, i: 0.6, d: 0.3, i_clamp: 1}&lt;br /&gt;
&lt;br /&gt;
  brazo_controller:&lt;br /&gt;
    type: effort_controllers/JointTrajectoryController&lt;br /&gt;
    joints:&lt;br /&gt;
      - arti1&lt;br /&gt;
      - arti2&lt;br /&gt;
      - arti3&lt;br /&gt;
      - base&lt;br /&gt;
&lt;br /&gt;
    gains: # Required because we're controlling an effort interface&lt;br /&gt;
      arti1: {p: 1.0, i: 0.6, d: 0.3, i_clamp: 10}&lt;br /&gt;
      arti2: {p: 1.0, i: 0.6, d: 0.3, i_clamp: 10}&lt;br /&gt;
      arti3: {p: 1.0, i: 0.6, d: 0.3, i_clamp: 10}&lt;br /&gt;
      base: {p: 1.0, i: 0.6, d: 0.3, i_clamp: 10}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Controlador para el brazo real (actionlib-action server)===&lt;br /&gt;
&lt;br /&gt;
Para la interacción entre el [[Control brazo MYRAbot (bioloid+arduino)|brazo]] y [http://moveit.ros.org/ moveIt!] es necesario un [http://wiki.ros.org/actionlib actionlib-ActionServer] que reciba las trayectorias calculadas a través de un ''Goal'', se suscriba al ''topic'' &amp;quot;pose_arm&amp;quot; (estados del brazo) y publique en el ''topic'' &amp;quot;move_arm&amp;quot; (movimiento del brazo). Crearemos un nuevo archivo llamado &amp;quot;controlador_brazo.cpp&amp;quot; dentro del directorio &amp;quot;src&amp;quot; del ''package'' &amp;quot;brazo_fer&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ros/ros.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ros/time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;trajectory_msgs/JointTrajectoryPoint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;trajectory_msgs/JointTrajectory.h&amp;gt;&lt;br /&gt;
#include &amp;lt;myrabot_arm_base_b/WriteServos.h&amp;gt;&lt;br /&gt;
#include &amp;lt;myrabot_arm_base_b/ReadServos.h&amp;gt;&lt;br /&gt;
#include &amp;lt;actionlib/server/simple_action_server.h&amp;gt;&lt;br /&gt;
#include &amp;lt;control_msgs/FollowJointTrajectoryAction.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define PI 3.14159265&lt;br /&gt;
&lt;br /&gt;
class MYRAbotArm&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&lt;br /&gt;
  MYRAbotArm(std::string name) :&lt;br /&gt;
    as_(nh_, name, false),&lt;br /&gt;
    action_name_(name)&lt;br /&gt;
  {&lt;br /&gt;
    as_.registerGoalCallback(boost::bind(&amp;amp;MYRAbotArm::goalCB, this));&lt;br /&gt;
    as_.registerPreemptCallback(boost::bind(&amp;amp;MYRAbotArm::preemptCB, this));&lt;br /&gt;
&lt;br /&gt;
    sub_pose_arm_ = nh_.subscribe(&amp;quot;/pose_arm&amp;quot;, 1, &amp;amp;MYRAbotArm::analysisCB, this);&lt;br /&gt;
&lt;br /&gt;
    pub_move_arm_ = nh_.advertise&amp;lt;myrabot_arm_base_b::WriteServos&amp;gt;(&amp;quot;/move_arm&amp;quot;, 1, this);&lt;br /&gt;
&lt;br /&gt;
    as_.start();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ~MYRAbotArm(void)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  void goalCB()&lt;br /&gt;
  {&lt;br /&gt;
	i_ = 0;&lt;br /&gt;
&lt;br /&gt;
	goal_ = as_.acceptNewGoal()-&amp;gt;trajectory;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  void preemptCB()&lt;br /&gt;
  {&lt;br /&gt;
    ROS_INFO(&amp;quot;%s: Preempted&amp;quot;, action_name_.c_str());&lt;br /&gt;
    as_.setPreempted();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  void analysisCB(const myrabot_arm_base_b::ReadServos&amp;amp; arm)&lt;br /&gt;
  {&lt;br /&gt;
    if (!as_.isActive())&lt;br /&gt;
      return;&lt;br /&gt;
&lt;br /&gt;
    ros::Time ahora = ros::Time::now();&lt;br /&gt;
&lt;br /&gt;
    feedback_.header.stamp = ahora;&lt;br /&gt;
&lt;br /&gt;
    feedback_.joint_names.resize(4);&lt;br /&gt;
    feedback_.actual.positions.resize(4);&lt;br /&gt;
    feedback_.actual.effort.resize(4);&lt;br /&gt;
&lt;br /&gt;
	for (int i = 0; i &amp;lt; 4; i++)&lt;br /&gt;
	{&lt;br /&gt;
		switch(i)&lt;br /&gt;
		{&lt;br /&gt;
			case 3:&lt;br /&gt;
				feedback_.joint_names[i] = &amp;quot;base_brazo&amp;quot;;&lt;br /&gt;
				feedback_.actual.positions[i] = ((((arm.posicion.base * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
				feedback_.actual.effort[i] = ((((arm.corriente.base * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
			break;&lt;br /&gt;
			case 0:&lt;br /&gt;
				feedback_.joint_names[i] = &amp;quot;arti1&amp;quot;;&lt;br /&gt;
				feedback_.actual.positions[i] = ((((arm.posicion.arti1 * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
				feedback_.actual.effort[i] = ((((arm.corriente.arti1 * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
			break;&lt;br /&gt;
			case 1:&lt;br /&gt;
				feedback_.joint_names[i] = &amp;quot;arti2&amp;quot;;&lt;br /&gt;
				feedback_.actual.positions[i] = ((((arm.posicion.arti2 * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
				feedback_.actual.effort[i] = ((((arm.corriente.arti2 * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
			break;&lt;br /&gt;
			case 2:&lt;br /&gt;
				feedback_.joint_names[i] = &amp;quot;arti3&amp;quot;;&lt;br /&gt;
				feedback_.actual.positions[i] = ((((arm.posicion.arti3 * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
				feedback_.actual.effort[i] = ((((arm.corriente.arti3 * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	puntos_ = goal_.points.size();&lt;br /&gt;
&lt;br /&gt;
	if (i_ != puntos_)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	    	myrabot_arm_base_b::WriteServos move;&lt;br /&gt;
&lt;br /&gt;
	    		if (i_ == 0&lt;br /&gt;
	    		    ||((feedback_.actual.positions[0] &amp;lt;= (goal_.points[i_-1].positions[0] + 0.1) &amp;amp;&amp;amp; feedback_.actual.positions[0] &amp;gt;= (goal_.points[i_-1].positions[0] - 0.1))&lt;br /&gt;
	    		    &amp;amp;&amp;amp; (feedback_.actual.positions[1] &amp;lt;= (goal_.points[i_-1].positions[1] + 0.1) &amp;amp;&amp;amp; feedback_.actual.positions[1] &amp;gt;= (goal_.points[i_-1].positions[1] - 0.1))&lt;br /&gt;
	    		    &amp;amp;&amp;amp; (feedback_.actual.positions[2] &amp;lt;= (goal_.points[i_-1].positions[2] + 0.1) &amp;amp;&amp;amp; feedback_.actual.positions[2] &amp;gt;= (goal_.points[i_-1].positions[2] - 0.1))&lt;br /&gt;
	    		    &amp;amp;&amp;amp; (feedback_.actual.positions[3] &amp;lt;= (goal_.points[i_-1].positions[3] + 0.1) &amp;amp;&amp;amp; feedback_.actual.positions[3] &amp;gt;= (goal_.points[i_-1].positions[3] - 0.1))))&lt;br /&gt;
	    		{&lt;br /&gt;
	    			for (int j = 0; j &amp;lt; 4; j++)&lt;br /&gt;
	    			{&lt;br /&gt;
	    				switch (j)&lt;br /&gt;
	    				{&lt;br /&gt;
	    				case 3:&lt;br /&gt;
	    					move.posicion.base = ((((goal_.points[i_].positions[j]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	    					move.velocidad.base = abs(goal_.points[i_].velocities[j]*511);&lt;br /&gt;
	    					move.par.base = 1;&lt;br /&gt;
	    				break;&lt;br /&gt;
	    				case 0:&lt;br /&gt;
	    					move.posicion.arti1 = ((((goal_.points[i_].positions[j]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	    					move.velocidad.arti1 = abs(goal_.points[i_].velocities[j]*511);&lt;br /&gt;
	    					move.par.arti1 = 1;&lt;br /&gt;
	    				break;&lt;br /&gt;
	    				case 1:&lt;br /&gt;
	    					move.posicion.arti2 = ((((goal_.points[i_].positions[j]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	    					move.velocidad.arti2 = abs(goal_.points[i_].velocities[j]*511);&lt;br /&gt;
	    					move.par.arti2 = 1;&lt;br /&gt;
	    				break;&lt;br /&gt;
	    				case 2:&lt;br /&gt;
	    					move.posicion.arti3 = ((((goal_.points[i_].positions[j]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	    				        move.velocidad.arti3 = abs(goal_.points[i_].velocities[j]*511);&lt;br /&gt;
	    					move.par.arti3 = 1;&lt;br /&gt;
	    				break;&lt;br /&gt;
	    				}&lt;br /&gt;
	    			}&lt;br /&gt;
&lt;br /&gt;
	    			pub_move_arm_.publish(move);&lt;br /&gt;
&lt;br /&gt;
	    			t_inicio = ros::Time::now();&lt;br /&gt;
	    		}&lt;br /&gt;
	    		else&lt;br /&gt;
	    		{&lt;br /&gt;
	    			i_ = i_ - 1;&lt;br /&gt;
	    		}&lt;br /&gt;
&lt;br /&gt;
	    		ros::Time ahora = ros::Time::now();&lt;br /&gt;
&lt;br /&gt;
	    		ros::Duration duracion(1.0);&lt;br /&gt;
&lt;br /&gt;
	    		if (ahora &amp;gt; (t_inicio + duracion))&lt;br /&gt;
	    		{&lt;br /&gt;
	    			result_.error_code = -1;&lt;br /&gt;
	    	                as_.setAborted(result_);&lt;br /&gt;
	    		}&lt;br /&gt;
&lt;br /&gt;
			feedback_.desired = goal_.points[i_];&lt;br /&gt;
&lt;br /&gt;
			feedback_.error.positions.resize(4);&lt;br /&gt;
&lt;br /&gt;
			for (int j = 0; j &amp;lt; 4; j++)&lt;br /&gt;
			{&lt;br /&gt;
				feedback_.error.positions[j] = feedback_.desired.positions[j] - feedback_.actual.positions[j];&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
    		i_ ++;&lt;br /&gt;
  	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		result_.error_code = 0;&lt;br /&gt;
	        as_.setSucceeded(result_);&lt;br /&gt;
	}&lt;br /&gt;
	as_.publishFeedback(feedback_);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
protected:&lt;br /&gt;
&lt;br /&gt;
  ros::NodeHandle nh_;&lt;br /&gt;
  actionlib::SimpleActionServer&amp;lt;control_msgs::FollowJointTrajectoryAction&amp;gt; as_;&lt;br /&gt;
  std::string action_name_;&lt;br /&gt;
  int puntos_, i_;&lt;br /&gt;
  ros::Time t_inicio;&lt;br /&gt;
  trajectory_msgs::JointTrajectory goal_;&lt;br /&gt;
  control_msgs::FollowJointTrajectoryResult result_;&lt;br /&gt;
  control_msgs::FollowJointTrajectoryFeedback feedback_;&lt;br /&gt;
  ros::Subscriber sub_pose_arm_;&lt;br /&gt;
  ros::Publisher pub_move_arm_;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv)&lt;br /&gt;
{&lt;br /&gt;
  ros::init(argc, argv, &amp;quot;brazo_controller/follow_join_trajectory&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  MYRAbotArm brazo(ros::this_node::getName());&lt;br /&gt;
  ros::spin();&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilarlo y generar el ejecutable se debe añadir la siguiente línea de código al archivo &amp;quot;CMakeLists.txt&amp;quot; del ''package'' creado, donde indicamos el nombre para el ejecutable y la ruta y nombre del archivo a compilar: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;rosbuild_add_executable(controlador_brazo src/controlador_brazo.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Necesitamos añadir las siguientes dependencias al ''package'' en el archivo &amp;quot;manifest.xml&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;actionlib&lt;br /&gt;
actionlib_msgs&lt;br /&gt;
trajectory_msgs&lt;br /&gt;
control_msgs&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilar el programa hay que situarse en el directorio del ''package''. Simplemente con ejecutar la siguiente secuencia de comandos en un terminal se compilará y creará el ejecutable, siempre que no existan errores:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Nuevo URDF soporte y cámara xtion===&lt;br /&gt;
&lt;br /&gt;
Se ha colocado una estructra de soporte para situar la nueva cámara [http://www.asus.com/Multimedia/Xtion_PRO_LIVE/ asus Xtion PRO LIVE] para poder realizar tareas de manipulación y reconocimiento de objetos, en sustitución de la anterior [[Detección y cálculo de posición de objetos (cámara web)|cámara web]]. Para la estructura de soporte añadiremos las siguientes líneas de código al archivo &amp;quot;estructura-myrabot.xacro&amp;quot; situado en el directotio &amp;quot;urdf&amp;quot; del ''package'' &amp;quot;myrabot_fer_modelo&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;soporte_3&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_soporte_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_soporte_3_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0.065 0.61&amp;quot; rpy=&amp;quot;0.12 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_soporte_3_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.0 -0.065 ${0.06/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.135 -0.2 -0.03&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_soporte_3.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.135 -0.2 -0.03&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_soporte_3.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt; &lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_soporte_3_link&amp;quot; material=&amp;quot;myrabot_fer/LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;xtion.xacro&amp;quot; dentro del directorio &amp;quot;urdf&amp;quot; del ''package'' &amp;quot;myrabot_fer_modelo&amp;quot; con el siguiente contenido para el modelo del sensor 3D:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;robot xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Xacro properties --&amp;gt;&lt;br /&gt;
  &amp;lt;xacro:property name=&amp;quot;M_SCALE&amp;quot; value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;xacro:property name=&amp;quot;asus_xtion_pro_depth_rel_rgb_py&amp;quot; value=&amp;quot;0.0270&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;xacro:property name=&amp;quot;asus_xtion_pro_cam_rel_rgb_py&amp;quot;   value=&amp;quot;-0.0220&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;property name=&amp;quot;M_PI&amp;quot; value=&amp;quot;3.14159&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Parameterised in part by the values in turtlebot_properties.urdf.xacro --&amp;gt;&lt;br /&gt;
  &amp;lt;xacro:macro name=&amp;quot;xtion&amp;quot; params=&amp;quot;parent *origin&amp;quot;&amp;gt;&lt;br /&gt;
	  &lt;br /&gt;
    &amp;lt;joint name=&amp;quot;camera_rgb_joint_xtion&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;camera_rgb_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;camera_rgb_frame_xtion&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;camera_rgb_optical_joint_xtion&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;${-M_PI/2} 0 ${-M_PI/2}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;camera_rgb_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;camera_rgb_optical_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;camera_rgb_optical_frame_xtion&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;camera_joint_xtion&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0.0175 ${asus_xtion_pro_cam_rel_rgb_py} 0.021&amp;quot;&lt;br /&gt;
              rpy=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;camera_rgb_frame_xtion&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;camera_link_xtion&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;link name=&amp;quot;camera_link_xtion&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;visual&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;-0.01 0 0&amp;quot; rpy=&amp;quot;${-M_PI/2} -${M_PI} ${-M_PI/2}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/asus_xtion_pro_live.dae&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/visual&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;-0.01 0 0&amp;quot; rpy=&amp;quot;${-M_PI/2} -${M_PI} ${-M_PI/2}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
          &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/asus_xtion_pro_live.dae&amp;quot; scale=&amp;quot;${M_SCALE} ${M_SCALE} ${M_SCALE}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;/collision&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;camera_depth_joint_xtion&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0.0175 ${asus_xtion_pro_depth_rel_rgb_py} 0.021&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;camera_rgb_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;camera_depth_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;camera_depth_frame_xtion&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;camera_depth_optical_joint_xtion&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;${-M_PI/2} 0 ${-M_PI/2}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;parent link=&amp;quot;camera_depth_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;child link=&amp;quot;camera_depth_optical_frame_xtion&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link name=&amp;quot;camera_depth_optical_frame_xtion&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertial&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
          izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;gazebo reference=&amp;quot;camera_link_xtion&amp;quot;&amp;gt;  &lt;br /&gt;
      &amp;lt;sensor type=&amp;quot;depth&amp;quot; name=&amp;quot;xtion&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;always_on&amp;gt;true&amp;lt;/always_on&amp;gt;&lt;br /&gt;
        &amp;lt;update_rate&amp;gt;20.0&amp;lt;/update_rate&amp;gt;&lt;br /&gt;
        &amp;lt;camera&amp;gt;&lt;br /&gt;
          &amp;lt;horizontal_fov&amp;gt;${60.0*M_PI/180.0}&amp;lt;/horizontal_fov&amp;gt;&lt;br /&gt;
          &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;R8G8B8&amp;lt;/format&amp;gt;&lt;br /&gt;
            &amp;lt;width&amp;gt;640&amp;lt;/width&amp;gt;&lt;br /&gt;
            &amp;lt;height&amp;gt;480&amp;lt;/height&amp;gt;&lt;br /&gt;
          &amp;lt;/image&amp;gt;&lt;br /&gt;
          &amp;lt;clip&amp;gt;&lt;br /&gt;
            &amp;lt;near&amp;gt;0.05&amp;lt;/near&amp;gt;&lt;br /&gt;
            &amp;lt;far&amp;gt;8.0&amp;lt;/far&amp;gt;&lt;br /&gt;
          &amp;lt;/clip&amp;gt;&lt;br /&gt;
        &amp;lt;/camera&amp;gt;&lt;br /&gt;
        &amp;lt;plugin name=&amp;quot;xtion_camera_controller&amp;quot; filename=&amp;quot;libgazebo_ros_openni_kinect.so&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;cameraName&amp;gt;xtion&amp;lt;/cameraName&amp;gt;&lt;br /&gt;
          &amp;lt;alwaysOn&amp;gt;true&amp;lt;/alwaysOn&amp;gt;&lt;br /&gt;
          &amp;lt;updateRate&amp;gt;10&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
          &amp;lt;imageTopicName&amp;gt;rgb/image_raw&amp;lt;/imageTopicName&amp;gt;&lt;br /&gt;
          &amp;lt;depthImageTopicName&amp;gt;depth/image_raw&amp;lt;/depthImageTopicName&amp;gt;&lt;br /&gt;
          &amp;lt;pointCloudTopicName&amp;gt;depth/points&amp;lt;/pointCloudTopicName&amp;gt;&lt;br /&gt;
          &amp;lt;cameraInfoTopicName&amp;gt;rgb/camera_info&amp;lt;/cameraInfoTopicName&amp;gt;&lt;br /&gt;
          &amp;lt;depthImageCameraInfoTopicName&amp;gt;depth/camera_info&amp;lt;/depthImageCameraInfoTopicName&amp;gt;&lt;br /&gt;
          &amp;lt;frameName&amp;gt;camera_depth_optical_frame_xtion&amp;lt;/frameName&amp;gt;&lt;br /&gt;
          &amp;lt;baseline&amp;gt;0.1&amp;lt;/baseline&amp;gt;&lt;br /&gt;
          &amp;lt;distortion_k1&amp;gt;0.0&amp;lt;/distortion_k1&amp;gt;&lt;br /&gt;
          &amp;lt;distortion_k2&amp;gt;0.0&amp;lt;/distortion_k2&amp;gt;&lt;br /&gt;
          &amp;lt;distortion_k3&amp;gt;0.0&amp;lt;/distortion_k3&amp;gt;&lt;br /&gt;
          &amp;lt;distortion_t1&amp;gt;0.0&amp;lt;/distortion_t1&amp;gt;&lt;br /&gt;
          &amp;lt;distortion_t2&amp;gt;0.0&amp;lt;/distortion_t2&amp;gt;&lt;br /&gt;
          &amp;lt;pointCloudCutoff&amp;gt;0.4&amp;lt;/pointCloudCutoff&amp;gt;&lt;br /&gt;
        &amp;lt;/plugin&amp;gt;&lt;br /&gt;
      &amp;lt;/sensor&amp;gt;&lt;br /&gt;
    &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Los archivos empleados, con los modelos de malla 3D &amp;quot;.stl&amp;quot; y &amp;quot;.dae&amp;quot;, en la descrición de la estructura soporte y de la cámara se pueden descargar a continuación, deben guardarse en el directorio &amp;quot;meshes&amp;quot; de nuestro ''package'':&lt;br /&gt;
&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_soporte_3.stl e_soporte_3.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/asus_xtion_pro_live.dae asus_xtion_pro_live.dae]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/images/asus_xtion_pro_live.png asus_xtion_pro_live.png]&lt;br /&gt;
&lt;br /&gt;
===Nuevo URDF de MYRAbot===&lt;br /&gt;
&lt;br /&gt;
También debemos crear un archivo llamado &amp;quot;myrabot_moveit.urdf.xacro&amp;quot; dentro del directorio &amp;quot;urdf&amp;quot; del ''package'' &amp;quot;myrabot_fer_modelo&amp;quot; con el siguiente contenido, para añadir a el [[Modelo para simulación MYRAbot (urdf+gazebo)|modelo del robot]] el nuevo [[Modelo para simulación brazo MYRAbot (urdf+gazebo)|modelo del brazo]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot name=&amp;quot;MYRAbot&amp;quot;&lt;br /&gt;
       xmlns:xi=&amp;quot;http://www.w3.org/2001/XInclude&amp;quot;&lt;br /&gt;
       xmlns:gazebo=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#gz&amp;quot;&lt;br /&gt;
       xmlns:model=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#model&amp;quot;&lt;br /&gt;
       xmlns:sensor=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor&amp;quot;&lt;br /&gt;
       xmlns:body=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#body&amp;quot;&lt;br /&gt;
       xmlns:geom=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#geom&amp;quot;&lt;br /&gt;
       xmlns:joint=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#joint&amp;quot;&lt;br /&gt;
       xmlns:interface=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#interface&amp;quot;&lt;br /&gt;
       xmlns:rendering=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#rendering&amp;quot;&lt;br /&gt;
       xmlns:renderable=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#renderable&amp;quot;&lt;br /&gt;
       xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot;&lt;br /&gt;
       xmlns:physics=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#physics&amp;quot;&lt;br /&gt;
       xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/roomba.xacro&amp;quot; /&amp;gt;		&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/estructura-myrabot.xacro&amp;quot; /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/kinect.xacro&amp;quot; /&amp;gt;	&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find brazo_fer_modelo)/urdf/brazo_moveit.xacro&amp;quot; /&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/xtion.xacro&amp;quot; /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;xacro:include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/ultrasonidos.xacro&amp;quot; /&amp;gt;		&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;roomba /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;estructura_myrabot parent=&amp;quot;base_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 1.57&amp;quot; xyz=&amp;quot;0 0 0.063&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/estructura_myrabot&amp;gt; &lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;kinect parent=&amp;quot;e_base_kinect_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 -1.57&amp;quot; xyz=&amp;quot;0 -0.045 0.112&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/kinect&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;brazo parent=&amp;quot;e_base_brazo_1_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 1.57&amp;quot; xyz=&amp;quot;0 -0.1015 0.075&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/brazo&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;xtion parent=&amp;quot;e_soporte_3_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0.65 -1.57&amp;quot; xyz=&amp;quot;0.021 -0.03 0.175&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/xtion&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;1&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 1.57&amp;quot; xyz=&amp;quot;0 0 ${0.04-0.007}&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;	&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;2&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 2.36&amp;quot; xyz=&amp;quot;0 0 ${0.04-0.007}&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;3&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 3.14&amp;quot; xyz=&amp;quot;0 0 ${0.04-0.007}&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;	&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;4&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 3.93&amp;quot; xyz=&amp;quot;0 0 ${0.04-0.007}&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;5&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 4.71&amp;quot; xyz=&amp;quot;0 0 ${0.04-0.007}&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;							&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;myrabot_gazebo_moveit.launcher&amp;quot; dentro del directorio &amp;quot;launch&amp;quot; del ''package'' &amp;quot;myrabot_fer_modelo&amp;quot; con el siguiente contenido, para cargar en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] el nuevo modelo del robot adaptado a [http://moveit.ros.org/ moveIt!]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find gazebo_ros)/launch/empty_world.launch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;arg name=&amp;quot;paused&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;arg name=&amp;quot;use_sim_time&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;arg name=&amp;quot;debug&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;arg name=&amp;quot;world_name&amp;quot; value=&amp;quot;$(find turtlebot_gazebo)/worlds/empty.world&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/include&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;robot_description&amp;quot; command=&amp;quot;$(find xacro)/xacro.py '$(find myrabot_fer_modelo)/urdf/myrabot_moveit.urdf.xacro'&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_myrabot&amp;quot; pkg=&amp;quot;gazebo_ros&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-urdf -param robot_description -model MYRAbot&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;rosparam file=&amp;quot;$(find brazo_fer_modelo)/config/controller_moveit.yaml&amp;quot; command=&amp;quot;load&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;controller_spawner&amp;quot; pkg=&amp;quot;controller_manager&amp;quot; type=&amp;quot;spawner&amp;quot; args=&amp;quot;pinza_pos_controller brazo_controller joint_state_controller&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;node name=&amp;quot;robot_state_publisher&amp;quot; pkg=&amp;quot;robot_state_publisher&amp;quot; type=&amp;quot;state_publisher&amp;quot; /&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;robot_pose_ekf&amp;quot; type=&amp;quot;robot_pose_ekf&amp;quot; name=&amp;quot;robot_pose_ekf&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;freq&amp;quot; value=&amp;quot;30.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;sensor_timeout&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;publish_tf&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;odom_used&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;imu_used&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;vo_used&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;output_frame&amp;quot; value=&amp;quot;odom&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;pointcloud_throttle&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudThrottle openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;max_rate&amp;quot; value=&amp;quot;20.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud_in&amp;quot; to=&amp;quot;/camera/depth/points&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud_out&amp;quot; to=&amp;quot;cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;kinect_laser&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudToScan openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;output_frame_id&amp;quot; value=&amp;quot;/camera_depth_frame&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;!-- heights are in the (optical?) frame of the kinect --&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;min_height&amp;quot; value=&amp;quot;-0.15&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;max_height&amp;quot; value=&amp;quot;0.15&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud&amp;quot; to=&amp;quot;/cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;kinect_laser_narrow&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudToScan openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;output_frame_id&amp;quot; value=&amp;quot;/camera_depth_frame&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;!-- heights are in the (optical?) frame of the kinect --&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;min_height&amp;quot; value=&amp;quot;-0.025&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;max_height&amp;quot; value=&amp;quot;0.025&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud&amp;quot; to=&amp;quot;/cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;scan&amp;quot; to=&amp;quot;/narrow_scan&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Configuración de MYRAbot en moveIt!=&lt;br /&gt;
&lt;br /&gt;
==Asistente de configuración==&lt;br /&gt;
&lt;br /&gt;
Una vez instalado [http://moveit.ros.org/ moveIt!] ejecutaremos el siguiente comando en un terminal para iniciar el asistente de configuración de este ''package'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch moveit_setup_assistant setup_assistant.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos aparecerá la ventana que se muestra a continuación, donde podemos escoger entre crear un nuevo ''package'' de configuración (Create New MoveIt Configuration Package) o editar un ''package'' de configuración existente (Edit existing MoveIt Configuration Package):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[file:myrabot_moveit_asistente_01.png|thumb|400px|center|Ventana de inicio asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Pinchamos sobre la opción &amp;quot;Create New MoveIt Configuration Package&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Seleccionamos el archivo [http://wiki.ros.org/urdf/Tutorials URDF] del [[Modelo para simulación MYRAbot (urdf+gazebo)|modelo de MYRAbot]] pinchando en &amp;quot;Browse&amp;quot; &amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||[[file:myrabot_moveit_asistente_02.png|thumb|400px|center|Ventana creación nuevo ''package'' asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Cuando tengamos seleccionado el modelo del robot pincharemos en &amp;quot;Load Files&amp;quot; para que el asistente de [http://moveit.ros.org/ moveIt!] cargue nuestro modelo. Al finalizar el proceso de carga aparecerá el modelo del robot en la parte derecha de la ventana, como se puede ver en la siguiente imagen:&lt;br /&gt;
&lt;br /&gt;
[[file:myrabot_moveit_asistente_03.png|thumb|400px|center|Ventana carga modelo robot asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
&lt;br /&gt;
Ahora seleccionaremos en el menú de la parte izquierda de la ventana &amp;quot;Self-Collision&amp;quot; y pincharemos en &amp;quot;Regenerate Default Collision Mtrix&amp;quot; para calcular la matriz de colisiones de nuestro modelo, podemos ver el resultado en la siguiente imagen:&lt;br /&gt;
&lt;br /&gt;
[[file:myrabot_moveit_asistente_04.png|thumb|400px|center|Ventana Self-Collision asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
&lt;br /&gt;
En el menú de la izquierda seleccionaremos &amp;quot;Virtual Joints&amp;quot; y pincharemos en &amp;quot;Add Virtual Joint&amp;quot;. En el campo &amp;quot;Virtual Joint Name&amp;quot; escribiremos '''virtual_joint''', en el campo &amp;quot;Child_Link&amp;quot; seleccionaremos el ''link'' '''base_footprint''', en el campo &amp;quot;Parent Frame Name&amp;quot; escribiremos '''odom''' y en el campo &amp;quot;Joint Type&amp;quot; seleccionaremos '''planar'''. El procedimiento se muestra en las siguientes imagenes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[file:myrabot_moveit_asistente_05.png|thumb|400px|center|Ventana añadir &amp;quot;Virtual Joint&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Para añadir la &amp;quot;Virtual Joint&amp;quot; pinchamos en &amp;quot;Save&amp;quot; &amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||[[file:myrabot_moveit_asistente_06.png|thumb|400px|center|Ventana &amp;quot;Virtual Joints&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En el menú de la izquierda seleccionaremos &amp;quot;Planning Groups&amp;quot; y pincharemos en &amp;quot;Add group&amp;quot;. En el campo &amp;quot;Group Name&amp;quot; escribiremos '''brazo''' y en el campo &amp;quot;Kinematic Solver&amp;quot; seleccionaremos '''kdl_kinematics_plugin/KDLKinematicsPlugin''', el resto de campos se dejarán como viene por defecto. El procedimiento se muestra en las siguientes imagenes:&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[file:myrabot_moveit_asistente_07.png|thumb|300px|center|Ventana añadir &amp;quot;Group&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Para añadir articulaciones pinchamos en &amp;quot;Add Joints&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Seleccionamos de la lista las articulaciones del brazo (&amp;lt;font style=&amp;quot;font-weight: bold&amp;quot;&amp;gt;base, arti1, arti2, arti3&amp;lt;/font&amp;gt;) &amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||[[file:myrabot_moveit_asistente_08.png|thumb|300px|center|Ventana añadir &amp;quot;Joints&amp;quot; a &amp;quot;Group&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
||||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Para añadir &amp;quot;Joints&amp;quot; y &amp;quot;Group&amp;quot; pinchamos en &amp;quot;Save&amp;quot; &amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||||[[file:myrabot_moveit_asistente_09.png|thumb|300px|center|Ventana &amp;quot;Planning Group&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
|}&lt;br /&gt;
También debemos añadir el grupo de la pinza pinchando en &amp;quot;Add Group&amp;quot;. En el campo &amp;quot;Group Name&amp;quot; escribiremos '''pinza''' y en el campo &amp;quot;Kinematic Solver&amp;quot; seleccionaremos '''None''', el resto de campos se dejarán como viene por defecto. El procedimiento se muestra en las siguientes imagenes:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[file:myrabot_moveit_asistente_10.png|thumb|300px|center|Ventana añadir &amp;quot;Group&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Para añadir partes pinchamos en &amp;quot;Add Links&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Seleccionamos de la lista las partes de la pinza &amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||[[file:myrabot_moveit_asistente_11.png|thumb|300px|center|Ventana añadir &amp;quot;Links&amp;quot; a &amp;quot;Group&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
||||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Para añadir &amp;quot;Links&amp;quot; y &amp;quot;Group&amp;quot; pinchamos en &amp;quot;Save&amp;quot; &amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||||[[file:myrabot_moveit_asistente_12.png|thumb|300px|center|Ventana &amp;quot;Planning Group&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Podemos establecer posiciones predefinidas para el brazo y así poder reutilizarlas. En el menú de la izquierda seleccionaremos &amp;quot;Robot Poses&amp;quot; y pincharemos en &amp;quot;Add Pose&amp;quot;. En el campo &amp;quot;Pose Name&amp;quot; escribiremos '''home''' y en el campo &amp;quot;Planning Group&amp;quot; seleccionaremos '''brazo'''. Con los controles deslizantes podemos modificar la posición de cada articulación para establecer la posición deseada. El procedimiento se muestra en las siguientes imagenes:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[file:myrabot_moveit_asistente_13.png|thumb|400px|center|Ventana añadir &amp;quot;Robot Pose&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Para añadir la &amp;quot;Robot Pose&amp;quot; pinchamos en &amp;quot;Save&amp;quot; &amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||[[file:myrabot_moveit_asistente_14.png|thumb|400px|center|Ventana &amp;quot;Robot Pose&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En el menú de la izquierda seleccionaremos &amp;quot;End Effectors&amp;quot; y pincharemos en &amp;quot;Add End Effector&amp;quot;. En el campo &amp;quot;End Effector Name&amp;quot; escribiremos '''pinza_eef''', en el campo &amp;quot;End Effector Group&amp;quot; seleccionaremos '''pinza''', en el campo &amp;quot;Parent Link&amp;quot; seleccionaremos '''arti3_link''' y el campo &amp;quot;Parent Group&amp;quot; lo dejaremos en blanco. El procedimiento se muestra en las siguientes imagenes:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[file:myrabot_moveit_asistente_15.png|thumb|400px|center|Ventana añadir &amp;quot;End Effector&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
||&amp;lt;center style=&amp;quot;text-align: left&amp;quot;&amp;gt;Para añadir el &amp;quot;End Effector&amp;quot; pinchamos en &amp;quot;Save&amp;quot; &amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|||[[file:myrabot_moveit_asistente_16.png|thumb|400px|center|Ventana &amp;quot;End Effectors&amp;quot; asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Para finalizar seleccionamos &amp;quot;Configuration Files&amp;quot; en el menú de la izquierda y  pincharemos en &amp;quot;Browse&amp;quot; para seleccionar la ubicación y nombre del ''package'' de configuración. Para generar el ''package'' simplemente pincharemos en &amp;quot;Generate Package&amp;quot;, como se muestra en la imagen:&lt;br /&gt;
&lt;br /&gt;
[[file:myrabot_moveit_asistente_18.png|thumb|400px|center|Ventana final asistente [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
&lt;br /&gt;
==Integración de controladores del brazo==&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;controllers.yaml&amp;quot; dentro del directorio &amp;quot;config&amp;quot; del ''package'' de configuración de [http://moveit.ros.org/ moveIt!] creado con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
controller_list:&lt;br /&gt;
 - name: brazo_controller&lt;br /&gt;
   action_ns: follow_joint_trajectory&lt;br /&gt;
   type: FollowJointTrajectory&lt;br /&gt;
   default: true&lt;br /&gt;
   joints:&lt;br /&gt;
     - arti1&lt;br /&gt;
     - arti2&lt;br /&gt;
     - arti3&lt;br /&gt;
     - base&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Editaremos el archivo &amp;quot;MYRAbot_moveit_controller_manager.launch.xml&amp;quot; situado en el directorio &amp;quot;launch&amp;quot;  del ''package'' de configuración de [http://moveit.ros.org/ moveIt!] creado para que su contenido sea el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!-- Set the param that trajectory_execution_manager needs to find the controller plugin --&amp;gt;&lt;br /&gt;
 &amp;lt;arg name=&amp;quot;moveit_controller_manager&amp;quot; default=&amp;quot;moveit_simple_controller_manager/MoveItSimpleControllerManager&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;param name=&amp;quot;moveit_controller_manager&amp;quot; value=&amp;quot;$(arg moveit_controller_manager)&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;!-- load controller_list --&amp;gt;&lt;br /&gt;
 &amp;lt;rosparam file=&amp;quot;$(find myrabot_moveit_generated)/config/controllers.yaml&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Integración de sensores de percepción==&lt;br /&gt;
&lt;br /&gt;
Dentro de estos sensores tenemos la [http://www.asus.com/Multimedia/Xtion_PRO_LIVE/ asus xtion pro live] y la [http://www.microsoft.com/en-us/kinectforwindows/ kinect], con las cuales puede estar equipado MYRAbot y las cuales se configuran de igual modo. Crearemos un archivo llamado &amp;quot;xtion.yaml&amp;quot; dentro del directorio &amp;quot;config&amp;quot; del ''package'' de configuración de [http://moveit.ros.org/ moveIt!] creado con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sensors:&lt;br /&gt;
  - sensor_plugin: occupancy_map_monitor/PointCloudOctomapUpdater&lt;br /&gt;
    point_cloud_topic: /xtion/depth/points&lt;br /&gt;
    max_range: 5.0&lt;br /&gt;
    point_subsample: 1&lt;br /&gt;
    padding_offset: 0.1&lt;br /&gt;
    padding_scale: 1.0&lt;br /&gt;
    filtered_cloud_topic: filtered_cloud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Editaremos el archivo &amp;quot;MYRAbot_moveit_sensor_manager.launch.xml&amp;quot; situado en el directorio &amp;quot;launch&amp;quot;  del ''package'' de configuración de [http://moveit.ros.org/ moveIt!] creado para que su contenido sea el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rosparam command=&amp;quot;load&amp;quot; file=&amp;quot;$(find myrabot_moveit_generated)/config/xtion.yaml&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;param name=&amp;quot;octomap_frame&amp;quot; type=&amp;quot;string&amp;quot; value=&amp;quot;odom&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;param name=&amp;quot;octomap_resolution&amp;quot; type=&amp;quot;double&amp;quot; value=&amp;quot;0.05&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;param name=&amp;quot;max_range&amp;quot; type=&amp;quot;double&amp;quot; value=&amp;quot;5.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tenemos que añadir el valor '''move_group/MoveGroupGetPlanningSceneService''' al parámetro &amp;quot;capabilities&amp;quot; en el archivo &amp;quot;move_group.launch&amp;quot; que se encuantra dentro del directorio &amp;quot;launch&amp;quot;  del ''package'' de configuración de [http://moveit.ros.org/ moveIt!] creado, quedando como se muestra a continuación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- MoveGroup capabilities to load --&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;capabilities&amp;quot; value=&amp;quot;move_group/MoveGroupCartesianPathService&lt;br /&gt;
				      move_group/MoveGroupExecuteService&lt;br /&gt;
				      move_group/MoveGroupKinematicsService&lt;br /&gt;
				      move_group/MoveGroupMoveAction&lt;br /&gt;
				      move_group/MoveGroupPickPlaceAction&lt;br /&gt;
				      move_group/MoveGroupPlanService&lt;br /&gt;
				      move_group/MoveGroupQueryPlannersService&lt;br /&gt;
				      move_group/MoveGroupStateValidationService&lt;br /&gt;
				      move_group/MoveGroupGetPlanningSceneService&lt;br /&gt;
				      &amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modificación del archivo .srdf generado==&lt;br /&gt;
&lt;br /&gt;
Tenemos que modificar el archivo &amp;quot;MYRAbot.srdf&amp;quot; generado por el asistente para remplazar las comas por puntos en los valores de las posiciones de las articulaciones guardados, como se muestra a continuación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;group_state name=&amp;quot;home&amp;quot; group=&amp;quot;brazo&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;arti1&amp;quot; value=&amp;quot;1,3836&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;arti2&amp;quot; value=&amp;quot;-2,2458&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;arti3&amp;quot; value=&amp;quot;-0,7065&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;base&amp;quot; value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/group_state&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;group_state name=&amp;quot;home&amp;quot; group=&amp;quot;brazo&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;arti1&amp;quot; value=&amp;quot;1.3836&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;arti2&amp;quot; value=&amp;quot;-2.2458&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;arti3&amp;quot; value=&amp;quot;-0.7065&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;joint name=&amp;quot;base&amp;quot; value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/group_state&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ejecución=&lt;br /&gt;
&lt;br /&gt;
==Planificación simple==&lt;br /&gt;
&lt;br /&gt;
Para probar que MYRAbot funciona correctamente en [http://moveit.ros.org/ moveIt!] podemos iniciar el ''launcher'' &amp;quot;demo.launch&amp;quot; contenido en el directorio &amp;quot;launch&amp;quot; del ''package'' generado, ejecutando en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_moveit_generated demo.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se cargará el modelo de MYRAbot en [http://wiki.ros.org/rviz rviz] con el &amp;quot;Motion Planning Interface&amp;quot; de [http://moveit.ros.org/ moveIt!], como se muestra en la siguiente imagen:&lt;br /&gt;
&lt;br /&gt;
[[file:myrabot_moveit_plugin_rviz.png|thumb|500px|center|MYRAbot en [http://wiki.ros.org/rviz rviz] con ''plugin'' de [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
&lt;br /&gt;
Podemos ver, si esta seleccionado el modo &amp;quot;interact&amp;quot;, unos ''interactive markers'' en torno a la pinza mediante los cuales podremos interactuar con la representación de los estados inicial y final del brazo. Si desplegamos la opción '''Planning Request''' dentro de '''MotionPlanning''', podemos activa o desactivar la representación del estado inicial '''Query Start State''' (representado en verde) o la representación del estado final '''Query Goal State''' (representado en naranja). Cuando alguna de las partes del brazo entre en contacto con otra u otro objeto, estas cambiarán a color rojo.&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo podemos ver un proceso de planificación simple, sin obstáculos, que desplaza el brazo desde una posición inicio, en este caso la pose guardada &amp;quot;home&amp;quot;, hasta una posición de destino, marcada desplazando el brazo usando los ''interantive markers'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;doy6VRjzYZc&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=doy6VRjzYZc Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Planificación con escena modelada==&lt;br /&gt;
&lt;br /&gt;
Ejecutaremos el siguiente comando en un terminal para iniciar [http://wiki.ros.org/rviz rviz] con el modelo del robot y el &amp;quot;MotionPlanning&amp;quot; de [http://moveit.ros.org/ moveIt!]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_moveit_generated demo.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se ha creado una escena con figuras geométricas básicas que representan una mesa y una lata sobre esta. No se han empleado mallas 3D, ''meshes'', aunque es una opción disponible, ya que hay problemas de intercambio aleatorio entre las representaciones visuales de los objetos. Crearemos un archivo llamado &amp;quot;mesa_lata.scene&amp;quot; dentro de nuestra carpeta personal&lt;br /&gt;
con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesa_Lata&lt;br /&gt;
* mesa_pata_izquierda_delantera&lt;br /&gt;
1&lt;br /&gt;
cylinder&lt;br /&gt;
0.015 0.71&lt;br /&gt;
0.20 0.97 0.355&lt;br /&gt;
0 0 0 1&lt;br /&gt;
0 0 0 1&lt;br /&gt;
* mesa_pata_derecha_delantera&lt;br /&gt;
1&lt;br /&gt;
cylinder&lt;br /&gt;
0.015 0.71&lt;br /&gt;
0.20 -0.97 0.355&lt;br /&gt;
0 0 0 1&lt;br /&gt;
0 0 0 1&lt;br /&gt;
* mesa_pata_derecha_trasera&lt;br /&gt;
1&lt;br /&gt;
cylinder&lt;br /&gt;
0.015 0.71&lt;br /&gt;
0.89 -0.97 0.355&lt;br /&gt;
0 0 0 1&lt;br /&gt;
0 0 0 1&lt;br /&gt;
* mesa_pata_izquierda_trasera&lt;br /&gt;
1&lt;br /&gt;
cylinder&lt;br /&gt;
0.015 0.71&lt;br /&gt;
0.89 0.97 0.355&lt;br /&gt;
0 0 0 1&lt;br /&gt;
0 0 0 1&lt;br /&gt;
* mesa_tablero&lt;br /&gt;
1&lt;br /&gt;
box&lt;br /&gt;
0.75 2 0.03&lt;br /&gt;
0.545 0 0.725&lt;br /&gt;
0 0 0 1&lt;br /&gt;
0.71372549 0.494117647 0.301960784 1&lt;br /&gt;
* lata&lt;br /&gt;
1&lt;br /&gt;
cylinder&lt;br /&gt;
0.03 0.12&lt;br /&gt;
0.28 0 0.8&lt;br /&gt;
0 0 0 1&lt;br /&gt;
1 0 0 1&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este archivo lo cargaremos en el menú '''Scene Objects''' de '''MotionPlanning''' pinchando en '''Import From Text'''. En el siguiente vídeo podemos ver el proceso de carga de la escena y la planificación de la trayectoria para evitar la lata, representada por un cilindro de color rojo, situada sobre la masa, desplazando el brazo desde un punto de partida a otro de destino entre los cuales se encuentra situada la lata:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;oWe_jj4keXU&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=oWe_jj4keXU Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Planificación con robot en gazebo==&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;myrabot_gazebo_moveit_mesa+latas.launch&amp;quot; dentro del directorio &amp;quot;launch&amp;quot; del ''package'' &amp;quot;myrabot_fer_modelo&amp;quot; con el siguiente contenido, para cargar [[Modelo para simulación MYRAbot (urdf+gazebo)#Creación de modelos de objetos|los modelos de los objetos]] (mesa y latas):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find myrabot_fer_modelo)/launch/myrabot_gazebo_moveit.launch&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Load models table and cans --&amp;gt;&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_mesa&amp;quot; pkg=&amp;quot;gazebo_ros&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find myrabot_objects_models_b)/urdf/mesa.urdf -urdf -x 0.545 -y 0 -z 0 -Y -1.57 -model mesa&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;    &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!--node name=&amp;quot;spawn_lata_coca_cola&amp;quot; pkg=&amp;quot;gazebo_ros&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find myrabot_objects_models_b)/urdf/lata_coca_cola.urdf -urdf -x 0.32 -y -0.18 -z 0.74 -Y -1.57 -model lata_Coca_Cola&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /--&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_lata_amstel&amp;quot; pkg=&amp;quot;gazebo_ros&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find myrabot_objects_models_b)/urdf/lata_amstel.urdf -urdf -x 0.32 -y 0.0 -z 0.74 -Y -1.57 -model lata_Amstel&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Crearemos otro archivo llamado &amp;quot;moveit_planning_execution.launch&amp;quot; dentro del directorio &amp;quot;launch&amp;quot; del ''package'' de configuración de [http://moveit.ros.org/ moveIt!] con el siguiente contenido, para iniciar el interfaz de planificación de movimientos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
 # The planning and execution components of MoveIt! configured to &lt;br /&gt;
 # publish the current configuration of the robot (simulated or real)&lt;br /&gt;
 # and the current state of the world as seen by the planner&lt;br /&gt;
 &amp;lt;include file=&amp;quot;$(find myrabot_moveit_generated)/launch/move_group.launch&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;arg name=&amp;quot;publish_monitored_planning_scene&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/include&amp;gt;&lt;br /&gt;
 # The visualization component of MoveIt!&lt;br /&gt;
 &amp;lt;include file=&amp;quot;$(find myrabot_moveit_generated)/launch/moveit_rviz.launch&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Ejecutaremos el siguiente comando en un terminal para iniciar [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] con los modelos del robot y los objetos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_fer_modelo myrabot_gazebo_moveit_mesa+latas.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En otro terminal ejecutaremos el siguiente comando para iniciar [http://wiki.ros.org/rviz rviz] con el &amp;quot;Motion Planning Interface&amp;quot; de [http://moveit.ros.org/ moveIt!]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_moveit_generated moveit_planning_execution.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo podemos ver el proceso de planificación y ejecución de la trayectoria para evitar la lata que se encuentra en medio de la trayectoria de las posiciones de inicio y destino, se planifica dos veces ya que la primera vez se detecta una colisión entre el brazo y la lata. La escena representada corresponde con la captada por el sensor de percepción situado por encima de la pantalla, donde se muestra el espacio ocupado mediante cubos con una tolerancia que permita evitar colisiones.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;xf1Jz1L-Xyc&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=xf1Jz1L-Xyc Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Planificación simple con robot real==&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;controlador_moveit.launch&amp;quot; dentro del directorio &amp;quot;launch&amp;quot; del ''package'' &amp;quot;brazo_fer&amp;quot; con el siguiente contenido, para cargar el modelo del robot e iniciar el brazo con el controlador para [http://moveit.ros.org/ moveIt!]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;robot_description&amp;quot; command=&amp;quot;$(find xacro)/xacro.py '$(find myrabot_fer_modelo)/urdf/myrabot_moveit.urdf.xacro'&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;robot_state_publisher&amp;quot; pkg=&amp;quot;robot_state_publisher&amp;quot; type=&amp;quot;state_publisher&amp;quot;&amp;gt;&amp;lt;/node&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;serial_node&amp;quot; pkg=&amp;quot;rosserial_python&amp;quot; type=&amp;quot;serial_node.py&amp;quot; args=&amp;quot;/dev/ttyACM0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;joint_states_brazo&amp;quot; pkg=&amp;quot;brazo_fer&amp;quot; type=&amp;quot;joint_states_brazo&amp;quot; /&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;group ns=&amp;quot;brazo_controller&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;node name=&amp;quot;follow_joint_trajectory&amp;quot; pkg=&amp;quot;brazo_fer&amp;quot; type=&amp;quot;controlador_moveit&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;/group&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutaremos el siguiente comando en un terminal para iniciar el control del brazo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer controlador_moveit.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En otro terminal ejecutaremos el siguiente comando para iniciar [http://wiki.ros.org/rviz rviz] con el &amp;quot;Motion Planning Interface&amp;quot; de [http://moveit.ros.org/ moveIt!]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_moveit_generated moveit_planning_execution.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo puede verse la planificación y ejecución de las trayectorias, por el brazo real, para alcanzar las pociones marcadas por el modelo del robot haciendo uso de ''interactive markers'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;Kz7bKL4ZP98&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=Kz7bKL4ZP98 Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Modelo_para_simulaci%c3%b3n_MYRAbot_(urdf%2bgazebo)&amp;diff=4210</id>
		<title>Modelo para simulación MYRAbot (urdf+gazebo)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Modelo_para_simulaci%c3%b3n_MYRAbot_(urdf%2bgazebo)&amp;diff=4210"/>
				<updated>2014-09-29T11:03:50Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Componentes del modelo de MYRAbot=&lt;br /&gt;
&lt;br /&gt;
Se ha comenzado realizado un modelo de la estructura del MYRAbot a la cual se le ha añadido la base [http://store.irobot.com/family/index.jsp?categoryId=3358508&amp;amp;s=A-ProductAge Roomba], la cámara [http://www.xbox.com/es-ES/Kinect kinect], el [[Modelo para simulación brazo MYRAbot (urdf+gazebo)|modelo del brazo]] y la cámara web [http://www.logitech.com/es-es/support/5867?crid=405 Logitech Webcam Pro 9000]. Hemos comenzado [[Fernando-TFM-ROS02#Creando un package|creando un package]] que va a contener el modelo de nuestro robot, que llamaremos &amp;quot;myrabot_fer_modelo&amp;quot;, con las dependencias urdf gazebo sensor_msgs roscpp.&lt;br /&gt;
&lt;br /&gt;
==URDF estructura MYRAbot==&lt;br /&gt;
&lt;br /&gt;
Se ha realizado previamente un modelo 3D de la estructura con un programa [http://es.wikipedia.org/wiki/Dise%C3%B1o_asistido_por_computadora CAD], del que vamos a emplear las partes con una geometria singular, ya que el diseño empleando los elementos geométricos básicos sería complicado. &lt;br /&gt;
&lt;br /&gt;
[[file:estructura_MYRAbot_modelo.jpg|thumb|500px|center|Diseño [http://es.wikipedia.org/wiki/Dise%C3%B1o_asistido_por_computadora CAD] 3D de la estructura del MYRAbot]]&lt;br /&gt;
&lt;br /&gt;
Para el archivo principal crearemos un archivo llamado &amp;quot;estructura-myrabot.xacro&amp;quot; en el directorio &amp;quot;urdf&amp;quot; de el ''package'' anteriormente creado, con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/estructura-myrabot-macros.xacro&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;estructura_myrabot&amp;quot; params=&amp;quot;parent *origin&amp;quot;&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;world_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_base_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
       &lt;br /&gt;
  &amp;lt;link name=&amp;quot;e_base_1_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 0.135 ${0.015/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 0.135 ${0.015/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.135&amp;quot; length=&amp;quot;0.015&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;${205/255} ${133/255} ${63/255} 1&amp;quot; /&amp;gt;&lt;br /&gt;
	  &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 0.135 ${0.015/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.135&amp;quot; length=&amp;quot;0.015&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;separador_base id=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;e_separador_base id=&amp;quot;1&amp;quot; xsim=&amp;quot;1&amp;quot; ysim=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;separador_base id=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;e_separador_base id=&amp;quot;2&amp;quot; xsim=&amp;quot;1&amp;quot; ysim=&amp;quot;-1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;separador_base id=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;e_separador_base id=&amp;quot;3&amp;quot; xsim=&amp;quot;-1&amp;quot; ysim=&amp;quot;-1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;separador_base id=&amp;quot;4&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;e_separador_base id=&amp;quot;4&amp;quot; xsim=&amp;quot;-1&amp;quot; ysim=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;base_2&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_base_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_base_2_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0.135&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;e_base_2_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 0.135 ${0.02/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 0.135 ${0.02/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.135&amp;quot; length=&amp;quot;0.02&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;${205/255} ${133/255} ${63/255} 1&amp;quot; /&amp;gt;&lt;br /&gt;
	  &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 0.135 ${0.02/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.135&amp;quot; length=&amp;quot;0.02&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;pilar&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_base_2_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_pilar_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0.02&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_pilar_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.08&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.7/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_pilar.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_pilar.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;ultrasonidos&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_base_2_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_ultrasonidos_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0.02&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_ultrasonidos_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.04&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.0 0.0 ${0.04/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.160 -0.135 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_robot_model/meshes/e_ultrasonidos.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.160 -0.135 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_robot_model/meshes/e_ultrasonidos.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;botonera&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_base_2_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_botonera_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0.02&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_botonera_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.06&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.1/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.1/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.2 0.09 0.1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.1/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.2 0.09 0.1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;joint name=&amp;quot;start_button_1&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_botonera_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_start_button_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;-0.06 0 0.1&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;e_start_button_1_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.002/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.002/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.009&amp;quot; length=&amp;quot;0.002&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;black&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;color rgba=&amp;quot;0 0 0 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;		  &lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.002/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.009&amp;quot; length=&amp;quot;0.002&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;joint name=&amp;quot;start_button_2&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_start_button_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_start_button_2_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0.0 0 0.002&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;e_start_button_2_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.004/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.004/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.0075&amp;quot; length=&amp;quot;0.004&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;color rgba=&amp;quot;0 1 0 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;		  &lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.004/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.0075&amp;quot; length=&amp;quot;0.004&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;joint name=&amp;quot;emergency_button_1&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_botonera_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_emergency_button_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0.06 0 0.1&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;e_emergency_button_1_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.015/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.015/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.0125&amp;quot; length=&amp;quot;0.015&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;metal&amp;quot; /&amp;gt;		  &lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.015/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.0125&amp;quot; length=&amp;quot;0.015&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;joint name=&amp;quot;emergency_button_2&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_emergency_button_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_emergency_button_2_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0.0 0 0.015&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;e_emergency_button_2_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.003/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.003/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.018&amp;quot; length=&amp;quot;0.003&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;color rgba=&amp;quot;1 0 0 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;		  &lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.135 ${0.165-(0.09/2)} ${0.003/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.018&amp;quot; length=&amp;quot;0.003&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;base_kinect&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_pilar_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_base_kinect_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 ${0.395-0.155}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_base_kinect_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.02&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.005/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_base_kinect.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_base_kinect.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;joint name=&amp;quot;base_brazo_1&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_pilar_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_base_brazo_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 ${0.708-(0.395-0.155)}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_base_brazo_1_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.03&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.005/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_base_brazo_1.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_base_brazo_1.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;separador_base_brazo id=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;e_separador_base_brazo id=&amp;quot;1&amp;quot; xsim=&amp;quot;1&amp;quot; ysim=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;separador_base_brazo id=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;e_separador_base_brazo id=&amp;quot;2&amp;quot; xsim=&amp;quot;1&amp;quot; ysim=&amp;quot;-1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;separador_base_brazo id=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;e_separador_base_brazo id=&amp;quot;3&amp;quot; xsim=&amp;quot;-1&amp;quot; ysim=&amp;quot;-1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;separador_base_brazo id=&amp;quot;4&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;e_separador_base_brazo id=&amp;quot;4&amp;quot; xsim=&amp;quot;-1&amp;quot; ysim=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;base_brazo_2&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_base_brazo_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_base_brazo_2_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0.074&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_base_brazo_2_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.005&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.005/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_base_brazo_2.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_base_brazo_2.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;soporte_1&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_pilar_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_soporte_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 ${0.995-(0.708-0.155)-(0.395-0.155)}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_soporte_1_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.05&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.64/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_soporte_1.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_soporte_1.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;joint name=&amp;quot;soporte_2&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_soporte_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_soporte_2_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0.2 0.61&amp;quot; rpy=&amp;quot;-0.12 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_soporte_2_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.06/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 -0.2 -0.03&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_soporte_2.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 -0.2 -0.03&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_soporte_2.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;monitor&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_soporte_2_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_monitor_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 -0.2 -0.09&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_monitor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.180/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_monitor.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/e_monitor.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;joint name=&amp;quot;pantalla&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_monitor_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_pantalla_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0.135 ${0.135-0.005-0.03-0.0001} 0.086&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;link name=&amp;quot;e_pantalla_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.0001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.22 0.0001 0.130&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;black&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.22 0.0001 0.127&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;       &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_base_1_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_base_2_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_separador_base_1_link&amp;quot; material=&amp;quot;Grey&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_separador_base_2_link&amp;quot; material=&amp;quot;Grey&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_separador_base_3_link&amp;quot; material=&amp;quot;Grey&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_separador_base_4_link&amp;quot; material=&amp;quot;Grey&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_separador_base_brazo_1_link&amp;quot; material=&amp;quot;Grey&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_separador_base_brazo_2_link&amp;quot; material=&amp;quot;Grey&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_separador_base_brazo_3_link&amp;quot; material=&amp;quot;Grey&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_separador_base_brazo_4_link&amp;quot; material=&amp;quot;Grey&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_pilar_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_base_kinect_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_base_brazo_1_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_base_brazo_2_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_botonera_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_start_button_1_link&amp;quot; material=&amp;quot;Black&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_start_button_2_link&amp;quot; material=&amp;quot;Green&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_emergency_button_1_link&amp;quot; material=&amp;quot;Grey&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_emergency_button_2_link&amp;quot; material=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_soporte_1_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_soporte_2_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_monitor_link&amp;quot; material=&amp;quot;LightWood&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades nombre=&amp;quot;e_pantalla_link&amp;quot; material=&amp;quot;Black&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los archivos empleados, con los modelos de malla 3D &amp;quot;.stl&amp;quot;, en la descrición de la estructura del robot se pueden descargar a continuación, deben guardarse en el directorio &amp;quot;meshes&amp;quot; de nuestro ''package'':&lt;br /&gt;
&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_pilar.stl e_pilar.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_base_kinect.stl e_base_kinect.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_base_brazo_1.stl e_base_brazo_1.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_base_brazo_2.stl e_base_brazo_2.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_soporte_1.stl e_soporte_1.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_soporte_2.stl e_soporte_2.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_monitor.stl e_monitor.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/e_ultrasonidos.stl e_ultrasonidos.stl]&lt;br /&gt;
&lt;br /&gt;
Los macros que estamos usando en el archivo principal del [http://wiki.ros.org/urdf/Tutorials URDF]  son los que se muestran continuación, que guardaremos en un archivo llamado &amp;quot;estructura-myrabot-macros.xacro&amp;quot; en el directorio &amp;quot;urdf&amp;quot; de nuestro ''package'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;default_inertia_e&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;inertia ixx=&amp;quot;0.01&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.01&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;separador_base&amp;quot; params=&amp;quot;id&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;joint name=&amp;quot;separador_base_${id}&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_base_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_separador_base_${id}_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0.135 0.135 0.015&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;e_separador_base&amp;quot; params=&amp;quot;id xsim ysim&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;link name=&amp;quot;e_separador_base_${id}_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.02&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;${xsim*0.040} ${ysim*0.105} ${0.120/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;${xsim*0.040} ${ysim*0.105} ${0.120/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.0075&amp;quot; length=&amp;quot;0.120&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;metal&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;${211/255} ${211/255} ${211/255} 1&amp;quot; /&amp;gt;&lt;br /&gt;
	  &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;${xsim*0.040} ${ysim*0.105} ${0.120/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.0075&amp;quot; length=&amp;quot;0.120&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt; &lt;br /&gt;
&amp;lt;/macro&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;separador_base_brazo&amp;quot; params=&amp;quot;id&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;joint name=&amp;quot;separador_base_brazo_${id}&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;e_base_brazo_1_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;e_separador_base_brazo_${id}_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0.135 ${0.135-0.082} 0.075&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;e_separador_base_brazo&amp;quot; params=&amp;quot;id xsim ysim&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;link name=&amp;quot;e_separador_base_brazo_${id}_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.002&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;${xsim*0.029} ${ysim*0.019} ${0.034/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;default_inertia_e /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;${xsim*0.029} ${ysim*0.019} ${0.034/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.002&amp;quot; length=&amp;quot;0.034&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;metal&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;${xsim*0.029} ${ysim*0.019} ${0.034/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.002&amp;quot; length=&amp;quot;0.034&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt; &lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;gazebo_propiedades&amp;quot; params=&amp;quot;nombre material&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;${nombre}&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;Gazebo/${material}&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;0.5&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;0.5&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt; &lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==URDF Roomba==&lt;br /&gt;
&lt;br /&gt;
Para la base móvil [http://store.irobot.com/family/index.jsp?categoryId=3358508&amp;amp;s=A-ProductAge Roomba] se ha empleado el modelo del [http://www.turtlebot.com/ turtlebot], aunque equipado con una base móvil [http://store.irobot.com/family/index.jsp?categoryId=2591511&amp;amp;s=A-ProductAge create], esta tiene unas físicas y sensores similares a la nuestra. Para esto necesitamos instalar los ''stacks'' [http://wiki.ros.org/turtlebot turtlebot] y [http://wiki.ros.org/turtlebot_simulator turtlebot_simulator], que contienen el modelo y los ''plugins'' para [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo], respectivamente. Eliminando lo que no necesitamos del modelo del [http://www.turtlebot.com/ turtlebot] y modificacndo el elemento de la base, el contenido del archivo que guardaremos con el nombre &amp;quot;roomba.xacro&amp;quot; en el directorio &amp;quot;urdf&amp;quot; de nuestro ''package'', es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/roomba-gazebo.xacro&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;roomba&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;material name=&amp;quot;Green&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;color rgba=&amp;quot;0.0 0.8 0.0 1.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;base_footprint&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
              iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot; &lt;br /&gt;
              izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.001 0.001 0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;Green&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0.017&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
       &amp;lt;box size=&amp;quot;0.001 0.001 0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;base_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;3.6&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 ${0.063/2}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.01&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.01&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot; 0 0 ${0.063/2}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder length=&amp;quot;0.063&amp;quot; radius=&amp;quot;0.17&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
	    &amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot; /&amp;gt;  &lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0.0 0.0 ${0.063/2}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder length=&amp;quot;0.063&amp;quot; radius=&amp;quot;0.17&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;wall_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;left_cliff_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;right_cliff_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;leftfront_cliff_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;1.0&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.01&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;rightfront_cliff_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;base_footprint_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0.017&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;        &lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_footprint&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;base_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;base_wall_sensor_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0.09 -0.120 0.042&amp;quot; rpy=&amp;quot;0 0 -1.0&amp;quot; /&amp;gt;        &lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;wall_sensor_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;base_left_cliff_sensor_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0.07 0.14 0.01&amp;quot; rpy=&amp;quot;0 1.57079 0&amp;quot; /&amp;gt;        &lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;left_cliff_sensor_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;base_right_cliff_sensor_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0.07 -0.14 0.01&amp;quot; rpy=&amp;quot;0 1.57079 0&amp;quot; /&amp;gt;        &lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;right_cliff_sensor_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;base_leftfront_cliff_sensor_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0.15 0.04 0.01&amp;quot; rpy=&amp;quot;0 1.57079 0&amp;quot; /&amp;gt;        &lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;leftfront_cliff_sensor_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;base_rightfront_cliff_sensor_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0.15 -0.04 0.01&amp;quot; rpy=&amp;quot;0 1.57079 0&amp;quot; /&amp;gt;        &lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;rightfront_cliff_sensor_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;left_wheel_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.5707 1.5707&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.033&amp;quot; length = &amp;quot;0.023&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.5707 1.5707&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.033&amp;quot; length = &amp;quot;0.023&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;left_wheel_joint&amp;quot; type=&amp;quot;continuous&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0.13 0.015&amp;quot; rpy=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;left_wheel_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;right_wheel_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.5707 1.5707&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.033&amp;quot; length = &amp;quot;0.023&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.5707 1.5707&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.033&amp;quot; length = &amp;quot;0.023&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;right_wheel_joint&amp;quot; type=&amp;quot;continuous&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 -0.13 0.015&amp;quot; rpy=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;right_wheel_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;rear_wheel_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.5707 1.5707&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;sphere radius=&amp;quot;0.015&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.5707 1.5707&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;sphere radius=&amp;quot;0.015&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;rear_castor_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;-0.13 0 0.0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;rear_wheel_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;front_wheel_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.5707 1.5707&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;sphere radius=&amp;quot;0.018&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.5707 1.5707&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;sphere radius=&amp;quot;0.018&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;front_castor_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0.13 0 0.0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;front_wheel_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;gyro_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0.04&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;gyro_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &amp;lt;link name=&amp;quot;gyro_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0&amp;quot; ixz=&amp;quot;0&amp;quot; iyy=&amp;quot;0.000001&amp;quot; iyz=&amp;quot;0&amp;quot; izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;laser_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;-0.065 0 0.57&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;laser&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;laser&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gaezebo&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;Gazebo/White&amp;lt;/material&amp;gt;&lt;br /&gt;
&amp;lt;/gaezebo&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;myrabot_sim_imu/&amp;gt;&lt;br /&gt;
  &amp;lt;myrabot_sim_laser/&amp;gt;&lt;br /&gt;
  &amp;lt;myrabot_sim_roomba/&amp;gt;&lt;br /&gt;
  &amp;lt;myrabot_sim_wall_sensors/&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/robot&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para su uso en el simulador [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] debemos añadir los ''plugins'' de los diferentes sensores de la base. Crearemos un archivo llamado &amp;quot;roomba-gazebo.xacro&amp;quot; en el directorio &amp;quot;urdf&amp;quot; de nuestro ''package'' con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot; xmlns:interface=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#interface&amp;quot; xmlns:sensor=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor&amp;quot; xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;myrabot_sim_imu&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;gazebo&amp;gt;&lt;br /&gt;
    &amp;lt;controller:gazebo_ros_imu name=&amp;quot;imu_controller&amp;quot; plugin=&amp;quot;libgazebo_ros_imu.so&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;robotNamespace&amp;gt;/&amp;lt;/robotNamespace&amp;gt;&lt;br /&gt;
      &amp;lt;alwaysOn&amp;gt;true&amp;lt;/alwaysOn&amp;gt;&lt;br /&gt;
      &amp;lt;updateRate&amp;gt;30&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
      &amp;lt;bodyName&amp;gt;gyro_link&amp;lt;/bodyName&amp;gt;&lt;br /&gt;
      &amp;lt;topicName&amp;gt;imu/data&amp;lt;/topicName&amp;gt;&lt;br /&gt;
      &amp;lt;gaussianNoise&amp;gt;${0.0017*0.0017}&amp;lt;/gaussianNoise&amp;gt;&lt;br /&gt;
      &amp;lt;xyzOffsets&amp;gt;0 0 0&amp;lt;/xyzOffsets&amp;gt; &lt;br /&gt;
      &amp;lt;rpyOffsets&amp;gt;0 0 0&amp;lt;/rpyOffsets&amp;gt;&lt;br /&gt;
      &amp;lt;interface:position name=&amp;quot;imu_position&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/controller:gazebo_ros_imu&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;myrabot_sim_laser&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;laser&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor:ray name=&amp;quot;laser&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;rayCount&amp;gt;180&amp;lt;/rayCount&amp;gt;&lt;br /&gt;
      &amp;lt;rangeCount&amp;gt;180&amp;lt;/rangeCount&amp;gt;&lt;br /&gt;
      &amp;lt;laserCount&amp;gt;1&amp;lt;/laserCount&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
      &amp;lt;origin&amp;gt;0.0 0.0 0.0&amp;lt;/origin&amp;gt;&lt;br /&gt;
      &amp;lt;displayRays&amp;gt;false&amp;lt;/displayRays&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
      &amp;lt;minAngle&amp;gt;-${60/2}&amp;lt;/minAngle&amp;gt;&lt;br /&gt;
      &amp;lt;maxAngle&amp;gt;${60/2}&amp;lt;/maxAngle&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
      &amp;lt;minRange&amp;gt;0.08&amp;lt;/minRange&amp;gt;&lt;br /&gt;
      &amp;lt;maxRange&amp;gt;5.0&amp;lt;/maxRange&amp;gt;&lt;br /&gt;
      &amp;lt;resRange&amp;gt;0.01&amp;lt;/resRange&amp;gt;&lt;br /&gt;
      &amp;lt;updateRate&amp;gt;20&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
      &amp;lt;controller:gazebo_ros_laser name=&amp;quot;gazebo_ros_laser_controller&amp;quot; plugin=&amp;quot;libgazebo_ros_laser.so&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;robotNamespace&amp;gt;/&amp;lt;/robotNamespace&amp;gt;	  &lt;br /&gt;
	&amp;lt;gaussianNoise&amp;gt;0.005&amp;lt;/gaussianNoise&amp;gt;&lt;br /&gt;
	&amp;lt;alwaysOn&amp;gt;true&amp;lt;/alwaysOn&amp;gt;&lt;br /&gt;
	&amp;lt;updateRate&amp;gt;20&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
	&amp;lt;topicName&amp;gt;scan&amp;lt;/topicName&amp;gt;&lt;br /&gt;
	&amp;lt;frameName&amp;gt;laser&amp;lt;/frameName&amp;gt;&lt;br /&gt;
	&amp;lt;interface:laser name=&amp;quot;gazebo_ros_laser_iface&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/controller:gazebo_ros_laser&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor:ray&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;myrabot_sim_roomba&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;gazebo&amp;gt;&lt;br /&gt;
    &amp;lt;controller:gazebo_ros_roomba name=&amp;quot;roomba_controller&amp;quot; plugin=&amp;quot;libgazebo_ros_create.so&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;alwaysOn&amp;gt;true&amp;lt;/alwaysOn&amp;gt;&lt;br /&gt;
      &amp;lt;node_namespace&amp;gt;myrabot_node&amp;lt;/node_namespace&amp;gt;&lt;br /&gt;
      &amp;lt;left_wheel_joint&amp;gt;left_wheel_joint&amp;lt;/left_wheel_joint&amp;gt;&lt;br /&gt;
      &amp;lt;right_wheel_joint&amp;gt;right_wheel_joint&amp;lt;/right_wheel_joint&amp;gt;&lt;br /&gt;
      &amp;lt;front_castor_joint&amp;gt;front_castor_joint&amp;lt;/front_castor_joint&amp;gt;&lt;br /&gt;
      &amp;lt;rear_castor_joint&amp;gt;rear_castor_joint&amp;lt;/rear_castor_joint&amp;gt;&lt;br /&gt;
      &amp;lt;wheel_separation&amp;gt;.230&amp;lt;/wheel_separation&amp;gt;&lt;br /&gt;
      &amp;lt;wheel_diameter&amp;gt;0.070&amp;lt;/wheel_diameter&amp;gt;&lt;br /&gt;
      &amp;lt;base_geom&amp;gt;base_roomba_link&amp;lt;/base_geom&amp;gt;&lt;br /&gt;
      &amp;lt;updateRate&amp;gt;40&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
      &amp;lt;torque&amp;gt;1.0&amp;lt;/torque&amp;gt;&lt;br /&gt;
    &amp;lt;/controller:gazebo_ros_roomba&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;myrabot_sim_wall_sensors&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;wall_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor:ray name=&amp;quot;wall_sensor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;alwaysActive&amp;gt;true&amp;lt;/alwaysActive&amp;gt;&lt;br /&gt;
      &amp;lt;rayCount&amp;gt;1&amp;lt;/rayCount&amp;gt;&lt;br /&gt;
      &amp;lt;rangeCount&amp;gt;1&amp;lt;/rangeCount&amp;gt;&lt;br /&gt;
      &amp;lt;resRange&amp;gt;0.1&amp;lt;/resRange&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minAngle&amp;gt;0&amp;lt;/minAngle&amp;gt;&lt;br /&gt;
      &amp;lt;maxAngle&amp;gt;0&amp;lt;/maxAngle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minRange&amp;gt;0.0160&amp;lt;/minRange&amp;gt;&lt;br /&gt;
      &amp;lt;maxRange&amp;gt;0.04&amp;lt;/maxRange&amp;gt;&lt;br /&gt;
      &amp;lt;displayRays&amp;gt;false&amp;lt;/displayRays&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor:ray&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;left_cliff_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor:ray name=&amp;quot;left_cliff_sensor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;alwaysActive&amp;gt;true&amp;lt;/alwaysActive&amp;gt;&lt;br /&gt;
      &amp;lt;rayCount&amp;gt;1&amp;lt;/rayCount&amp;gt;&lt;br /&gt;
      &amp;lt;rangeCount&amp;gt;1&amp;lt;/rangeCount&amp;gt;&lt;br /&gt;
      &amp;lt;resRange&amp;gt;0.1&amp;lt;/resRange&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minAngle&amp;gt;0&amp;lt;/minAngle&amp;gt;&lt;br /&gt;
      &amp;lt;maxAngle&amp;gt;0&amp;lt;/maxAngle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minRange&amp;gt;0.01&amp;lt;/minRange&amp;gt;&lt;br /&gt;
      &amp;lt;maxRange&amp;gt;0.04&amp;lt;/maxRange&amp;gt;&lt;br /&gt;
      &amp;lt;displayRays&amp;gt;false&amp;lt;/displayRays&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor:ray&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;right_cliff_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor:ray name=&amp;quot;right_cliff_sensor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;alwaysActive&amp;gt;true&amp;lt;/alwaysActive&amp;gt;&lt;br /&gt;
      &amp;lt;rayCount&amp;gt;1&amp;lt;/rayCount&amp;gt;&lt;br /&gt;
      &amp;lt;rangeCount&amp;gt;1&amp;lt;/rangeCount&amp;gt;&lt;br /&gt;
      &amp;lt;resRange&amp;gt;0.1&amp;lt;/resRange&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minAngle&amp;gt;0&amp;lt;/minAngle&amp;gt;&lt;br /&gt;
      &amp;lt;maxAngle&amp;gt;0&amp;lt;/maxAngle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minRange&amp;gt;0.01&amp;lt;/minRange&amp;gt;&lt;br /&gt;
      &amp;lt;maxRange&amp;gt;0.04&amp;lt;/maxRange&amp;gt;&lt;br /&gt;
      &amp;lt;displayRays&amp;gt;false&amp;lt;/displayRays&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor:ray&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;leftfront_cliff_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor:ray name=&amp;quot;leftfront_cliff_sensor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;alwaysActive&amp;gt;true&amp;lt;/alwaysActive&amp;gt;&lt;br /&gt;
      &amp;lt;rayCount&amp;gt;1&amp;lt;/rayCount&amp;gt;&lt;br /&gt;
      &amp;lt;rangeCount&amp;gt;1&amp;lt;/rangeCount&amp;gt;&lt;br /&gt;
      &amp;lt;resRange&amp;gt;0.1&amp;lt;/resRange&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minAngle&amp;gt;0&amp;lt;/minAngle&amp;gt;&lt;br /&gt;
      &amp;lt;maxAngle&amp;gt;0&amp;lt;/maxAngle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minRange&amp;gt;0.01&amp;lt;/minRange&amp;gt;&lt;br /&gt;
      &amp;lt;maxRange&amp;gt;0.04&amp;lt;/maxRange&amp;gt;&lt;br /&gt;
      &amp;lt;displayRays&amp;gt;false&amp;lt;/displayRays&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor:ray&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;rightfront_cliff_sensor_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor:ray name=&amp;quot;rightfront_cliff_sensor&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;alwaysActive&amp;gt;true&amp;lt;/alwaysActive&amp;gt;&lt;br /&gt;
      &amp;lt;rayCount&amp;gt;1&amp;lt;/rayCount&amp;gt;&lt;br /&gt;
      &amp;lt;rangeCount&amp;gt;1&amp;lt;/rangeCount&amp;gt;&lt;br /&gt;
      &amp;lt;resRange&amp;gt;0.1&amp;lt;/resRange&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minAngle&amp;gt;0&amp;lt;/minAngle&amp;gt;&lt;br /&gt;
      &amp;lt;maxAngle&amp;gt;0&amp;lt;/maxAngle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;minRange&amp;gt;0.01&amp;lt;/minRange&amp;gt;&lt;br /&gt;
      &amp;lt;maxRange&amp;gt;0.04&amp;lt;/maxRange&amp;gt;&lt;br /&gt;
      &amp;lt;displayRays&amp;gt;false&amp;lt;/displayRays&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor:ray&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;left_wheel_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;mu1 value=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;mu2 value=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;kp value=&amp;quot;100000000.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;kd value=&amp;quot;10000.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;fdir value=&amp;quot;1 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;right_wheel_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;mu1 value=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;mu2 value=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;kp value=&amp;quot;100000000.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;kd value=&amp;quot;10000.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;fdir value=&amp;quot;1 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;rear_wheel_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;mu1 value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;mu2 value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;kp value=&amp;quot;100000000.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;kd value=&amp;quot;10000.0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;front_wheel_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;mu1 value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;mu2 value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;kp value=&amp;quot;100000000.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;kd value=&amp;quot;10000.0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==URDF kinect==&lt;br /&gt;
&lt;br /&gt;
Para la cámara [http://www.xbox.com/es-ES/Kinect kinect] incluiremos el modelo y el ''plugin'' para el simulador en un solo archivo. Crearemos un archivo llamado &amp;quot;kinect.xacro&amp;quot; dentro del directorio &amp;quot;urdf&amp;quot; de nuestro ''package'' con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot; xmlns:interface=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#interface&amp;quot; xmlns:sensor=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor&amp;quot; xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;property name=&amp;quot;M_PI&amp;quot; value=&amp;quot;3.14159&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;kinect&amp;quot; params=&amp;quot;parent *origin&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;base_camera_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;${parent}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;camera_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;camera_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/kinect.dae&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0.0 0.0 0.0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_fer_modelo/meshes/kinect.dae&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;camera_depth_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0.018 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;camera_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;camera_depth_frame&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;camera_depth_frame&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;camera_depth_optical_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;${-M_PI/2} 0 ${-M_PI/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;camera_depth_frame&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;camera_depth_optical_frame&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;camera_depth_optical_frame&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;camera_rgb_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 -0.005 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;camera_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;camera_rgb_frame&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;camera_rgb_frame&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;camera_rgb_optical_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;${-M_PI/2} 0 ${-M_PI/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;camera_rgb_frame&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;camera_rgb_optical_frame&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;camera_rgb_optical_frame&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot;&lt;br /&gt;
        izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;camera_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor:camera name=&amp;quot;camera&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;imageFormat&amp;gt;R8G8B8&amp;lt;/imageFormat&amp;gt;&lt;br /&gt;
      &amp;lt;imageSize&amp;gt;640 480&amp;lt;/imageSize&amp;gt;&lt;br /&gt;
      &amp;lt;hfov&amp;gt;60&amp;lt;/hfov&amp;gt;&lt;br /&gt;
      &amp;lt;nearClip&amp;gt;0.05&amp;lt;/nearClip&amp;gt;&lt;br /&gt;
      &amp;lt;farClip&amp;gt;5&amp;lt;/farClip&amp;gt;&lt;br /&gt;
      &amp;lt;updateRate&amp;gt;20&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
      &amp;lt;baseline&amp;gt;0.1&amp;lt;/baseline&amp;gt;&lt;br /&gt;
      &amp;lt;controller:gazebo_ros_openni_kinect name=&amp;quot;kinect_camera_controller&amp;quot; plugin=&amp;quot;libgazebo_ros_openni_kinect.so&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alwaysOn&amp;gt;true&amp;lt;/alwaysOn&amp;gt;&lt;br /&gt;
        &amp;lt;updateRate&amp;gt;20&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
        &amp;lt;robotNamespace&amp;gt;/&amp;lt;/robotNamespace&amp;gt; &lt;br /&gt;
        &amp;lt;imageTopicName&amp;gt;/camera/image_raw&amp;lt;/imageTopicName&amp;gt;&lt;br /&gt;
        &amp;lt;pointCloudTopicName&amp;gt;/camera/depth/points&amp;lt;/pointCloudTopicName&amp;gt;&lt;br /&gt;
        &amp;lt;cameraInfoTopicName&amp;gt;/camera/camera_info&amp;lt;/cameraInfoTopicName&amp;gt;&lt;br /&gt;
        &amp;lt;frameName&amp;gt;camera_depth_optical_frame&amp;lt;/frameName&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_k1&amp;gt;0.0&amp;lt;/distortion_k1&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_k2&amp;gt;0.0&amp;lt;/distortion_k2&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_k3&amp;gt;0.0&amp;lt;/distortion_k3&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_t1&amp;gt;0.0&amp;lt;/distortion_t1&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_t2&amp;gt;0.0&amp;lt;/distortion_t2&amp;gt;&lt;br /&gt;
      &amp;lt;/controller:gazebo_ros_openni_kinect&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor:camera&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los archivos empleados, con el modelo de malla 3D &amp;quot;.stl&amp;quot;, en la descrición de la cámara se pueden descargar a continuación, deben guardarse en el directorio &amp;quot;meshes&amp;quot; de nuestro ''package'':&lt;br /&gt;
&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/kinect.dae kinect.dae]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/images/kinect.jpg kinect.jpg]&lt;br /&gt;
&lt;br /&gt;
==URDF cámara web==&lt;br /&gt;
&lt;br /&gt;
Para la cámara web vamos a emplear el ''plugin'' de la cámara [http://www.xbox.com/es-ES/Kinect kinect], pero sin usar la nube de puntos (''point cloud''). La cámara web empleada es una [http://www.logitech.com/es-es/support/5867?crid=405 Logitech Webcam Pro 9000]. Crearemos un archivo llamado &amp;quot;webcam.xacro&amp;quot; dentro del directorio &amp;quot;urdf&amp;quot; de nuestro ''package'' con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot; xmlns:interface=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#interface&amp;quot; xmlns:sensor=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor&amp;quot; xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;webcam&amp;quot; params=&amp;quot;parent *origin&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;webcam_1&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;${parent}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;e_webcam_1_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;e_webcam_1_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot; 0 0 0 &amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_robot_model/meshes/webcam_1.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;black&amp;quot;&amp;gt;&lt;br /&gt;
	    &amp;lt;color rgba=&amp;quot;0 0 0 1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0.0 0.0 0.0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_robot_model/meshes/webcam_1.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;webcam_2&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 ${0.135-0.04-(0.02-0.009)} ${(0.185/2)+0.0045}&amp;quot; rpy=&amp;quot;0.82 0 0&amp;quot; /&amp;gt;	&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;e_webcam_1_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;e_webcam_2_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;e_webcam_2_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 -${0.135-0.04-(0.02-0.009)} -${(0.185/2)+0.0045}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 -${0.135-0.04-(0.02-0.009)} -${(0.185/2)+0.0045}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_robot_model/meshes/webcam_2.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;black&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 -${0.135-0.04-(0.02-0.009)} -${(0.185/2)+0.0045}&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh filename=&amp;quot;package://myrabot_robot_model/meshes/webcam_2.stl&amp;quot; scale=&amp;quot;0.001 0.001 0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;webcam_optica&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0.135 -0.0285 0&amp;quot; rpy=&amp;quot;0 0 -1.57&amp;quot; /&amp;gt;	&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;e_webcam_2_link&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;e_webcam_optica_link&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link name=&amp;quot;e_webcam_optica_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.0001&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.57 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.017&amp;quot; length=&amp;quot;0.004&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 1.57 0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;0.017&amp;quot; length=&amp;quot;0.004&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;e_webcam_1_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;myrabot_fer/Black&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;0.5&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;0.5&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt; &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;e_webcam_2_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;myrabot_fer/Black&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;0.5&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;0.5&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt; &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;e_webcam_optica_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;myrabot_fer/White&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;0.5&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;0.5&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt; &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;e_webcam_optica_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor:camera name=&amp;quot;webcam&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;imageFormat&amp;gt;R8G8B8&amp;lt;/imageFormat&amp;gt;&lt;br /&gt;
      &amp;lt;imageSize&amp;gt;640 480&amp;lt;/imageSize&amp;gt;&lt;br /&gt;
      &amp;lt;hfov&amp;gt;63.09&amp;lt;/hfov&amp;gt;&lt;br /&gt;
      &amp;lt;nearClip&amp;gt;0.02&amp;lt;/nearClip&amp;gt;&lt;br /&gt;
      &amp;lt;farClip&amp;gt;3&amp;lt;/farClip&amp;gt;&lt;br /&gt;
      &amp;lt;updateRate&amp;gt;20&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
      &amp;lt;baseline&amp;gt;0.1&amp;lt;/baseline&amp;gt;&lt;br /&gt;
      &amp;lt;controller:gazebo_ros_openni_kinect name=&amp;quot;webcam_camera_controller&amp;quot; filename=&amp;quot;libgazebo_ros_openni_kinect.so&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alwaysOn&amp;gt;true&amp;lt;/alwaysOn&amp;gt;&lt;br /&gt;
        &amp;lt;updateRate&amp;gt;20&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
        &amp;lt;robotNamespace&amp;gt;/&amp;lt;/robotNamespace&amp;gt;&lt;br /&gt;
        &amp;lt;imageTopicName&amp;gt;/webcam/image_raw&amp;lt;/imageTopicName&amp;gt;&lt;br /&gt;
        &amp;lt;pointCloudTopicName&amp;gt;/webcam/depth/points&amp;lt;/pointCloudTopicName&amp;gt;     &lt;br /&gt;
        &amp;lt;cameraInfoTopicName&amp;gt;/webcam/camera_info&amp;lt;/cameraInfoTopicName&amp;gt;&lt;br /&gt;
        &amp;lt;frameName&amp;gt;e_webcam_optica_link&amp;lt;/frameName&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_k1&amp;gt;0.0&amp;lt;/distortion_k1&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_k2&amp;gt;0.0&amp;lt;/distortion_k2&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_k3&amp;gt;0.0&amp;lt;/distortion_k3&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_t1&amp;gt;0.0&amp;lt;/distortion_t1&amp;gt;&lt;br /&gt;
        &amp;lt;distortion_t2&amp;gt;0.0&amp;lt;/distortion_t2&amp;gt;&lt;br /&gt;
      &amp;lt;/controller:gazebo_ros_openni_kinect&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor:camera&amp;gt;&lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los archivos empleados, con los modelos de malla 3D &amp;quot;.stl&amp;quot;, en la descrición de la cámara web empleada se pueden descargar a continuación, deben guardarse en el directorio &amp;quot;meshes&amp;quot; de nuestro package:&lt;br /&gt;
&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/webcam_1.stl webcam_1.stl]&lt;br /&gt;
* [http://www.fernando.casadogarcia.es/files/webcam_2.stl webcam_2.stl]&lt;br /&gt;
&lt;br /&gt;
==URDF sensor ultrasonidos==&lt;br /&gt;
&lt;br /&gt;
===Creación de un plugin para gazebo===&lt;br /&gt;
&lt;br /&gt;
Primero [[Fernando-TFM-ROS02#Creando un package|crearemos un package]] que va a contener los ''plugins'' de nuestro robot, que llamaremos &amp;quot;myrabot_gazebo_plugins&amp;quot;, con las dependencias gazebo sensor_msgs roscpp.. Dentro de la carpeta &amp;quot;src&amp;quot; del ''package'' creado para los ''plugins'' crearemos un archivo llamado &amp;quot;gazebo_ros_sonar.cpp&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Software License Agreement (Modified BSD License)&lt;br /&gt;
 *&lt;br /&gt;
 *  Copyright (c) 2012, PAL Robotics, S.L.&lt;br /&gt;
 *  All rights reserved.&lt;br /&gt;
 *&lt;br /&gt;
 *  Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 *  modification, are permitted provided that the following conditions&lt;br /&gt;
 *  are met:&lt;br /&gt;
 *&lt;br /&gt;
 *   * Redistributions of source code must retain the above copyright&lt;br /&gt;
 *     notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 *   * Redistributions in binary form must reproduce the above&lt;br /&gt;
 *     copyright notice, this list of conditions and the following&lt;br /&gt;
 *     disclaimer in the documentation and/or other materials provided&lt;br /&gt;
 *     with the distribution.&lt;br /&gt;
 *   * Neither the name of PAL Robotics, S.L. nor the names of its&lt;br /&gt;
 *     contributors may be used to endorse or promote products derived&lt;br /&gt;
 *     from this software without specific prior written permission.&lt;br /&gt;
 *&lt;br /&gt;
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS&lt;br /&gt;
 *  &amp;quot;AS IS&amp;quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT&lt;br /&gt;
 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS&lt;br /&gt;
 *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE&lt;br /&gt;
 *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,&lt;br /&gt;
 *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,&lt;br /&gt;
 *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;&lt;br /&gt;
 *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER&lt;br /&gt;
 *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT&lt;br /&gt;
 *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN&lt;br /&gt;
 *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;br /&gt;
 *  POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;gazebo/Sensor.hh&amp;gt;&lt;br /&gt;
#include &amp;lt;gazebo/Global.hh&amp;gt;&lt;br /&gt;
#include &amp;lt;gazebo/XMLConfig.hh&amp;gt;&lt;br /&gt;
#include &amp;lt;gazebo/Simulator.hh&amp;gt;&lt;br /&gt;
#include &amp;lt;gazebo/gazebo.h&amp;gt;&lt;br /&gt;
#include &amp;lt;gazebo/GazeboError.hh&amp;gt;&lt;br /&gt;
#include &amp;lt;gazebo/ControllerFactory.hh&amp;gt;&lt;br /&gt;
#include &amp;lt;limits&amp;gt;&lt;br /&gt;
#include &amp;lt;myrabot_gazebo_plugin/gazebo_ros_sonar.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace gazebo;&lt;br /&gt;
&lt;br /&gt;
GZ_REGISTER_DYNAMIC_CONTROLLER(&amp;quot;gazebo_ros_sonar&amp;quot;, GazeboRosSonar)&lt;br /&gt;
&lt;br /&gt;
GazeboRosSonar::GazeboRosSonar(Entity *parent) : Controller(parent)&lt;br /&gt;
{&lt;br /&gt;
  sensor_ = dynamic_cast&amp;lt;RaySensor*&amp;gt;(parent);&lt;br /&gt;
  if (!sensor_) gzthrow(&amp;quot;GazeboRosSonar controller requires a RaySensor as its parent&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Param::Begin(&amp;amp;parameters);&lt;br /&gt;
  topic_param_ = new ParamT&amp;lt;std::string&amp;gt;(&amp;quot;topicName&amp;quot;, &amp;quot;sonar&amp;quot;, false);&lt;br /&gt;
  frame_id_param_ = new ParamT&amp;lt;std::string&amp;gt;(&amp;quot;frameId&amp;quot;, &amp;quot;&amp;quot;, false);&lt;br /&gt;
  radiation_param_ = new ParamT&amp;lt;std::string&amp;gt;(&amp;quot;radiation&amp;quot;,&amp;quot;ultrasound&amp;quot;,false);&lt;br /&gt;
  fov_param_ = new ParamT&amp;lt;double&amp;gt;(&amp;quot;fov&amp;quot;, 0.05, false);&lt;br /&gt;
  gaussian_noise_ = new ParamT&amp;lt;double&amp;gt;(&amp;quot;gaussianNoise&amp;quot;, 0.0, 0);&lt;br /&gt;
  Param::End();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Destructor&lt;br /&gt;
GazeboRosSonar::~GazeboRosSonar()&lt;br /&gt;
{&lt;br /&gt;
  delete topic_param_;&lt;br /&gt;
  delete frame_id_param_;&lt;br /&gt;
  delete radiation_param_;&lt;br /&gt;
  delete fov_param_;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Load the controller&lt;br /&gt;
void GazeboRosSonar::LoadChild(XMLConfigNode *node)&lt;br /&gt;
{&lt;br /&gt;
  ROS_INFO(&amp;quot;INFO: gazebo_ros_ir plugin loading&amp;quot; );&lt;br /&gt;
  topic_param_-&amp;gt;Load(node);&lt;br /&gt;
  frame_id_param_-&amp;gt;Load(node);&lt;br /&gt;
  radiation_param_-&amp;gt;Load(node);&lt;br /&gt;
  fov_param_-&amp;gt;Load(node);&lt;br /&gt;
  gaussian_noise_-&amp;gt;Load(node);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////&lt;br /&gt;
// Initialize the controller&lt;br /&gt;
void GazeboRosSonar::InitChild()&lt;br /&gt;
{&lt;br /&gt;
  Range.header.frame_id = **frame_id_param_;&lt;br /&gt;
&lt;br /&gt;
  if (**radiation_param_==std::string(&amp;quot;ultrasound&amp;quot;))&lt;br /&gt;
      Range.radiation_type = sensor_msgs::Range::ULTRASOUND;&lt;br /&gt;
  else&lt;br /&gt;
      Range.radiation_type = sensor_msgs::Range::INFRARED;&lt;br /&gt;
&lt;br /&gt;
  Range.field_of_view = **fov_param_;&lt;br /&gt;
  Range.max_range = sensor_-&amp;gt;GetMaxRange();&lt;br /&gt;
  Range.min_range = sensor_-&amp;gt;GetMinRange();&lt;br /&gt;
&lt;br /&gt;
  sensor_-&amp;gt;SetActive(false);&lt;br /&gt;
  node_handle_ = new ros::NodeHandle(&amp;quot;&amp;quot;);&lt;br /&gt;
  publisher_ = node_handle_-&amp;gt;advertise&amp;lt;sensor_msgs::Range&amp;gt;(**topic_param_, 10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Utility for adding noise&lt;br /&gt;
double GazeboRosSonar::GaussianKernel(double mu,double sigma)&lt;br /&gt;
{&lt;br /&gt;
    // using Box-Muller transform to generate two independent standard normally disbributed normal variables&lt;br /&gt;
    // see wikipedia&lt;br /&gt;
    double U = (double)rand()/(double)RAND_MAX; // normalized uniform random variable&lt;br /&gt;
    double V = (double)rand()/(double)RAND_MAX; // normalized uniform random variable&lt;br /&gt;
    double X = sqrt(-2.0 * ::log(U)) * cos( 2.0*M_PI * V);&lt;br /&gt;
    //double Y = sqrt(-2.0 * ::log(U)) * sin( 2.0*M_PI * V); // the other indep. normal variable&lt;br /&gt;
    // we'll just use X&lt;br /&gt;
    // scale to our mu and sigma&lt;br /&gt;
    X = sigma * X + mu;&lt;br /&gt;
    return X;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Update the controller&lt;br /&gt;
void GazeboRosSonar::UpdateChild()&lt;br /&gt;
{&lt;br /&gt;
  if (!sensor_-&amp;gt;IsActive()) sensor_-&amp;gt;SetActive(true);&lt;br /&gt;
&lt;br /&gt;
  Range.header.stamp.sec  = (Simulator::Instance()-&amp;gt;GetSimTime()).sec;&lt;br /&gt;
  Range.header.stamp.nsec = (Simulator::Instance()-&amp;gt;GetSimTime()).nsec;&lt;br /&gt;
  Range.range = std::numeric_limits&amp;lt;sensor_msgs::Range::_range_type&amp;gt;::max();&lt;br /&gt;
&lt;br /&gt;
  for(int i = 0; i &amp;lt; sensor_-&amp;gt;GetRangeCount(); ++i) {&lt;br /&gt;
    double ray = sensor_-&amp;gt;GetRange(i);&lt;br /&gt;
    if (ray &amp;lt; Range.range) Range.range = ray;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Range.range = std::min(Range.range + this-&amp;gt;GaussianKernel(0,**gaussian_noise_), sensor_-&amp;gt;GetMaxRange());&lt;br /&gt;
  publisher_.publish(Range);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Finalize the controller&lt;br /&gt;
void GazeboRosSonar::FiniChild()&lt;br /&gt;
{&lt;br /&gt;
  sensor_-&amp;gt;SetActive(false);&lt;br /&gt;
  node_handle_-&amp;gt;shutdown();&lt;br /&gt;
  delete node_handle_;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;gazebo_ros_sonar.h&amp;quot; situdo en la ruta &amp;quot;include/myrabot_gazebo_plugins/&amp;quot; dentro del ''package'' que hemos creado, con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Software License Agreement (Modified BSD License)&lt;br /&gt;
 *&lt;br /&gt;
 *  Copyright (c) 2012, PAL Robotics, S.L.&lt;br /&gt;
 *  All rights reserved.&lt;br /&gt;
 *&lt;br /&gt;
 *  Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 *  modification, are permitted provided that the following conditions&lt;br /&gt;
 *  are met:&lt;br /&gt;
 *&lt;br /&gt;
 *   * Redistributions of source code must retain the above copyright&lt;br /&gt;
 *     notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 *   * Redistributions in binary form must reproduce the above&lt;br /&gt;
 *     copyright notice, this list of conditions and the following&lt;br /&gt;
 *     disclaimer in the documentation and/or other materials provided&lt;br /&gt;
 *     with the distribution.&lt;br /&gt;
 *   * Neither the name of PAL Robotics, S.L. nor the names of its&lt;br /&gt;
 *     contributors may be used to endorse or promote products derived&lt;br /&gt;
 *     from this software without specific prior written permission.&lt;br /&gt;
 *&lt;br /&gt;
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS&lt;br /&gt;
 *  &amp;quot;AS IS&amp;quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT&lt;br /&gt;
 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS&lt;br /&gt;
 *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE&lt;br /&gt;
 *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,&lt;br /&gt;
 *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,&lt;br /&gt;
 *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;&lt;br /&gt;
 *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER&lt;br /&gt;
 *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT&lt;br /&gt;
 *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN&lt;br /&gt;
 *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;br /&gt;
 *  POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ros/ros.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;gazebo.hh&amp;gt;&lt;br /&gt;
#include &amp;lt;gazebo/common/Plugin.hh&amp;gt;&lt;br /&gt;
#include &amp;lt;gazebo/sensors/RaySensor.hh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ros/callback_queue.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sensor_msgs/Range.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
namespace gazebo&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
class GazeboRosSonar : public  gazebo::SensorPlugin&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  GazeboRosSonar();&lt;br /&gt;
  virtual ~GazeboRosSonar();&lt;br /&gt;
&lt;br /&gt;
protected:&lt;br /&gt;
  virtual void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf);&lt;br /&gt;
  virtual void Update();&lt;br /&gt;
&lt;br /&gt;
  /// \brief Gaussian noise generator&lt;br /&gt;
private:&lt;br /&gt;
  double GaussianKernel(double mu,double sigma);&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
  gazebo::sensors::RaySensorPtr sensor_;&lt;br /&gt;
&lt;br /&gt;
  ros::NodeHandle* node_handle_;&lt;br /&gt;
  ros::Publisher publisher_;&lt;br /&gt;
&lt;br /&gt;
  sensor_msgs::Range range_;&lt;br /&gt;
&lt;br /&gt;
  std::string namespace_;&lt;br /&gt;
  std::string topic_name_;&lt;br /&gt;
  std::string frame_id_;&lt;br /&gt;
  std::string radiation_;&lt;br /&gt;
  double fov_;&lt;br /&gt;
  double gaussian_noise_;&lt;br /&gt;
&lt;br /&gt;
  gazebo::physics::WorldPtr parent_;&lt;br /&gt;
&lt;br /&gt;
  common::Time last_time;&lt;br /&gt;
&lt;br /&gt;
  gazebo::event::ConnectionPtr updateConnection;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
} // namespace gazebo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Añadiremos al archivo &amp;quot;CMakeLists.txt&amp;quot; del ''package'' la siguiente línea al final:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosbuild_add_library(gazebo_ros_sonar src/gazebo_ros_sonar.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También añadiremos las siguientes líneas al archivo &amp;quot;manifest.xml&amp;quot; del ''package'', antes de las etiqueta &amp;lt;/package&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;export&amp;gt;&lt;br /&gt;
    &amp;lt;cpp cflags=&amp;quot;-I${prefix}/include&amp;quot; lflags=&amp;quot;-Wl,-rpath,${prefix}/lib -L${prefix}/lib&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;gazebo plugin_path=&amp;quot;${prefix}/lib&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/export&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilar el nuevo ''plugin'' simplemente deberemos ejecutar en un terminal la siguiente secuencia de comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
roscd myrabot_gazebo_plugins&lt;br /&gt;
make&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===URDF===&lt;br /&gt;
&lt;br /&gt;
En el directorio &amp;quot;urdf&amp;quot; del ''package'' del robot vamos a crear un archivo llamado &amp;quot;ultrasonidos.xacro&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot; xmlns:interface=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#interface&amp;quot; xmlns:sensor=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor&amp;quot; xmlns:xacro=&amp;quot;http://ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;ultrasonidos&amp;quot; params=&amp;quot;id parent d_centro *origin&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;ultrasonidos_${id}_joint_fisico&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;ultrasonidos_${id}_link_fisico&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
       &lt;br /&gt;
  &amp;lt;link name=&amp;quot;ultrasonidos_${id}_link_fisico&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;1.57 0 0&amp;quot; xyz=&amp;quot;0 -${d_centro} ${0.015/2}&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.0001&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;1.57 0 0&amp;quot; xyz=&amp;quot;0 -${d_centro} ${0.015/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;${0.015/2}&amp;quot; length=&amp;quot;0.015&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;black&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;0 0 0 1&amp;quot; /&amp;gt;&lt;br /&gt;
	  &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;1.57 0 0&amp;quot; xyz=&amp;quot;0 -${d_centro} ${0.015/2}&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;cylinder radius=&amp;quot;${0.015/2}&amp;quot; length=&amp;quot;0.015&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;joint name=&amp;quot;ultrasonidos_${id}_joint&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;ultrasonidos_${id}_link_fisico&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;ultrasonidos_${id}_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 -1.57&amp;quot; xyz=&amp;quot;0 -${d_centro+(0.015/2)} ${0.015/2}&amp;quot;/&amp;gt; &lt;br /&gt;
&amp;lt;/joint&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;link name=&amp;quot;ultrasonidos_${id}_link&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/link&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;ultrasonidos_${id}_link_fisico&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;myrabot_fer/Black&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;0.5&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;0.5&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt; &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
    &amp;lt;gazebo reference=&amp;quot;ultrasonidos_${id}_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;sensor:ray name=&amp;quot;ultrasonidos_${id}&amp;quot;&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
        &amp;lt;displayRays&amp;gt;false&amp;lt;/displayRays&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;rayCount&amp;gt;5&amp;lt;/rayCount&amp;gt;&lt;br /&gt;
        &amp;lt;rangeCount&amp;gt;5&amp;lt;/rangeCount&amp;gt;&lt;br /&gt;
        &amp;lt;verticalRayCount&amp;gt;1&amp;lt;/verticalRayCount&amp;gt;&lt;br /&gt;
        &amp;lt;verticalRangeCount&amp;gt;1&amp;lt;/verticalRangeCount&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;minAngle&amp;gt;-16&amp;lt;/minAngle&amp;gt;&lt;br /&gt;
        &amp;lt;verticalMinAngle&amp;gt;-16&amp;lt;/verticalMinAngle&amp;gt;&lt;br /&gt;
        &amp;lt;maxAngle&amp;gt;16&amp;lt;/maxAngle&amp;gt;&lt;br /&gt;
        &amp;lt;verticalMaxAngle&amp;gt;16&amp;lt;/verticalMaxAngle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;minRange&amp;gt;0&amp;lt;/minRange&amp;gt;&lt;br /&gt;
        &amp;lt;maxRange&amp;gt;7&amp;lt;/maxRange&amp;gt;&lt;br /&gt;
        &amp;lt;resRange&amp;gt;0.01&amp;lt;/resRange&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;updateRate&amp;gt;20&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;controller:gazebo_ros_sonar name=&amp;quot;gazebo_ros_ultrasonidos_${id}_controller&amp;quot; plugin=&amp;quot;libgazebo_ros_sonar.so&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;robotNamespace&amp;gt;/&amp;lt;/robotNamespace&amp;gt;&lt;br /&gt;
          &amp;lt;gaussianNoise&amp;gt;0.005&amp;lt;/gaussianNoise&amp;gt;&lt;br /&gt;
          &amp;lt;alwaysOn&amp;gt;true&amp;lt;/alwaysOn&amp;gt;&lt;br /&gt;
          &amp;lt;updateRate&amp;gt;20&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
          &amp;lt;topicName&amp;gt;ultrasonidos_${id}&amp;lt;/topicName&amp;gt;&lt;br /&gt;
          &amp;lt;frameId&amp;gt;ultrasonidos_${id}_link&amp;lt;/frameId&amp;gt;&lt;br /&gt;
          &amp;lt;radiation&amp;gt;ultrasound&amp;lt;/radiation&amp;gt;&lt;br /&gt;
          &amp;lt;fov&amp;gt;32&amp;lt;/fov&amp;gt;&lt;br /&gt;
                  &lt;br /&gt;
        &amp;lt;/controller:gazebo_ros_sonar&amp;gt;&lt;br /&gt;
      &amp;lt;/sensor:ray&amp;gt;&lt;br /&gt;
    &amp;lt;/gazebo&amp;gt; &lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ensamblado del modelo del MYRAbot=&lt;br /&gt;
&lt;br /&gt;
Para poder formar el modelo de nuestro robot tenemos que ensamblar las diferentes partes que lo componen, las que hemos descrito en los puntos anteriores y el [[Control brazo MYRAbot (bioloid+arduino)|brazo]]. Los componentes individuales se han definido como ''macros'' con los parámetros de ''link parent'' y origen, con lo que deberemos indicar el ''link'' y el origen del componente al que se une. Crearemos un archivo llamado &amp;quot;myrabot.urdf.xacro&amp;quot; dentro del directorio &amp;quot;urdf&amp;quot; de nuestro package con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot name=&amp;quot;MYRAbot&amp;quot;&lt;br /&gt;
       xmlns:xi=&amp;quot;http://www.w3.org/2001/XInclude&amp;quot;&lt;br /&gt;
       xmlns:gazebo=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#gz&amp;quot;&lt;br /&gt;
       xmlns:model=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#model&amp;quot;&lt;br /&gt;
       xmlns:sensor=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor&amp;quot;&lt;br /&gt;
       xmlns:body=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#body&amp;quot;&lt;br /&gt;
       xmlns:geom=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#geom&amp;quot;&lt;br /&gt;
       xmlns:joint=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#joint&amp;quot;&lt;br /&gt;
       xmlns:interface=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#interface&amp;quot;&lt;br /&gt;
       xmlns:rendering=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#rendering&amp;quot;&lt;br /&gt;
       xmlns:renderable=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#renderable&amp;quot;&lt;br /&gt;
       xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot;&lt;br /&gt;
       xmlns:physics=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#physics&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/roomba.xacro&amp;quot; /&amp;gt;		&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/estructura-myrabot.xacro&amp;quot; /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/kinect.xacro&amp;quot; /&amp;gt;	&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;include filename=&amp;quot;$(find brazo_fer_modelo)/urdf/brazo.xacro&amp;quot; /&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;include filename=&amp;quot;$(find myrabot_fer_modelo)/urdf/webcam.xacro&amp;quot; /&amp;gt;		&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;roomba /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;estructura_myrabot parent=&amp;quot;base_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 1.57&amp;quot; xyz=&amp;quot;0.135 -0.135 0.063&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/estructura_myrabot&amp;gt; &lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;kinect parent=&amp;quot;e_base_kinect_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 -1.57&amp;quot; xyz=&amp;quot;0.135 0.090 0.112&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/kinect&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;brazo parent=&amp;quot;e_base_brazo_1_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 3.1416&amp;quot; xyz=&amp;quot;0.135 0.0335 0.075&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/brazo&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;webcam parent=&amp;quot;e_monitor_link&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.185/2}&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/webcam&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;1&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 1.57&amp;quot; xyz=&amp;quot;0.135 0.135 0.02&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;	&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;2&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 2.36&amp;quot; xyz=&amp;quot;0.135 0.135 0.02&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;3&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 3.14&amp;quot; xyz=&amp;quot;0.135 0.135 0.02&amp;quot;/&amp;gt;	&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;	&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;4&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 3.93&amp;quot; xyz=&amp;quot;0.135 0.135 0.02&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;ultrasonidos id=&amp;quot;5&amp;quot; parent=&amp;quot;e_base_2_link&amp;quot; d_centro=&amp;quot;0.150&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 4.71&amp;quot; xyz=&amp;quot;0.135 0.135 0.02&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/ultrasonidos&amp;gt;		&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Visualización del modelo en rviz==&lt;br /&gt;
&lt;br /&gt;
Para la comprobación y visualización del correcto ensamblado del modelo, así como la prueba de las uniones móviles, se ha creado un ''launcher'' para cargar el modelo en [http://wiki.ros.org/rviz rviz]. Crearemos un archivo llamado &amp;quot;myrabot_rviz.launch&amp;quot; dentro del directorio &amp;quot;launch&amp;quot; de nuestro ''package'' con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;param name=&amp;quot;robot_description&amp;quot; command=&amp;quot;$(find xacro)/xacro.py '$(find myrabot_fer_modelo)/urdf/myrabot.urdf.xacro'&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;node name=&amp;quot;joint_state_publisher&amp;quot; pkg=&amp;quot;joint_state_publisher&amp;quot; type=&amp;quot;joint_state_publisher&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;param name=&amp;quot;use_gui&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;node name=&amp;quot;robot_state_publisher&amp;quot; pkg=&amp;quot;robot_state_publisher&amp;quot; type=&amp;quot;state_publisher&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;node name=&amp;quot;rviz&amp;quot; pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para iniciar el ''launcher'' debemos ejecutar en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_fer_modelo myrabot_rviz.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si todo va bien, se ejecutará [http://wiki.ros.org/rviz rviz] y el interfaz del [http://wiki.ros.org/joint_state_publisher joint_state_publisher], sobre el cual al modificar los controles deslizables observaremos como se modifica la posición de las uniones móviles en el modelo 3D cargado en [http://wiki.ros.org/rviz rviz]. Para que se muestre correctamente nuestro modelo en [http://wiki.ros.org/rviz rviz] debemos seleccionar el elemento ''link'' que se va ha tomar como elemento fijo &amp;quot;fixed frame&amp;quot;, en nuestro caso en &amp;quot;Global Options&amp;quot; el &amp;quot;Fixed Frame&amp;quot; será el ''link'' &amp;quot;/base_footprint&amp;quot;. El resultado es el que se muestra a continuación:&lt;br /&gt;
&lt;br /&gt;
[[file:modelo_MYRAbot_rviz.png|thumb|500px|center|Modelo MYRAbot en [http://wiki.ros.org/rviz rviz] e interfaz [http://wiki.ros.org/joint_state_publisher joint_state_publisher]]]&lt;br /&gt;
&lt;br /&gt;
=Carga del modelo en gazebo=&lt;br /&gt;
&lt;br /&gt;
==Uso de un único ''topic'' para joint states==&lt;br /&gt;
&lt;br /&gt;
Para poder tener en el ''topic'' &amp;quot;joint_states_myrabot&amp;quot; el estado de las uniones del brazo y de la base, hemos creado un pequeño programa que toma los valores de los ''topics'' &amp;quot;brazo/joint_states&amp;quot; y &amp;quot;joint_states&amp;quot;, y los publica en este único ''topic''. Crearemos un archivo llamado &amp;quot;remap_joint_states.cpp&amp;quot; dentro del directorio &amp;quot;src&amp;quot; de nuestro ''package'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;ros/time.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;sensor_msgs/JointState.h&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  sensor_msgs::JointState joint_states_todo;&lt;br /&gt;
  int cont_brazo = 0;&lt;br /&gt;
  int cont_roomba = 0;&lt;br /&gt;
  std::string name[9];&lt;br /&gt;
  float position[9];&lt;br /&gt;
  float velocity[9];&lt;br /&gt;
  float effort[9];&lt;br /&gt;
&lt;br /&gt;
  void brazo(const sensor_msgs::JointState&amp;amp; brazo_states)&lt;br /&gt;
  {	&lt;br /&gt;
	int tam = brazo_states.name.size();&lt;br /&gt;
	&lt;br /&gt;
	if (::cont_brazo == 0)&lt;br /&gt;
	{	&lt;br /&gt;
		for (int i = 0; i &amp;lt; tam; i++)&lt;br /&gt;
		{&lt;br /&gt;
			::name[i] = brazo_states.name[i];&lt;br /&gt;
			::position[i] = brazo_states.position[i];&lt;br /&gt;
			::velocity[i] = brazo_states.velocity[i];&lt;br /&gt;
			::effort[i] = brazo_states.effort[i];&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		::cont_brazo = 1;&lt;br /&gt;
	}		  	  	  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void roomba(const sensor_msgs::JointState&amp;amp; roomba_states)&lt;br /&gt;
  {&lt;br /&gt;
	int tam = roomba_states.name.size();&lt;br /&gt;
	&lt;br /&gt;
	if (::cont_roomba == 0)&lt;br /&gt;
	{&lt;br /&gt;
		for (int i = 0; i &amp;lt; tam; i++)&lt;br /&gt;
		{&lt;br /&gt;
			::name[i+5] = roomba_states.name[i];&lt;br /&gt;
			::position[i+5] = roomba_states.position[i];&lt;br /&gt;
			::velocity[i+5] = roomba_states.velocity[i];&lt;br /&gt;
			::effort[i+5] = roomba_states.effort[i];&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		::cont_roomba = 1;&lt;br /&gt;
	}	  	  	  &lt;br /&gt;
  }    &lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;remap_joint_states&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber joint_states_brazo_sub_= n.subscribe(&amp;quot;brazo/joint_states&amp;quot;, 1, brazo);&lt;br /&gt;
  	ros::Subscriber joint_states_roomba_sub_= n.subscribe(&amp;quot;joint_states&amp;quot;, 1, roomba);   	 &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher joint_states_pub_=n.advertise&amp;lt;sensor_msgs::JointState&amp;gt;(&amp;quot;joint_states_myrabot&amp;quot;, 1);  	 &lt;br /&gt;
  	&lt;br /&gt;
        ros::Rate loop_rate(100);&lt;br /&gt;
    &lt;br /&gt;
	ros::Time ahora;&lt;br /&gt;
    &lt;br /&gt;
	::joint_states_todo.name = std::vector&amp;lt;std::string&amp;gt;(9);&lt;br /&gt;
	::joint_states_todo.position = std::vector&amp;lt;double&amp;gt;(9);&lt;br /&gt;
	::joint_states_todo.velocity = std::vector&amp;lt;double&amp;gt;(9);&lt;br /&gt;
	::joint_states_todo.effort = std::vector&amp;lt;double&amp;gt;(9);		  	      	&lt;br /&gt;
&lt;br /&gt;
    while (ros::ok())&lt;br /&gt;
    {	&lt;br /&gt;
		&lt;br /&gt;
		if (::cont_brazo == 1 &amp;amp;&amp;amp; ::cont_roomba == 1)&lt;br /&gt;
		{	&lt;br /&gt;
			for (int i = 0; i &amp;lt; 9; i++)&lt;br /&gt;
			{&lt;br /&gt;
				::joint_states_todo.name[i] = ::name[i];&lt;br /&gt;
				::joint_states_todo.position[i] = ::position[i];&lt;br /&gt;
				::joint_states_todo.velocity[i] = ::velocity[i];&lt;br /&gt;
				::joint_states_todo.effort[i] = ::effort[i];&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			ahora = ros::Time::now();&lt;br /&gt;
			&lt;br /&gt;
			::joint_states_todo.header.stamp = ahora; 			&lt;br /&gt;
			&lt;br /&gt;
			joint_states_pub_.publish(::joint_states_todo);&lt;br /&gt;
			&lt;br /&gt;
			::cont_brazo = 0;&lt;br /&gt;
			::cont_roomba = 0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
			ros::spinOnce();&lt;br /&gt;
	&lt;br /&gt;
			loop_rate.sleep();			&lt;br /&gt;
	}   &lt;br /&gt;
   	   &lt;br /&gt;
 &lt;br /&gt;
	ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Carga en gazebo==&lt;br /&gt;
&lt;br /&gt;
Para poder cargar el modelo en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] e iniciar los controladores de todos sus componentes, se ha creado un ''launcher''. Crearemos un archivo llamado &amp;quot;myrabot_gazebo.launch&amp;quot; dentro del directorio &amp;quot;launch&amp;quot; de nuestro ''package'' con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;/use_sim_time&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;gazebo&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;gazebo&amp;quot; args=&amp;quot;-u $(find turtlebot_gazebo)/worlds/empty.world&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;node name=&amp;quot;gazebo_gui&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;gui&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;group ns=&amp;quot;brazo&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;param name=&amp;quot;robot_description&amp;quot; command=&amp;quot;$(find xacro)/xacro.py '$(find myrabot_robot_model)/urdf/myrabot.urdf.xacro'&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_myrabot&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-urdf -param robot_description -model MYRAbot&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;rosparam file=&amp;quot;$(find myrabot_arm_model)/controller.yaml&amp;quot; command=&amp;quot;load&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_controller&amp;quot; pkg=&amp;quot;pr2_controller_manager&amp;quot; type=&amp;quot;spawner&amp;quot; args=&amp;quot;base_pos_controller arti1_pos_controller arti2_pos_controller arti3_pos_controller pinza_pos_controller base_vel_controller arti1_vel_controller arti2_vel_controller arti3_vel_controller pinza_vel_controller&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/group&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;modelo_brazo&amp;quot; pkg=&amp;quot;myrabot_arm_model&amp;quot; type=&amp;quot;modelo_brazo&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;remap_joint_states&amp;quot; pkg=&amp;quot;myrabot_robot_model&amp;quot; type=&amp;quot;remap_joint_states&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;robot_pose_ekf&amp;quot; type=&amp;quot;robot_pose_ekf&amp;quot; name=&amp;quot;robot_pose_ekf&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;freq&amp;quot; value=&amp;quot;30.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;sensor_timeout&amp;quot; value=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;publish_tf&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;odom_used&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;imu_used&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;vo_used&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;param name=&amp;quot;output_frame&amp;quot; value=&amp;quot;odom&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;pointcloud_throttle&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudThrottle openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;max_rate&amp;quot; value=&amp;quot;20.0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud_in&amp;quot; to=&amp;quot;/camera/depth/points&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud_out&amp;quot; to=&amp;quot;cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;kinect_laser&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudToScan openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;output_frame_id&amp;quot; value=&amp;quot;/camera_depth_frame&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;!-- heights are in the (optical?) frame of the kinect --&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;min_height&amp;quot; value=&amp;quot;-0.15&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;max_height&amp;quot; value=&amp;quot;0.15&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud&amp;quot; to=&amp;quot;/cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;nodelet&amp;quot; type=&amp;quot;nodelet&amp;quot; name=&amp;quot;kinect_laser_narrow&amp;quot; args=&amp;quot;load pointcloud_to_laserscan/CloudToScan openni_manager&amp;quot; respawn=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;output_frame_id&amp;quot; value=&amp;quot;/camera_depth_frame&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;!-- heights are in the (optical?) frame of the kinect --&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;min_height&amp;quot; value=&amp;quot;-0.025&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;max_height&amp;quot; value=&amp;quot;0.025&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;cloud&amp;quot; to=&amp;quot;/cloud_throttled&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;scan&amp;quot; to=&amp;quot;/narrow_scan&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para lanzar el ''launcher'' ejecutaremos el siguiente comando en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_fer_modelo myrabot_gazebo.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si todo va bien podremos ver en la ventana gráfica de [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] el modelo del MYRAbot  situado en un mundo vacío, tal como se muestra en la siguiente imagen: &lt;br /&gt;
&lt;br /&gt;
[[file:modelo_MYRAbot_gazebo.png|thumb|500px|center|Modelo MYRAbot en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]]]&lt;br /&gt;
&lt;br /&gt;
==Programa de prueba (Vuela al ruedo)==&lt;br /&gt;
&lt;br /&gt;
Se ha realizado un pequeño programa para probar el funcionamiento del modelo del MYRAbot, que simplemente hace girar en circulo al robot y gira el brazo de un lado a otro en posición vertical, cuando se acciona el pulsado de inicio del robot. Primero vamos a [[Fernando-TFM-ROS02#Creando un package| crear un package]] que va a contener nuestro programa y que llamaremos &amp;quot;myrabot_fer&amp;quot;, con las siguientes dependencias: brazo_fer geometry_msgs std_msgs nav_msgs sensor_msgs image_transport roscpp.&lt;br /&gt;
&lt;br /&gt;
Dentro de este ''package'' vamos a crear un archivo llamado &amp;quot;vuelta_al_ruedo.cpp&amp;quot; en el directorio &amp;quot;src&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; anclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;std_msgs/Bool.h&amp;quot;  &lt;br /&gt;
&lt;br /&gt;
  int cont = 0;&lt;br /&gt;
  int cont1= 0;&lt;br /&gt;
  int encendido = 0;&lt;br /&gt;
  brazo_fer::Servos move, on, vel;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
  void home()&lt;br /&gt;
  {&lt;br /&gt;
	if (cont1 == 0)&lt;br /&gt;
	{&lt;br /&gt;
		ros::NodeHandle n;&lt;br /&gt;
&lt;br /&gt;
		ros::Publisher move_arm_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);&lt;br /&gt;
		ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);  		&lt;br /&gt;
		ros::Publisher move_base_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1);   &lt;br /&gt;
		&lt;br /&gt;
		brazo_fer::WriteServos home;&lt;br /&gt;
		&lt;br /&gt;
		::move.base = 511;&lt;br /&gt;
		::move.arti1 = 511;&lt;br /&gt;
		::move.arti2 = 511;&lt;br /&gt;
		::move.arti3 = 511;&lt;br /&gt;
		::move.pinza = 511;&lt;br /&gt;
		&lt;br /&gt;
		::on.base = 1;&lt;br /&gt;
		::on.arti1 = 1;&lt;br /&gt;
		::on.arti2 = 1;&lt;br /&gt;
		::on.arti3 = 1;&lt;br /&gt;
		::on.pinza = 1;&lt;br /&gt;
		&lt;br /&gt;
		::vel.base = 400;&lt;br /&gt;
		::vel.arti1 = 400;&lt;br /&gt;
		::vel.arti2 = 400;&lt;br /&gt;
		::vel.arti3 = 400;&lt;br /&gt;
		::vel.pinza = 400;&lt;br /&gt;
		&lt;br /&gt;
		home.posicion = ::move;&lt;br /&gt;
		home.par = ::on;&lt;br /&gt;
		home.velocidad = ::vel;&lt;br /&gt;
		&lt;br /&gt;
		move_arm_pub_.publish(home);&lt;br /&gt;
		hand_pub_.publish(home);&lt;br /&gt;
		&lt;br /&gt;
		::cont1 = 1;&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void inicio(const std_msgs::Bool&amp;amp; inicio)&lt;br /&gt;
  {&lt;br /&gt;
	if (inicio.data == true &amp;amp;&amp;amp; ::cont == 0)&lt;br /&gt;
	{&lt;br /&gt;
		::encendido = 1;&lt;br /&gt;
		::cont = 1;&lt;br /&gt;
	}&lt;br /&gt;
	else if (inicio.data == true &amp;amp;&amp;amp; ::cont == 1)&lt;br /&gt;
	{&lt;br /&gt;
		::encendido = 0;&lt;br /&gt;
		::cont = 0;&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void posicion(const brazo_fer::ReadServos&amp;amp; posicion)&lt;br /&gt;
  {&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
&lt;br /&gt;
  	ros::Publisher move_arm_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);&lt;br /&gt;
  	ros::Publisher move_base_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1);    	 	&lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::Servos p = posicion.posicion;&lt;br /&gt;
	brazo_fer::WriteServos mover_brazo;&lt;br /&gt;
	&lt;br /&gt;
	home();&lt;br /&gt;
	&lt;br /&gt;
	if (::encendido == 1)&lt;br /&gt;
	{	&lt;br /&gt;
		geometry_msgs::Twist mover_base;&lt;br /&gt;
		&lt;br /&gt;
		mover_base.linear.x = 0.1;&lt;br /&gt;
		mover_base.angular.z = 0.3;&lt;br /&gt;
		&lt;br /&gt;
		move_base_pub_.publish(mover_base);		&lt;br /&gt;
		&lt;br /&gt;
		if (::cont1 ==  1)&lt;br /&gt;
		{&lt;br /&gt;
			::move.base = 718;&lt;br /&gt;
			::cont1 = 2;&lt;br /&gt;
			mover_brazo.posicion = ::move;&lt;br /&gt;
			mover_brazo.par = ::on;&lt;br /&gt;
			mover_brazo.velocidad = ::vel;&lt;br /&gt;
			move_arm_pub_.publish(mover_brazo);&lt;br /&gt;
		}&lt;br /&gt;
		else if ((p.base-110) &amp;lt; ::move.base &amp;amp;&amp;amp; ::move.base &amp;lt; (p.base+110))		&lt;br /&gt;
		{&lt;br /&gt;
			if (::cont1 ==  2)&lt;br /&gt;
			{&lt;br /&gt;
				::move.base = 304;&lt;br /&gt;
				::cont1 = 3;&lt;br /&gt;
				mover_brazo.posicion = ::move;&lt;br /&gt;
				mover_brazo.par = ::on;&lt;br /&gt;
				mover_brazo.velocidad = ::vel;&lt;br /&gt;
				move_arm_pub_.publish(mover_brazo);				&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				::cont1 = 1;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;vuelta_al_ruedo&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber pose_sub_= n.subscribe(&amp;quot;pose_arm&amp;quot;, 1, posicion); &lt;br /&gt;
  	ros::Subscriber button_sub_= n.subscribe(&amp;quot;start_button&amp;quot;, 1, inicio); &lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_arm_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);&lt;br /&gt;
  	ros::Publisher move_base_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;cmd_vel&amp;quot;, 1);  	 	   &lt;br /&gt;
 &lt;br /&gt;
	ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Para compilar el programa añadiremos la siguiente línea al final del archivo &amp;quot;CMakeLists.txt&amp;quot; de nuestro ''package'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosbuild_add_executable(vuelta_al_ruedo src/vuelta_al_ruedo.cpp)&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Para generar el ejecutable debemos ejecutar la siguiente secuencia de comandos en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
roscd myrabot_fer&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para lanzar [http://wiki.ros.org/simulator_gazebo gazebo] con el modelo del robot en un mundo vacío, ejecutaremos el siguiente comando en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_fer_modelo myrabot_gazebo.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ejecutar el programa que hemos creado, en otro terminal ejecutaremos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun myrabot_fer vuelta_al_ruedo&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El modelo del robot permanecerá detenido hasta que publiquemos el valor &amp;quot;true&amp;quot; en el ''topic'' &amp;quot;start_button&amp;quot;, que corresponde al botón de inicio del robot. Para simular la pulsación del botón de inicio vamos a ejecutar el siguiente comando en un nuevo terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub start_button std_msgs/Bool '{data: true}' --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si todo a funcionado bien el robot comenzara a desplazarse en círculo y girar el brazo de un lado a otro en posición vertical, como se muestra en el vídeo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;IY63zJgQYGI&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=IY63zJgQYGI Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ejecución del programa (entre la cerveza y la cola, la plataforma) escoja=&lt;br /&gt;
&lt;br /&gt;
Para la ejecución del programa [[Detección y cálculo de posición de objetos (cámara web)#Señalar objetos (Escoja)|escoja]] en el simulador [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] usando el modelo del MYRAbot, necesitamos crear previamente los modelos de los objetos a reconocer y una mesa, sobre la cual estarán situados.&lt;br /&gt;
&lt;br /&gt;
==Creación de modelos de objetos==&lt;br /&gt;
&lt;br /&gt;
===Mesa===&lt;br /&gt;
&lt;br /&gt;
Primero vamos crear el modelo de la mesa donde vamos a situar los objetos. Se trata de una mesa con tablero de madera y patas metálicas negras de dimensiones 200x75x74 cm (largo x ancho x alto).&lt;br /&gt;
&lt;br /&gt;
[[file:modelo_mesa.png|thumb|200px|center|Modelo mesa en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]]]&lt;br /&gt;
&lt;br /&gt;
Para contener los objetos vamos a [[Fernando-TFM-ROS02#Creando un package|crear un ''package'']] que llamaremos &amp;quot;objetos_fer_modelos&amp;quot; con las siguientes dependencias: geometry_msgs gazebo urdf roscpp. Para el modelo de la mesa crearemos un archivo llamado &amp;quot;mesa.xacro&amp;quot; dentro del directorio &amp;quot;urdf&amp;quot; del ''package'' que acabamos de crear, con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot name=&amp;quot;mesa&amp;quot; xmlns:xacro=&amp;quot;http://www.ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;world&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;mesa&amp;quot; type=&amp;quot;floating&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;world&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;mesa_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;mesa_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;visual&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;box size=&amp;quot;2 0.75 0.03&amp;quot; /&amp;gt; &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${(0.03/2)+0.71}&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;wood&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;${205/255} ${133/255} ${63/255} 1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;/visual&amp;gt;&lt;br /&gt;
  &amp;lt;collision&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${(0.03/2)+0.71}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;box size=&amp;quot;2 0.75 0.03&amp;quot; /&amp;gt; &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
  &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;inertial&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${(0.03/2)+0.71}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mass value=&amp;quot;5&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.1&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.1&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.1&amp;quot;/&amp;gt;  &lt;br /&gt;
  &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;pata&amp;quot; params=&amp;quot;id refx refy&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint name=&amp;quot;pata_${id}&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;mesa_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;pata_${id}_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;${refx*((2/2)-0.045)} ${refy*((0.75/2)-0.045)} 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;pata_${id}_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;visual&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.025&amp;quot; length=&amp;quot;0.71&amp;quot; /&amp;gt;    &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.71/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;material name=&amp;quot;black&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;color rgba=&amp;quot;0 0 0 1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;/visual&amp;gt;&lt;br /&gt;
  &amp;lt;collision&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.71/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.025&amp;quot; length=&amp;quot;0.71&amp;quot; /&amp;gt; &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
  &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;inertial&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.71/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mass value=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.1&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.1&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.1&amp;quot;/&amp;gt;  &lt;br /&gt;
  &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&amp;lt;/link&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:pata id=&amp;quot;1&amp;quot; refx=&amp;quot;1&amp;quot; refy=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;xacro:pata id=&amp;quot;2&amp;quot; refx=&amp;quot;1&amp;quot; refy=&amp;quot;-1&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;xacro:pata id=&amp;quot;3&amp;quot; refx=&amp;quot;-1&amp;quot; refy=&amp;quot;-1&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;xacro:pata id=&amp;quot;4&amp;quot; refx=&amp;quot;-1&amp;quot; refy=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;mesa_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;Gazebo/LightWood&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;10&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;10&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:macro name=&amp;quot;gazebo_pata&amp;quot; params=&amp;quot;id&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;pata_${id}_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;PR2/Black&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;0.9&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;0.9&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/xacro:macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xacro:gazebo_pata id=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;xacro:gazebo_pata id=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;xacro:gazebo_pata id=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;xacro:gazebo_pata id=&amp;quot;4&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el modelo de la mesa hemos empleado los materiales que vienen por defecto en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo], pero para las latas vamos a necesitar crear materiales nuevos con las texturas de las etiquetas.&lt;br /&gt;
&lt;br /&gt;
===Creación de nuevos materiales para gazebo===&lt;br /&gt;
&lt;br /&gt;
Comenzaremos creando dentro de nuestro ''package'' un directorio llamado &amp;quot;Media&amp;quot;, dentro del cual crearemos otro directorio llamado &amp;quot;materials&amp;quot;, y dentro de este crearemos otros dos directorios llamados &amp;quot;scripts&amp;quot; y &amp;quot;textures&amp;quot;. También debemos añadir las siguientes líneas al archivo &amp;quot;manifest.xml&amp;quot; de nuestro ''package'', para colocarlo en la ruta de [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;export&amp;gt;&lt;br /&gt;
     &amp;lt;gazebo gazebo_media_path=&amp;quot;${prefix}&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/export&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Los materiales se definen para el motor gráfico [http://www.ogre3d.org/ OGRE]. Para las latas vamos a necesitar asociar una imagen al material para que aplique una textura a la geometría. La imagen que usaremos para la textura debe guardarse en la carpeta &amp;quot;textures&amp;quot; creada dentro de nuestro ''package''. Crearemos un archivo llamado &amp;quot;myrabot_fer.material&amp;quot; dentro del directorio &amp;quot;scripts&amp;quot; de nuestro ''package'' con el contenido que se muestra a continuación, para la definición de un nuevo material con textura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
material material_fer/NOMBRE_DEL_NUEVO_MATERIAL&lt;br /&gt;
{&lt;br /&gt;
	technique&lt;br /&gt;
	{&lt;br /&gt;
		pass&lt;br /&gt;
		{&lt;br /&gt;
                        lighting off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                        ambient 1 1 1 1&lt;br /&gt;
			diffuse 1 1 1 1&lt;br /&gt;
			specular 0 0 0 0&lt;br /&gt;
			emissive 0 0 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			alpha_rejection greater 128&lt;br /&gt;
			depth_write on&lt;br /&gt;
&lt;br /&gt;
			texture_unit&lt;br /&gt;
			{&lt;br /&gt;
				texture NUESTRO_ARCHIVO_DE_IMAGEN&lt;br /&gt;
				tex_coord_set 0&lt;br /&gt;
				colour_op modulate&lt;br /&gt;
				rotate 180&lt;br /&gt;
				scale 1 1&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Latas===&lt;br /&gt;
&lt;br /&gt;
====Lata de cerveza====&lt;br /&gt;
&lt;br /&gt;
Para el modelo simplificado de la lata crearemos un archivo llamado &amp;quot;lata_cerveza.xacro&amp;quot; dentro del directorio &amp;quot;urdf&amp;quot; de nuestro ''package'' con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot name=&amp;quot;lata_cerveza&amp;quot; xmlns:xacro=&amp;quot;http://www.ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;world&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;lata&amp;quot; type=&amp;quot;floating&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;world&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;lata_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;lata_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;visual&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.1115&amp;quot; /&amp;gt;    &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${(0.1115/2)+0.007}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;material name=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;color rgba=&amp;quot;1 0 0 1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;/visual&amp;gt;&lt;br /&gt;
  &amp;lt;collision&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${(0.1115/2)+0.007}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.1115&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
  &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;inertial&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${(0.1115/2)+0.007}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot;/&amp;gt;  &lt;br /&gt;
  &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;lata_top&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;lata_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;lata_top_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0.1185&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;lata_top_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;visual&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.0015&amp;quot; /&amp;gt;    &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.0015/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;material name=&amp;quot;grey&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;color rgba=&amp;quot;0.8 0.8 0.8 1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;/visual&amp;gt;&lt;br /&gt;
  &amp;lt;collision&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.0015/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.0015&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
  &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;inertial&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.0015/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.0001&amp;quot;/&amp;gt;  &lt;br /&gt;
  &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;lata_bottom&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;lata_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;lata_bottom_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;lata_bottom_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;visual&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.007&amp;quot; /&amp;gt;    &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.007/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;material name=&amp;quot;grey&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;color rgba=&amp;quot;0.8 0.8 0.8 1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;/visual&amp;gt;&lt;br /&gt;
  &amp;lt;collision&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.007/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.007&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
  &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;inertial&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.007/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.0001&amp;quot;/&amp;gt;  &lt;br /&gt;
  &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;lata_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;material_fer/Amstel&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;100&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;100&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;lata_top_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;PR2/Grey0&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;100&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;100&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;lata_bottom_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;PR2/Grey0&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;100&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;100&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora debemos añadir el material &amp;quot;Amstel&amp;quot; a [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]. Copiaremos las siguientes líneas al final del archivo &amp;quot;myrabot_fer.material&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
material material_fer/Amstel&lt;br /&gt;
{&lt;br /&gt;
	technique&lt;br /&gt;
	{&lt;br /&gt;
		pass&lt;br /&gt;
		{&lt;br /&gt;
                        lighting off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                        ambient 1 1 1 1&lt;br /&gt;
			diffuse 1 1 1 1&lt;br /&gt;
			specular 0 0 0 0&lt;br /&gt;
			emissive 0 0 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			alpha_rejection greater 128&lt;br /&gt;
			depth_write on&lt;br /&gt;
&lt;br /&gt;
			texture_unit&lt;br /&gt;
			{&lt;br /&gt;
				texture amstel.png&lt;br /&gt;
				tex_coord_set 0&lt;br /&gt;
				colour_op modulate&lt;br /&gt;
				rotate 180&lt;br /&gt;
				scale 1 1&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación se muestra la imagen que se ha empleado para la textura y una captura del modelo en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]:&lt;br /&gt;
&lt;br /&gt;
[[file:amstel.png|thumb|200px|center|Textura lata de cerveza]]&lt;br /&gt;
&lt;br /&gt;
[[file:modelo_lata_cerveza.png|thumb|200px|center|Lata de cerveza en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]]]&lt;br /&gt;
&lt;br /&gt;
====Lata de cola====&lt;br /&gt;
&lt;br /&gt;
Para el modelo simplificado de la lata crearemos un archivo llamado &amp;quot;lata_cola.xacro&amp;quot; dentro del directorio &amp;quot;urdf&amp;quot; de nuestro ''package'' con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot name=&amp;quot;lata_cola&amp;quot; xmlns:xacro=&amp;quot;http://www.ros.org/wiki/xacro&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;world&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;lata&amp;quot; type=&amp;quot;floating&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;world&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;lata_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;lata_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;visual&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.1115&amp;quot; /&amp;gt;    &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${(0.1115/2)+0.007}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;material name=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;color rgba=&amp;quot;1 0 0 1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;/visual&amp;gt;&lt;br /&gt;
  &amp;lt;collision&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${(0.1115/2)+0.007}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.1115&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
  &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;inertial&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${(0.1115/2)+0.007}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot;/&amp;gt;  &lt;br /&gt;
  &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;lata_top&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;lata_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;lata_top_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0.1185&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;lata_top_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;visual&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.0015&amp;quot; /&amp;gt;    &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.0015/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;material name=&amp;quot;grey&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;color rgba=&amp;quot;0.8 0.8 0.8 1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;/visual&amp;gt;&lt;br /&gt;
  &amp;lt;collision&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.0015/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.0015&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
  &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;inertial&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.0015/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.0001&amp;quot;/&amp;gt;  &lt;br /&gt;
  &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;lata_bottom&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;lata_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;lata_bottom_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;lata_bottom_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;visual&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.007&amp;quot; /&amp;gt;    &lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.007/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;material name=&amp;quot;grey&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;color rgba=&amp;quot;0.8 0.8 0.8 1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;/visual&amp;gt;&lt;br /&gt;
  &amp;lt;collision&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.007/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.0325&amp;quot; length=&amp;quot;0.007&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
  &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;inertial&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 ${0.007/2}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mass value=&amp;quot;0.001&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.0001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.0001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.0001&amp;quot;/&amp;gt;  &lt;br /&gt;
  &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;lata_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;material_fer/CocaCola&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;10&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;10&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;lata_top_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;PR2/Grey0&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;10&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;10&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;lata_bottom_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;PR2/Grey0&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;10&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;10&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora debemos añadir el material &amp;quot;CocaCola&amp;quot; a [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]. Copiaremos las siguientes líneas al final del archivo &amp;quot;myrabot_fer.material&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
material Gazebo/CocaCola&lt;br /&gt;
{&lt;br /&gt;
	technique&lt;br /&gt;
	{&lt;br /&gt;
		pass&lt;br /&gt;
		{&lt;br /&gt;
                        lighting off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                        ambient 1 1 1 1&lt;br /&gt;
			diffuse 1 1 1 1&lt;br /&gt;
			specular 0 0 0 0&lt;br /&gt;
			emissive 0 0 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			alpha_rejection greater 128&lt;br /&gt;
			depth_write on&lt;br /&gt;
&lt;br /&gt;
			texture_unit&lt;br /&gt;
			{&lt;br /&gt;
				texture coca_cola.png&lt;br /&gt;
				tex_coord_set 0&lt;br /&gt;
				colour_op modulate&lt;br /&gt;
				rotate 180&lt;br /&gt;
				scale 1 1&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación se muestra la imagen que se ha empleado para la textura y una captura del modelo en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:coca_cola.png|thumb|200px|center|Textura lata de cola]]&lt;br /&gt;
&lt;br /&gt;
[[file:modelo_lata_cola.png|thumb|200px|center|Lata de cola [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]]]&lt;br /&gt;
&lt;br /&gt;
Para poder cargar los modelo en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] debemos convertirlos a &amp;quot;.urdf&amp;quot;, para extender las macros y calcular campos, de nuestros archivos &amp;quot;.xacro&amp;quot;. Para esto simplemente deberemos ejecutar la siguiente secuencia de comandos en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
roscd objetos_fer_modelos&lt;br /&gt;
cd urdf&lt;br /&gt;
rosrun xacro xacro.py OBJETO.xacro &amp;gt; OBJETO.urdf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ejecución==&lt;br /&gt;
&lt;br /&gt;
Para la carga de todos los modelos se ha creado un ''launcher'', donde le indicamos a cada modelo sus coordenadas de inserción. Crearemos un archivo llamado &amp;quot;myrabot_latas.launch&amp;quot; dentro del directorio &amp;quot;launch&amp;quot; del ''package'' &amp;quot;myrabot_fer&amp;quot;, con el sigiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;/use_sim_time&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;gazebo&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;gazebo&amp;quot; args=&amp;quot;$(find gazebo_worlds)/worlds/empty.world&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_mesa&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find objetos_fer_modelos)/urdf/mesa.urdf -urdf -x 0.55 -y 0 -z 0 -Y -1.57 -model mesa&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;    &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_lata_coca_cola&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find objetos_fer_modelos)/urdf/lata_cola.urdf -urdf -x 0.38 -y -0.18 -z 0.74 -Y -1.57 -model lata_cocacola&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_lata_amstel&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find objetos_fer_modelos)/urdf/lata_cerveza.urdf -urdf -x 0.38 -y 0.17 -z 0.74 -Y -1.57 -model lata_amstel&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find myrabot_fer_modelo)/launch/myrabot_gazebo.launch&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para iniciar el ''launcher'' simplemente debemos ejecutar el siguiente comando en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_fer myrabot_latas.launch&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo se muestra al modelo del MYRAbot ejecutando el programa [[Detección y cálculo de posición de objetos (cámara web)#Señalar objetos (Escoja)|escoja]], en el que el brazo señala el objeto que le indiquemos y pasado un breve período de tiempo regresa a su posición inicial. Para iniciar el programa ejecutaremos el siguiente comando en otro terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer escoja.launch&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Para seleccionar el objeto a señalar publicaremos en el ''topic'' &amp;quot;selected_object&amp;quot; su número de identificación, ejecutando en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub selected_object std_msgs/Int16 1 --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si todo va bien el resultado será similar al que se muestra en el siguiente vídeo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;lp2FUFlsFV4&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=lp2FUFlsFV4 Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ejecución del programa seguir objetos=&lt;br /&gt;
&lt;br /&gt;
==Programa para mover objetos en gazebo usando el teclado==&lt;br /&gt;
&lt;br /&gt;
Para poder desplazar los modelos de los objetos dentro de [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] hemos escrito un pequeño programa que publica en el ''topic'' &amp;quot;gazebo/set_model_state&amp;quot; la posición del modelo del objeto indicado, en este caso &amp;quot;Lata_amstel&amp;quot;, usando el teclado. Crearemos un archivo llamado &amp;quot;mover_objetos.cpp&amp;quot; que guardaremos en el directorio &amp;quot;src&amp;quot; del ''package'' que hemos creado anteriormente para contener los modelos de los objetos, con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;gazebo/ModelState.h&amp;quot;&lt;br /&gt;
  #include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;termios.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  #define PI 3.14159265&lt;br /&gt;
  #define L1 104&lt;br /&gt;
  #define L2 104&lt;br /&gt;
  #define Lp 60&lt;br /&gt;
  &lt;br /&gt;
  #define KEYCODE_Xmas 0x43 &lt;br /&gt;
  #define KEYCODE_Xmenos 0x44&lt;br /&gt;
  #define KEYCODE_Ymas 0x41&lt;br /&gt;
  #define KEYCODE_Ymenos 0x42&lt;br /&gt;
  #define KEYCODE_Zmas 0x77&lt;br /&gt;
  #define KEYCODE_Zmenos 0x73&lt;br /&gt;
  #define KEYCODE_XgiroMas 0x61&lt;br /&gt;
  #define KEYCODE_XgiroMenos 0x64&lt;br /&gt;
  #define KEYCODE_YgiroMas 0x65&lt;br /&gt;
  #define KEYCODE_YgiroMenos 0x71  &lt;br /&gt;
  &lt;br /&gt;
struct termios cooked, raw; &lt;br /&gt;
&lt;br /&gt;
int cont = 0;&lt;br /&gt;
&lt;br /&gt;
double retardo = 0.1;&lt;br /&gt;
&lt;br /&gt;
gazebo::ModelState objeto;  &lt;br /&gt;
 &lt;br /&gt;
void quit(int sig)&lt;br /&gt;
{&lt;br /&gt;
  tcsetattr(0, TCSANOW, &amp;amp;cooked);&lt;br /&gt;
  ros::shutdown();&lt;br /&gt;
  exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void callback(const ros::TimerEvent&amp;amp;)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;   	&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher object_pub_=n.advertise&amp;lt;gazebo::ModelState&amp;gt;(&amp;quot;gazebo/set_model_state&amp;quot;, 1);&lt;br /&gt;
&lt;br /&gt;
        std::string modelo_objeto;&lt;br /&gt;
&lt;br /&gt;
        ros::NodeHandle nh(&amp;quot;~&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        nh.param(&amp;quot;modelo_objeto&amp;quot;, modelo_objeto, std::string(&amp;quot;Lata_amstel&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	ros::Time anterior;&lt;br /&gt;
&lt;br /&gt;
	if (::cont == 0)&lt;br /&gt;
        {&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		&lt;br /&gt;
		::objeto.model_name = modelo_objeto;&lt;br /&gt;
  &lt;br /&gt;
		::objeto.reference_frame = &amp;quot;world&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		::objeto.pose.position.x = 0;&lt;br /&gt;
		&lt;br /&gt;
		::objeto.pose.position.y = 0.5;&lt;br /&gt;
		&lt;br /&gt;
		::objeto.pose.position.z = 0.74;&lt;br /&gt;
		&lt;br /&gt;
		::objeto.pose.orientation.x = 0;&lt;br /&gt;
		&lt;br /&gt;
		::objeto.pose.orientation.y = 0;&lt;br /&gt;
		&lt;br /&gt;
		::objeto.pose.orientation.z = 0;&lt;br /&gt;
		&lt;br /&gt;
		::objeto.pose.orientation.w = 1;												 &lt;br /&gt;
		&lt;br /&gt;
		::cont = 1;&lt;br /&gt;
&lt;br /&gt;
		object_pub_.publish(::objeto);		&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
  char c;&lt;br /&gt;
&lt;br /&gt;
  // get the console in raw mode                                                              &lt;br /&gt;
  tcgetattr(0, &amp;amp;cooked);&lt;br /&gt;
  memcpy(&amp;amp;raw, &amp;amp;cooked, sizeof(struct termios));&lt;br /&gt;
  raw.c_lflag &amp;amp;=~ (ICANON | ECHO);&lt;br /&gt;
  // Setting a new line, then end of file                         &lt;br /&gt;
  raw.c_cc[VEOL] = 1;&lt;br /&gt;
  raw.c_cc[VEOF] = 2;&lt;br /&gt;
  tcsetattr(0, TCSANOW, &amp;amp;raw);&lt;br /&gt;
&lt;br /&gt;
  puts(&amp;quot;&amp;quot;); &lt;br /&gt;
  puts(&amp;quot;#####################################################&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;                   CONTROLES OBJETO&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;#####################################################&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;&amp;quot;);  &lt;br /&gt;
  puts(&amp;quot;Flecha arriba:_______ Subir objeto&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Flecha abajo:________ Bajar objeto&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Flecha izquierda:____ Desplazar objeto a la izquierda&amp;quot;); &lt;br /&gt;
  puts(&amp;quot;Flecha derecha:______ Desplazar objeto a la derecha&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Tecla W:_____________ Desplazar objeto hacia delante&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Tecla S:_____________ Desplazar objeto hacia atrás&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Tecla A:_____________ Inclinar objeto en eje x mas&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Tecla D:_____________ Inclinar objeto en eje x menos&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Tecla Q:_____________ Inclinar objeto en eje y mas&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Tecla E:_____________ Inclinar objeto en eje y menos&amp;quot;);                               &lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
    while (ros::ok())&lt;br /&gt;
    {&lt;br /&gt;
		&lt;br /&gt;
			&lt;br /&gt;
    // get the next event from the keyboard  &lt;br /&gt;
    if(read(0, &amp;amp;c, 1) &amp;lt; 0)&lt;br /&gt;
    {&lt;br /&gt;
      perror(&amp;quot;read():&amp;quot;);&lt;br /&gt;
      exit(-1);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
      if (c == KEYCODE_Xmas)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.position.x = ::objeto.pose.position.x + 0.005;&lt;br /&gt;
			&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}		&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Xmenos)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.position.x = ::objeto.pose.position.x - 0.005;&lt;br /&gt;
&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}				&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Ymas)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.position.z = ::objeto.pose.position.z + 0.005;&lt;br /&gt;
			&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}					    &lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Ymenos)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.position.z = ::objeto.pose.position.z - 0.005;&lt;br /&gt;
			&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}						&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Zmas)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.position.y = ::objeto.pose.position.y + 0.005;&lt;br /&gt;
			&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}					&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Zmenos)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.position.y = ::objeto.pose.position.y - 0.005;&lt;br /&gt;
			&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}				&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_XgiroMas)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.orientation.x = ::objeto.pose.orientation.x + 0.1;&lt;br /&gt;
			&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}	&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_XgiroMenos)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.orientation.x = ::objeto.pose.orientation.x - 0.1;&lt;br /&gt;
			&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}	&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_YgiroMas)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.orientation.y = ::objeto.pose.orientation.y + 0.1;&lt;br /&gt;
			&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}	&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_YgiroMenos)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
			::objeto.pose.orientation.y = ::objeto.pose.orientation.y - 0.1;&lt;br /&gt;
&lt;br /&gt;
			anterior = ros::Time::now();&lt;br /&gt;
		}	&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      object_pub_.publish(::objeto);&lt;br /&gt;
&lt;br /&gt;
	}	&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;mover_objetos&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher object_pub_=n.advertise&amp;lt;gazebo::ModelState&amp;gt;(&amp;quot;gazebo/set_model_state&amp;quot;, 1);    	 	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	signal(SIGINT,quit); &lt;br /&gt;
	&lt;br /&gt;
	ros::Timer timer = n.createTimer(ros::Duration(1), callback);&lt;br /&gt;
    &lt;br /&gt;
   	   &lt;br /&gt;
 &lt;br /&gt;
	ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilar el programa añadiremos la siguiente línea al final del archivo &amp;quot;CMakeLists.txt&amp;quot; de nuestro ''package'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosbuild_add_executable(mover_objetos src/mover_objetos.cpp)&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Para generar el ejecutable debemos ejecutar la siguiente secuencia de comandos en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
roscd objetos_fer_modelos&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ejecución==&lt;br /&gt;
&lt;br /&gt;
Para la carga de todos los modelos se ha creado un ''launcher'', donde le indicamos a cada modelo sus coordenadas de inserción. Crearemos un archivo llamado &amp;quot;myrabot_lata.launch&amp;quot; dentro del directorio &amp;quot;launch&amp;quot; del ''package'' &amp;quot;myrabot_fer&amp;quot;, con el sigiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;/use_sim_time&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;gazebo&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;gazebo&amp;quot; args=&amp;quot;$(find gazebo_worlds)/worlds/empty.world&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_mesa&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find objetos_fer_modelos)/urdf/mesa.urdf -urdf -x 0.55 -y 0 -z 0 -Y -1.57 -model mesa&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_lata_amstel&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find objetos_fer_modelos)/urdf/lata_cerveza.urdf -urdf -x 0.5 -y 0 -z 0.74 -Y -1.57 -model lata_amstel&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find myrabot_fer_modelo)/launch/myrabot_gazebo.launch&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para iniciar el ''launcher'' simplemente debemos ejecutar el siguiente comando en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch myrabot_fer myrabot_lata.launch&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo se muestra al modelo del MYRAbot ejecutando el programa [[Detección y cálculo de posición de objetos (cámara web)#Seguir objetos|seguir objetos]], en el que el brazo sigue el objeto que le indiquemos. Para iniciar el programa ejecutaremos el siguiente comando en otro terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer seguir.launch&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Para seleccionar el objeto a señalar publicaremos en el ''topic'' &amp;quot;selected_object&amp;quot; su número de identificación, ejecutando en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub selected_object std_msgs/Int16 1 --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para poder mover la lata, ejecutaremos en un nuevo terminal el siguiente comando, donde indicamos en el parámetro &amp;quot;modelo_objeto&amp;quot; el nombre del modelo en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] que queremos mover:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun objetos_fer_modelos mover_objetos _modelo_objeto:=lata_amstel&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si todo va bien el resultado será similar al que se muestra en el vídeo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;kLfgfHo8OnI&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=kLfgfHo8OnI Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Modelo_para_simulaci%c3%b3n_brazo_MYRAbot_(urdf%2bgazebo)&amp;diff=4209</id>
		<title>Modelo para simulación brazo MYRAbot (urdf+gazebo)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Modelo_para_simulaci%c3%b3n_brazo_MYRAbot_(urdf%2bgazebo)&amp;diff=4209"/>
				<updated>2014-09-29T11:03:17Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Creación del modelo URDF=&lt;br /&gt;
&lt;br /&gt;
El formato empleado para el modelo del brazo está denominado por el acrónimo inglés [http://wiki.ros.org/urdf/Tutorials URDF] (Unified Robot Description Format), que emplea el lenguaje [http://es.wikipedia.org/wiki/Extensible_Markup_Language xml]. Consiste en un árbol de elementos geométricos (''links'') conectados entre sí mediante uniones (''joints'') que determinan el parentesco entre ellos. Estas uniones pueden ser fijas o móviles, las móviles pueden ser a su vez rotacionales, lineales o flotantes.&lt;br /&gt;
&lt;br /&gt;
Comenzaremos [[Fernando-TFM-ROS02#Creando un package|creando el package]] &amp;quot;brazo_fer_modelo&amp;quot; que va a contener el modelo de nuestro brazo, con las siguientes dependencias: urdf [[Control brazo MYRAbot (bioloid+arduino)|brazo_fer]] std_msgs sensor_msgs tf roscpp&lt;br /&gt;
&lt;br /&gt;
El modelo planteado para nuestro brazo se compone de tres archivos, uno que contiene los ''macros'' que vamos a utilizar en el archivo principal del modelo y un archivo en el que marcamos el ''link'' al que está unido el modelo. El contenido del arcivo principal del modelo es el siguiente, que guardaremos en el directorio &amp;quot;urdf&amp;quot; del ''package'' creado en un archivo llamado &amp;quot;brazo.xacro&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;include filename=&amp;quot;$(find brazo_fer_modelo)/urdf/brazo-macros.xacro&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;brazo&amp;quot; params=&amp;quot;parent *origin&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;fixed&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;${parent}&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;base_brazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;insert_block name=&amp;quot;origin&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 0 1&amp;quot; /&amp;gt;  &lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;link name=&amp;quot;base_brazo_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.032 0.05 0.04&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 -0.0135 0.020&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;black&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;color rgba=&amp;quot;0 0 0 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 -0.0135 0.020&amp;quot;/&amp;gt;		&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.032 0.05 0.04&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 -0.0135 0.020&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.055&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia_servos /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;       &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;base&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;base_brazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;hombro_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0.04&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 0 1&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;default_limit /&amp;gt;&lt;br /&gt;
	&amp;lt;default_dynamics /&amp;gt;          &lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;hombro_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.04 0.032 0.05&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.025&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;black&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.025&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.04 0.032 0.05&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;       &lt;br /&gt;
    &amp;lt;/collision&amp;gt; &lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.025&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.055&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia_servos /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;        &lt;br /&gt;
  &amp;lt;/link&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;arti1&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;hombro_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;brazo_link&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0.0385&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;default_limit /&amp;gt;&lt;br /&gt;
	&amp;lt;default_dynamics /&amp;gt;        &lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!--brazo--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;servo nombre=&amp;quot;brazo&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti1_B&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;brazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;brazo_link_B&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;base nombre=&amp;quot;brazo&amp;quot; /&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti1_D&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;brazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;brazo_link_SI&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;soporte nombre=&amp;quot;brazo&amp;quot; simetrico=&amp;quot;1&amp;quot; lado=&amp;quot;I&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti1_I&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;brazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;brazo_link_SD&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;soporte nombre=&amp;quot;brazo&amp;quot; simetrico=&amp;quot;-1&amp;quot; lado=&amp;quot;D&amp;quot; /&amp;gt;     &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;arti2&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;brazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;antebrazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0.104&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;default_limit /&amp;gt;&lt;br /&gt;
	&amp;lt;default_dynamics /&amp;gt;            &lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!--antebrazo--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;servo nombre=&amp;quot;antebrazo&amp;quot; /&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti2_B&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;antebrazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;antebrazo_link_B&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;base nombre=&amp;quot;antebrazo&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti2_D&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;antebrazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;antebrazo_link_SI&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;soporte nombre=&amp;quot;antebrazo&amp;quot; simetrico=&amp;quot;1&amp;quot; lado=&amp;quot;I&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti2_I&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;antebrazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;antebrazo_link_SD&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;soporte nombre=&amp;quot;antebrazo&amp;quot; simetrico=&amp;quot;-1&amp;quot; lado=&amp;quot;D&amp;quot; /&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;joint name=&amp;quot;arti3&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;antebrazo_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;muneca_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0.104&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;default_limit /&amp;gt;&lt;br /&gt;
	&amp;lt;default_dynamics /&amp;gt;             &lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!--muneca--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;muneca_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.05 0.04 0.032&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.00625 0 0.06&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;black&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.00625 0 0.06&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.05 0.04 0.032&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.00625 0 0.06&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.055&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia_servos /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;            &lt;br /&gt;
  &amp;lt;/link&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti3_B&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;muneca_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;muneca_link_B&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;muneca_link_B&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.05325 0.04 0.005&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.004625 0 0.0415&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.004625 0 0.0415&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.05325 0.04 0.005&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.004625 0 0.0415&amp;quot;/&amp;gt;		&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.0005&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;              &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti3_D&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;muneca_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;muneca_link_SI&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;muneca_link_SI&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.032 0.0555&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.021 0 0.01625&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.021 0 0.01625&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.032 0.0555&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.021 0 0.01625&amp;quot;/&amp;gt;		&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.0005&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;           &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti3_I&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;muneca_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;muneca_link_SD&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;muneca_link_SD&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.032 0.0555&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.021 0 0.01625&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.021 0 0.01625&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.032 0.0555&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.021 0 0.01625&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.0005&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;            &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti3_P&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;muneca_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;muneca_link_P&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!--pinza izquierda fija--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;muneca_link_P&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.04 0.092&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.03425 0 0.090&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.03425 0 0.090&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.04 0.092&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.03425 0 0.090&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;           &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_arti3_PS&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;muneca_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;muneca_link_PS&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;muneca_link_PS&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.04 0.037&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.03225 0 0.0575&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.03225 0 0.0575&amp;quot;/&amp;gt;	&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.04 0.037&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0.03225 0 0.0575&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.0005&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;            &lt;br /&gt;
  &amp;lt;/link&amp;gt;             &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;pinza&amp;quot; type=&amp;quot;revolute&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;muneca_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;pinza_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;-0.00725 0 0.06&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;axis xyz=&amp;quot;0 1 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;default_limit /&amp;gt;&lt;br /&gt;
	&amp;lt;default_dynamics /&amp;gt;     &lt;br /&gt;
  &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!--pinza--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;pinza_link&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.04 0.092&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.027 0 0.030&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.027 0 0.030&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.04 0.092&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.027 0 0.030&amp;quot;/&amp;gt;		&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
 	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;           &lt;br /&gt;
  &amp;lt;/link&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_pinza_B&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;pinza_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;pinza_link_B&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;pinza_link_B&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.04 0.032&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.025 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.025 0 0&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.04 0.032&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.025 0 0&amp;quot;/&amp;gt;		&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.0005&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;           &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_pinza_D&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;pinza_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;pinza_link_SI&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;pinza_link_SI&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.0375 0.002 0.032&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.00725 0.021 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.00725 0.021 0&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.0375 0.002 0.032&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.00725 0.021 0&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.0005&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;        &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;joint name=&amp;quot;servo_pinza_I&amp;quot; type=&amp;quot;fixed&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;parent link=&amp;quot;pinza_link&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;child link=&amp;quot;pinza_link_SD&amp;quot;/&amp;gt;  &lt;br /&gt;
    &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;axis xyz=&amp;quot;1 0 0&amp;quot; /&amp;gt;    &lt;br /&gt;
  &amp;lt;/joint&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;pinza_link_SD&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.0375 0.002 0.032&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.00725 -0.021 0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.00725 -0.021 0&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.0375 0.002 0.032&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;-0.00725 -0.021 0&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.0005&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;            &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
     &lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El contenido del archivo que contiene los macros, el controlador y transmisiones, que empleamos en el rachivo principal, es el siguiente, que guardaremos en el mismo directorio con el nombre &amp;quot;brazo-macros.xacro&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;default_inertia&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;default_inertia_servos&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.01&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.01&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.01&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;default_limit&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;limit effort=&amp;quot;100.0&amp;quot; lower=&amp;quot;-2.62&amp;quot; upper=&amp;quot;2.62&amp;quot; velocity=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;default_dynamics&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;dynamics fricction=&amp;quot;0&amp;quot; damping=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;servo&amp;quot; params=&amp;quot;nombre&amp;quot;&amp;gt;  &lt;br /&gt;
  &amp;lt;link name=&amp;quot;${nombre}_link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.04 0.032 0.05&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.0905&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;black&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.0905&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.04 0.032 0.05&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.0905&amp;quot;/&amp;gt;		&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.055&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia_servos /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;             &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;base&amp;quot; params=&amp;quot;nombre&amp;quot;&amp;gt;    &lt;br /&gt;
  &amp;lt;link name=&amp;quot;${nombre}_link_B&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.04 0.032 0.020&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.0555&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.0555&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.04 0.032 0.02&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.0555&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;           &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;soporte&amp;quot; params=&amp;quot;nombre simetrico lado&amp;quot;&amp;gt;    &lt;br /&gt;
  &amp;lt;link name=&amp;quot;${nombre}_link_S${lado}&amp;quot;&amp;gt;    &lt;br /&gt;
	&amp;lt;visual&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.032 0.067&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;${simetrico*0.021} 0 0.022&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;material name=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;color rgba=&amp;quot;1 1 1 1&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
    &amp;lt;collision&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;${simetrico*0.021} 0 0.022&amp;quot;/&amp;gt;		&lt;br /&gt;
	  &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;box size=&amp;quot;0.002 0.032 0.067&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
    &amp;lt;inertial&amp;gt;&lt;br /&gt;
      &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;${simetrico*0.021} 0 0.022&amp;quot;/&amp;gt;			&lt;br /&gt;
      &amp;lt;mass value=&amp;quot;0.001&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;default_inertia /&amp;gt;&lt;br /&gt;
    &amp;lt;/inertial&amp;gt;           &lt;br /&gt;
  &amp;lt;/link&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora solo falta un archivo desde el que cargaremos el principal donde indicaremos el nombre del ''link'' al que se une  y el origen. Guardaremos un archivo con el nombre &amp;quot;brazo.urdf.xacro&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot name=&amp;quot;MYRAbot-arm&amp;quot;&lt;br /&gt;
       xmlns:xi=&amp;quot;http://www.w3.org/2001/XInclude&amp;quot;&lt;br /&gt;
       xmlns:gazebo=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#gz&amp;quot;&lt;br /&gt;
       xmlns:model=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#model&amp;quot;&lt;br /&gt;
       xmlns:sensor=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor&amp;quot;&lt;br /&gt;
       xmlns:body=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#body&amp;quot;&lt;br /&gt;
       xmlns:geom=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#geom&amp;quot;&lt;br /&gt;
       xmlns:joint=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#joint&amp;quot;&lt;br /&gt;
       xmlns:interface=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#interface&amp;quot;&lt;br /&gt;
       xmlns:rendering=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#rendering&amp;quot;&lt;br /&gt;
       xmlns:renderable=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#renderable&amp;quot;&lt;br /&gt;
       xmlns:controller=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#controller&amp;quot;&lt;br /&gt;
       xmlns:physics=&amp;quot;http://playerstage.sourceforge.net/gazebo/xmlschema/#physics&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;include filename=&amp;quot;$(find brazo_fer_modelo)/urdf/brazo.xacro&amp;quot; /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;link name=&amp;quot;world&amp;quot; /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;brazo parent=&amp;quot;world&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/brazo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Análisis del modelo==&lt;br /&gt;
&lt;br /&gt;
Como estamos empleando [http://wiki.ros.org/xacro xacro] para simplificar y hacer más editable el código necesitamos hacer la conversión a [http://wiki.ros.org/urdf/Tutorials URDF] para obtener el archivo procesado, ejecutando en un terminal la siguiente secuencia de comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer_modelo&lt;br /&gt;
cd urdf&lt;br /&gt;
rosrun xacro xacro.py brazo.urdf.xacro &amp;gt; brazo.urdf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora podemos comprobar si el modelo que hemos creado es correcto ejecutando el siguiente comando en el terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun urdf_parser check_urdf brazo.urdf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si todo va bien deberiamos obtener lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
robot name is: MYRAbot_arm&lt;br /&gt;
---------- Successfully Parsed XML ---------------&lt;br /&gt;
root Link: world has 1 child(ren)&lt;br /&gt;
    child(1):  base_link&lt;br /&gt;
        child(1):  hombro_link&lt;br /&gt;
            child(1):  brazo_link&lt;br /&gt;
                child(1):  antebrazo_link&lt;br /&gt;
                    child(1):  muneca_link&lt;br /&gt;
                        child(1):  pinza_link&lt;br /&gt;
                            child(1):  pinza_link_B&lt;br /&gt;
                            child(2):  pinza_link_SI&lt;br /&gt;
                            child(3):  pinza_link_SD&lt;br /&gt;
                        child(2):  muneca_link_B&lt;br /&gt;
                        child(3):  muneca_link_SI&lt;br /&gt;
                        child(4):  muneca_link_SD&lt;br /&gt;
                        child(5):  muneca_link_P&lt;br /&gt;
                        child(6):  muneca_link_PS&lt;br /&gt;
                    child(2):  antebrazo_link_B&lt;br /&gt;
                    child(3):  antebrazo_link_SI&lt;br /&gt;
                    child(4):  antebrazo_link_SD&lt;br /&gt;
                child(2):  brazo_link_B&lt;br /&gt;
                child(3):  brazo_link_SI&lt;br /&gt;
                child(4):  brazo_link_SD&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podemos ver el árbol de relaciones de forma gráfica generando un archivo pdf, para lo que ejecutaremos en el terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun urdf_parser urdf_to_graphiz brazo.urdf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El resultado obtenido será el siguiente:&lt;br /&gt;
&lt;br /&gt;
[[file:modelo_brazo_MYRAbot_arbol_relaciones.jpg|thumb|500px|center|Árbol de relaciones modelo URBF para el brazo del MYRAbot]]&lt;br /&gt;
&lt;br /&gt;
=Prueba visual del modelo=&lt;br /&gt;
&lt;br /&gt;
Para poder visualizar el modelo y comprobar el correcto funcionamiento de las uniones ''joints'' vamos a crear un ''launcher'' para cargarlo en el [http://wiki.ros.org/robot_state_publisher robot_state_publisher] y ejecutar el [http://wiki.ros.org/joint_state_publisher joint_state_publisher] con el interfaz de publicación del estado de las uniones móviles, y el [http://wiki.ros.org/rviz rviz] para la visualización. Crearemos el archivo &amp;quot;brazo_rviz.launch&amp;quot; en el directorio &amp;quot;launch&amp;quot; del ''package'' que hemos creado, con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;robot_description&amp;quot; command=&amp;quot;$(find xacro)/xacro.py '$(find brazo_fer_modelo)/urdf/brazo.urdf.xacro'&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;joint_state_publisher&amp;quot; pkg=&amp;quot;joint_state_publisher&amp;quot; type=&amp;quot;joint_state_publisher&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;use_gui&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;robot_state_publisher&amp;quot; pkg=&amp;quot;robot_state_publisher&amp;quot; type=&amp;quot;state_publisher&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;rviz&amp;quot; pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para iniciar el ''launcher'' debemos ejecutar en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer_modelo brazo_rviz.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si todo va bien, se ejecutará [http://wiki.ros.org/rviz rviz] y el interfaz del [http://wiki.ros.org/joint_state_publisher joint_state_publisher], sobre el cual al modificar los controles deslizables observaremos como se modifica la posición de las uniones móviles en el modelo 3D cargado en [http://wiki.ros.org/rviz rviz]. Para que se muestre correctamente nuestro modelo en [http://wiki.ros.org/rviz rviz] debemos seleccionar el elemento ''link'' que se va ha tomar como elemento fijo &amp;quot;fixed frame&amp;quot;, en nuestro caso en &amp;quot;Global Options&amp;quot; el &amp;quot;Fixed Frame&amp;quot; será el ''link'' &amp;quot;/world&amp;quot;. El resultado es el que se muestra a continuación:&lt;br /&gt;
&lt;br /&gt;
[[file:modelo_brazo_MYRAbot_rviz.png|thumb|500px|center|Modelo cargado en [http://wiki.ros.org/rviz rviz] e interfaz [http://wiki.ros.org/joint_state_publisher joint_state_publisher]]]&lt;br /&gt;
&lt;br /&gt;
=Control de uniones para simulación=&lt;br /&gt;
&lt;br /&gt;
Una vez creado el modelo [http://wiki.ros.org/urdf/Tutorials URDF] y probada la correcta representación y funcionamiento de las uniones móviles, debemos añadir una serie de controladores a cada unión para poder simular en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] los servomotores [http://support.robotis.com/en/product/dynamixel/ax_series/dxl_ax_actuator.htm Dynamixel AX-12A].&lt;br /&gt;
&lt;br /&gt;
==Pasos previos==&lt;br /&gt;
&lt;br /&gt;
Debemos comenzar añadiendo los ''packages'' donde se encuentran los controladores que vamos a emplear. Se trata de los controladores del [http://wiki.ros.org/Robots/PR2 PR2] por lo que necesitamos instalar los ''stacks'' [http://wiki.ros.org/pr2_simulator?distro=electric pr2_simulator], [http://wiki.ros.org/pr2_mechanism pr2_mechanism] y [http://wiki.ros.org/pr2_controllers pr2_controllers]. Para ello tenemos que ejecutar la siguiente secuencia de comandos en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
sudo atp-get update&lt;br /&gt;
sudo apt-get install ros-VERSIÓN_ROS-pr2-simulator ros-VERSIÓN_ROS-pr2-mechanism ros-VERSIÓN_ROS-pr2-controllers&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Añadir controladores a uniones móviles==&lt;br /&gt;
&lt;br /&gt;
===Modificación del URDF===&lt;br /&gt;
&lt;br /&gt;
En el [http://wiki.ros.org/urdf/Tutorials URDF] hemos definido la geometría y propiedades físicas de los elementos (''link''), así como las uniones (''joint'') entre estos y sus características. Para poder visualizar el color que le hemos dado a cada elemento en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] debemos asignar a cada elemento un material [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]. También necesitamos establecer los coeficientes de rozamiento de cada elemento, establecer si pueden colisionar los elementos entre sí y la acción de la fuerza de gravedad. A continuación se muestra la descripción para cada elemento en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo], que añadiremos al final de los ficheros de nuestro [http://wiki.ros.org/urdf/Tutorials URDF] antes de la etiqueta &amp;quot;&amp;lt;/robot&amp;gt;&amp;quot;, en el archivo &amp;quot;brazo-macros.xacro&amp;quot;, y &amp;quot;&amp;lt;/macro&amp;gt;&amp;quot;, el el archivo &amp;quot;brazo.xacro&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
* En el archivo brazo-macros.xacro:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;gazebo_propiedades_link&amp;quot; params=&amp;quot;nombre material&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;gazebo reference=&amp;quot;${nombre}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;mu1&amp;gt;0.5&amp;lt;/mu1&amp;gt;&lt;br /&gt;
	&amp;lt;mu2&amp;gt;0.5&amp;lt;/mu2&amp;gt;&lt;br /&gt;
	&amp;lt;material&amp;gt;Gazebo/${material}&amp;lt;/material&amp;gt;&lt;br /&gt;
    &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
    &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt; &lt;br /&gt;
  &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En el archivo brazo.xacro:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;base_brazo_link&amp;quot; material=&amp;quot;Black&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;hombro_link&amp;quot; material=&amp;quot;Black&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;brazo_link&amp;quot; material=&amp;quot;Black&amp;quot; /&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;antebrazo_link&amp;quot; material=&amp;quot;Black&amp;quot; /&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;muneca_link&amp;quot; material=&amp;quot;Black&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;brazo_link_B&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;brazo_link_SI&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;brazo_link_SD&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;antebrazo_link_B&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;antebrazo_link_SI&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;antebrazo_link_SD&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;muneca_link_B&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;muneca_link_SI&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;muneca_link_SD&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;muneca_link_P&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;muneca_link_PS&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;     &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_link&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_link_B&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_link_SI&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt;   &lt;br /&gt;
   &lt;br /&gt;
&amp;lt;gazebo_propiedades_link nombre=&amp;quot;pinza_link_SD&amp;quot; material=&amp;quot;White&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora nos queda añadir las características de las uniones móviles, el ''plugin'' del controlador que vamos a emplear para el control de estas y el modelado del mecanismo de transmisión. A continuación se muestra el código que debemos añadir al final de los ficheros de nuestro [http://wiki.ros.org/urdf/Tutorials URDF] antes de la etiqueta &amp;quot;&amp;lt;/robot&amp;gt;&amp;quot;, en el archivo &amp;quot;brazo-macros.xacro&amp;quot;, y &amp;quot;&amp;lt;/macro&amp;gt;&amp;quot;, el el archivo &amp;quot;brazo.xacro&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
* En el archivo brazo-macros.xacro:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;macro name=&amp;quot;gazebo_propiedades_joint&amp;quot; params=&amp;quot;nombre&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;gazebo reference=&amp;quot;${nombre}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;erp&amp;gt;0.1&amp;lt;/erp&amp;gt;&lt;br /&gt;
    &amp;lt;stopKd value=&amp;quot;1000000.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;stopKp value=&amp;quot;10000000.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;fudgeFactor value=&amp;quot;0.5&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&amp;lt;/macro&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo&amp;gt;   &lt;br /&gt;
     &amp;lt;controller:gazebo_ros_controller_manager name=&amp;quot;gazebo_ros_controller_manager&amp;quot; plugin=&amp;quot;libgazebo_ros_controller_manager.so&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;alwaysOn&amp;gt;true&amp;lt;/alwaysOn&amp;gt;&lt;br /&gt;
          &amp;lt;updateRate&amp;gt;1000.0&amp;lt;/updateRate&amp;gt;&lt;br /&gt;
          &amp;lt;robotNamespace&amp;gt;brazo&amp;lt;/robotNamespace&amp;gt;&lt;br /&gt;
     &amp;lt;/controller:gazebo_ros_controller_manager&amp;gt;&lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;transmission type=&amp;quot;pr2_mechanism_model/SimpleTransmission&amp;quot; name=&amp;quot;base_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;base_motor&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;base&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mechanicalReduction&amp;gt;1.0&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;motorTorqueConstant&amp;gt;1.0&amp;lt;/motorTorqueConstant&amp;gt;&lt;br /&gt;
 &amp;lt;/transmission&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;transmission type=&amp;quot;pr2_mechanism_model/SimpleTransmission&amp;quot; name=&amp;quot;arti1_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;arti1_motor&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;arti1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mechanicalReduction&amp;gt;1.0&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;motorTorqueConstant&amp;gt;1.0&amp;lt;/motorTorqueConstant&amp;gt;&lt;br /&gt;
 &amp;lt;/transmission&amp;gt;              &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;transmission type=&amp;quot;pr2_mechanism_model/SimpleTransmission&amp;quot; name=&amp;quot;arti2_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;arti2_motor&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;arti2&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mechanicalReduction&amp;gt;1.0&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;motorTorqueConstant&amp;gt;1.0&amp;lt;/motorTorqueConstant&amp;gt;&lt;br /&gt;
 &amp;lt;/transmission&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;transmission type=&amp;quot;pr2_mechanism_model/SimpleTransmission&amp;quot; name=&amp;quot;arti3_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;arti3_motor&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;arti3&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mechanicalReduction&amp;gt;1.0&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;motorTorqueConstant&amp;gt;1.0&amp;lt;/motorTorqueConstant&amp;gt;&lt;br /&gt;
 &amp;lt;/transmission&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;transmission type=&amp;quot;pr2_mechanism_model/SimpleTransmission&amp;quot; name=&amp;quot;pinza_trans&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;actuator name=&amp;quot;pinza_motor&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;pinza&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mechanicalReduction&amp;gt;1.0&amp;lt;/mechanicalReduction&amp;gt;&lt;br /&gt;
    &amp;lt;motorTorqueConstant&amp;gt;1.0&amp;lt;/motorTorqueConstant&amp;gt;&lt;br /&gt;
 &amp;lt;/transmission&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En el archivo brazo.xacro:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;base&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;arti1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;arti2&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;arti3&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;gazebo_propiedades_joint nombre=&amp;quot;pinza&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Creación del fichero de configuración===&lt;br /&gt;
&lt;br /&gt;
Los [http://wiki.ros.org/robot_mechanism_controllers?distro=electric controladores] que vamos a emplear para cada unión móvil son uno de posición y otro de velocidad. Cada controlador esta modelado por un regulador [http://es.wikipedia.org/wiki/Proporcional_integral_derivativo PID]. Debemos crear un archivo dentro de nuestro ''package'' llamado &amp;quot;controllers.yaml&amp;quot;, con la configuración de los controladores de cada unión móvil, cuyo contenido será el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
base_pos_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointPositionController&lt;br /&gt;
  joint: base&lt;br /&gt;
  pid: &amp;amp;base_pos&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    d: 0.0&lt;br /&gt;
    i_clamp: 10.0&lt;br /&gt;
&lt;br /&gt;
arti1_pos_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointPositionController&lt;br /&gt;
  joint: arti1&lt;br /&gt;
  pid: &amp;amp;arti1_pos&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    d: 0.0&lt;br /&gt;
    i_clamp: 10.0&lt;br /&gt;
&lt;br /&gt;
arti2_pos_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointPositionController&lt;br /&gt;
  joint: arti2&lt;br /&gt;
  pid: &amp;amp;arti2_pos&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    d: 0.0&lt;br /&gt;
    i_clamp: 10.0&lt;br /&gt;
&lt;br /&gt;
arti3_pos_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointPositionController&lt;br /&gt;
  joint: arti3&lt;br /&gt;
  pid: &amp;amp;arti3_pos&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    d: 0.0&lt;br /&gt;
    i_clamp: 10.0&lt;br /&gt;
&lt;br /&gt;
pinza_pos_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointPositionController&lt;br /&gt;
  joint: pinza&lt;br /&gt;
  pid: &amp;amp;pinza_pos&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    d: 0.0&lt;br /&gt;
    i_clamp: 10.0&lt;br /&gt;
&lt;br /&gt;
base_vel_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointVelocityController&lt;br /&gt;
  joint: base&lt;br /&gt;
  pid: &amp;amp;base_vel&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    i_clamp: 10.0&lt;br /&gt;
    &lt;br /&gt;
arti1_vel_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointVelocityController&lt;br /&gt;
  joint: arti1&lt;br /&gt;
  pid: &amp;amp;arti1_vel&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    i_clamp: 10.0         &lt;br /&gt;
&lt;br /&gt;
arti2_vel_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointVelocityController&lt;br /&gt;
  joint: arti2&lt;br /&gt;
  pid: &amp;amp;arti2_vel&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    i_clamp: 10.0 &lt;br /&gt;
    &lt;br /&gt;
arti3_vel_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointVelocityController&lt;br /&gt;
  joint: arti3&lt;br /&gt;
  pid: &amp;amp;arti3_vel&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    i_clamp: 10.0   &lt;br /&gt;
    &lt;br /&gt;
pinza_vel_controller:&lt;br /&gt;
  type: robot_mechanism_controllers/JointVelocityController&lt;br /&gt;
  joint: pinza&lt;br /&gt;
  pid: &amp;amp;pinza_vel&lt;br /&gt;
    p: 2.0&lt;br /&gt;
    i: 0.5&lt;br /&gt;
    i_clamp: 10.0 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Carga del modelo en gazebo==&lt;br /&gt;
&lt;br /&gt;
Para poder mostrar el modelo en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] vamos a crear un launcher que cargue el modelo un mundo vacío y los controladores de las uniones móviles. Crearemos el archivo &amp;quot;brazo_gazebo.launch&amp;quot; en el directorio &amp;quot;launch&amp;quot; de nuestro ''package'', con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;/use_sim_time&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;gazebo&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;gazebo&amp;quot; args=&amp;quot;-u $(find turtlebot_gazebo)/worlds/empty.world&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;node name=&amp;quot;gazebo_gui&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;gui&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;group ns=&amp;quot;brazo&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;param name=&amp;quot;robot_description&amp;quot; command=&amp;quot;$(find xacro)/xacro.py '$(find myrabot_arm_model)/urdf/brazo.urdf.xacro'&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_brazo&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-urdf -param robot_description -model brazo&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;rosparam file=&amp;quot;$(find myrabot_arm_model)/controller.yaml&amp;quot; command=&amp;quot;load&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;spawn_controller_brazo&amp;quot; pkg=&amp;quot;pr2_controller_manager&amp;quot; type=&amp;quot;spawner&amp;quot; args=&amp;quot;base_pos_controller arti1_pos_controller arti2_pos_controller arti3_pos_controller pinza_pos_controller base_vel_controller arti1_vel_controller arti2_vel_controller arti3_vel_controller pinza_vel_controller&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/group&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para lanzar el ''launcher'' ejecutaremos el siguiente comando en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer_modelo brazo.gazebo.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si todo va bien podremos ver en la ventana gráfica de [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] el modelo del brazo en posición vertical situado en el punto xyz = (0 0 0) de un mundo vacío, tal como se muestra en la siguiente imagen: &lt;br /&gt;
&lt;br /&gt;
[[file:modelo_brazo_MYRAbot_gazebo.png|thumb|500px|center|Modelo brazo MYRAbot en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]]]&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar que se han cargado correctamente todos los controladores de las uniones móviles, ya que tienen que aparecer dos ''topics'' por cada controlador, para lo que ejecutaremos en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic echo&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Debería aparecernos algo similar a lo que se muestra a continuación, donde el ''topic'' brazo/NOMBRE_CONTROLADOR/command es al que está suscrito el controlador para recibir el valor de consigna y el ''topic'' brazo/NOMBRE_CONTROLADOR/state es en el que publica el estado del controlador:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
/brazo/arti1_pos_controller/command&lt;br /&gt;
/brazo/arti1_pos_controller/state&lt;br /&gt;
/brazo/arti1_vel_controller/command&lt;br /&gt;
/brazo/arti1_vel_controller/state&lt;br /&gt;
/brazo/arti2_pos_controller/command&lt;br /&gt;
/brazo/arti2_pos_controller/state&lt;br /&gt;
/brazo/arti2_vel_controller/command&lt;br /&gt;
/brazo/arti2_vel_controller/state&lt;br /&gt;
/brazo/arti3_pos_controller/command&lt;br /&gt;
/brazo/arti3_pos_controller/state&lt;br /&gt;
/brazo/arti3_vel_controller/command&lt;br /&gt;
/brazo/arti3_vel_controller/state&lt;br /&gt;
/brazo/base_pos_controller/command&lt;br /&gt;
/brazo/base_pos_controller/state&lt;br /&gt;
/brazo/base_vel_controller/command&lt;br /&gt;
/brazo/base_vel_controller/state&lt;br /&gt;
/brazo/joint_states&lt;br /&gt;
/brazo/mechanism_statistics&lt;br /&gt;
/brazo/pinza_pos_controller/command&lt;br /&gt;
/brazo/pinza_pos_controller/state&lt;br /&gt;
/brazo/pinza_vel_controller/command&lt;br /&gt;
/brazo/pinza_vel_controller/state&lt;br /&gt;
/clock&lt;br /&gt;
/gazebo/link_states&lt;br /&gt;
/gazebo/model_states&lt;br /&gt;
/gazebo/parameter_descriptions&lt;br /&gt;
/gazebo/parameter_updates&lt;br /&gt;
/gazebo/set_link_state&lt;br /&gt;
/gazebo/set_model_state&lt;br /&gt;
/rosout&lt;br /&gt;
/rosout_agg&lt;br /&gt;
/tf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programa interfaz (gazebo-programas de control)==&lt;br /&gt;
&lt;br /&gt;
Al igual que en el [[Control brazo MYRAbot (bioloid+arduino)|brazo real]], que empleabamos una placa [http://www.arduino.cc/ arduino] que contenía el programa de interfaz entre el brazo y [[Control brazo MYRAbot (bioloid+arduino)#Programas de control|nuestros programas de control]], hemos creado un programa que se suscriba a los ''topic'' que publican los programas de control y publique en consecuencia en los ''topics'' a los que están suscritos los controladores de las uniones móviles. Crearemos un archivo con el nombre &amp;quot;control_modelo.cpp&amp;quot; en el directorio &amp;quot;src&amp;quot; de nuestro ''package'' con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;std_msgs/Float64.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;sensor_msgs/JointState.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  #define PI 3.14159265&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
  void mover(const brazo_fer::WriteServos&amp;amp; move)&lt;br /&gt;
  {	&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
   	ros::Publisher base_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/base_pos_controller/command&amp;quot;, 1);   &lt;br /&gt;
  	ros::Publisher arti1_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti1_pos_controller/command&amp;quot;, 1); &lt;br /&gt;
   	ros::Publisher arti2_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti2_pos_controller/command&amp;quot;, 1);  	   &lt;br /&gt;
   	ros::Publisher arti3_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti3_pos_controller/command&amp;quot;, 1);&lt;br /&gt;
   	&lt;br /&gt;
   	ros::Publisher base_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/base_vel_controller/command&amp;quot;, 1);   &lt;br /&gt;
  	ros::Publisher arti1_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti1_vel_controller/command&amp;quot;, 1); &lt;br /&gt;
   	ros::Publisher arti2_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti2_vel_controller/command&amp;quot;, 1);  	   &lt;br /&gt;
   	ros::Publisher arti3_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti3_vel_controller/command&amp;quot;, 1);   	&lt;br /&gt;
   	 &lt;br /&gt;
	brazo_fer::Servos position = move.posicion;&lt;br /&gt;
	brazo_fer::Servos speed = move.velocidad;&lt;br /&gt;
	brazo_fer::Servos torque = move.par;&lt;br /&gt;
	&lt;br /&gt;
	std_msgs::Float64 base_pos_command, arti1_pos_command, arti2_pos_command, arti3_pos_command;&lt;br /&gt;
	std_msgs::Float64 base_vel_command, arti1_vel_command, arti2_vel_command, arti3_vel_command;	&lt;br /&gt;
	&lt;br /&gt;
	if (torque.base != 0 &amp;amp;&amp;amp; (position.base &amp;gt;= 0 &amp;amp;&amp;amp; position.base &amp;lt;= 1023) &amp;amp;&amp;amp; (speed.base &amp;gt;= 0 &amp;amp;&amp;amp; speed.base &amp;lt;= 1023))&lt;br /&gt;
	{		&lt;br /&gt;
		base_pos_command.data = ((((position.base * 300)/1023)*PI)/180)-2.62;&lt;br /&gt;
		base_vel_command.data = speed.base/511;&lt;br /&gt;
	}&lt;br /&gt;
	if (torque.arti1 != 0 &amp;amp;&amp;amp; (position.arti1 &amp;gt;= 0 &amp;amp;&amp;amp; position.arti1 &amp;lt;= 1023) &amp;amp;&amp;amp; (speed.arti1 &amp;gt;= 0 &amp;amp;&amp;amp; speed.arti1 &amp;lt;= 1023))&lt;br /&gt;
	{&lt;br /&gt;
		arti1_pos_command.data = ((((position.arti1*300)/1023)*PI)/180)-2.62;&lt;br /&gt;
		arti1_vel_command.data = speed.arti1/511;		&lt;br /&gt;
	}&lt;br /&gt;
	if (torque.arti2 != 0 &amp;amp;&amp;amp; (position.arti2 &amp;gt;= 0 &amp;amp;&amp;amp; position.arti2 &amp;lt;= 1023) &amp;amp;&amp;amp; (speed.arti2 &amp;gt;= 0 &amp;amp;&amp;amp; speed.arti2 &amp;lt;= 1023))&lt;br /&gt;
	{&lt;br /&gt;
		arti2_pos_command.data = ((((position.arti2*300)/1023)*PI)/180)-2.62;&lt;br /&gt;
		arti2_vel_command.data = speed.arti2/511;		&lt;br /&gt;
	}&lt;br /&gt;
	if (torque.arti3 != 0 &amp;amp;&amp;amp; (position.arti3 &amp;gt;= 0 &amp;amp;&amp;amp; position.arti3 &amp;lt;= 1023) &amp;amp;&amp;amp; (speed.arti3 &amp;gt;= 0 &amp;amp;&amp;amp; speed.arti3 &amp;lt;= 1023))&lt;br /&gt;
	{&lt;br /&gt;
		arti3_pos_command.data = ((((position.arti3*300)/1023)*PI)/180)-2.62;&lt;br /&gt;
		arti3_vel_command.data = speed.arti3/511;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	base_pos_pub_.publish(base_pos_command);&lt;br /&gt;
	arti1_pos_pub_.publish(arti1_pos_command);&lt;br /&gt;
	arti2_pos_pub_.publish(arti2_pos_command);&lt;br /&gt;
	arti3_pos_pub_.publish(arti3_pos_command);&lt;br /&gt;
&lt;br /&gt;
	base_vel_pub_.publish(base_vel_command);&lt;br /&gt;
	arti1_vel_pub_.publish(arti1_vel_command);&lt;br /&gt;
	arti2_vel_pub_.publish(arti2_vel_command);&lt;br /&gt;
	arti3_vel_pub_.publish(arti3_vel_command);					&lt;br /&gt;
 &lt;br /&gt;
  } &lt;br /&gt;
  void pinza(const brazo_fer::WriteServos&amp;amp; pinza)&lt;br /&gt;
  {	 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
   	ros::Publisher pinza_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/pinza_pos_controller/command&amp;quot;, 1);&lt;br /&gt;
 	   &lt;br /&gt;
   	ros::Publisher pinza_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/pinza_vel_controller/command&amp;quot;, 1);   	 	 &lt;br /&gt;
	  &lt;br /&gt;
	brazo_fer::Servos position = pinza.posicion;&lt;br /&gt;
	brazo_fer::Servos speed = pinza.velocidad;&lt;br /&gt;
	brazo_fer::Servos torque = pinza.par;&lt;br /&gt;
	&lt;br /&gt;
	std_msgs::Float64 pinza_pos_command;&lt;br /&gt;
	std_msgs::Float64 pinza_vel_command;	&lt;br /&gt;
	&lt;br /&gt;
 	if (torque.pinza != 0 &amp;amp;&amp;amp; (position.pinza &amp;gt;= 0 &amp;amp;&amp;amp; position.pinza &amp;lt;= 1023) &amp;amp;&amp;amp; (speed.pinza &amp;gt;= 0 &amp;amp;&amp;amp; speed.pinza &amp;lt;= 1023))&lt;br /&gt;
	{&lt;br /&gt;
		pinza_pos_command.data = ((((position.pinza*300)/1023)*PI)/180)-2.62;&lt;br /&gt;
		pinza_vel_command.data = speed.pinza/511;		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	pinza_pos_pub_.publish(pinza_pos_command);&lt;br /&gt;
	pinza_vel_pub_.publish(pinza_vel_command);	&lt;br /&gt;
		&lt;br /&gt;
  }&lt;br /&gt;
  void pe(const sensor_msgs::JointState&amp;amp; pe)&lt;br /&gt;
  {&lt;br /&gt;
	ros::NodeHandle n;	  &lt;br /&gt;
	  &lt;br /&gt;
	ros::Publisher pose_pub_=n.advertise&amp;lt;brazo_fer::ReadServos&amp;gt;(&amp;quot;pose_arm&amp;quot;, 1);   &lt;br /&gt;
	  &lt;br /&gt;
	brazo_fer::ReadServos estado;&lt;br /&gt;
	  &lt;br /&gt;
	estado.posicion.base = ((((pe.position[0]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	estado.posicion.arti1 = ((((pe.position[1]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	estado.posicion.arti2 = ((((pe.position[2]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	estado.posicion.arti3 = ((((pe.position[3]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	estado.posicion.pinza = ((((pe.position[4]+2.62)*180)/PI)*1023)/300;&lt;br /&gt;
	&lt;br /&gt;
	estado.corriente.base = pe.effort[0]*1000;&lt;br /&gt;
	estado.corriente.arti1 = pe.effort[1]*1000;&lt;br /&gt;
	estado.corriente.arti2 = pe.effort[2]*1000;&lt;br /&gt;
	estado.corriente.arti3 = pe.effort[3]*1000;&lt;br /&gt;
	estado.corriente.pinza = pe.effort[4]*1000;&lt;br /&gt;
	&lt;br /&gt;
	pose_pub_.publish(estado);				&lt;br /&gt;
	&lt;br /&gt;
  }	  &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
	  &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;modelo_brazo&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber move_sub_= n.subscribe(&amp;quot;move_arm&amp;quot;, 1, mover);&lt;br /&gt;
  	ros::Subscriber hand_sub_= n.subscribe(&amp;quot;hand_arm&amp;quot;, 1, pinza);&lt;br /&gt;
  	ros::Subscriber pe_sub_= n.subscribe(&amp;quot;brazo/joint_states&amp;quot;, 1, pe);&lt;br /&gt;
  	  	   	 &lt;br /&gt;
 &lt;br /&gt;
   	ros::Publisher base_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/base_pos_controller/command&amp;quot;, 1);   &lt;br /&gt;
  	ros::Publisher arti1_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti1_pos_controller/command&amp;quot;, 1); &lt;br /&gt;
   	ros::Publisher arti2_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti2_pos_controller/command&amp;quot;, 1);  	   &lt;br /&gt;
   	ros::Publisher arti3_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti3_pos_controller/command&amp;quot;, 1);&lt;br /&gt;
   	ros::Publisher pinza_pos_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/pinza_pos_controller/command&amp;quot;, 1);&lt;br /&gt;
 	    	&lt;br /&gt;
   	ros::Publisher base_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/base_vel_controller/command&amp;quot;, 1);   &lt;br /&gt;
  	ros::Publisher arti1_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti1_vel_controller/command&amp;quot;, 1); &lt;br /&gt;
   	ros::Publisher arti2_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti2_vel_controller/command&amp;quot;, 1);  	   &lt;br /&gt;
   	ros::Publisher arti3_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/arti3_vel_controller/command&amp;quot;, 1);  &lt;br /&gt;
   	ros::Publisher pinza_vel_pub_=n.advertise&amp;lt;std_msgs::Float64&amp;gt;(&amp;quot;brazo/pinza_vel_controller/command&amp;quot;, 1); &lt;br /&gt;
   	&lt;br /&gt;
   	ros::Publisher pose_pub_=n.advertise&amp;lt;brazo_fer::ReadServos&amp;gt;(&amp;quot;pose_arm&amp;quot;, 1);   	   	  &lt;br /&gt;
	&lt;br /&gt;
	ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para compilarlo y generar el ejecutable se debe añadir la siguiente línea de código al archivo &amp;quot;CMakeLists.txt&amp;quot; del package creado, donde indicamos el nombre para el ejecutable y la ruta y nombre del archivo a compilar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosbuild_add_executable(control_modelo src/control_modelo.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilar el programa hay que situarse en el directorio del package. Simplemente con ejecutar la siguiente secuencia de comandos en un terminal se compilará y creará el ejecutable, siempre que no existan errores:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer_modelo&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Simulación de programas de control=&lt;br /&gt;
&lt;br /&gt;
Lo primero vamos a modificar el ''launcher'' &amp;quot;brazo_gazebo.launch&amp;quot;, creado previamente, para añadir el programa interfaz entre los programas de control y el modelo del brazo. Deberemos añadir la siguiente linea al final antes de la etiqueta &amp;quot;&amp;lt;/launch&amp;gt;&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;control_modelo&amp;quot; pkg=&amp;quot;brazo_fer_modelo&amp;quot; type=&amp;quot;control_modelo&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Primer programa de control (Ven aquí)==&lt;br /&gt;
&lt;br /&gt;
El  [[Control brazo MYRAbot (bioloid+arduino)#Tercer programa (Ven aquí)|programa de control]] es el mismo que se ha desarrollado para el brazo real. Para su simulación ejecutaremos primero el ''launcher'' que inicia el simulador, carga el modelo y los controladores, y el programa interfaz, ejecutando en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer_modelo brazo_gazebo.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vez se haya iniciado el [http://wiki.ros.org/simulator_gazebo?distro=electric simulador gazebo] podremos iniciar el programa de control ejecutando en otro terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun brazo_fer control_v01&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para poder publicar las coordenadas del punto al que queremos que se desplace el brazo, debemos publicar en el topic &amp;quot;point&amp;quot;, al que esta suscrito el programa de control para recibir el punto. Ejecutaremos en un nuevo terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub point geometry_msgs/Point '{x: 100, y: 0, z: 180}' --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El brazo comenzará a desplazarse y se detendrá al llegar al punto que le hemos indicado. En el siguiente vídeo se puede ver como el brazo se posiciona en el punto que le indicamos desde su posición inicial: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;S9kUKYysm0M&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=S9kUKYysm0M Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Segundo programa de control (Agarra la lata)==&lt;br /&gt;
&lt;br /&gt;
Lo primero debemos crear la lata que va a coger el brazo. Crearemos un archivo [http://wiki.ros.org/urdf/Tutorials URDF] llamado &amp;quot;lata.urdf&amp;quot;, que colocaremos en nuestro ''package'', con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;robot name=&amp;quot;lata&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;world&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;joint name=&amp;quot;fixed&amp;quot; type=&amp;quot;floating&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parent link=&amp;quot;world&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;child link=&amp;quot;lata_link&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;origin xyz=&amp;quot;0 0 0&amp;quot; rpy=&amp;quot;0 0 0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link name=&amp;quot;lata_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;visual&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.03&amp;quot; length=&amp;quot;0.125&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.0625&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;material name=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;color rgba=&amp;quot;1 0 0 1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;/visual&amp;gt;&lt;br /&gt;
  &amp;lt;collision&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.0625&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;geometry&amp;gt;&lt;br /&gt;
      &amp;lt;cylinder radius=&amp;quot;0.03&amp;quot; length=&amp;quot;0.125&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/geometry&amp;gt;&lt;br /&gt;
  &amp;lt;/collision&amp;gt;&lt;br /&gt;
  &amp;lt;inertial&amp;gt;&lt;br /&gt;
    &amp;lt;origin rpy=&amp;quot;0 0 0&amp;quot; xyz=&amp;quot;0 0 0.0625&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mass value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;inertia ixx=&amp;quot;0.001&amp;quot; ixy=&amp;quot;0.0&amp;quot; ixz=&amp;quot;0.0&amp;quot; iyy=&amp;quot;0.001&amp;quot; iyz=&amp;quot;0.0&amp;quot; izz=&amp;quot;0.001&amp;quot;/&amp;gt;  &lt;br /&gt;
  &amp;lt;/inertial&amp;gt;&lt;br /&gt;
&amp;lt;/link&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gazebo reference=&amp;quot;lata_link&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;material&amp;gt;Gazebo/Red&amp;lt;/material&amp;gt;&lt;br /&gt;
  &amp;lt;mu1&amp;gt;0.9&amp;lt;/mu1&amp;gt;&lt;br /&gt;
  &amp;lt;mu2&amp;gt;0.9&amp;lt;/mu2&amp;gt;&lt;br /&gt;
  &amp;lt;selfCollide&amp;gt;true&amp;lt;/selfCollide&amp;gt;&lt;br /&gt;
  &amp;lt;turnGravityOff&amp;gt;false&amp;lt;/turnGravityOff&amp;gt;  &lt;br /&gt;
&amp;lt;/gazebo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También deberemos añadir la siguiente línea al archvo &amp;quot;brazo_gazebo.launch&amp;quot;, que carga la lata en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo] en la posición xyz = (-0.15 0.21 0):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&amp;lt;node name=&amp;quot;spawn_lata&amp;quot; pkg=&amp;quot;gazebo&amp;quot; type=&amp;quot;spawn_model&amp;quot; args=&amp;quot;-file $(find brazo_fer_modelo)/lata.urdf -urdf -x -0.15 -y 0.21 -model lata&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El  [[Control brazo MYRAbot (bioloid+arduino)#Cuarto programa (Agarra la botella)|programa de control]] es el mismo que se ha desarrollado para el brazo real. Para su simulación ejecutaremos primero el ''launcher'' que inicia el simulador, carga el modelo y los controladores,la lata y el programa interfaz, ejecutando en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer_modelo brazo_gazebo.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vez se haya iniciado el [http://wiki.ros.org/simulator_gazebo?distro=electric simulador gazebo] podremos iniciar el programa de control ejecutando en otro terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun brazo_fer control_v02&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para poder publicar las coordenadas del punto donde se encuentra la lata, debemos publicar en el topic &amp;quot;point&amp;quot;, al que esta suscrito el programa de control para recibir el punto. Ejecutaremos en un nuevo terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub point geometry_msgs/Point '{x: 145, y: 0, z: 180}' --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''nota''': El sismtema de coordenadas del simulador no coincide con el tomado para el brazo, por lo que el punto no es el mismo cuando indicamos la posición del objeto en el mundo y cuando indicamos la posición del objeto al brazo, además hemos indicado un punto alejado del centro del objeto para evitar la colisión. &lt;br /&gt;
&lt;br /&gt;
El brazo se situará en la posición de partida y al indicarle el punto donde se encuentra el objeto se desclazará hasta sus proximidades y se situará para para agarrarlo, cuando lo tenga sujeto se lo llevará cerca de él. En el siguiente vídeo se puede ver como el brazo recoge la lata partiendo desde su posición inicial: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;16aR8XXHnmw&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=16aR8XXHnmw Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;!--http://youtu.be/16aR8XXHnmw--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Detecci%c3%b3n_y_c%c3%a1lculo_de_posici%c3%b3n_de_objetos_(c%c3%a1mara_web)&amp;diff=4208</id>
		<title>Detección y cálculo de posición de objetos (cámara web)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Detecci%c3%b3n_y_c%c3%a1lculo_de_posici%c3%b3n_de_objetos_(c%c3%a1mara_web)&amp;diff=4208"/>
				<updated>2014-09-29T11:02:32Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Detección de objetos=&lt;br /&gt;
&lt;br /&gt;
Para esta tarea se ha empleado el ''package'' [http://code.google.com/p/find-object/ find_object_2d] desarrollado por [https://introlab.3it.usherbrooke.ca/mediawiki-introlab/index.php/Mathieu_Labb%C3%A9 Mathieu Labbé] (Université de Sherbrooke ). Se trata de una aplicación con entorno gráfico que permite detectar objetos presentes en la escena, de los cuales ha sido previamente guardada una imagen.&lt;br /&gt;
&lt;br /&gt;
[[file:find_object_2d.png|thumb|500px|center|Captura [http://code.google.com/p/find-object/ find_object_2d]]]&lt;br /&gt;
&lt;br /&gt;
En la captura del entorno gráfico podemos observar como aparece enmarcado el objeto encontrado en la escena. Este marco se sitúa en las esquinas del objeto a partir de la imagen guardada. El entorno dispone de un menú para añadir objetos a partir de objetos presentes en la escena, tomando una imagen y seleccionando el área donde se encuentra el objeto. Estos objetos añadidos desde las escena podemos guardarlos para volver a usarlos.&lt;br /&gt;
&lt;br /&gt;
La aplicación proporciona diversos datos de cada objeto encontrado en la escena, pero vamos a utilizar los siguientes: &lt;br /&gt;
&lt;br /&gt;
* Ancho de la imagen del objeto (número de píxeles).&lt;br /&gt;
* Alto de la imagen del objeto (número de píxeles).&lt;br /&gt;
* Posición de las esquinas de la imagen del objeto en la escena.&lt;br /&gt;
&lt;br /&gt;
==Utilización de una nueva versión de OpenCV en ROS Electric==&lt;br /&gt;
&lt;br /&gt;
Para poder compilar el anterior ''package'' necesitamos utilizar la versión 2.4.3, o posterior, de la librería [http://opencv.org/ OpenCV], pero en la versión &amp;quot;[http://wiki.ros.org/electric/Installation electric]&amp;quot; de [http://wiki.ros.org/ ROS] la versión que viene integrada de esta librería es la 2.3.1. Por esto vamos a instalar la versión 2.4.3 de [http://opencv.org/ OpenCV], configurar el ''package'' [http://wiki.ros.org/cv_bridge?distro=electric cv_bridge] y modificar el ''package'' [http://code.google.com/p/find-object/ find_object_2d] para que utilice esta nueva versión de la librería.&lt;br /&gt;
&lt;br /&gt;
===Instalación de OpenCV===&lt;br /&gt;
&lt;br /&gt;
Lo primero vamos a [http://opencv.org/downloads.html Descargar] la versión 2.4.3 de [http://opencv.org/ OpenCV] de la página oficial. Descomprimiremos el archivo descargado y situaremos el contenido en el emplazemiento que más nos guste. Los primero que vamos a realizar  es una actualización de los paquetes de [http://www.ubuntu.com/ ubuntu], para lo que ejecutaremos en un terminal los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get upgrade&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Realizada la actualización vamos a continuar compilando [http://opencv.org/ OpenCV]. Para esto, desde un terminal, vamos a situarnos dentro del directorio &amp;quot;OpenCV-2.4.3&amp;quot;, carpeta por defecto al descomprimir el archivo con [http://opencv.org/ OpenCV]. Una vez situados en el directorio que contiene [http://opencv.org/ OpenCV] vamos a ejecutar los siguientes comandos en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
cmake -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_OPENGL=ON ..&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Solo queda configurar [http://opencv.org/ OpenCV]. Ejecutaremos en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo gedit /etc/ld.so.conf.d/opencv.conf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Añadimos la siguiente línea de código al archivo que hemos abierto y guardamos los cambios:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;/usr/local/lib&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora ejecutamos en un terminal los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
sudo gedit /etc/bash.bashrc &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el archivo que hemos abierto añadimos las siguientes líneas al final y guardamos los cambios:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig&lt;br /&gt;
export PKG_CONFIG_PATH&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para finalizar la instalación vamos a reiniciar el equipo.&lt;br /&gt;
&lt;br /&gt;
===Modificación de cv_bridge===&lt;br /&gt;
&lt;br /&gt;
Debemos modificar el archivo &amp;quot;manifest.xml&amp;quot; del ''package'' [http://wiki.ros.org/cv_bridge?distro=electric cv_bridge] para que no utilice anterior versión de [http://opencv.org/ OpenCV]. Ejecutaremos en un terminal la siguiente secuencia de comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
roscd cv_bridge&lt;br /&gt;
sudo gedit manifest.xml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eliminaremos o comentaremos, para poder reutilizarlas, las siguientes líneas del archivo que hemos abierto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;depend package=&amp;quot;opencv2&amp;quot; /&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;rosdep name=&amp;quot;opencv2.3&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modificación del ''package''===&lt;br /&gt;
&lt;br /&gt;
Debemos indicar al ''package'' que libreria [http://opencv.org/ OpenCV] debe emplear para compilar. Lo primero debemos asegurarnos que no existe ningún tipo de dependencia en el archivo &amp;quot;manifest.xml&amp;quot; del ''package'' a los ''packages'' del ''stack'' [http://wiki.ros.org/vision_opencv vision_opencv], excepto [http://wiki.ros.org/cv_bridge?distro=electric cv_bridge] que anteriormente ha sido modificado para poder emplearlo. En un terminal ejecutaremos la siguiente secuencia de comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
roscd find_object_2d&lt;br /&gt;
sudo gedit CMakeLists.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el archivo que hemos abierto vamos a modificar la siguiente línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;find_package(OpenCV REQUIRED)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y nos quedará asi:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;find_package(OpenCV 2.4 REQUIRED)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este caso el package ya tenia incluidas las llamadas a librerias [http://opencv.org/ OpenCV] externas a [http://wiki.ros.org/ ROS], si no hubiera sido este el caso tendríamos que añadir las siguientes líneas al archivo &amp;quot;CMakeLists.txt&amp;quot;:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
find_package(OpenCV &amp;quot;NÚMERO_VERSIÓN&amp;quot; REQUIRED)&lt;br /&gt;
include_directories(${OpenCV_INCLUDE_DIRS})&lt;br /&gt;
...&lt;br /&gt;
target_link_libraries(&amp;quot;NOMBRE_PROGRAMA_A_COMPILAR&amp;quot; ${OpenCV_LIBS})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Cálculo de posición de objetos=&lt;br /&gt;
&lt;br /&gt;
A partir de los datos obtenidos del ''package'' [http://code.google.com/p/find-object/ find_object_2d] se realizan una serie de cálculos para determinar la posición del objeto respecto al [[Control brazo MYRAbot (bioloid+arduino) | brazo del MYRAbot]]. Para esto necesitaremos conocer y establecer una serie de parámetros físicos:&lt;br /&gt;
&lt;br /&gt;
* Posición de la cámara web respecto al brazo (h, d).&lt;br /&gt;
* Ángulo de inclinación de la cámara web respecto a la horizontal (&amp;amp;alpha;).&lt;br /&gt;
* Distancia perpendicular al objetivo de la cámara a la que vamos a situar los objetos para obtener la imagen de muestra (''dZ0'').&lt;br /&gt;
&lt;br /&gt;
[[file:webcam_MYRAbot_esquema.jpg|thumb|500px|center|Esquema cálculo posición objetos]]&lt;br /&gt;
&lt;br /&gt;
Para el cálculo de la distancia a los objetos se ha tomado el área de estos como base de cálculo, ya que su variación entre las imágenes tomadas es proporcional y lineal respecto a la distancia al objetivo de la cámara. Las ecuaciones obtenidas a partir del esquema son las siguientes, los parámetros se han obtenido realizando mediciones para diferentes posiciones conocidas de un objeto:&lt;br /&gt;
&lt;br /&gt;
[[file:webcam_ecuaciones.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Programa de publicación de posición de objetos==&lt;br /&gt;
&lt;br /&gt;
Lo primero [[Control brazo MYRAbot (bioloid+arduino)#Creación de mensajes personalizados en ROS|crearemos unos mensajes personalizados]] dentro del ''package'' &amp;quot;[http://code.google.com/p/find-object/ find_object_2d]&amp;quot; para la publicación de las posiciones de los objetos en la escena. Como en la escena puede haber más de un objeto reconocido debemos guardar los datos en un array, de dimensión el número de objetos encontrados. Comenzaremos creando un mensaje base llamado &amp;quot;Point_id.msg&amp;quot; con el siguiente contenido, el identificador del objeto y el punto donde se encuentra:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;int16 id&lt;br /&gt;
geometry_msgs/Point punto&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora necesitamos crear un mensaje que contenga un array de los mensajes anteriores. Este mensaje lo llamaremos &amp;quot;PointObjects.msg&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;Point_id[] objeto&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El programa crea el ''nodo'' &amp;quot;objects_detected&amp;quot; que está suscrito al ''topic'' &amp;quot;objects&amp;quot;, publicado por el programa &amp;quot;find_object_2d_node&amp;quot;, y publica el ''topic'' &amp;quot;point&amp;quot;, con el identificador y posición de los objetos encontrados en la escena. Crearemos en este mismo ''package'' un archivo llamado &amp;quot;objects_detected.cpp&amp;quot; en el directorio &amp;quot;src&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;ros/ros.h&amp;gt;&lt;br /&gt;
#include &amp;lt;std_msgs/Float32MultiArray.h&amp;gt;&lt;br /&gt;
#include &amp;lt;opencv2/opencv.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;QTransform&amp;gt;&lt;br /&gt;
#include &amp;lt;geometry_msgs/Point.h&amp;gt;&lt;br /&gt;
#include &amp;lt;std_msgs/Int16.h&amp;gt;&lt;br /&gt;
#include &amp;lt;find_object_2d/PointObjects.h&amp;gt;&lt;br /&gt;
#include &amp;lt;find_object_2d/Point_id.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define dZ0 450&lt;br /&gt;
#define alfa 40&lt;br /&gt;
#define h 310&lt;br /&gt;
#define d 50&lt;br /&gt;
#define PI 3.14159265&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void objectsDetectedCallback(const std_msgs::Float32MultiArray&amp;amp; msg)&lt;br /&gt;
{&lt;br /&gt;
    ros::NodeHandle nh;&lt;br /&gt;
    ros::Publisher position_pub_=nh.advertise&amp;lt;find_object_2d::PointObjects&amp;gt;(&amp;quot;point&amp;quot;, 1);&lt;br /&gt;
   &lt;br /&gt;
    find_object_2d::PointObjects p_objects;&lt;br /&gt;
    find_object_2d::Point_id objeto;&lt;br /&gt;
           &lt;br /&gt;
    p_objects.objeto = std::vector&amp;lt;find_object_2d::Point_id&amp;gt;(msg.data.size()/12);&lt;br /&gt;
           &lt;br /&gt;
    for(unsigned int i=0; i&amp;lt;msg.data.size(); i+=12)&lt;br /&gt;
    {&lt;br /&gt;
        // get data&lt;br /&gt;
        int id = (int)msg.data[i];&lt;br /&gt;
        float objectWidth = msg.data[i+1];&lt;br /&gt;
        float objectHeight = msg.data[i+2];&lt;br /&gt;
&lt;br /&gt;
        // Find corners Qt&lt;br /&gt;
        QTransform qtHomography(msg.data[i+3], msg.data[i+4], msg.data[i+5],&lt;br /&gt;
                                msg.data[i+6], msg.data[i+7], msg.data[i+8],&lt;br /&gt;
                                msg.data[i+9], msg.data[i+10], msg.data[i+11]);&lt;br /&gt;
&lt;br /&gt;
        QPointF qtTopLeft = qtHomography.map(QPointF(0,0));&lt;br /&gt;
        QPointF qtTopRight = qtHomography.map(QPointF(objectWidth,0));&lt;br /&gt;
        QPointF qtBottomLeft = qtHomography.map(QPointF(0,objectHeight));&lt;br /&gt;
        QPointF qtBottomRight = qtHomography.map(QPointF(objectWidth,objectHeight));&lt;br /&gt;
       &lt;br /&gt;
        geometry_msgs::Point punto;&lt;br /&gt;
       &lt;br /&gt;
	float widthTop = sqrt(pow(qtTopRight.x() - qtTopLeft.x(),2) + pow(qtTopRight.y() - qtTopLeft.y(),2));&lt;br /&gt;
	float widthBottom = sqrt(pow(qtBottomRight.x() - qtBottomLeft.x(),2) + pow(qtBottomRight.y() - qtBottomLeft.y(),2));&lt;br /&gt;
	float heightLeft = sqrt(pow(qtBottomLeft.x() - qtTopLeft.x(),2) + pow(qtBottomLeft.y() - qtTopLeft.y(),2));&lt;br /&gt;
	float heightRight = sqrt(pow(qtBottomRight.x() - qtTopRight.x(),2) + pow(qtBottomRight.y() - qtTopRight.y(),2));&lt;br /&gt;
		&lt;br /&gt;
        float dArea_0 = (objectHeight*objectWidth) - (((widthTop + widthBottom)/2) * ((heightLeft + heightRight)/2));&lt;br /&gt;
&lt;br /&gt;
        float dZ_0 = dZ0 + (dArea_0/10);&lt;br /&gt;
        &lt;br /&gt;
        float dY_0 = (((480/2) - (((qtTopLeft.y() + qtTopRight.y())/2) + ((heightLeft + heightRight)/4)))*dZ_0)/585;                &lt;br /&gt;
        &lt;br /&gt;
        float beta_0 = atan2(dY_0,dZ_0);        &lt;br /&gt;
        &lt;br /&gt;
        objectHeight = objectHeight/cos((alfa*PI)/180);&lt;br /&gt;
        &lt;br /&gt;
        float height = ((heightLeft + heightRight)/2)/cos(((alfa*PI)/180)-beta_0);                    &lt;br /&gt;
        &lt;br /&gt;
        float dArea = (objectHeight*objectWidth) - (((widthTop + widthBottom)/2) * height);&lt;br /&gt;
&lt;br /&gt;
        float dZ = dZ0 + (dArea/38);&lt;br /&gt;
       &lt;br /&gt;
        float dX = (((640/2) - (((qtTopLeft.x() + qtBottomLeft.x())/2) + ((widthTop + widthBottom)/4)))*dZ)/585;&lt;br /&gt;
       &lt;br /&gt;
        float dY = (((480/2) - (((qtTopLeft.y() + qtTopRight.y())/2) + ((heightLeft + heightRight)/4)))*dZ)/585;&lt;br /&gt;
       &lt;br /&gt;
        float beta = atan2(dY,dZ);&lt;br /&gt;
       &lt;br /&gt;
        punto.x = dX;&lt;br /&gt;
        punto.y = h-((dZ/cos(beta))*sin(((alfa*PI)/180)-beta));&lt;br /&gt;
        punto.z = ((dZ/cos(beta))*cos(((alfa*PI)/180)-beta))-d;&lt;br /&gt;
        &lt;br /&gt;
        //Validate detection&lt;br /&gt;
        int paralelepipedo;&lt;br /&gt;
        &lt;br /&gt;
        if (abs(widthTop - widthBottom) &amp;lt; 20 &amp;amp;&amp;amp; abs(heightLeft - heightRight) &amp;lt; 15)&lt;br /&gt;
        {&lt;br /&gt;
			paralelepipedo = 1;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			paralelepipedo = 0;&lt;br /&gt;
		}&lt;br /&gt;
        &lt;br /&gt;
        if (paralelepipedo == 1)&lt;br /&gt;
        {       &lt;br /&gt;
			objeto.punto = punto;&lt;br /&gt;
			objeto.id = id;&lt;br /&gt;
       &lt;br /&gt;
			p_objects.objeto[i/12] = objeto;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    position_pub_.publish(p_objects);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv)&lt;br /&gt;
{&lt;br /&gt;
    ros::init(argc, argv, &amp;quot;objects_detected&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    ros::NodeHandle nh;&lt;br /&gt;
    ros::Subscriber subs = nh.subscribe(&amp;quot;objects&amp;quot;, 1, objectsDetectedCallback);&lt;br /&gt;
&lt;br /&gt;
    ros::Publisher position_pub_=nh.advertise&amp;lt;find_object_2d::PointObjects&amp;gt;(&amp;quot;point&amp;quot;, 1);  &lt;br /&gt;
&lt;br /&gt;
    ros::spin();&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compilando el programa===&lt;br /&gt;
&lt;br /&gt;
Para generar el ejecutable de nuestro programa tenemos que compilarlo, para ello tenemos que añadir las siguientes líneas de código al final del archivo &amp;quot;CMakeLists.txt&amp;quot; del ''package'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
rosbuild_add_executable(objects_detected src/objects_detected.cpp)&lt;br /&gt;
target_link_libraries(objects_detected ${LIBRARIES})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para iniciar la compilación ejecutaremos la siguiente secuencia de comandos en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
roscd find_object_2d&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ejecutando el programa===&lt;br /&gt;
&lt;br /&gt;
Para poder lanzar nuestra cámara web necesitamos instalar el ''package'' [http://wiki.ros.org/camera_umd?distro=electric camera_umd] y ejecutar el siguiente comando en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun uvc_camera camera_node&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''nota:''' Puede que en nuestro equipo se encuentren conectadas más de una cámara web,y la que queremos emplear no sea el dispositivo por defecto &amp;quot;/dev/video0&amp;quot;. Para poder cambiar el dispositivo que vamos a emplear debemos ejecutar el siguiente comando en un terminal, indicando el número de nuestro dispositivo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosparam set uvc_camera/device /dev/videoNÚMERO_DE_NUESTRO_DISPOSITIVO&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para lanzar la cámara web, ejecutar [http://code.google.com/p/find-object/ find_object_2d] y nuestro programa en un solo paso vamos a crear un ''launcher'' que guardaremos en el directorio &amp;quot;launch&amp;quot; dentro del ''package'' con el nombre &amp;quot;encontrar_objetos.launch&amp;quot;. El contenido del ''launch'' será el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;node name=&amp;quot;camera_node&amp;quot; pkg=&amp;quot;uvc_camera&amp;quot; type=&amp;quot;camera_node&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;param name=&amp;quot;/device&amp;quot; value=&amp;quot;/dev/videoNÚMERO_DE_NUESTRO_DISPOSITIVO&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;node name=&amp;quot;find_object_2d&amp;quot; pkg=&amp;quot;find_object_2d&amp;quot; type=&amp;quot;find_object_2d&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;remap from=&amp;quot;image&amp;quot; to=&amp;quot;image_raw&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;node name=&amp;quot;objects_detected&amp;quot; pkg=&amp;quot;find_object_2d&amp;quot; type=&amp;quot;objects_detected&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para iniciar el ''launcher'' simplemente ejecutaremos en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch find_object_2d encontrar_objetos.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Señalar objetos (Escoja)=&lt;br /&gt;
&lt;br /&gt;
Usando la detección y cálculo de posición de objetos se ha desarrollado un programa para controlar el brazo y señalar el objeto que le indiquemos. Este programa se suscribe a los ''topics'' &amp;quot;point&amp;quot;, que publica el programa anteriormente descrito, &amp;quot;selected_object&amp;quot;, donde publicamos el identificador del objeto a señalar, y &amp;quot;pose_arm&amp;quot;, donde se publican los datos del brazo. Publica en los ''topics'' &amp;quot;move_arm&amp;quot; y &amp;quot;hand_arm&amp;quot;, donde se indican los movimientos del brazo. Al iniciar el programa el brazo se situará en su posición inicial y una vez publiquemos el número del identificador del objeto, se desplazará hasta señalarlo y pasado un breve período de tiempo, regresará a la posición de partida. Si indicamos el número del identificador de un objeto que no se encuentra en la escena, nos dará un mensaje de objeto no presente (el valor 100 se ha reservado para devolver el brazo a su posición inicial. Crearemos un archivo llamado &amp;quot;escoja.cpp&amp;quot; en el directorio &amp;quot;src&amp;quot;, del ''package'' del [[Control brazo MYRAbot (bioloid+arduino)#Programas de control|brazo]], con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;find_object_2d/PointObjects.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;find_object_2d/Point_id.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;std_msgs/Int16.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  #define PI 3.14159265&lt;br /&gt;
  #define L1 104&lt;br /&gt;
  #define L2 104&lt;br /&gt;
  #define Lp 60&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos move, vel, pg, eg, cg;&lt;br /&gt;
  find_object_2d::PointObjects p_objects;&lt;br /&gt;
  &lt;br /&gt;
  int cont = 0;&lt;br /&gt;
  int cont_obj = 0;&lt;br /&gt;
  int nuevo_punto = 0;&lt;br /&gt;
  &lt;br /&gt;
  int id_0 = 0;&lt;br /&gt;
  int id_1 = 0;&lt;br /&gt;
  &lt;br /&gt;
  double x = 0;&lt;br /&gt;
  double y = 0;&lt;br /&gt;
  double z = 0;&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos inversa(geometry_msgs::Point destino)&lt;br /&gt;
  {&lt;br /&gt;
    &lt;br /&gt;
   	double z = destino.z; &lt;br /&gt;
        double x = destino.x;&lt;br /&gt;
	double y = destino.y;&lt;br /&gt;
	&lt;br /&gt;
	y = y + z*tan(atan2(45,250)); //Compensación para alcanzar la &amp;quot;y&amp;quot; intruducida, ya que la real es menor debido al peso del conjunto.&lt;br /&gt;
 &lt;br /&gt;
	int coordenadas_correctas = 1;&lt;br /&gt;
 &lt;br /&gt;
	double alfa, beta, beta_a, beta_p, gamma, delta, delta_a, delta_p;&lt;br /&gt;
	double z_p;&lt;br /&gt;
	double L_a, L;&lt;br /&gt;
 &lt;br /&gt;
	alfa = (atan2(x,z)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
	z_p = sqrt(pow(z,2)+pow(x,2));&lt;br /&gt;
 &lt;br /&gt;
	L = sqrt(pow(z_p,2)+pow(y,2));&lt;br /&gt;
 &lt;br /&gt;
	L_a = sqrt(pow(y,2)+pow(z_p-Lp,2));&lt;br /&gt;
 &lt;br /&gt;
	beta_p = atan2(y,z_p-Lp);&lt;br /&gt;
 &lt;br /&gt;
	beta_a = acos((pow(L1,2)+pow(L_a,2)-pow(L2,2))/(2*L1*L_a));&lt;br /&gt;
 &lt;br /&gt;
	beta = ((beta_p+beta_a)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
	gamma = acos((pow(L1,2)+pow(L2,2)-pow(L_a,2))/(2*L1*L2));&lt;br /&gt;
 &lt;br /&gt;
	delta_a = PI-(beta_a+gamma);&lt;br /&gt;
 &lt;br /&gt;
	gamma = (gamma*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
        delta_p = acos((pow(L_a,2)+pow(Lp,2)-pow(L,2))/(2*L_a*Lp));&lt;br /&gt;
 &lt;br /&gt;
	if (y&amp;lt;0) {&lt;br /&gt;
		delta = ((2*PI-(delta_p-delta_a))*180)/PI;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		delta = ((delta_p+delta_a)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
		if (isnan(delta)) {&lt;br /&gt;
			delta = ((PI+delta_a)*180)/PI;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	if (isnan(gamma)) // si no hay solución&lt;br /&gt;
	{&lt;br /&gt;
		coordenadas_correctas = 0; &lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	::move.base = ((alfa+150)*1023)/300;&lt;br /&gt;
	::move.arti1 = ((beta+60)*1023)/300;&lt;br /&gt;
	::move.arti2 = ((gamma-30)*1023)/300;&lt;br /&gt;
	::move.arti3 = ((delta-30)*1023)/300;&lt;br /&gt;
	::move.pinza = 511;&lt;br /&gt;
	&lt;br /&gt;
	::vel.base = abs(::move.base - ::pg.base)/5;&lt;br /&gt;
	::vel.arti1 = abs(::move.arti1 - ::pg.arti1)/5;	&lt;br /&gt;
	::vel.arti2 = abs(::move.arti2 - ::pg.arti2)/5;&lt;br /&gt;
	::vel.arti3 = abs(::move.arti3 - ::pg.arti3)/5;&lt;br /&gt;
	::vel.pinza = abs(::move.pinza - ::pg.pinza);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	if (coordenadas_correctas == 1 &amp;amp;&amp;amp; (205 &amp;lt;= ::move.base &amp;amp;&amp;amp; ::move.base &amp;lt;= 818) &amp;amp;&amp;amp; (120 &amp;lt;= ::move.arti1 &amp;amp;&amp;amp; ::move.arti1 &amp;lt;= 920) &amp;amp;&amp;amp; ::move.arti2 &amp;gt;= 50  &amp;amp;&amp;amp; ::move.arti3 &amp;lt;= 828) {&lt;br /&gt;
		return ::move;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		std::cout&amp;lt;&amp;lt;&amp;quot;error coordenadas no validas o punto fuera del alcance&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		&lt;br /&gt;
		::nuevo_punto = 0;	&lt;br /&gt;
		::id_1 = ::id_0;		&lt;br /&gt;
		return ::pg;				&lt;br /&gt;
	}  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void indicar(geometry_msgs::Point indicado)&lt;br /&gt;
  {&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1); &lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);&lt;br /&gt;
	  	&lt;br /&gt;
	  	brazo_fer::Servos mover;&lt;br /&gt;
		&lt;br /&gt;
		double x0 = indicado.x;&lt;br /&gt;
		double z0 = indicado.z;&lt;br /&gt;
		&lt;br /&gt;
		indicado.z = indicado.z - 100*cos(atan2(x0,z0));&lt;br /&gt;
		indicado.x = indicado.x - 100*sin(atan2(x0,z0)); &lt;br /&gt;
		&lt;br /&gt;
		mover = inversa(indicado);&lt;br /&gt;
		&lt;br /&gt;
		brazo_fer::WriteServos indicar;&lt;br /&gt;
		&lt;br /&gt;
		indicar.posicion = mover;&lt;br /&gt;
		&lt;br /&gt;
		indicar.velocidad = ::vel;&lt;br /&gt;
		&lt;br /&gt;
		indicar.par.base = 1;&lt;br /&gt;
		indicar.par.arti1 = 1;&lt;br /&gt;
		indicar.par.arti2 = 1;&lt;br /&gt;
		indicar.par.arti3 = 1;&lt;br /&gt;
		indicar.par.pinza = 1;		&lt;br /&gt;
						&lt;br /&gt;
		move_pub_.publish(indicar);&lt;br /&gt;
		hand_pub_.publish(indicar);&lt;br /&gt;
		&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void home()&lt;br /&gt;
  {&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1); &lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);&lt;br /&gt;
	  	&lt;br /&gt;
	  	brazo_fer::Servos mover;&lt;br /&gt;
		&lt;br /&gt;
		geometry_msgs::Point home;&lt;br /&gt;
		&lt;br /&gt;
		home.x = 0;&lt;br /&gt;
		home.y = 80;&lt;br /&gt;
		home.z = 50;&lt;br /&gt;
		&lt;br /&gt;
		mover = inversa(home);&lt;br /&gt;
		&lt;br /&gt;
		brazo_fer::WriteServos inicio;&lt;br /&gt;
		&lt;br /&gt;
		inicio.posicion = mover;&lt;br /&gt;
		&lt;br /&gt;
		inicio.velocidad = ::vel;&lt;br /&gt;
		&lt;br /&gt;
		inicio.par.base = 1;&lt;br /&gt;
		inicio.par.arti1 = 1;&lt;br /&gt;
		inicio.par.arti2 = 1;&lt;br /&gt;
		inicio.par.arti3 = 1;&lt;br /&gt;
		inicio.par.pinza = 1;		&lt;br /&gt;
						&lt;br /&gt;
		move_pub_.publish(inicio);&lt;br /&gt;
		hand_pub_.publish(inicio);&lt;br /&gt;
		&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  void posicion(const brazo_fer::ReadServos&amp;amp; pose)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
    brazo_fer::Servos p = pose.posicion;&lt;br /&gt;
	&lt;br /&gt;
    ::pg = pose.posicion;&lt;br /&gt;
    ::eg = pose.estado;&lt;br /&gt;
    ::cg = pose.corriente;&lt;br /&gt;
    &lt;br /&gt;
    if (::cont == 0) &lt;br /&gt;
    {&lt;br /&gt;
		home();&lt;br /&gt;
		::cont = 1;&lt;br /&gt;
	}&lt;br /&gt;
	else if (::nuevo_punto &amp;gt; 8)&lt;br /&gt;
	{&lt;br /&gt;
		if (((p.base-15) &amp;lt; ::move.base &amp;amp;&amp;amp; ::move.base &amp;lt; (p.base+15)) &amp;amp;&amp;amp; ((p.arti1-15) &amp;lt; ::move.arti1 &amp;amp;&amp;amp; ::move.arti1 &amp;lt; (p.arti1+15)) &amp;amp;&amp;amp; ((p.arti2-15) &amp;lt; ::move.arti2 &amp;amp;&amp;amp; ::move.arti2 &amp;lt; (p.arti2+15)) &amp;amp;&amp;amp; ((p.arti3-15) &amp;lt; ::move.arti3 &amp;amp;&amp;amp; ::move.arti3 &amp;lt; (p.arti3+15)))&lt;br /&gt;
		{&lt;br /&gt;
			ros::Time ahora;&lt;br /&gt;
			&lt;br /&gt;
			ahora = ros::Time::now();   //Asignación del tiempo actual a la variable ahora&lt;br /&gt;
 &lt;br /&gt;
			while (ros::Time::now() &amp;lt; (ahora + ros::Duration(1)))&lt;br /&gt;
			{}&lt;br /&gt;
			&lt;br /&gt;
			home();&lt;br /&gt;
			&lt;br /&gt;
			::nuevo_punto = 0;	&lt;br /&gt;
			::id_1 = ::id_0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  void punto(const find_object_2d::PointObjects&amp;amp; point)&lt;br /&gt;
  {	&lt;br /&gt;
	::p_objects = point;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	if (::id_0 == ::id_1)&lt;br /&gt;
	{&lt;br /&gt;
		::cont_obj = 0;&lt;br /&gt;
			  &lt;br /&gt;
		::x = 0;&lt;br /&gt;
		::y = 0;&lt;br /&gt;
		::z = 0; &lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		if (::id_1 == 100)&lt;br /&gt;
		{	&lt;br /&gt;
			home();&lt;br /&gt;
			::nuevo_punto = 0;		&lt;br /&gt;
			::id_1 = ::id_0;&lt;br /&gt;
		} &lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			int max = ::p_objects.objeto.size();&lt;br /&gt;
			&lt;br /&gt;
			if (::nuevo_punto &amp;lt; 8)&lt;br /&gt;
			{&lt;br /&gt;
				for (int i=0; i &amp;lt; max; i++)&lt;br /&gt;
				{&lt;br /&gt;
					if (::p_objects.objeto[i].id == ::id_1)&lt;br /&gt;
					{&lt;br /&gt;
						::x = ::x + ::p_objects.objeto[i].punto.x;&lt;br /&gt;
						::y = ::y + ::p_objects.objeto[i].punto.y;&lt;br /&gt;
						::z = ::z + ::p_objects.objeto[i].punto.z;&lt;br /&gt;
										&lt;br /&gt;
						::cont_obj = ::cont_obj + 1;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				::nuevo_punto = ::nuevo_punto + 1;			&lt;br /&gt;
			}	&lt;br /&gt;
			else&lt;br /&gt;
			{		&lt;br /&gt;
				if (::cont_obj == 0)&lt;br /&gt;
				{&lt;br /&gt;
					std::cout&amp;lt;&amp;lt;&amp;quot;Objeto no presente en la escena&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
					::nuevo_punto = 0;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					geometry_msgs::Point punto_medio;&lt;br /&gt;
				&lt;br /&gt;
					punto_medio.x = ::x/::cont_obj;&lt;br /&gt;
					punto_medio.y = ::y/::cont_obj;&lt;br /&gt;
					punto_medio.z = ::z/::cont_obj;&lt;br /&gt;
			&lt;br /&gt;
					indicar(punto_medio);&lt;br /&gt;
					&lt;br /&gt;
					::nuevo_punto = ::nuevo_punto + 1;										&lt;br /&gt;
				}&lt;br /&gt;
				::id_1 = ::id_0;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
  void objeto(const std_msgs::Int16&amp;amp; id)&lt;br /&gt;
  {&lt;br /&gt;
	::id_1 = id.data;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;indicar_objetos&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber pose_sub_= n.subscribe(&amp;quot;pose_arm&amp;quot;, 1, posicion); &lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber point_sub_= n.subscribe(&amp;quot;point&amp;quot;, 1, punto);&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber object_sub_= n.subscribe(&amp;quot;selected_object&amp;quot;, 1, objeto);  	 &lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1); &lt;br /&gt;
  	   &lt;br /&gt;
 &lt;br /&gt;
	ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vez tengamos [[Fernando-TFM-ROS02#Escribiendo y compilando el programa|compilado el programa]], vamos a crear un ''launcher'' para su ejecución, en el que iniciaremos el nodo de comunicación con [http://www.arduino.cc/es/ arduino], el programa creado e incluiremos el ''launcher'' anteriormente creado, que inicia la cámara web, [http://code.google.com/p/find-object/ find_object_2d] y el programa &amp;quot;objects_detected&amp;quot;. Crearemos un archivo llamado &amp;quot;escoja.launch&amp;quot; en el directorio &amp;quot;launch&amp;quot; del ''package'' del [[Control brazo MYRAbot (bioloid+arduino)#Programas de control|brazo]] con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;serial_node&amp;quot; pkg=&amp;quot;rosserial_python&amp;quot; type=&amp;quot;serial_node.py&amp;quot; args=&amp;quot;/dev/ttyACM0&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;indicar&amp;quot; pkg=&amp;quot;brazo_fer&amp;quot; type=&amp;quot;escoja&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find find_object_2d)/launch/encontrar_objetos.launch&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para iniciar el ''launcher'' simplemente ejecutaremos en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer escoja.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
En la sección &amp;quot;[[Modelo para simulación MYRAbot (urdf+gazebo)#Ejecución del programa (entre la cerveza y la cola, la plataforma) escoja|Ejecución del programa (entre la cerveza y la cola, la plataforma) escoja]]&amp;quot; del apartado dedicado al [[Modelo para simulación MYRAbot (urdf+gazebo)|modelo para simulación MYRAbot]], puede verse un vídeo de la ejecución del programa en el simulador [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo].&lt;br /&gt;
&lt;br /&gt;
=Seguir objetos=&lt;br /&gt;
&lt;br /&gt;
El siguiente programa controla el [[Control brazo MYRAbot (bioloid+arduino)|brazo]] para realizar el seguimiento del objeto que indiquemos a través del ''topic'' &amp;quot;selected_object&amp;quot;, haciendo uso del ''package'' [http://code.google.com/p/find-object/ find_object_2d] y el programa anterior para la detección de objetos. Crearemos un archivo llamado &amp;quot;seguir_objetos.cpp&amp;quot; dentro del directorio &amp;quot;src&amp;quot; del ''package'' del [[Control brazo MYRAbot (bioloid+arduino)#Programas de control|brazo]], con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;find_object_2d/PointObjects.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;find_object_2d/Point_id.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;std_msgs/Int16.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  #define PI 3.14159265&lt;br /&gt;
  #define L1 104&lt;br /&gt;
  #define L2 104&lt;br /&gt;
  #define Lp 60&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos move_0, move_1, vel, pg, eg, cg;&lt;br /&gt;
  find_object_2d::PointObjects p_objects;&lt;br /&gt;
  geometry_msgs::Point punto_obj_0;&lt;br /&gt;
  &lt;br /&gt;
  int cont = 0;&lt;br /&gt;
  int cont_obj = 0;&lt;br /&gt;
  &lt;br /&gt;
  int id;&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos inversa(geometry_msgs::Point destino)&lt;br /&gt;
  {&lt;br /&gt;
    &lt;br /&gt;
   	double z = destino.z; &lt;br /&gt;
    double x = destino.x;&lt;br /&gt;
	double y = destino.y;&lt;br /&gt;
	&lt;br /&gt;
	y = y + z*tan(atan2(45,250)); //Compensación para alcanzar la &amp;quot;y&amp;quot; intruducida, ya que la real es menor debido al peso del conjunto.&lt;br /&gt;
 &lt;br /&gt;
	int coordenadas_correctas = 1;&lt;br /&gt;
 &lt;br /&gt;
	double alfa, beta, beta_a, beta_p, gamma, delta, delta_a, delta_p;&lt;br /&gt;
	double z_p;&lt;br /&gt;
	double L_a, L;&lt;br /&gt;
 &lt;br /&gt;
	alfa = (atan2(x,z)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
	z_p = sqrt(pow(z,2)+pow(x,2));&lt;br /&gt;
 &lt;br /&gt;
	L = sqrt(pow(z_p,2)+pow(y,2));&lt;br /&gt;
 &lt;br /&gt;
	L_a = sqrt(pow(y,2)+pow(z_p-Lp,2));&lt;br /&gt;
 &lt;br /&gt;
	beta_p = atan2(y,z_p-Lp);&lt;br /&gt;
 &lt;br /&gt;
	beta_a = acos((pow(L1,2)+pow(L_a,2)-pow(L2,2))/(2*L1*L_a));&lt;br /&gt;
 &lt;br /&gt;
	beta = ((beta_p+beta_a)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
	gamma = acos((pow(L1,2)+pow(L2,2)-pow(L_a,2))/(2*L1*L2));&lt;br /&gt;
 &lt;br /&gt;
	delta_a = PI-(beta_a+gamma);&lt;br /&gt;
 &lt;br /&gt;
	gamma = (gamma*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
        delta_p = acos((pow(L_a,2)+pow(Lp,2)-pow(L,2))/(2*L_a*Lp));&lt;br /&gt;
 &lt;br /&gt;
	if (y&amp;lt;0) {&lt;br /&gt;
		delta = ((2*PI-(delta_p-delta_a))*180)/PI;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		delta = ((delta_p+delta_a)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
		if (isnan(delta)) {&lt;br /&gt;
			delta = ((PI+delta_a)*180)/PI;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	if (isnan(gamma)) // si no hay solución&lt;br /&gt;
	{&lt;br /&gt;
		coordenadas_correctas = 0; &lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	::move_1.base = ((alfa+150)*1023)/300;&lt;br /&gt;
	::move_1.arti1 = ((beta+60)*1023)/300;&lt;br /&gt;
	::move_1.arti2 = ((gamma-30)*1023)/300;&lt;br /&gt;
	::move_1.arti3 = ((delta-30)*1023)/300;&lt;br /&gt;
	::move_1.pinza = 511;&lt;br /&gt;
	&lt;br /&gt;
	::vel.base = abs(::move_1.base - ::pg.base)/5;&lt;br /&gt;
	::vel.arti1 = abs(::move_1.arti1 - ::pg.arti1)/5;	&lt;br /&gt;
	::vel.arti2 = abs(::move_1.arti2 - ::pg.arti2)/5;&lt;br /&gt;
	::vel.arti3 = abs(::move_1.arti3 - ::pg.arti3)/5;&lt;br /&gt;
	::vel.pinza = abs(::move_1.pinza - ::pg.pinza);		&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	if (coordenadas_correctas == 1 &amp;amp;&amp;amp; (205 &amp;lt;= ::move_1.base &amp;amp;&amp;amp; ::move_1.base &amp;lt;= 818) &amp;amp;&amp;amp; (120 &amp;lt;= ::move_1.arti1 &amp;amp;&amp;amp; ::move_1.arti1 &amp;lt;= 920) &amp;amp;&amp;amp; ::move_1.arti2 &amp;gt;= 50  &amp;amp;&amp;amp; ::move_1.arti3 &amp;lt;= 828) {&lt;br /&gt;
		move_0 = move_1;&lt;br /&gt;
		&lt;br /&gt;
		return ::move_0;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		std::cout&amp;lt;&amp;lt;&amp;quot;error coordenadas no validas o punto fuera del alcance&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
			&lt;br /&gt;
		return ::move_0;				&lt;br /&gt;
	}  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void indicar(geometry_msgs::Point indicado)&lt;br /&gt;
  {&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1); &lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);&lt;br /&gt;
	  	&lt;br /&gt;
	  	brazo_fer::Servos mover;&lt;br /&gt;
		&lt;br /&gt;
		double x0 = indicado.x;&lt;br /&gt;
		double z0 = indicado.z;&lt;br /&gt;
		&lt;br /&gt;
		indicado.z = indicado.z - 150*cos(atan2(x0,z0));&lt;br /&gt;
		indicado.x = indicado.x - 150*sin(atan2(x0,z0)); &lt;br /&gt;
		&lt;br /&gt;
		mover = inversa(indicado);&lt;br /&gt;
		&lt;br /&gt;
		brazo_fer::WriteServos indicar;&lt;br /&gt;
		&lt;br /&gt;
		indicar.posicion = mover;&lt;br /&gt;
		&lt;br /&gt;
		indicar.velocidad = ::vel;&lt;br /&gt;
		&lt;br /&gt;
		indicar.par.base = 1;&lt;br /&gt;
		indicar.par.arti1 = 1;&lt;br /&gt;
		indicar.par.arti2 = 1;&lt;br /&gt;
		indicar.par.arti3 = 1;&lt;br /&gt;
		indicar.par.pinza = 1;		&lt;br /&gt;
						&lt;br /&gt;
		move_pub_.publish(indicar);&lt;br /&gt;
		hand_pub_.publish(indicar);&lt;br /&gt;
		&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void home()&lt;br /&gt;
  {&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1); &lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);&lt;br /&gt;
	  	&lt;br /&gt;
	  	brazo_fer::Servos mover;&lt;br /&gt;
		&lt;br /&gt;
		geometry_msgs::Point home;&lt;br /&gt;
		&lt;br /&gt;
		home.x = 0;&lt;br /&gt;
		home.y = 80;&lt;br /&gt;
		home.z = 50;&lt;br /&gt;
		&lt;br /&gt;
		mover = inversa(home);&lt;br /&gt;
		&lt;br /&gt;
		brazo_fer::WriteServos inicio;&lt;br /&gt;
		&lt;br /&gt;
		inicio.posicion = mover;&lt;br /&gt;
		&lt;br /&gt;
		inicio.velocidad = ::vel;&lt;br /&gt;
		&lt;br /&gt;
		inicio.par.base = 1;&lt;br /&gt;
		inicio.par.arti1 = 1;&lt;br /&gt;
		inicio.par.arti2 = 1;&lt;br /&gt;
		inicio.par.arti3 = 1;&lt;br /&gt;
		inicio.par.pinza = 1;		&lt;br /&gt;
						&lt;br /&gt;
		move_pub_.publish(inicio);&lt;br /&gt;
		hand_pub_.publish(inicio);&lt;br /&gt;
		&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  void posicion(const brazo_fer::ReadServos&amp;amp; pose)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	brazo_fer::Servos p = pose.posicion;&lt;br /&gt;
	&lt;br /&gt;
	::pg = pose.posicion;&lt;br /&gt;
        ::eg = pose.estado;&lt;br /&gt;
        ::cg = pose.corriente;&lt;br /&gt;
 &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  void punto(const find_object_2d::PointObjects&amp;amp; point)&lt;br /&gt;
  {	&lt;br /&gt;
	::p_objects = point;&lt;br /&gt;
	&lt;br /&gt;
	geometry_msgs::Point punto_obj_1;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	if (::id == 100 || ::cont == 0)&lt;br /&gt;
	{	&lt;br /&gt;
		home();&lt;br /&gt;
	&lt;br /&gt;
		::cont = ::cont + 1;&lt;br /&gt;
	} &lt;br /&gt;
&lt;br /&gt;
	int max = ::p_objects.objeto.size();&lt;br /&gt;
&lt;br /&gt;
	for (int i=0; i &amp;lt; max; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (::p_objects.objeto[i].id == ::id)&lt;br /&gt;
		{&lt;br /&gt;
			punto_obj_1 = ::p_objects.objeto[i].punto;&lt;br /&gt;
			&lt;br /&gt;
			::cont_obj = 1;&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if (::cont_obj == 0)&lt;br /&gt;
	{&lt;br /&gt;
		std::cout&amp;lt;&amp;lt;&amp;quot;Objeto no presente en la escena&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	else if (abs(punto_obj_1.x - ::punto_obj_0.x) &amp;gt; 20 || abs(punto_obj_1.y - ::punto_obj_0.y) &amp;gt; 20 || abs(punto_obj_1.z - ::punto_obj_0.z) &amp;gt; 20)&lt;br /&gt;
	{&lt;br /&gt;
		indicar(punto_obj_1);&lt;br /&gt;
		&lt;br /&gt;
		::punto_obj_0 = punto_obj_1;									&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	::cont_obj = 0;&lt;br /&gt;
&lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
  void objeto(const std_msgs::Int16&amp;amp; id)&lt;br /&gt;
  {&lt;br /&gt;
	::id = id.data;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;seguir_objetos&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber pose_sub_= n.subscribe(&amp;quot;pose_arm&amp;quot;, 1, posicion); &lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber point_sub_= n.subscribe(&amp;quot;point&amp;quot;, 1, punto);&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber object_sub_= n.subscribe(&amp;quot;selected_object&amp;quot;, 1, objeto);  	 &lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1); &lt;br /&gt;
  	   &lt;br /&gt;
 &lt;br /&gt;
	ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vez tengamos [[Fernando-TFM-ROS02#Escribiendo y compilando el programa|compilado el programa]], vamos a crear un ''launcher'' para su ejecución, en el que iniciaremos el nodo de comunicación con [http://www.arduino.cc/es/ arduino], el programa creado e incluiremos el ''launcher'' anteriormente creado, que inicia la cámara web, [http://code.google.com/p/find-object/ find_object_2d] y el programa &amp;quot;objects_detected&amp;quot;. Crearemos un archivo llamado &amp;quot;seguir.launch&amp;quot; en el directorio &amp;quot;launch&amp;quot; del ''package'' del [[Control brazo MYRAbot (bioloid+arduino)#Programas de control|brazo]] con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node name=&amp;quot;serial_node&amp;quot; pkg=&amp;quot;rosserial_python&amp;quot; type=&amp;quot;serial_node.py&amp;quot; args=&amp;quot;/dev/ttyACM0&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;seguir&amp;quot; pkg=&amp;quot;brazo_fer&amp;quot; type=&amp;quot;seguir_objetos&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find find_object_2d)/launch/encontrar_objetos.launch&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para iniciar el ''launcher'' simplemente ejecutaremos en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch brazo_fer seguir.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En la sección &amp;quot;[[Modelo para simulación MYRAbot (urdf+gazebo)#Ejecución del programa seguir objetos|Ejecución del programa seguir objetos]]&amp;quot; del apartado dedicado al [[Modelo para simulación MYRAbot (urdf+gazebo)|modelo para simulación MYRAbot]], puede verse un vídeo de la ejecución del programa en el simulador [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Control_brazo_MYRAbot_(bioloid%2barduino)&amp;diff=4207</id>
		<title>Control brazo MYRAbot (bioloid+arduino)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Control_brazo_MYRAbot_(bioloid%2barduino)&amp;diff=4207"/>
				<updated>2014-09-29T11:01:46Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Brazo Bioloid=&lt;br /&gt;
&lt;br /&gt;
El brazo en el que se basa este proyecto es el desarrollado en el proyecto [[Carlos-TFM-MYRABot01 | MYRA Robot: Hardware Update ]], realizado por Carlos Rodríguez Hernández. Los componentes principales de este son:&lt;br /&gt;
[[file:IMG_4871_b.JPG|thumb|200px|Fotografía del Brazo [http://www.robotis.com/xe/BIOLOID_main_en Bioloid].]]&lt;br /&gt;
&lt;br /&gt;
* Placa [http://arduino.cc/en/Main/ArduinoBoardMega2560 arduino mega 2560].&lt;br /&gt;
* Circuito integrado [http://www.futurlec.com/74LS/74LS241.shtml 74LS241] (Bufer tri-estado).&lt;br /&gt;
* Circuito regulador de tensión.&lt;br /&gt;
* 5 servomotores serie [http://support.robotis.com/en/product/dynamixel/ax_series/dxl_ax_actuator.htm Dynamixel AX-12A].&lt;br /&gt;
* Piezas de montaje de kit Bioloid.&lt;br /&gt;
* Piezas realizadas para pinza y fijación al MYRAbot.&lt;br /&gt;
&lt;br /&gt;
=Arduino IDE y rosserial=&lt;br /&gt;
&lt;br /&gt;
Para la comunicación e intercambio de información entre [http://www.arduino.cc arduino] y [http://www.ros.org ROS] es necesario instalar [http://www.arduino.cc arduino] IDE y rosserial (''stack'' de [http://www.ros.org ROS] que contiene el ''package'' rosserial_arduino con las librerias para [http://www.arduino.cc arduino]). Comenzaremos instalando el [http://www.arduino.cc arduino] IDE, para lo que ejecutaremos los siguientes comandos en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get update&lt;br /&gt;
sudo apt-get install arduino arduino-core&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vez realizada la instalación del software de [http://www.arduino.cc arduino] se procedera a la instalación del ''package'' de [http://www.ros.org ROS] ejecutando en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;sudo apt-get install ros-NUESTRA_VERSIÓN_ROS-rosserial&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalados [http://www.arduino.cc arduino] IDE y el ''package'' rosserial debemos copiar las librerias del ''package'' rosserial_arduino al sketchbook de [http://www.arduino.cc arduino], carpeta que se encuentra habitualmente en la carpeta personal, para lo que ejecutaremos en un terminal los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd rosserial_arduino/libraries&lt;br /&gt;
cp -r ros_lib /home/”nombre_sesion”/sketchbook/libraries/ros_lib&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Creación de un package para nuestros programas==&lt;br /&gt;
&lt;br /&gt;
Deberemos tener previamente creado un [[Fernando-TFM-ROS02#Creando un espacio de trabajo|espacio de trabajo]] para nuestra versión de [http://www.ros.org ROS]. Para poder compilar y enviar nuestros programas a la placa [http://www.arduino.cc arduino] sin tener que pasar por [http://www.arduino.cc arduino] IDE vamos a crear un ''package'' llamado “arduino_fer” con las dependencias necesarias para nuestros programas, para ello ejecutaremos los siguientes comandos en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;cd ~/ros_workspace&lt;br /&gt;
roscreate-pkg arduino_fer rosserial_arduino std_msgs&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
Deberemos sustituir el contenido del fichero &amp;quot;CMakeLists.txt&amp;quot;, situado en la carpeta del ''package'' creado, por el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;cmake_minimum_required(VERSION 2.4.6)&lt;br /&gt;
include($ENV{ROS_ROOT}/core/rosbuild/rosbuild.cmake)&lt;br /&gt;
&lt;br /&gt;
rosbuild_find_ros_package(rosserial_arduino)&lt;br /&gt;
include(${rosserial_arduino_PACKAGE_PATH}/cmake_scripts/rosserial.cmake)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para finalizar la cración del ''package'' ejecutaremos los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd arduino_fer&lt;br /&gt;
cmake .&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Primer programa (A toda potencia)==&lt;br /&gt;
&lt;br /&gt;
El primer programa que vamos a realizar crea un nodo llamado “potencia” que publica un ''topic'' llamado “cifra” y está suscrito a un ''topic'' llamado “resultado”. Cuando se publique un número en el ''topic'' “cifra” lo multiplicará por si mismo y publicará el resultado en el ''topic'' “resultado”. El código del programa es el siguiente:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;ros.h&amp;gt; &lt;br /&gt;
#include &amp;lt;std_msgs/Int16.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
ros::NodeHandle nh; &lt;br /&gt;
int pot; &lt;br /&gt;
&lt;br /&gt;
void potencia( const std_msgs::Int16&amp;amp; cifra){ &lt;br /&gt;
&lt;br /&gt;
::pot = cifra.data*cifra.data; &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
ros::Subscriber&amp;lt;std_msgs::Int16&amp;gt; sub(&amp;quot;cifra&amp;quot;, &amp;amp;potencia ); &lt;br /&gt;
std_msgs::Int16 res; &lt;br /&gt;
&lt;br /&gt;
ros::Publisher pub(&amp;quot;resultado&amp;quot;, &amp;amp;res); &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{ &lt;br /&gt;
  nh.initNode(); &lt;br /&gt;
  nh.subscribe(sub);  &lt;br /&gt;
  nh.advertise(pub); &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void loop() &lt;br /&gt;
{ &lt;br /&gt;
  res.data = ::pot; &lt;br /&gt;
  pub.publish( &amp;amp;res ); &lt;br /&gt;
  nh.spinOnce(); &lt;br /&gt;
  delay(1000); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Para su compilación y envio a la placa [http://www.arduino.cc arduino] es necesario añadir al archivo &amp;quot;CMakeLists.txt&amp;quot; las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;set(FIRMWARE_NAME potencia)&lt;br /&gt;
&lt;br /&gt;
set(${FIRMWARE_NAME}_BOARD MODELO_NUESTRA_PLACA)   # Modelo placa arduino&lt;br /&gt;
set(${FIRMWARE_NAME}_SRCS src/potencia.cpp )&lt;br /&gt;
set(${FIRMWARE_NAME}_PORT /dev/ttyACM0)            # Puerto serie para carga&lt;br /&gt;
generate_ros_firmware(${FIRMWARE_NAME})&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donde se indica el nombre del programa, tipo de placa [http://www.arduino.cc arduino] (uno, atmega328 o mega2560), nombre y ubicación del archivo y puerto serie del PC empleado para la comunicación con la placa. Deberemos ejecutar los siguientes comandos en un terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd arduino_fer&lt;br /&gt;
make potencia-upload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para la ejecución del programa se debe lanzar en un terminal el núcleo de [http://www.ros.org ROS], si no se encuentra ya en marcha, ejecutando el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscore&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En otro terminal se ejecutará el nodo que comunica a [http://www.ros.org ROS] con la placa [http://www.arduino.cc arduino], indicándole el puerto empleado para la comunicación. Para saber el puerto que se está empleando, con la placa [http://www.arduino.cc arduino] conectada al pc a través de su puerto USB, podemos verlo en el menú &amp;quot;Herramientas&amp;quot;&amp;gt;&amp;quot;Puerto serie&amp;quot; del software [http://www.arduino.cc arduino] IDE. En nuestro caso es el &amp;quot;ttyACM0&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun rosserial_python serial_node.py /dev/ttyACM0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para la publicación de un número en el ''topic'' “cifra” se ejecutará en otro terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub cifra std_msgs/Int16 NUMERO_DESEADO --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para comprobar que realmente el programa calcula el cuadrado del número publicado en el ''topic'' “cifra” podemos ejecutar en otro terminal el siguiente comando para visualizar el ''topic'' “resultado”:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic echo resultado&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Arduino y servomotores Dinamixel=&lt;br /&gt;
&lt;br /&gt;
En [http://savageelectronics.blogspot.com.es/2011/01/arduino-y-dynamixel-ax-12.html Savage Electronics] se encuentran las adaptaciones hardware realizadas a la placa [http://arduino.cc/en/Main/ArduinoBoardMega2560 arduino mega 2560] para la correcta comunicación con los servomotores [http://support.robotis.com/en/product/dynamixel/ax_series/dxl_ax_actuator.htm Dynamixel AX-12A] de [http://www.robotis.com/xe/ ROBOTICS], así como las librerías utilizadas para la programación ([http://savageelectronics.blogspot.com.es/2011/08/actualizacion-biblioteca-dynamixel.html DynamixelSerial]).&lt;br /&gt;
&lt;br /&gt;
==Segundo programa (Muévete)==&lt;br /&gt;
&lt;br /&gt;
En este programa simplemente se realiza un prueba de la comunicación entre la placa [http://arduino.cc/en/Main/ArduinoBoardMega2560 arduino mega 2560] con un servomotor [http://support.robotis.com/en/product/dynamixel/ax_series/dxl_ax_actuator.htm Dynamixel AX-12A]. El programa publica el ''topic'' “angulo” con la posición del motor (entero entre 0 y 1023) y está suscrito al ''topic'' “giro” del que recibe la posición a la que debe moverse (entero entre 0 y 1023), con una velocidad constante de 128 (entero entre 0 y 1023). El código del programa es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;ros.h&amp;gt;&lt;br /&gt;
#include &amp;lt;std_msgs/Int16.h&amp;gt;&lt;br /&gt;
#include &amp;lt;DynamixelSerial1.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ros::NodeHandle nh;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void mover( const std_msgs::Int16&amp;amp; giro){&lt;br /&gt;
&lt;br /&gt;
  Dynamixel.moveSpeed(1,giro.data,128);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ros::Subscriber&amp;lt;std_msgs::Int16&amp;gt; sub(&amp;quot;giro&amp;quot;, &amp;amp;mover );&lt;br /&gt;
&lt;br /&gt;
std_msgs::Int16 ang;&lt;br /&gt;
ros::Publisher pub(&amp;quot;angulo&amp;quot;, &amp;amp;ang);&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  nh.initNode();&lt;br /&gt;
  nh.subscribe(sub);  &lt;br /&gt;
  nh.advertise(pub);&lt;br /&gt;
  Dynamixel.begin(1000000,2);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  int posicion = Dynamixel.readPosition(1);&lt;br /&gt;
  ang.data = posicion;&lt;br /&gt;
  pub.publish( &amp;amp;ang );&lt;br /&gt;
  nh.spinOnce();&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Para poder compilar y enviar el programa a la placa [http://www.arduino.cc arduino] deberemos emplear el software [http://www.arduino.cc arduino] IDE, ya que empleamos una librería externa al sistema [http://www.ros.org ROS] y no nos permite hacerlo usando [[#Creación de un package para nuestros programas|nuestro ''package'']].&lt;br /&gt;
Una vez transferido el programa a la placa, para probar el programa debemos ejecutar en un terminal el siguiente comando, que inicia el nucleo de [http://www.ros.org ROS]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscore&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También debemos lanzar en otro terminal el nodo de comunicación [http://www.ros.org ROS]-[http://www.arduino.cc arduino], ejecutando el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun rosserial_python serial_node.py /dev/ttyACM0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En un nuevo terminal publicaremos en el ''topic'' &amp;quot;giro&amp;quot; la posición de destino del servomotor, ejecutando el siguiente comando: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub giro std_msgs/Int16 POSICION_DESEADA --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El servomotor de inmediato comenzará a moverse hasta la posición indicada. Podemos visualizar el valor de posición del servomotor en todo momento ejecutando en otro terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic echo angulo&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Modelo cinemático del brazo=&lt;br /&gt;
&lt;br /&gt;
Para el correcto posicionamiento del brazo es necesario obtener las transformaciones geométricas para determinar el ángulo que deben girar los servomotores para alcanzar un punto (cinemática inversa). Al tratarse de un brazo que trabaja en un solo plano con giro (4 articulaciones) es un proceso sencillo que se ha realizado de forma directa, sino se puede recurrir al algoritmo de [http://en.wikipedia.org/wiki/Denavit%E2%80%93Hartenberg_parameters parametrización Denavit- Hartenberg] que permite obtener la cinemática directa y a partir de esta obtener la inversa.&lt;br /&gt;
&lt;br /&gt;
[[file:brazo_cinematica.jpg|thumb|500px|center|Diagramas para el estudio de la cinemática]]&lt;br /&gt;
&lt;br /&gt;
==Cinemática inversa==&lt;br /&gt;
&lt;br /&gt;
Siguiendo los diagramas planteados y considerando ''x'',''y'' y ''z'' como las coordenadas del punto destino, y &amp;amp;epsilon; el ángulo que forma la pinza respecto al plano x-z, las ecuaciones obtenidas para la cinemática inversa son las siguientes:&lt;br /&gt;
&lt;br /&gt;
[[file:brazo_ecuaciones.jpg]]&lt;br /&gt;
&lt;br /&gt;
Teniendo en cuenta los ángulos límite de los servomotores [http://support.robotis.com/en/product/dynamixel/ax_series/dxl_ax_actuator.htm Dynamixel AX-12A] y el rango de valores que debemos usar, los valores que debemos pasar a los servomotores de cada articulación son los siguientes:&lt;br /&gt;
&lt;br /&gt;
[[file:brazo_dynamixel_AX-12.jpg|thumb|250px|Diagrama de ángulos servomotor [http://support.robotis.com/en/product/dynamixel/ax_series/dxl_ax_actuator.htm Dynamixel AX-12A]]]&lt;br /&gt;
&lt;br /&gt;
[[file:brazo_ecuacion_base.jpg]] Se suman 150º al ángulo para situar el 0º coincidente con el eje z.&lt;br /&gt;
&lt;br /&gt;
[[file:brazo_ecuacion_arti1.jpg]] Se suman 60º al ángulo para situar el 0º coincidente con el eje z.&lt;br /&gt;
&lt;br /&gt;
[[file:brazo_ecuacion_arti2.jpg]] Se restan 30º al ángulo para situar el 0º coincidente con el eje longitudinal del servomotor.&lt;br /&gt;
&lt;br /&gt;
[[file:brazo_ecuacion_arti3.jpg]] Se restan 30º al ángulo para situar el 0º coincidente con el eje longitudinal del servomotor.&lt;br /&gt;
&lt;br /&gt;
Para enviar a los servomotores valores dentro del rango de trabajo, se multiplica por 1023 (0x3FF), valor máximo del rango de posiciones del servo, y se divide por 300 (300º), el ángulo total de giro del servomotor.&lt;br /&gt;
&lt;br /&gt;
==Cinemática directa==&lt;br /&gt;
&lt;br /&gt;
A partir de las ecuaciones anteriores podemos plantear también el proceso inverso, la obtención del punto en que se encuentra el brazo a partir de las posiciones de los servomotores. Las ecuaciones obtenidas son las siguientes:&lt;br /&gt;
&lt;br /&gt;
[[file:brazo_ecuaciones_directa.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Espacio de trabajo y limitaciones==&lt;br /&gt;
&lt;br /&gt;
Para evitar colisiones del brazo con las diferentes partes del MYRAbot y con sus propios componentes, es necesario fijar unos límites de giro a los servomotores y restringir el acceso a regiones del espacio. Para esta tarea se ha realizado una hoja de calculo con las formulas de la cinemática inversa y se ha representado en unos gráficos las posiciones de los ejes y las articulaciones del brazo en el espacio.&lt;br /&gt;
&lt;br /&gt;
[[file:brazo_cinematica_excel.jpg|thumb|750px|center|Hoja de cálculo cinemática inversa y directa, [http://www.fernando.casadogarcia.es/files/cinematica_brazo_MYRAbot.xlsx descargar]]]&lt;br /&gt;
&lt;br /&gt;
=Programas de control=&lt;br /&gt;
&lt;br /&gt;
==Tercer programa (Ven aquí)==&lt;br /&gt;
&lt;br /&gt;
Primero crearemos un programa que actuará de intermediario entre el programa de control y los servomotores del brazo, que situaremos en la placa [http://www.arduino.cc arduino]. Este programa se encargará de enviar las ordenes recibidas a los servomotores y enviar los datos más relevantes de los servomotores. Como se van a ''publicar'' y ''suscribir'' los datos de 5 servomotores, vamos a comenzar creando nuestros ''mensajes personalizados''.&lt;br /&gt;
&lt;br /&gt;
===Creación de mensajes personalizados en ROS===&lt;br /&gt;
&lt;br /&gt;
Previamente [[Fernando-TFM-ROS02#Creando un package|crearemos un package]] con las dependencias necesarias para nuestros programas (std_msgs geometry_msgs roscpp). Dentro de este ''package'' crearemos una carpeta llamada &amp;quot;msg&amp;quot;, donde colocaremos los siguientes archivos con la descripción de los mensajes (tipo de dato y nombre de campo). &lt;br /&gt;
&lt;br /&gt;
Comenzaremos creando un mensaje base llamado &amp;quot;servos&amp;quot;, que contendrá los datos de cada servomotor. Crearemos un archivo llamado &amp;quot;Servos.msg&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;int16 base&lt;br /&gt;
int16 arti1&lt;br /&gt;
int16 arti2&lt;br /&gt;
int16 arti3&lt;br /&gt;
int16 pinza&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vamos a crear un mensaje que contenga los datos que enviaremos a los servomotores (posición, velocidad y par). Ahora el tipo de dato que vamos a manejar es el que hemos creado anteriormente. Creamos un archivo llamado &amp;quot;WriteServos.msg&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;Servos posicion&lt;br /&gt;
Servos velocidad&lt;br /&gt;
Servos par&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para la recepción de datos de los servomotores (posición, estado y corriente) crearemos un archivo llamado &amp;quot;ReadServos.mag&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;Servos posicion&lt;br /&gt;
Servos estado&lt;br /&gt;
Servos corriente&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para permitir la creación de los mensajes en el sistema [http://www.ros.org ROS] debemos editar el archivo &amp;quot;CMakeLists.txt&amp;quot; eliminando el símbolo &amp;quot;#&amp;quot; para que deje de estar comentada la siguiente línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;# rosbuild_gensrv()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para la compilación y creación de los mensaje ejecutaremos la siguiente secuencia de comandos en un terminal, donde &amp;quot;brazo_fer&amp;quot; es el package creado para nuestros programas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como vamos a usar estos mensajes en [http://www.arduino.cc arduino], necesitamos añadirlos al ''package'' &amp;quot;rosserial&amp;quot;, ejecutando en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun rosserial_client make_library.py ~/sketchbook/libraries brazo_fer&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Programa arduino===&lt;br /&gt;
&lt;br /&gt;
El programa para la placa [http://www.arduino.cc arduino] está suscrito al ''topic'' &amp;quot;move_arm&amp;quot;, por el cual recibe los movimientos de los servomotores, y publica el ''topic'' &amp;quot;pose_arm&amp;quot;, con la información de posición, par y corriente de los servomotores. El código del programa es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ros.h&amp;gt;&lt;br /&gt;
#include &amp;lt;brazo_fer/Servos.h&amp;gt;&lt;br /&gt;
#include &amp;lt;brazo_fer/WriteServos.h&amp;gt;&lt;br /&gt;
#include &amp;lt;brazo_fer/ReadServos.h&amp;gt;&lt;br /&gt;
#include &amp;lt;std_msgs/Bool.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;DynamixelSerial1.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
ros::NodeHandle nh;&lt;br /&gt;
 &lt;br /&gt;
void mover(const brazo_fer::WriteServos&amp;amp; brazo){&lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos par = brazo.par;&lt;br /&gt;
  &lt;br /&gt;
  brazo_fer::Servos vel = brazo.velocidad;&lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos move = brazo.posicion;&lt;br /&gt;
 &lt;br /&gt;
  int posicion[4];&lt;br /&gt;
  &lt;br /&gt;
  if (par.base == 0){&lt;br /&gt;
    Dynamixel.torqueStatus(1,OFF);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    Dynamixel.torqueStatus(1,ON);&lt;br /&gt;
 &lt;br /&gt;
    Dynamixel.moveSpeed(1,move.base,vel.base);  &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  if (par.arti1 == 0){&lt;br /&gt;
    Dynamixel.torqueStatus(2,OFF);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    Dynamixel.torqueStatus(2,ON);&lt;br /&gt;
 &lt;br /&gt;
    Dynamixel.moveSpeed(2,move.arti1,vel.arti1);  &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  if (par.arti2 == 0){&lt;br /&gt;
    Dynamixel.torqueStatus(3,OFF);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    Dynamixel.torqueStatus(3,ON);&lt;br /&gt;
 &lt;br /&gt;
    Dynamixel.moveSpeed(3,move.arti2,vel.arti2);  &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  if (par.arti3 == 0){&lt;br /&gt;
    Dynamixel.torqueStatus(4,OFF);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    Dynamixel.torqueStatus(4,ON);    &lt;br /&gt;
 &lt;br /&gt;
    Dynamixel.moveSpeed(4,move.arti3,vel.arti3);  &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void pinza(const brazo_fer::WriteServos&amp;amp; pinza){&lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos par = pinza.par;&lt;br /&gt;
  &lt;br /&gt;
  brazo_fer::Servos vel = pinza.velocidad;&lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos move = pinza.posicion;&lt;br /&gt;
  &lt;br /&gt;
  int posicion;&lt;br /&gt;
  &lt;br /&gt;
  if (par.pinza == 0){&lt;br /&gt;
    Dynamixel.torqueStatus(5,OFF);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    Dynamixel.torqueStatus(5,ON);    &lt;br /&gt;
 &lt;br /&gt;
    Dynamixel.moveSpeed(5,move.pinza,vel.pinza);  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
ros::Subscriber&amp;lt;brazo_fer::WriteServos&amp;gt; move_sub(&amp;quot;move_arm&amp;quot;, &amp;amp;mover );&lt;br /&gt;
ros::Subscriber&amp;lt;brazo_fer::WriteServos&amp;gt; hand_sub(&amp;quot;hand_arm&amp;quot;, &amp;amp;pinza );&lt;br /&gt;
 &lt;br /&gt;
brazo_fer::ReadServos pec;&lt;br /&gt;
std_msgs::Bool pulsador;&lt;br /&gt;
 &lt;br /&gt;
ros::Publisher pose_pub(&amp;quot;pose_arm&amp;quot;, &amp;amp;pec);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  nh.initNode();&lt;br /&gt;
  nh.subscribe(move_sub);&lt;br /&gt;
  nh.subscribe(hand_sub);  &lt;br /&gt;
  nh.advertise(pose_pub);&lt;br /&gt;
  &lt;br /&gt;
  Dynamixel.begin(1000000,2);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  brazo_fer::Servos pos;&lt;br /&gt;
  brazo_fer::Servos est;&lt;br /&gt;
  brazo_fer::Servos cor; &lt;br /&gt;
 &lt;br /&gt;
  pos.base = Dynamixel.readPosition(1);&lt;br /&gt;
  pos.arti1 = Dynamixel.readPosition(2);&lt;br /&gt;
  pos.arti2 = Dynamixel.readPosition(3);&lt;br /&gt;
  pos.arti3 = Dynamixel.readPosition(4);&lt;br /&gt;
  pos.pinza = Dynamixel.readPosition(5);&lt;br /&gt;
 &lt;br /&gt;
  est.base = Dynamixel.moving(1);&lt;br /&gt;
  est.arti1 = Dynamixel.moving(2);&lt;br /&gt;
  est.arti2 = Dynamixel.moving(3);&lt;br /&gt;
  est.arti3 = Dynamixel.moving(4);&lt;br /&gt;
  est.pinza = Dynamixel.moving(5);      &lt;br /&gt;
 &lt;br /&gt;
  cor.base = Dynamixel.readLoad(1);&lt;br /&gt;
  cor.arti1 = Dynamixel.readLoad(2);&lt;br /&gt;
  cor.arti2 = Dynamixel.readLoad(3);&lt;br /&gt;
  cor.arti3 = Dynamixel.readLoad(4);&lt;br /&gt;
  cor.pinza = Dynamixel.readLoad(5);    &lt;br /&gt;
 &lt;br /&gt;
  pec.posicion = pos;&lt;br /&gt;
  pec.estado = est;&lt;br /&gt;
  pec.corriente = cor;  &lt;br /&gt;
 &lt;br /&gt;
  pose_pub.publish( &amp;amp;pec );&lt;br /&gt;
  &lt;br /&gt;
  nh.spinOnce();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilar y cargar el programa en la placa emplearemos el programa [http://www.arduino.cc arduino] IDE. Este programa nos servirá para otros programas de control que desarrollemos, ya que se trata de un mero intermediario.&lt;br /&gt;
&lt;br /&gt;
===Programa ROS===&lt;br /&gt;
&lt;br /&gt;
Usando las ecuaciones de la cinemática inversa este programa indica a los servomotores la posición de giro para alcanzar el punto de destino que se encuentre dentro del espacio de trabajo. Está suscrito al ''topic'' &amp;quot;point&amp;quot;, por el cual recibe el punto del espacio en el que tiene que posicionarse, evalúa la viabilidad y obra en consecuencia, tambien esta suscrito al ''topic'' &amp;quot;pose_arm&amp;quot;, donde recibe la información de los servomotores que publica el programa de [http://www.arduino.cc arduino], y publica el ''topic'' &amp;quot;move_arm&amp;quot;, donde indica al programa de [http://www.arduino.cc arduino] la posición, velocidad y par de los servomotores. Dentro del ''pakage'' creado, en el directorio &amp;quot;src&amp;quot; crearemos un fichero llamado &amp;quot;control_v01.cpp&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  #define PI 3.14159265&lt;br /&gt;
  #define L1 104&lt;br /&gt;
  #define L2 104&lt;br /&gt;
  #define Lp 60&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos move, vel, p, e, c;&lt;br /&gt;
 &lt;br /&gt;
  void posicion(const brazo_fer::ReadServos&amp;amp; pose)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
    ::p = pose.posicion;&lt;br /&gt;
    ::e = pose.estado;&lt;br /&gt;
    ::c = pose.corriente;&lt;br /&gt;
 &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  void punto(const geometry_msgs::Point&amp;amp; point)&lt;br /&gt;
  {	&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
 &lt;br /&gt;
  	double x = point.x;&lt;br /&gt;
  	double y = point.y;&lt;br /&gt;
	double z = point.z;&lt;br /&gt;
	&lt;br /&gt;
	y = y + z*tan(atan2(45,250));&lt;br /&gt;
 &lt;br /&gt;
	int coordenadas_correctas = 1;&lt;br /&gt;
 &lt;br /&gt;
	double alfa, beta, beta_a, beta_p, beta_pp, gamma, delta, delta_a, delta_p, epsilon;&lt;br /&gt;
	double z_p;&lt;br /&gt;
	double L_a, L;&lt;br /&gt;
 &lt;br /&gt;
	epsilon = 0; //Ángulo de inclinación de la pinza respecto a la horizontal&lt;br /&gt;
 &lt;br /&gt;
	alfa = (atan2(x,z)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
	z_p = sqrt(pow(z,2)+pow(x,2));&lt;br /&gt;
 &lt;br /&gt;
	L = sqrt(pow(z_p,2)+pow(y,2));&lt;br /&gt;
 &lt;br /&gt;
	L_a = sqrt(pow(y+(Lp*sin(epsilon)),2)+pow(z_p-(Lp*cos(epsilon)),2));&lt;br /&gt;
 &lt;br /&gt;
	beta_p = atan2(y+(Lp*sin(epsilon)),z_p-(Lp*cos(epsilon)));&lt;br /&gt;
	&lt;br /&gt;
	beta_pp = atan2(y,z_p);&lt;br /&gt;
 &lt;br /&gt;
	beta_a = acos((pow(L1,2)+pow(L_a,2)-pow(L2,2))/(2*L1*L_a));&lt;br /&gt;
 &lt;br /&gt;
	beta = ((beta_p+beta_a)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
	gamma = acos((pow(L1,2)+pow(L2,2)-pow(L_a,2))/(2*L1*L2));&lt;br /&gt;
 &lt;br /&gt;
	delta_a = PI-(beta_a+gamma);&lt;br /&gt;
 &lt;br /&gt;
	gamma = (gamma*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
        delta_p = acos((pow(L_a,2)+pow(Lp,2)-pow(L,2))/(2*L_a*Lp));       &lt;br /&gt;
 &lt;br /&gt;
	if (beta_pp &amp;gt; beta_p) {&lt;br /&gt;
		delta = ((2*PI-(delta_p-delta_a))*180)/PI;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		delta = ((delta_p+delta_a)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
		if (isnan(delta)) {&lt;br /&gt;
			delta = ((PI+delta_a)*180)/PI;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	if (isnan(gamma)) // si no hay solución&lt;br /&gt;
	{&lt;br /&gt;
		coordenadas_correctas = 0; &lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	::move.base = ((alfa+150)*1023)/300;&lt;br /&gt;
	::move.arti1 = ((beta+60)*1023)/300;&lt;br /&gt;
	::move.arti2 = ((gamma-30)*1023)/300;&lt;br /&gt;
	::move.arti3 = ((delta-30)*1023)/300;&lt;br /&gt;
	::move.pinza = 511;&lt;br /&gt;
&lt;br /&gt;
	::vel.base = abs(::move.base - ::p.base)/5;&lt;br /&gt;
	::vel.arti1 = abs(::move.arti1 - ::p.arti1)/5;&lt;br /&gt;
	::vel.arti2 = abs(::move.arti2 - ::p.arti2)/5;&lt;br /&gt;
	::vel.arti3 = abs(::move.arti3 - ::p.arti3)/5;&lt;br /&gt;
	::vel.pinza = abs(::move.pinza - ::p.pinza);&lt;br /&gt;
 &lt;br /&gt;
	if (coordenadas_correctas == 1 &amp;amp;&amp;amp; (205 &amp;lt;= ::move.base &amp;amp;&amp;amp; ::move.base &amp;lt;= 818) &amp;amp;&amp;amp; (120 &amp;lt;= ::move.arti1 &amp;amp;&amp;amp; ::move.arti1 &amp;lt;= 920) &amp;amp;&amp;amp; ::move.arti2 &amp;gt;= 50  &amp;amp;&amp;amp; ::move.arti3 &amp;lt;= 828) {&lt;br /&gt;
 &lt;br /&gt;
                brazo_fer::WriteServos mover;&lt;br /&gt;
 &lt;br /&gt;
                mover.posicion = ::move;                &lt;br /&gt;
                 &lt;br /&gt;
                mover.velocidad = ::vel;&lt;br /&gt;
				&lt;br /&gt;
		mover.par.base = 1;&lt;br /&gt;
		mover.par.arti1 = 1;&lt;br /&gt;
		mover.par.arti2 = 1;&lt;br /&gt;
		mover.par.arti3 = 1;&lt;br /&gt;
		mover.par.pinza = 1;&lt;br /&gt;
                &lt;br /&gt;
                move_pub_.publish(mover);&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		std::cout&amp;lt;&amp;lt;&amp;quot;error coordenadas no validas o punto fuera del alcance&amp;quot;&amp;lt;&amp;lt;std::endl;				&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;control_brazo&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber pose_sub_= n.subscribe(&amp;quot;pose_arm&amp;quot;, 1, posicion); &lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber point_sub_= n.subscribe(&amp;quot;point&amp;quot;, 1, punto); &lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilarlo y generar el ejecutable se debe añadir la siguiente línea de código al archivo &amp;quot;CMakeLists.txt&amp;quot; del ''package'' creado, donde indicamos el nombre para el ejecutable y la ruta y nombre del archivo a compilar: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;rosbuild_add_executable(control_v01 src/control_v01.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilar el programa hay que situarse en el directorio del ''package''. Simplemente con ejecutar la siguiente secuencia de comandos en un terminal se compilará y creará el ejecutable, siempre que no existan errores:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ejecutando el programa===&lt;br /&gt;
&lt;br /&gt;
Para ejecutar el programa debemos lanzar el núcleo de [http://www.ros.org ROS], si no se encuentra iniciado, ejecutando en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscore&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora debemos iniciar el nodo de la placa [http://www.arduino.cc arduino] ejecutando en un nuevo terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun rosserial_python serial_node.py /dev/ttyACM0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ejecutar el programa de control llamado &amp;quot;control_v01&amp;quot;, en un terminal nuevo ejecutaremos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun brazo_fer control_v01&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para poder publicar las coordenadas del punto al que queremos que se desplace el brazo, debemos publicar en el ''topic'' &amp;quot;point&amp;quot;, al que esta suscrito el programa de control para recibir el punto. Ejecutaremos en un nuevo terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub place_point geometry_msgs/Point '{x: 50, y: 100, z: 150}' --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El brazo comenzará a desplazarse y se detendrá al llegar al punto que le hemos indicado. En el siguiente vídeo se puede ver como el brazo se posiciona en el punto que le indicamos desde uno de partida:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;iwAcutO3C8g&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=iwAcutO3C8g Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Cuarto programa (Agarra la botella)==&lt;br /&gt;
&lt;br /&gt;
===Archivo include con funciones===&lt;br /&gt;
&lt;br /&gt;
Con el objetivo de simplificar y hacer más legibles los programas se ha creado este archivo que contiene las funciones de control del brazo. Crearemos un archivo llamado &amp;quot;brazo_fer.h&amp;quot; dentro del directorio &amp;quot;include/brazo_fer&amp;quot; del ''package'' creado con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifndef brazo_fer_H&lt;br /&gt;
#define brazo_fer_H&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;std_msgs/Int16.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot; &lt;br /&gt;
  &lt;br /&gt;
  #define PI 3.14159265&lt;br /&gt;
  #define L1 104&lt;br /&gt;
  #define L2 104&lt;br /&gt;
  #define Lp 60  &lt;br /&gt;
&lt;br /&gt;
geometry_msgs::Point directa(brazo_fer::Servos posicion_servos_0, int inclinacion_pinza)&lt;br /&gt;
  {&lt;br /&gt;
	&lt;br /&gt;
	double alfa, beta, beta_a, beta_p, beta_pp, gamma, delta, delta_a, delta_p1, delta_p2, epsilon;&lt;br /&gt;
	double z_p;&lt;br /&gt;
	double L_a, L;&lt;br /&gt;
	double a, b;&lt;br /&gt;
	double x, y, z;&lt;br /&gt;
	&lt;br /&gt;
	alfa = (((posicion_servos_0.base*300)/1023)-150)*PI/180;&lt;br /&gt;
	beta = (((posicion_servos_0.arti1*300)/1023)-60)*PI/180;&lt;br /&gt;
	gamma = (((posicion_servos_0.arti2*300)/1023)+30)*PI/180;&lt;br /&gt;
	delta = (((posicion_servos_0.arti3*300)/1023)+30)*PI/180;&lt;br /&gt;
	&lt;br /&gt;
	epsilon = (inclinacion_pinza*PI)/180;	&lt;br /&gt;
	&lt;br /&gt;
	L_a = sqrt(pow(L1,2)+pow(L2,2)-2*L1*L2*cos(gamma));&lt;br /&gt;
	&lt;br /&gt;
	beta_a = acos((pow(L1,2)+pow(L_a,2)-pow(L2,2))/(2*L1*L_a));&lt;br /&gt;
	&lt;br /&gt;
	beta_p = beta - beta_a;&lt;br /&gt;
	&lt;br /&gt;
	delta_a = PI - (beta_a + gamma);&lt;br /&gt;
	&lt;br /&gt;
	delta_p1 = delta - delta_a;&lt;br /&gt;
	&lt;br /&gt;
	delta_p2 = 2*PI - (delta - delta_a);&lt;br /&gt;
	&lt;br /&gt;
	if (delta_p1 &amp;lt; delta_p2) &lt;br /&gt;
	{&lt;br /&gt;
		L = sqrt(pow(L_a,2)+pow(Lp,2)-2*L_a*Lp*cos(delta_p1));&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		L = sqrt(pow(L_a,2)+pow(Lp,2)-2*L_a*Lp*cos(delta_p2));&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	z_p = L_a*cos(beta_p) + Lp*cos(epsilon);&lt;br /&gt;
	&lt;br /&gt;
	beta_pp = acos(z_p/L);&lt;br /&gt;
	&lt;br /&gt;
	a = L1*sin(beta);&lt;br /&gt;
	&lt;br /&gt;
	b = L2*sin(beta+gamma)+Lp*sin(epsilon);&lt;br /&gt;
	&lt;br /&gt;
	if (a &amp;gt;= b) &lt;br /&gt;
	{&lt;br /&gt;
		y = L*sin(beta_pp);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		y = -L*sin(beta_pp);&lt;br /&gt;
	}	&lt;br /&gt;
	&lt;br /&gt;
	z = z_p*cos(alfa);&lt;br /&gt;
	&lt;br /&gt;
	x = z_p*sin(alfa);&lt;br /&gt;
	&lt;br /&gt;
	geometry_msgs::Point punto;&lt;br /&gt;
	&lt;br /&gt;
	punto.x = x;&lt;br /&gt;
	punto.y = y;&lt;br /&gt;
	punto.z = z;&lt;br /&gt;
	&lt;br /&gt;
	return punto; &lt;br /&gt;
  } &lt;br /&gt;
  &lt;br /&gt;
brazo_fer::WriteServos inversa(geometry_msgs::Point destino, int inclinacion_pinza, brazo_fer::Servos posicion_servos_0, int velocidad) &lt;br /&gt;
  {&lt;br /&gt;
	  &lt;br /&gt;
	double x = destino.x;&lt;br /&gt;
  	double y = destino.y;&lt;br /&gt;
	double z = destino.z;&lt;br /&gt;
&lt;br /&gt;
	int coordenadas_correctas = 1;&lt;br /&gt;
&lt;br /&gt;
	double alfa, beta, beta_a, beta_p, beta_pp, gamma, delta, delta_a, delta_p, epsilon;&lt;br /&gt;
	double z_p;&lt;br /&gt;
	double L_a, L;&lt;br /&gt;
 &lt;br /&gt;
	epsilon = (inclinacion_pinza*PI)/180;&lt;br /&gt;
 &lt;br /&gt;
	alfa = (atan2(x,z)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
	z_p = sqrt(pow(z,2)+pow(x,2));&lt;br /&gt;
 &lt;br /&gt;
	L = sqrt(pow(z_p,2)+pow(y,2));&lt;br /&gt;
 &lt;br /&gt;
	L_a = sqrt(pow(y+(Lp*sin(epsilon)),2)+pow(z_p-(Lp*cos(epsilon)),2));&lt;br /&gt;
 &lt;br /&gt;
	beta_p = atan2(y+(Lp*sin(epsilon)),z_p-(Lp*cos(epsilon)));&lt;br /&gt;
	&lt;br /&gt;
	beta_pp = atan2(y,z_p);&lt;br /&gt;
 &lt;br /&gt;
	beta_a = acos((pow(L1,2)+pow(L_a,2)-pow(L2,2))/(2*L1*L_a));&lt;br /&gt;
 &lt;br /&gt;
	beta = ((beta_p+beta_a)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
	gamma = acos((pow(L1,2)+pow(L2,2)-pow(L_a,2))/(2*L1*L2));&lt;br /&gt;
 &lt;br /&gt;
	delta_a = PI-(beta_a+gamma);&lt;br /&gt;
 &lt;br /&gt;
	gamma = (gamma*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
        delta_p = acos((pow(L_a,2)+pow(Lp,2)-pow(L,2))/(2*L_a*Lp));       &lt;br /&gt;
 &lt;br /&gt;
	if (beta_pp &amp;gt; beta_p) {&lt;br /&gt;
		delta = ((2*PI-(delta_p-delta_a))*180)/PI;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		delta = ((delta_p+delta_a)*180)/PI;&lt;br /&gt;
 &lt;br /&gt;
		if (isnan(delta)) {&lt;br /&gt;
			delta = ((PI+delta_a)*180)/PI;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	if (isnan(gamma))&lt;br /&gt;
	{&lt;br /&gt;
		coordenadas_correctas = 0; &lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	brazo_fer::Servos posicion_servos_1;&lt;br /&gt;
	brazo_fer::Servos velocidad_servos;&lt;br /&gt;
	brazo_fer::Servos par_servos;	&lt;br /&gt;
	&lt;br /&gt;
	posicion_servos_1.base = ((alfa+150)*1023)/300;&lt;br /&gt;
	posicion_servos_1.arti1 = ((beta+60)*1023)/300;&lt;br /&gt;
	posicion_servos_1.arti2 = ((gamma-30)*1023)/300;&lt;br /&gt;
	posicion_servos_1.arti3 = ((delta-30)*1023)/300;	&lt;br /&gt;
	&lt;br /&gt;
	if (velocidad == 0)&lt;br /&gt;
	{&lt;br /&gt;
		velocidad_servos.base = abs(posicion_servos_1.base - posicion_servos_0.base)/5;&lt;br /&gt;
		if (velocidad_servos.base &amp;gt; 1023){velocidad_servos.base = 1023;}&lt;br /&gt;
		else if (velocidad_servos.base &amp;lt; 10){velocidad_servos.base = 10;}&lt;br /&gt;
		velocidad_servos.arti1 = abs(posicion_servos_1.arti1 - posicion_servos_0.arti1)/5;&lt;br /&gt;
		if (velocidad_servos.arti1 &amp;gt; 1023){velocidad_servos.arti1 = 1023;}&lt;br /&gt;
		else if (velocidad_servos.arti1 &amp;lt; 10){velocidad_servos.arti1 = 10;}&lt;br /&gt;
		velocidad_servos.arti2 = abs(posicion_servos_1.arti2 - posicion_servos_0.arti2)/5;&lt;br /&gt;
		if (velocidad_servos.arti2 &amp;gt; 1023){velocidad_servos.arti2 = 1023;}&lt;br /&gt;
		else if (velocidad_servos.arti2 &amp;lt; 10){velocidad_servos.arti2 = 10;}&lt;br /&gt;
		velocidad_servos.arti3 = abs(posicion_servos_1.arti3 - posicion_servos_0.arti3)/5;&lt;br /&gt;
		if (velocidad_servos.arti3 &amp;gt; 1023){velocidad_servos.arti3 = 1023;}&lt;br /&gt;
		else if (velocidad_servos.arti3 &amp;lt; 10){velocidad_servos.arti3 = 10;}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		velocidad_servos.base = abs(posicion_servos_1.base - posicion_servos_0.base)*(velocidad/10);&lt;br /&gt;
		if (velocidad_servos.base &amp;gt; 1023){velocidad_servos.base = 1023;}&lt;br /&gt;
		else if (velocidad_servos.base &amp;lt; 10){velocidad_servos.base = 10;}&lt;br /&gt;
		velocidad_servos.arti1 = abs(posicion_servos_1.arti1 - posicion_servos_0.arti1)*(velocidad/10);&lt;br /&gt;
		if (velocidad_servos.arti1 &amp;gt; 1023){velocidad_servos.arti1 = 1023;}&lt;br /&gt;
		else if (velocidad_servos.arti1 &amp;lt; 10){velocidad_servos.arti1 = 10;}&lt;br /&gt;
		velocidad_servos.arti2 = abs(posicion_servos_1.arti2 - posicion_servos_0.arti2)*(velocidad/10);&lt;br /&gt;
		if (velocidad_servos.arti2 &amp;gt; 1023){velocidad_servos.arti2 = 1023;}&lt;br /&gt;
		else if (velocidad_servos.arti2 &amp;lt; 10){velocidad_servos.arti2 = 10;}&lt;br /&gt;
		velocidad_servos.arti3 = abs(posicion_servos_1.arti3 - posicion_servos_0.arti3)*(velocidad/10);&lt;br /&gt;
		if (velocidad_servos.arti3 &amp;gt; 1023){velocidad_servos.arti3 = 1023;}&lt;br /&gt;
		else if (velocidad_servos.arti3 &amp;lt; 10){velocidad_servos.arti3 = 10;}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::Servos velocidad_servos_0;&lt;br /&gt;
	&lt;br /&gt;
	velocidad_servos_0.base = 0;&lt;br /&gt;
	velocidad_servos_0.arti1 = 0;&lt;br /&gt;
	velocidad_servos_0.arti2 = 0;&lt;br /&gt;
	velocidad_servos_0.arti3 = 0;&lt;br /&gt;
		&lt;br /&gt;
	par_servos.base = 1;&lt;br /&gt;
	par_servos.arti1 = 1;&lt;br /&gt;
	par_servos.arti2 = 1;&lt;br /&gt;
	par_servos.arti3 = 1;&lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::WriteServos move_arm;			&lt;br /&gt;
	&lt;br /&gt;
	if (coordenadas_correctas == 1 &amp;amp;&amp;amp; (205 &amp;lt;= posicion_servos_1.base &amp;amp;&amp;amp; posicion_servos_1.base &amp;lt;= 818) &amp;amp;&amp;amp; (120 &amp;lt;= posicion_servos_1.arti1 &amp;amp;&amp;amp; posicion_servos_1.arti1 &amp;lt;= 920) &amp;amp;&amp;amp; posicion_servos_1.arti2 &amp;gt;= 50  &amp;amp;&amp;amp; (posicion_servos_1.arti3 &amp;lt;= 828 &amp;amp;&amp;amp; posicion_servos_1.arti3 &amp;gt;= 195)) {&lt;br /&gt;
		move_arm.posicion = posicion_servos_1;&lt;br /&gt;
		move_arm.velocidad = velocidad_servos;&lt;br /&gt;
		move_arm.par = par_servos;&lt;br /&gt;
		return move_arm;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		std::cout&amp;lt;&amp;lt;&amp;quot;error coordenadas no validas o punto fuera del alcance&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		move_arm.posicion = posicion_servos_0;&lt;br /&gt;
		move_arm.velocidad = velocidad_servos_0;&lt;br /&gt;
		move_arm.par = par_servos;&lt;br /&gt;
		return move_arm;				&lt;br /&gt;
	}	  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
brazo_fer::WriteServos  control_pinza(brazo_fer::Servos posicion_servos_1, brazo_fer::Servos posicion_servos_0, brazo_fer::Servos corriente_servos)&lt;br /&gt;
  {&lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::Servos velocidad_servos;	  &lt;br /&gt;
	brazo_fer::Servos par_servos;&lt;br /&gt;
	&lt;br /&gt;
	velocidad_servos.pinza = 50;&lt;br /&gt;
	    &lt;br /&gt;
	par_servos.pinza = 1;&lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::WriteServos hand_arm;		&lt;br /&gt;
	&lt;br /&gt;
	if ((posicion_servos_1.pinza &amp;gt;= 480 &amp;amp;&amp;amp; posicion_servos_1.pinza &amp;lt;= 680 &amp;amp;&amp;amp; corriente_servos.pinza &amp;lt;= 300) || (posicion_servos_0.pinza &amp;gt; posicion_servos_1.pinza &amp;amp;&amp;amp; posicion_servos_1.pinza &amp;gt;= 480))&lt;br /&gt;
	{&lt;br /&gt;
		hand_arm.posicion = posicion_servos_1;&lt;br /&gt;
		hand_arm.velocidad = velocidad_servos;&lt;br /&gt;
		hand_arm.par = par_servos;&lt;br /&gt;
		return hand_arm;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		std::cout&amp;lt;&amp;lt;&amp;quot;Alcanzado límite de la pinza&amp;quot;&amp;lt;&amp;lt;std::endl;		&lt;br /&gt;
		hand_arm.posicion = posicion_servos_0;&lt;br /&gt;
		hand_arm.velocidad = velocidad_servos;&lt;br /&gt;
		hand_arm.par = par_servos;&lt;br /&gt;
		return hand_arm;&lt;br /&gt;
	}&lt;br /&gt;
  }  &lt;br /&gt;
  &lt;br /&gt;
geometry_msgs::Point home(brazo_fer::Servos posicion_servos_0, brazo_fer::Servos corriente_servos)&lt;br /&gt;
  { &lt;br /&gt;
	  &lt;br /&gt;
  	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);  &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);  &lt;br /&gt;
		&lt;br /&gt;
		geometry_msgs::Point punto_0;&lt;br /&gt;
		&lt;br /&gt;
		punto_0.x = 0;&lt;br /&gt;
		punto_0.y = 80;&lt;br /&gt;
		punto_0.z = 50;&lt;br /&gt;
		&lt;br /&gt;
		int inclinacion_pinza = 0;		&lt;br /&gt;
				&lt;br /&gt;
		brazo_fer::WriteServos inicio_brazo = inversa(punto_0, inclinacion_pinza, posicion_servos_0, 0);&lt;br /&gt;
	&lt;br /&gt;
		brazo_fer::Servos posicion_servos_1;&lt;br /&gt;
		&lt;br /&gt;
		posicion_servos_1.pinza = 511;&lt;br /&gt;
	&lt;br /&gt;
		brazo_fer::WriteServos inicio_pinza = control_pinza(posicion_servos_1, posicion_servos_0, corriente_servos);&lt;br /&gt;
			&lt;br /&gt;
		move_pub_.publish(inicio_brazo);&lt;br /&gt;
		&lt;br /&gt;
		hand_pub_.publish(inicio_pinza);&lt;br /&gt;
		&lt;br /&gt;
				&lt;br /&gt;
		return punto_0;&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Programa===&lt;br /&gt;
&lt;br /&gt;
Este programa ejecuta la secuencia para coger una botella pequeña de plástico (vacía, ya que la potencia de los servomotores es insuficiente para una llena, deberían emplearse más servomotores por articulación). Los pasos que realiza son los siguientes:&lt;br /&gt;
&lt;br /&gt;
# Primera aproximación (sitúa el brazo a unos 70 mm del punto indicado).&lt;br /&gt;
# Posicionamiento en el punto indicado.&lt;br /&gt;
# Cierre de la pinza (hasta tener agarrada la botella).&lt;br /&gt;
# Levantamiento y acercamiento (levanta y acerca la botella al MYRAbot)&lt;br /&gt;
&lt;br /&gt;
Dentro del package creado, en el directorio &amp;quot;src&amp;quot; crearemos un fichero llamado &amp;quot;control_v02.cpp&amp;quot; con el siguiente contenido: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/brazo_fer.h&amp;quot;     &lt;br /&gt;
  #include &amp;quot;std_msgs/Int16.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;std_msgs/String.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot; &lt;br /&gt;
  &lt;br /&gt;
  geometry_msgs::Point punto_0,punto_1;&lt;br /&gt;
  &lt;br /&gt;
  int cont = 0;&lt;br /&gt;
  int cont_1 = 0;&lt;br /&gt;
  int cont_2 = 0;&lt;br /&gt;
  int inclinacion_pinza = 0;&lt;br /&gt;
  int start = 0;&lt;br /&gt;
    &lt;br /&gt;
  brazo_fer::Servos pg, cg;&lt;br /&gt;
  brazo_fer::WriteServos move;&lt;br /&gt;
  brazo_fer::Servos pinza;&lt;br /&gt;
  brazo_fer::WriteServos pin;  &lt;br /&gt;
  brazo_fer::WriteServos error_coordenadas;&lt;br /&gt;
  &lt;br /&gt;
  brazo_fer::WriteServos acercar(geometry_msgs::Point cerca)&lt;br /&gt;
  {&lt;br /&gt;
  	double x = cerca.x;&lt;br /&gt;
  	double z = cerca.z; &lt;br /&gt;
  	 	&lt;br /&gt;
  	cerca.z = cerca.z - 70*cos(atan2(x,z));&lt;br /&gt;
  	cerca.x = cerca.x - 70*sin(atan2(x,z));&lt;br /&gt;
  	&lt;br /&gt;
  	brazo_fer::WriteServos move = inversa(cerca, ::inclinacion_pinza, ::pg, 0);&lt;br /&gt;
  	&lt;br /&gt;
  	return move;&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
    brazo_fer::WriteServos levantar_acercar(geometry_msgs::Point la)&lt;br /&gt;
  {&lt;br /&gt;
  	 	&lt;br /&gt;
  	la.x = 0;&lt;br /&gt;
  	la.y = la.y + 50;&lt;br /&gt;
   	la.z = 60;&lt;br /&gt;
  	&lt;br /&gt;
  	if (la.y &amp;lt; 75) {&lt;br /&gt;
		la.y = 75;&lt;br /&gt;
	}&lt;br /&gt;
  	 	&lt;br /&gt;
  	brazo_fer::WriteServos move = inversa(la, ::inclinacion_pinza, ::pg, 0);&lt;br /&gt;
  	&lt;br /&gt;
  	::punto_0 = la;&lt;br /&gt;
  	&lt;br /&gt;
  	return move;&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void posicion_estado_corriente(const brazo_fer::ReadServos&amp;amp; pec)   &lt;br /&gt;
  { &lt;br /&gt;
	  &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1); &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);   &lt;br /&gt;
  	   &lt;br /&gt;
	brazo_fer::Servos p = pec.posicion;  &lt;br /&gt;
&lt;br /&gt;
	::pg = pec.posicion;&lt;br /&gt;
	::cg = pec.corriente; 	&lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::Servos e = pec.estado;   &lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::Servos c = pec.corriente;   &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	if (::cont == 0)&lt;br /&gt;
	{&lt;br /&gt;
		::punto_0 = home(p, c);&lt;br /&gt;
		&lt;br /&gt;
		::punto_1 = ::punto_0;&lt;br /&gt;
	&lt;br /&gt;
		::cont = ::cont+1;&lt;br /&gt;
	&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if (::punto_0.x != ::punto_1.x || ::punto_0.y != ::punto_1.y || ::punto_0.z != ::punto_1.z ) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
  	if (::cont_1 == 0) {&lt;br /&gt;
  	&lt;br /&gt;
		::move = acercar(::punto_0); 	&lt;br /&gt;
  	&lt;br /&gt;
		move_pub_.publish(::move);&lt;br /&gt;
  	&lt;br /&gt;
		::cont_1 = ::cont_1+1;&lt;br /&gt;
  	&lt;br /&gt;
	}&lt;br /&gt;
  	  	&lt;br /&gt;
  	&lt;br /&gt;
  	if (((p.base-15) &amp;lt; ::move.posicion.base &amp;amp;&amp;amp; ::move.posicion.base &amp;lt; (p.base+15)) &amp;amp;&amp;amp; ((p.arti1-15) &amp;lt; ::move.posicion.arti1 &amp;amp;&amp;amp; ::move.posicion.arti1 &amp;lt; (p.arti1+15)) &amp;amp;&amp;amp; ((p.arti2-15) &amp;lt; ::move.posicion.arti2 &amp;amp;&amp;amp; ::move.posicion.arti2 &amp;lt; (p.arti2+15)) &amp;amp;&amp;amp; ((p.arti3-15) &amp;lt; ::move.posicion.arti3 &amp;amp;&amp;amp; ::move.posicion.arti3 &amp;lt; (p.arti3+15))) {	&lt;br /&gt;
			&lt;br /&gt;
			if (::cont_2 == 0) {&lt;br /&gt;
				&lt;br /&gt;
				::move = inversa(::punto_0, ::inclinacion_pinza, ::pg, 0);&lt;br /&gt;
  	&lt;br /&gt;
				move_pub_.publish(::move);&lt;br /&gt;
			 &lt;br /&gt;
				::cont_2 = ::cont_2+1;&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			}&lt;br /&gt;
			else {	 &lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			  	if (((p.base-15) &amp;lt; ::move.posicion.base &amp;amp;&amp;amp; ::move.posicion.base &amp;lt; (p.base+15)) &amp;amp;&amp;amp; ((p.arti1-15) &amp;lt; ::move.posicion.arti1 &amp;amp;&amp;amp; ::move.posicion.arti1 &amp;lt; (p.arti1+15)) &amp;amp;&amp;amp; ((p.arti2-15) &amp;lt; ::move.posicion.arti2 &amp;amp;&amp;amp; ::move.posicion.arti2 &amp;lt; (p.arti2+15)) &amp;amp;&amp;amp; ((p.arti3-15) &amp;lt; ::move.posicion.arti3 &amp;amp;&amp;amp; ::move.posicion.arti3 &amp;lt; (p.arti3+15))) {&lt;br /&gt;
				&lt;br /&gt;
				&lt;br /&gt;
				::pinza.pinza = p.pinza;&lt;br /&gt;
				&lt;br /&gt;
					if(::pin.posicion.pinza != p.pinza) {&lt;br /&gt;
					&lt;br /&gt;
						std::cout&amp;lt;&amp;lt;c.pinza&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
				&lt;br /&gt;
						::pinza.pinza = ::pinza.pinza + 20;&lt;br /&gt;
					&lt;br /&gt;
						::pin = control_pinza(::pinza, p, c);&lt;br /&gt;
					&lt;br /&gt;
						hand_pub_.publish(::pin);&lt;br /&gt;
						&lt;br /&gt;
					}&lt;br /&gt;
					else {&lt;br /&gt;
					&lt;br /&gt;
						std::cout&amp;lt;&amp;lt;&amp;quot;Agarrado&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
				&lt;br /&gt;
						::move = levantar_acercar(::punto_0);				&lt;br /&gt;
			&lt;br /&gt;
						move_pub_.publish(::move);&lt;br /&gt;
					&lt;br /&gt;
						::punto_1 = ::punto_0;&lt;br /&gt;
					&lt;br /&gt;
						::cont_1 = 0;&lt;br /&gt;
						::cont_2 = 0;&lt;br /&gt;
				}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
			&lt;br /&gt;
			std::cout&amp;lt;&amp;lt;&amp;quot;En movimiento&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	  &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  void punto(const geometry_msgs::Point&amp;amp; point)   &lt;br /&gt;
  {	&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   //Publicación del topic &amp;quot;move_arm&amp;quot;&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);   //Publicación del topic &amp;quot;hand_arm&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	::punto_0 = point;&lt;br /&gt;
&lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;control_recogida&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
	&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber pose_sub_= n.subscribe(&amp;quot;pose_arm&amp;quot;, 1, posicion_estado_corriente);&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber point_sub_= n.subscribe(&amp;quot;pick_point&amp;quot;, 1, punto);&lt;br /&gt;
  	&lt;br /&gt;
	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);&lt;br /&gt;
&lt;br /&gt;
	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);	&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	ros::spin();&lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilarlo y generar el ejecutable se debe añadir la siguiente línea de código al archivo &amp;quot;CMakeLists.txt&amp;quot; del package creado, donde indicamos el nombre para el ejecutable y la ruta y nombre del archivo a compilar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;rosbuild_add_executable(contro_v02 src/control_v02.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilar el programa hay que situarse en el directorio del package. Simplemente con ejecutar la siguiente secuencia de comandos en un terminal se compilará y creará el ejecutable, siempre que no existan errores:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ejecutando el programa===&lt;br /&gt;
&lt;br /&gt;
Para ejecutar el programa debemos lanzar el núcleo de ROS, si no se encuentra iniciado, ejecutando en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscore&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora debemos iniciar el nodo de la placa arduino ejecutando en un nuevo terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun rosserial_python serial_node.py /dev/ttyACM0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ejecutar el programa de control llamado &amp;quot;control_v02&amp;quot;, en un terminal nuevo ejecutaremos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun brazo_fer control_v02&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para poder publicar las coordenadas del punto donde se encuentra la botella (ya que no disponemos de otros medios para calcular la posición, se colocará la botella en una posición conocida), debemos publicar en el topic &amp;quot;pick_point&amp;quot;, al que esta suscrito el programa de control para recibir el punto. Ejecutaremos en un nuevo terminal el siguiente comando (en este caso la posición en la que se encuentra la botella):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub pick_point geometry_msgs/Point '{x: -150, y: 0, z: 150}' --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo se puede ver la ejecución de la secuencia para la recogida de una botella:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;0FcB6-i23cU&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=0FcB6-i23cU Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Quinto programa (posa la botella)==&lt;br /&gt;
&lt;br /&gt;
Este programa ejecuta la secuencia para posar la botella que hemos cogido. Los pasos que realiza son los siguientes:&lt;br /&gt;
&lt;br /&gt;
# Posicionamiento en el punto indicado.&lt;br /&gt;
# Apertura de la pinza (hasta soltar la botella).&lt;br /&gt;
# Separación (sitúa el brazo a unos 70 mm del punto indicado).&lt;br /&gt;
# Retorno a la posición de inicial.&lt;br /&gt;
&lt;br /&gt;
Dentro del package creado, en el directorio &amp;quot;src&amp;quot; crearemos un fichero llamado &amp;quot;control_v03.cpp&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/brazo_fer.h&amp;quot;     &lt;br /&gt;
  #include &amp;quot;std_msgs/Int16.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;std_msgs/String.h&amp;quot;   &lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  geometry_msgs::Point punto_0, punto_1;&lt;br /&gt;
  &lt;br /&gt;
  int cont = 0;&lt;br /&gt;
  int cont_1 = 0;&lt;br /&gt;
  int cont_2 = 0;&lt;br /&gt;
  int cont_3 = 0;&lt;br /&gt;
  int inclinacion_pinza = 0;&lt;br /&gt;
    &lt;br /&gt;
  brazo_fer::Servos pg, cg, pinza;&lt;br /&gt;
  brazo_fer::WriteServos move;&lt;br /&gt;
  brazo_fer::WriteServos pin;&lt;br /&gt;
  brazo_fer::WriteServos error_coordenadas;  &lt;br /&gt;
  &lt;br /&gt;
  brazo_fer::WriteServos separar(geometry_msgs::Point lejos)&lt;br /&gt;
  {&lt;br /&gt;
  	double x = lejos.x;&lt;br /&gt;
  	double z = lejos.z; &lt;br /&gt;
  	 	&lt;br /&gt;
  	lejos.z = lejos.z - 70*cos(atan2(x,z));&lt;br /&gt;
  	lejos.x = lejos.x - 70*sin(atan2(x,z));&lt;br /&gt;
  	 	&lt;br /&gt;
  	brazo_fer::WriteServos move = inversa(lejos, ::inclinacion_pinza, ::pg, 0);&lt;br /&gt;
  	&lt;br /&gt;
  	return move;&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void posicion_estado_corriente(const brazo_fer::ReadServos&amp;amp; pec)  &lt;br /&gt;
  { &lt;br /&gt;
	  &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);  &lt;br /&gt;
  	   &lt;br /&gt;
	brazo_fer::Servos p = pec.posicion;   &lt;br /&gt;
&lt;br /&gt;
	::pg = pec.posicion;&lt;br /&gt;
	::cg = pec.corriente; 	&lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::Servos e = pec.estado;   &lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::Servos c = pec.corriente;  &lt;br /&gt;
	&lt;br /&gt;
	if (::cont == 0)&lt;br /&gt;
	{&lt;br /&gt;
		::punto_0 = directa(p, inclinacion_pinza);&lt;br /&gt;
		&lt;br /&gt;
		::punto_1 = ::punto_0;&lt;br /&gt;
	&lt;br /&gt;
		::cont = ::cont+1;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if (::punto_0.x != ::punto_1.x || ::punto_0.y != ::punto_1.y || ::punto_0.z != ::punto_1.z ) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
  	if (::cont_1 == 0) {&lt;br /&gt;
  	&lt;br /&gt;
		::move = inversa(::punto_0, ::inclinacion_pinza, ::pg, 0); 	&lt;br /&gt;
  	&lt;br /&gt;
		move_pub_.publish(::move);&lt;br /&gt;
  	&lt;br /&gt;
		::cont_1 = ::cont_1+1;&lt;br /&gt;
  	&lt;br /&gt;
	}  	&lt;br /&gt;
  	&lt;br /&gt;
  	if (((p.base-15) &amp;lt; ::move.posicion.base &amp;amp;&amp;amp; ::move.posicion.base &amp;lt; (p.base+15)) &amp;amp;&amp;amp; ((p.arti1-15) &amp;lt; ::move.posicion.arti1 &amp;amp;&amp;amp; ::move.posicion.arti1 &amp;lt; (p.arti1+15)) &amp;amp;&amp;amp; ((p.arti2-15) &amp;lt; ::move.posicion.arti2 &amp;amp;&amp;amp; ::move.posicion.arti2 &amp;lt; (p.arti2+15)) &amp;amp;&amp;amp; ((p.arti3-15) &amp;lt; ::move.posicion.arti3 &amp;amp;&amp;amp; ::move.posicion.arti3 &amp;lt; (p.arti3+15))) {	&lt;br /&gt;
			&lt;br /&gt;
			if (::cont_2 == 0) {&lt;br /&gt;
				&lt;br /&gt;
				::pinza.pinza = 470;&lt;br /&gt;
				&lt;br /&gt;
				::pin = control_pinza(::pinza, p, c);&lt;br /&gt;
					&lt;br /&gt;
				hand_pub_.publish(::pin);&lt;br /&gt;
				&lt;br /&gt;
				::cont_2 = ::cont_2+1;&lt;br /&gt;
			&lt;br /&gt;
			}&lt;br /&gt;
			else {	 &lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			  	if (p.pinza &amp;lt;= 495) {&lt;br /&gt;
				&lt;br /&gt;
					if (::cont_3 == 0) {&lt;br /&gt;
					&lt;br /&gt;
						::move = separar(::punto_0);&lt;br /&gt;
		&lt;br /&gt;
						move_pub_.publish(::move);&lt;br /&gt;
						&lt;br /&gt;
						::cont_3 = ::cont_3+1;		&lt;br /&gt;
										&lt;br /&gt;
					}	&lt;br /&gt;
					&lt;br /&gt;
					else if (((p.base-15) &amp;lt; ::move.posicion.base &amp;amp;&amp;amp; ::move.posicion.base &amp;lt; (p.base+15)) &amp;amp;&amp;amp; ((p.arti1-15) &amp;lt; ::move.posicion.arti1 &amp;amp;&amp;amp; ::move.posicion.arti1 &amp;lt; (p.arti1+15)) &amp;amp;&amp;amp; ((p.arti2-15) &amp;lt; ::move.posicion.arti2 &amp;amp;&amp;amp; ::move.posicion.arti2 &amp;lt; (p.arti2+15)) &amp;amp;&amp;amp; ((p.arti3-15) &amp;lt; ::move.posicion.arti3 &amp;amp;&amp;amp; ::move.posicion.arti3 &amp;lt; (p.arti3+15))) {&lt;br /&gt;
					&lt;br /&gt;
						std::cout&amp;lt;&amp;lt;&amp;quot;Suelto&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
						&lt;br /&gt;
						::cont = 0;&lt;br /&gt;
						&lt;br /&gt;
						::cont_1 = 0;&lt;br /&gt;
						::cont_2 = 0;&lt;br /&gt;
						::cont_3 = 0;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
			&lt;br /&gt;
			std::cout&amp;lt;&amp;lt;&amp;quot;En movimiento&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
		&lt;br /&gt;
	  &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  void punto(const geometry_msgs::Point&amp;amp; point)   &lt;br /&gt;
  {	&lt;br /&gt;
	&lt;br /&gt;
	::punto_0 = point;		&lt;br /&gt;
&lt;br /&gt;
  }  &lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;control_entrega&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
	&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber pose_sub_= n.subscribe(&amp;quot;pose_arm&amp;quot;, 1, posicion_estado_corriente);  &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber point_sub_= n.subscribe(&amp;quot;place_point&amp;quot;, 1, punto);  &lt;br /&gt;
 	&lt;br /&gt;
  	&lt;br /&gt;
	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
&lt;br /&gt;
	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);  &lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	ros::spin(); &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilarlo y generar el ejecutable se debe añadir la siguiente línea de código al archivo &amp;quot;CMakeLists.txt&amp;quot; del package creado, donde indicamos el nombre para el ejecutable y la ruta y nombre del archivo a compilar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;rosbuild_add_executable(contro_v03 src/control_v03.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilar el programa hay que situarse en el directorio del package. Simplemente con ejecutar la siguiente secuencia de comandos en un terminal se compilará y creará el ejecutable, siempre que no existan errores:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ejecutando el programa===&lt;br /&gt;
&lt;br /&gt;
Para ejecutar el programa debemos lanzar el núcleo de ROS, si no se encuentra iniciado, ejecutando en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscore&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora debemos iniciar el nodo de la placa arduino ejecutando en un nuevo terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun rosserial_python serial_node.py /dev/ttyACM0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ejecutar el programa de control llamado &amp;quot;control_v03&amp;quot;, en un terminal nuevo ejecutaremos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun brazo_fer control_v03&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para poder publicar las coordenadas del punto donde queremos posar la botella, debemos publicar en el ''topic'' &amp;quot;place_point&amp;quot;, al que esta suscrito el programa de control para recibir el punto. Ejecutaremos en un nuevo terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub point geometry_msgs/Point '{x: 150, y: 0, z: 150}' --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sexto programa (Sigue el camino recto)==&lt;br /&gt;
&lt;br /&gt;
Se ha creado un programa que desplaza el brazo desde el punto en el que se encuentre al que le indiquemos, siguiendo la línea recta que une los puntos. Dentro del ''package'' creado, en el directorio &amp;quot;src&amp;quot; crearemos un fichero llamado &amp;quot;control_v04.cpp&amp;quot; con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/brazo_fer.h&amp;quot;   &lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
  brazo_fer::Servos  p, e, c;&lt;br /&gt;
  brazo_fer::WriteServos destino, mover;  &lt;br /&gt;
  geometry_msgs::Point punto_0, punto_1, punto_i;&lt;br /&gt;
  double lambda = 0;&lt;br /&gt;
  int inclinacion_pinza = 0;&lt;br /&gt;
  int cont = 0; &lt;br /&gt;
 &lt;br /&gt;
  void posicion(const brazo_fer::ReadServos&amp;amp; pose)&lt;br /&gt;
  {&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);  &lt;br /&gt;
 &lt;br /&gt;
	::p = pose.posicion;&lt;br /&gt;
        ::e = pose.estado;&lt;br /&gt;
        ::c = pose.corriente;&lt;br /&gt;
    &lt;br /&gt;
    if (cont == 0)&lt;br /&gt;
    {&lt;br /&gt;
		::punto_0 = home(::p, ::c);&lt;br /&gt;
    &lt;br /&gt;
		::punto_1 = ::punto_0;&lt;br /&gt;
		&lt;br /&gt;
		cont = 1;&lt;br /&gt;
	}&lt;br /&gt;
    &lt;br /&gt;
	if ((::punto_0.x != ::punto_1.x || ::punto_0.y != ::punto_1.y || ::punto_0.z != ::punto_1.z) &amp;amp;&amp;amp; ((::p.base-15) &amp;lt; ::mover.posicion.base &amp;amp;&amp;amp; ::mover.posicion.base &amp;lt; (::p.base+15)) &amp;amp;&amp;amp; ((::p.arti1-15) &amp;lt; ::mover.posicion.arti1 &amp;amp;&amp;amp; ::mover.posicion.arti1 &amp;lt; (::p.arti1+15)) &amp;amp;&amp;amp; ((::p.arti2-15) &amp;lt; ::mover.posicion.arti2 &amp;amp;&amp;amp; ::mover.posicion.arti2 &amp;lt; (::p.arti2+15)) &amp;amp;&amp;amp; ((::p.arti3-15) &amp;lt; ::mover.posicion.arti3 &amp;amp;&amp;amp; ::mover.posicion.arti3 &amp;lt; (::p.arti3+15)))&lt;br /&gt;
	{	&lt;br /&gt;
    &lt;br /&gt;
		if (((::p.base-15) &amp;lt; ::destino.posicion.base &amp;amp;&amp;amp; ::destino.posicion.base &amp;lt; (::p.base+15)) &amp;amp;&amp;amp; ((::p.arti1-15) &amp;lt; ::destino.posicion.arti1 &amp;amp;&amp;amp; ::destino.posicion.arti1 &amp;lt; (::p.arti1+15)) &amp;amp;&amp;amp; ((::p.arti2-15) &amp;lt; ::destino.posicion.arti2 &amp;amp;&amp;amp; ::destino.posicion.arti2 &amp;lt; (::p.arti2+15)) &amp;amp;&amp;amp; ((::p.arti3-15) &amp;lt; ::destino.posicion.arti3 &amp;amp;&amp;amp; ::destino.posicion.arti3 &amp;lt; (::p.arti3+15))) &lt;br /&gt;
		{&lt;br /&gt;
			::punto_0 = ::punto_1;&lt;br /&gt;
			::lambda = 0;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{    &lt;br /&gt;
			geometry_msgs::Point u;&lt;br /&gt;
			&lt;br /&gt;
			//ecuación de la recta p1 = p0+lambda.u&lt;br /&gt;
			&lt;br /&gt;
			u.x = ::punto_1.x - ::punto_0.x;&lt;br /&gt;
			u.y = ::punto_1.y - ::punto_0.y;&lt;br /&gt;
			u.z = ::punto_1.z - ::punto_0.z;        &lt;br /&gt;
			&lt;br /&gt;
			double paso = abs(sqrt(pow(u.x,2)+pow(u.y,2)+pow(u.z,2))/10);&lt;br /&gt;
			   &lt;br /&gt;
			::lambda = ::lambda + 1/paso;&lt;br /&gt;
			&lt;br /&gt;
			::punto_i.x = ::punto_0.x + (::lambda)*u.x;&lt;br /&gt;
			::punto_i.y = ::punto_0.y + (::lambda)*u.y;&lt;br /&gt;
			::punto_i.z = ::punto_0.z + (::lambda)*u.z;&lt;br /&gt;
			&lt;br /&gt;
			::mover = inversa(::punto_i, ::inclinacion_pinza, ::p, 0);&lt;br /&gt;
			&lt;br /&gt;
			move_pub_.publish(::mover);&lt;br /&gt;
			 	&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  void punto(const geometry_msgs::Point&amp;amp; point)&lt;br /&gt;
  {	&lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1); &lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);&lt;br /&gt;
  	&lt;br /&gt;
	::lambda = 0;    &lt;br /&gt;
    &lt;br /&gt;
        ::punto_0 = directa(::p, ::inclinacion_pinza);  	&lt;br /&gt;
	&lt;br /&gt;
	::punto_1 = point;&lt;br /&gt;
	&lt;br /&gt;
	::destino = inversa(::punto_1, ::inclinacion_pinza, ::p, 0);&lt;br /&gt;
 &lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;control_brazo&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber pose_sub_= n.subscribe(&amp;quot;pose_arm&amp;quot;, 1, posicion); &lt;br /&gt;
 &lt;br /&gt;
  	ros::Subscriber point_sub_= n.subscribe(&amp;quot;point&amp;quot;, 1, punto); &lt;br /&gt;
 &lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1); &lt;br /&gt;
  	   &lt;br /&gt;
 &lt;br /&gt;
	ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilarlo y generar el ejecutable se debe añadir la siguiente línea de código al archivo &amp;quot;CMakeLists.txt&amp;quot; del package creado, donde indicamos el nombre para el ejecutable y la ruta y nombre del archivo a compilar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;rosbuild_add_executable(contro_v04 src/control_v04.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilar el programa hay que situarse en el directorio del package. Simplemente con ejecutar la siguiente secuencia de comandos en un terminal se compilará y creará el ejecutable, siempre que no existan errores:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ejecutando el programa===&lt;br /&gt;
&lt;br /&gt;
Para ejecutar el programa debemos lanzar el núcleo de ROS, si no se encuentra iniciado, ejecutando en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscore&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora debemos iniciar el nodo de la placa arduino ejecutando en un nuevo terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun rosserial_python serial_node.py /dev/ttyACM0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ejecutar el programa de control llamado &amp;quot;control_v04&amp;quot;, en un terminal nuevo ejecutaremos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun brazo_fer control_v04&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para poder publicar las coordenadas del punto donde queremos que se deplace el brazo, debemos publicar en el topic &amp;quot;point&amp;quot;, al que esta suscrito el programa de control para recibir el punto. Ejecutaremos en un nuevo terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rostopic pub point geometry_msgs/Point '{x: 150, y: 100, z: 0}' --once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Séptimo programa (Teleoperador)==&lt;br /&gt;
&lt;br /&gt;
Se ha desarrollado un programa tele-operador para poder manejar el brazo en modo manual usando el teclado del PC. Dentro del ''package'' creado, en el directorio &amp;quot;src&amp;quot; crearemos un fichero llamado &amp;quot;teleoperador_teclado.cpp&amp;quot; con el siguiente contenido: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/Servos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/WriteServos.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;brazo_fer/ReadServos.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;brazo_fer/brazo_fer.h&amp;quot;  &lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;std_msgs/Int16.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;std_msgs/String.h&amp;quot;  &lt;br /&gt;
  #include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;termios.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
  &lt;br /&gt;
  #define KEYCODE_Xmas 0x43 &lt;br /&gt;
  #define KEYCODE_Xmenos 0x44&lt;br /&gt;
  #define KEYCODE_Ymas 0x41&lt;br /&gt;
  #define KEYCODE_Ymenos 0x42&lt;br /&gt;
  #define KEYCODE_Zmas 0x77&lt;br /&gt;
  #define KEYCODE_Zmenos 0x73&lt;br /&gt;
  #define KEYCODE_Pabrir 0x61&lt;br /&gt;
  #define KEYCODE_Pcerrar 0x64&lt;br /&gt;
  #define KEYCODE_PinclinarMas 0x65&lt;br /&gt;
  #define KEYCODE_PinclinarMenos 0x71  &lt;br /&gt;
  &lt;br /&gt;
struct termios cooked, raw; &lt;br /&gt;
&lt;br /&gt;
int cont = 0;&lt;br /&gt;
&lt;br /&gt;
double retardo = 0.11;&lt;br /&gt;
&lt;br /&gt;
  geometry_msgs::Point punto;&lt;br /&gt;
  brazo_fer::Servos vel;&lt;br /&gt;
  brazo_fer::Servos pinza, p, c;&lt;br /&gt;
  &lt;br /&gt;
  int pinza_incli = 0;&lt;br /&gt;
  &lt;br /&gt;
	&lt;br /&gt;
void posicion_estado_corriente(const brazo_fer::ReadServos&amp;amp; pec) &lt;br /&gt;
  { &lt;br /&gt;
	     &lt;br /&gt;
	::p = pec.posicion;  &lt;br /&gt;
	::c = pec.corriente;&lt;br /&gt;
&lt;br /&gt;
  }	  &lt;br /&gt;
 &lt;br /&gt;
void quit(int sig)&lt;br /&gt;
{&lt;br /&gt;
  tcsetattr(0, TCSANOW, &amp;amp;cooked);&lt;br /&gt;
  ros::shutdown();&lt;br /&gt;
  exit(0);&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void callback(const ros::TimerEvent&amp;amp;)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;   	&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1); &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);  	  	&lt;br /&gt;
&lt;br /&gt;
	ros::Time anterior;&lt;br /&gt;
	&lt;br /&gt;
	brazo_fer::WriteServos teleop;&lt;br /&gt;
	brazo_fer::WriteServos teleop_pinza;	&lt;br /&gt;
&lt;br /&gt;
	if (::cont == 0)&lt;br /&gt;
    {&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		&lt;br /&gt;
		::punto = home(::p, ::c);&lt;br /&gt;
		&lt;br /&gt;
		::cont = 1;&lt;br /&gt;
		&lt;br /&gt;
		::pinza.pinza = 511;&lt;br /&gt;
		&lt;br /&gt;
		teleop = inversa(::punto, ::pinza_incli, ::p, 0);&lt;br /&gt;
		teleop_pinza = control_pinza(::pinza, ::p, ::c);&lt;br /&gt;
		&lt;br /&gt;
		//std::cout&amp;lt;&amp;lt;teleop&amp;lt;&amp;lt;&amp;quot;-&amp;quot;&amp;lt;&amp;lt;teleop_pinza&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
  char c;&lt;br /&gt;
&lt;br /&gt;
  // get the console in raw mode                                                              &lt;br /&gt;
  tcgetattr(0, &amp;amp;cooked);&lt;br /&gt;
  memcpy(&amp;amp;raw, &amp;amp;cooked, sizeof(struct termios));&lt;br /&gt;
  raw.c_lflag &amp;amp;=~ (ICANON | ECHO);&lt;br /&gt;
  // Setting a new line, then end of file                         &lt;br /&gt;
  raw.c_cc[VEOL] = 1;&lt;br /&gt;
  raw.c_cc[VEOF] = 2;&lt;br /&gt;
  tcsetattr(0, TCSANOW, &amp;amp;raw);&lt;br /&gt;
&lt;br /&gt;
  puts(&amp;quot;&amp;quot;); &lt;br /&gt;
  puts(&amp;quot;#####################################################&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;                   CONTROLES BRAZO&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;#####################################################&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;&amp;quot;);  &lt;br /&gt;
  puts(&amp;quot;Flecha arriba:________ Subir pinza&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Flecha abajo:_________ Bajar pinza&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Flecha izquierda:_____ Desplazar pinza a la izquierda&amp;quot;); &lt;br /&gt;
  puts(&amp;quot;Flecha derecha:_______ Desplazar pinza a la derecha&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Tecla W:______________ Desplazar pinza hacia delante&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Tecla S:______________ Desplazar pinza hacia atrás&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Tecla A:______________ Abrir pinza&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Tecla D:______________ Cerrar pinza&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Tecla Q:______________ Inclinar pinza hacia arriba&amp;quot;);&lt;br /&gt;
  puts(&amp;quot;Tecla E:______________ Inclinar pinza hacia abajo&amp;quot;);                 &lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
    while (ros::ok())&lt;br /&gt;
    {&lt;br /&gt;
				&lt;br /&gt;
    // get the next event from the keyboard  &lt;br /&gt;
    if(read(0, &amp;amp;c, 1) &amp;lt; 0)&lt;br /&gt;
    {&lt;br /&gt;
      perror(&amp;quot;read():&amp;quot;);&lt;br /&gt;
      exit(-1);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
      if (c == KEYCODE_Xmas)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{&lt;br /&gt;
		::punto.x = ::punto.x - 5;&lt;br /&gt;
		teleop = inversa(::punto, ::pinza_incli, ::p, 0);&lt;br /&gt;
		if (teleop.posicion.base == ::p.base &amp;amp;&amp;amp; teleop.posicion.arti1 == ::p.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == ::p.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == ::p.arti3) &lt;br /&gt;
		{::punto.x = ::punto.x + 5;}&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}			&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Xmenos)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{      &lt;br /&gt;
		::punto.x = ::punto.x + 5;&lt;br /&gt;
		teleop = inversa(::punto, ::pinza_incli, ::p, 0);&lt;br /&gt;
		if (teleop.posicion.base == ::p.base &amp;amp;&amp;amp; teleop.posicion.arti1 == ::p.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == ::p.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == ::p.arti3) &lt;br /&gt;
		{::punto.x = ::punto.x - 5;}&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}				&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Ymas)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{      &lt;br /&gt;
		::punto.y = ::punto.y + 5;&lt;br /&gt;
		teleop = inversa(::punto, ::pinza_incli, ::p, 0);&lt;br /&gt;
		if (teleop.posicion.base == ::p.base &amp;amp;&amp;amp; teleop.posicion.arti1 == ::p.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == ::p.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == ::p.arti3) &lt;br /&gt;
		{::punto.y = ::punto.y - 5;}&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}					    &lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Ymenos)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{      &lt;br /&gt;
		::punto.y = ::punto.y - 5;&lt;br /&gt;
		teleop = inversa(::punto, ::pinza_incli, ::p, 0);&lt;br /&gt;
		if (teleop.posicion.base == ::p.base &amp;amp;&amp;amp; teleop.posicion.arti1 == ::p.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == ::p.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == ::p.arti3) &lt;br /&gt;
		{::punto.y = ::punto.y + 5;}		&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}						&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Zmas)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{      &lt;br /&gt;
		::punto.z = ::punto.z + 5;&lt;br /&gt;
		teleop = inversa(::punto, ::pinza_incli, ::p, 0);&lt;br /&gt;
		if (teleop.posicion.base == ::p.base &amp;amp;&amp;amp; teleop.posicion.arti1 == ::p.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == ::p.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == ::p.arti3)  &lt;br /&gt;
		{::punto.z = ::punto.z - 5;}		&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}					&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Zmenos)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{      &lt;br /&gt;
		::punto.z = ::punto.z - 5;&lt;br /&gt;
		teleop = inversa(::punto, ::pinza_incli, ::p, 0);&lt;br /&gt;
		if (teleop.posicion.base == ::p.base &amp;amp;&amp;amp; teleop.posicion.arti1 == ::p.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == ::p.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == ::p.arti3) &lt;br /&gt;
		{::punto.z = ::punto.z + 5;}	&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}				&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Pabrir)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{      &lt;br /&gt;
		::pinza.pinza = ::pinza.pinza - 5;&lt;br /&gt;
		teleop_pinza = control_pinza(::pinza, ::p, ::c);&lt;br /&gt;
		if (teleop_pinza.posicion.pinza == ::p.pinza) {::pinza.pinza = ::pinza.pinza + 5;}		&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_Pcerrar)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{      &lt;br /&gt;
		::pinza.pinza = ::pinza.pinza + 5;&lt;br /&gt;
		teleop_pinza = control_pinza(::pinza, ::p, ::c);&lt;br /&gt;
		if (teleop_pinza.posicion.pinza == ::p.pinza) {::pinza.pinza = ::pinza.pinza - 5;}&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_PinclinarMas)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{      &lt;br /&gt;
		::pinza_incli = ::pinza_incli + 5;&lt;br /&gt;
		teleop = inversa(::punto, ::pinza_incli, ::p, 0);&lt;br /&gt;
		if (teleop.posicion.base == ::p.base &amp;amp;&amp;amp; teleop.posicion.arti1 == ::p.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == ::p.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == ::p.arti3) &lt;br /&gt;
		{::pinza_incli = ::pinza_incli - 5;}&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}&lt;br /&gt;
      }&lt;br /&gt;
      if (c == KEYCODE_PinclinarMenos)&lt;br /&gt;
      {&lt;br /&gt;
		if (ros::Time::now() &amp;gt; anterior + ros::Duration(::retardo))&lt;br /&gt;
		{      &lt;br /&gt;
		::pinza_incli = ::pinza_incli - 5;&lt;br /&gt;
		teleop = inversa(::punto, ::pinza_incli, ::p, 0);&lt;br /&gt;
		if (teleop.posicion.base == ::p.base &amp;amp;&amp;amp; teleop.posicion.arti1 == ::p.arti1 &amp;amp;&amp;amp; teleop.posicion.arti2 == ::p.arti2 &amp;amp;&amp;amp; teleop.posicion.arti3 == ::p.arti3) &lt;br /&gt;
		{::pinza_incli = ::pinza_incli + 5;}&lt;br /&gt;
		anterior = ros::Time::now();&lt;br /&gt;
		}&lt;br /&gt;
      }                                     &lt;br /&gt;
		&lt;br /&gt;
		if (teleop.posicion.base != ::p.base || teleop.posicion.arti1 != ::p.arti1 || teleop.posicion.arti2 != ::p.arti2 || teleop.posicion.arti3 != ::p.arti3)&lt;br /&gt;
		{&lt;br /&gt;
			move_pub_.publish(teleop);			&lt;br /&gt;
		}&lt;br /&gt;
		if (teleop_pinza.posicion.pinza != ::p.pinza)&lt;br /&gt;
		{				&lt;br /&gt;
			hand_pub_.publish(teleop_pinza);&lt;br /&gt;
		}						    	&lt;br /&gt;
&lt;br /&gt;
	}	&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;teleoperador_teclado&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber pose_sub_= n.subscribe(&amp;quot;pose_arm&amp;quot;, 1, posicion_estado_corriente);  	&lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher move_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;move_arm&amp;quot;, 1);   &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Publisher hand_pub_=n.advertise&amp;lt;brazo_fer::WriteServos&amp;gt;(&amp;quot;hand_arm&amp;quot;, 1);    &lt;br /&gt;
		 	 &lt;br /&gt;
&lt;br /&gt;
	signal(SIGINT,quit); &lt;br /&gt;
	&lt;br /&gt;
	ros::Timer timer = n.createTimer(ros::Duration(1), callback);  &lt;br /&gt;
   	   &lt;br /&gt;
 &lt;br /&gt;
	ros::spin();  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilarlo y generar el ejecutable se debe añadir la siguiente línea de código al archivo &amp;quot;CMakeLists.txt&amp;quot; del package creado, donde indicamos el nombre para el ejecutable y la ruta y nombre del archivo a compilar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;rosbuild_add_executable(teleoperador_teclado src/teleoperador_teclado.cpp)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilar el programa hay que situarse en el directorio del ''package''. Simplemente con ejecutar la siguiente secuencia de comandos en un terminal se compilará y creará el ejecutable, siempre que no existan errores:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd brazo_fer&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ejecutando el programa===&lt;br /&gt;
&lt;br /&gt;
Para ejecutar el programa debemos lanzar el núcleo de ROS, si no se encuentra iniciado, ejecutando en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscore&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora debemos iniciar el nodo de la placa arduino ejecutando en un nuevo terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun rosserial_python serial_node.py /dev/ttyACM0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ejecutar el programa de control llamado &amp;quot;teleoperador_teclado&amp;quot;, en un terminal nuevo ejecutaremos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;rosrun brazo_fer teleoperador_teclado&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_Teleoperation_with_xbox360_wireless_controller_(xbox360_controller%2bjoy)&amp;diff=4206</id>
		<title>CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_Teleoperation_with_xbox360_wireless_controller_(xbox360_controller%2bjoy)&amp;diff=4206"/>
				<updated>2014-09-29T11:00:44Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Teleoperation of CeRVaNTeS=&lt;br /&gt;
&lt;br /&gt;
We need a teleoperation system in order to take the control of the robot to make specific tasks. Currently we use the [http://es.wikipedia.org/wiki/Secure_Shell ssh] connection between the robot PC and our PC, using the keyboard. This method use a [http://es.wikipedia.org/wiki/Wi-Fi wifi] network that can fail or not available. For this reason the best option is to use a device plugged in to the PC robot with its own network. The well-chosen device is the [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows xbox360 wireless controller of microsoft].&lt;br /&gt;
&lt;br /&gt;
=xbox360 controller=&lt;br /&gt;
&lt;br /&gt;
==Description of buttons and axes==&lt;br /&gt;
&lt;br /&gt;
This controller has 6 axes and 14 buttons that are distributed like is shown below:&lt;br /&gt;
&lt;br /&gt;
* Left pad: 2 axes and 1 button.&lt;br /&gt;
* Right pad: 2 axes and 1 button.&lt;br /&gt;
* Left trigger: 1 axe.&lt;br /&gt;
* Right trigger: 1 axe.&lt;br /&gt;
* Cross: 4 buttons.&lt;br /&gt;
* Left side buttons: 4 buttons.&lt;br /&gt;
* Left button: 1 button.&lt;br /&gt;
* Right button: 1 button.&lt;br /&gt;
* &amp;quot;Back&amp;quot; button: 1 button.&lt;br /&gt;
* &amp;quot;Start&amp;quot; button: 1 button.&lt;br /&gt;
&lt;br /&gt;
The function assigned to the buttons and axes of the [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows xbox360 controller] for teleoperation of CeRVaNTeS is shown in the next picture:&lt;br /&gt;
&lt;br /&gt;
[[file:xbox360_control-CeRVaNTeS-EN.jpg|thumb|center|800px|Funcionalidad [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows xbox360 controller] for CeRVaNTeS.]]&lt;br /&gt;
&lt;br /&gt;
==Program==&lt;br /&gt;
&lt;br /&gt;
The program assigns the function to the buttons and axes. The program subscribes to the ''topic'' &amp;quot;joy&amp;quot; where is published the state of the buttons and axes and publishes the ''topics'' &amp;quot;Base_Control&amp;quot; and &amp;quot;Group_Motor_Control&amp;quot; for the control of the base and the [[CeRVaNTeS' arm control (maxon+epos2)|arm]]. We have to execute the next command in a terminal in order to create a new ''package'' named &amp;quot;cervantes_teleop&amp;quot; within our catkin workspace:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;catkin_create_pkg cervantes_teleop cervantes_epos_manager geometry_msgs sensor_msgs tf tf_conversions std_msgs moveit_core moveit_ros_perception moveit_ros_planning_interface ros_cpp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a new file named &amp;quot;teleop_xbox360.cpp&amp;quot; within the folder &amp;quot;src&amp;quot; of the created ''package'' with the content that is shown below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cpp enclose=div&amp;gt;&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;  &lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/GroupEPOSControl.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/EPOSControl.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/GroupMotorInfo.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/MotorInfo.h&amp;gt;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Pose.h&amp;quot;&lt;br /&gt;
  #include &amp;lt;tf/transform_listener.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;tf_conversions/tf_eigen.h&amp;gt;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;sensor_msgs/JointState.h&amp;quot;    &lt;br /&gt;
  #include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  // MoveIt!&lt;br /&gt;
  #include &amp;lt;moveit/robot_model_loader/robot_model_loader.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;moveit/robot_model/robot_model.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;moveit/robot_state/robot_state.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #define PI 3.14159265&lt;br /&gt;
&lt;br /&gt;
double avance = 0.005, giro = 0.05;&lt;br /&gt;
double avance_base = 0.05, giro_base = 0.1;&lt;br /&gt;
int start = 0;&lt;br /&gt;
int flanco = 0;&lt;br /&gt;
&lt;br /&gt;
geometry_msgs::Twist base;&lt;br /&gt;
&lt;br /&gt;
double pad_izquierda_x, pad_izquierda_y, gatillo_izquierda, pad_derecha_x, pad_derecha_y, gatillo_derecha;&lt;br /&gt;
int boton_a, boton_b, boton_izquierda, boton_x, boton_y, boton_derecha, boton_back, boton_start, boton_pad_izquierda, boton_pad_derecha, cruz_izquierda, cruz_derecha, cruz_arriba, cruz_abajo;&lt;br /&gt;
	 &lt;br /&gt;
 &lt;br /&gt;
  void xbox(const sensor_msgs::Joy&amp;amp; xbox_joystick)   &lt;br /&gt;
  {	&lt;br /&gt;
	&lt;br /&gt;
	::pad_izquierda_x = xbox_joystick.axes[0];&lt;br /&gt;
	::pad_izquierda_y = xbox_joystick.axes[1];&lt;br /&gt;
	::gatillo_izquierda = xbox_joystick.axes[2] -1;&lt;br /&gt;
	::pad_derecha_x = xbox_joystick.axes[3];&lt;br /&gt;
	::pad_derecha_y = xbox_joystick.axes[4];&lt;br /&gt;
	::gatillo_derecha = xbox_joystick.axes[5] -1;&lt;br /&gt;
	&lt;br /&gt;
	::boton_a = xbox_joystick.buttons[0];&lt;br /&gt;
	::boton_b = xbox_joystick.buttons[1];&lt;br /&gt;
	::boton_x = xbox_joystick.buttons[2];&lt;br /&gt;
	::boton_y = xbox_joystick.buttons[3];&lt;br /&gt;
	::boton_izquierda = xbox_joystick.buttons[4];&lt;br /&gt;
	::boton_derecha = xbox_joystick.buttons[5];&lt;br /&gt;
	::boton_back = xbox_joystick.buttons[6];&lt;br /&gt;
	::boton_start = xbox_joystick.buttons[7];&lt;br /&gt;
	::boton_pad_izquierda = xbox_joystick.buttons[9];&lt;br /&gt;
	::boton_pad_derecha = xbox_joystick.buttons[10];	&lt;br /&gt;
	::cruz_izquierda = xbox_joystick.buttons[11];&lt;br /&gt;
	::cruz_derecha = xbox_joystick.buttons[12];&lt;br /&gt;
	::cruz_arriba = xbox_joystick.buttons[13];&lt;br /&gt;
	::cruz_abajo = xbox_joystick.buttons[14];	&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;teleoperador_xbox360&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;  &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber joystick_sub_= n.subscribe(&amp;quot;joy&amp;quot;, 1, xbox); &lt;br /&gt;
  	&lt;br /&gt;
  	&lt;br /&gt;
	ros::Publisher move_pub_=n.advertise&amp;lt;cervantes_epos_manager::GroupEPOSControl&amp;gt;(&amp;quot;Group_Motor_Control&amp;quot;, 1);   &lt;br /&gt;
	&lt;br /&gt;
	ros::Publisher base_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;Base_Control&amp;quot;, 1); &lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	robot_model_loader::RobotModelLoader robot_model_loader(&amp;quot;robot_description&amp;quot;);&lt;br /&gt;
	robot_model::RobotModelPtr kinematic_model = robot_model_loader.getModel();&lt;br /&gt;
&lt;br /&gt;
	robot_state::RobotStatePtr kinematic_state(new robot_state::RobotState(kinematic_model));&lt;br /&gt;
&lt;br /&gt;
	const robot_state::JointModelGroup* joint_model_group = kinematic_model-&amp;gt;getJointModelGroup(&amp;quot;brazo&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	std::vector&amp;lt;double&amp;gt; joint_values;&lt;br /&gt;
	&lt;br /&gt;
	std::vector&amp;lt;std::string&amp;gt; joint_names;&lt;br /&gt;
	&lt;br /&gt;
	joint_names = joint_model_group-&amp;gt;getJointModelNames();&lt;br /&gt;
	&lt;br /&gt;
	Eigen::Affine3d end_effector_state, end_effector_state_i;&lt;br /&gt;
	&lt;br /&gt;
	int cont = 0;&lt;br /&gt;
		&lt;br /&gt;
        ros::Rate loop_rate(5);	&lt;br /&gt;
	&lt;br /&gt;
	while (ros::ok())&lt;br /&gt;
	{&lt;br /&gt;
	&lt;br /&gt;
		end_effector_state = kinematic_state-&amp;gt;getGlobalLinkTransform(&amp;quot;muneca_c_link&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		if (cont == 0)&lt;br /&gt;
		{			&lt;br /&gt;
			end_effector_state_i = end_effector_state;&lt;br /&gt;
			&lt;br /&gt;
			cont = 1;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			if (::boton_start != 0 &amp;amp;&amp;amp; ::flanco == 0)&lt;br /&gt;
			{&lt;br /&gt;
				flanco = 1;&lt;br /&gt;
			}&lt;br /&gt;
			else &lt;br /&gt;
			{&lt;br /&gt;
				if (::boton_start != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::flanco = 2;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::flanco = 0;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		&lt;br /&gt;
			if (::boton_start != 0 &amp;amp;&amp;amp; ::flanco == 1)&lt;br /&gt;
			{&lt;br /&gt;
				if (::start == 0)&lt;br /&gt;
				{&lt;br /&gt;
					::start = 1;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::start = 0;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			if (::start == 1)&lt;br /&gt;
			{&lt;br /&gt;
&lt;br /&gt;
				if (::pad_derecha_x &amp;gt; 0.2 || ::pad_derecha_x &amp;lt; -0.2 || pad_derecha_y &amp;gt; 0.2 || pad_derecha_y &amp;lt; -0.2 ||&lt;br /&gt;
					(::gatillo_izquierda &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_izquierda != -1) || &lt;br /&gt;
					(::gatillo_derecha &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_derecha != -1) || &lt;br /&gt;
					::cruz_izquierda !=  0 || ::cruz_derecha !=  0 || ::cruz_arriba != 0 || ::cruz_abajo != 0 || &lt;br /&gt;
					::boton_back != 0 || &lt;br /&gt;
					::boton_izquierda != 0 || ::boton_derecha != 0)&lt;br /&gt;
				{&lt;br /&gt;
				&lt;br /&gt;
					if (::boton_back != 0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state = end_effector_state_i;&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					if (::pad_derecha_x &amp;gt; 0.2 || ::pad_derecha_x &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(0, 0, ::pad_derecha_x * avance));&lt;br /&gt;
					}&lt;br /&gt;
		&lt;br /&gt;
					if (::pad_derecha_y &amp;gt; 0.2 || ::pad_derecha_y &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(0, -::pad_derecha_y * avance, 0));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::gatillo_izquierda &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_izquierda != -1)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(::gatillo_izquierda * (avance/2), 0, 0));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::gatillo_derecha &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_derecha != -1)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(-::gatillo_derecha * (avance/2), 0, 0));&lt;br /&gt;
					} &lt;br /&gt;
					&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_arriba !=  0)&lt;br /&gt;
					{					&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(-giro, Eigen::Vector3d::UnitZ()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_abajo !=  0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(giro, Eigen::Vector3d::UnitZ()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_derecha !=  0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(giro, Eigen::Vector3d::UnitY()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_izquierda !=  0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(-giro, Eigen::Vector3d::UnitY()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_derecha != 0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(giro, Eigen::Vector3d::UnitX()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_izquierda != 0)&lt;br /&gt;
					{   	  &lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(-giro, Eigen::Vector3d::UnitX()));&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					bool found_ik = kinematic_state-&amp;gt;setFromIK(joint_model_group, end_effector_state, 5, 0.1);&lt;br /&gt;
		&lt;br /&gt;
					if (found_ik)&lt;br /&gt;
					{&lt;br /&gt;
						cervantes_epos_manager::GroupEPOSControl arm;&lt;br /&gt;
						std::vector&amp;lt;cervantes_epos_manager::EPOSControl&amp;gt; motor_group;&lt;br /&gt;
						cervantes_epos_manager::EPOSControl motor_control;	&lt;br /&gt;
						kinematic_state-&amp;gt;copyJointGroupPositions(joint_model_group, joint_values);&lt;br /&gt;
						&lt;br /&gt;
						for(int i = 0; i &amp;lt; joint_names.size(); i++)&lt;br /&gt;
						{&lt;br /&gt;
							if (joint_names[i] == &amp;quot;hombro_a&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 3;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;hombro_b&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 5;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;codo_a&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 4;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;codo_b&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 6;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;muneca_a&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 7;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(270*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;muneca_b&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 9;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(270*16);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;muneca_c&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 8;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(270*16);&lt;br /&gt;
							}&lt;br /&gt;
							&lt;br /&gt;
							motor_control.control_mode = 3;&lt;br /&gt;
							motor_group.push_back(motor_control);&lt;br /&gt;
				&lt;br /&gt;
						}&lt;br /&gt;
						&lt;br /&gt;
						arm.motor_group = motor_group;&lt;br /&gt;
						&lt;br /&gt;
						move_pub_.publish(arm);&lt;br /&gt;
						&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						ROS_INFO(&amp;quot;Did not find IK solution&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					if (::boton_a != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::avance_base = ::avance_base - 0.01;&lt;br /&gt;
						&lt;br /&gt;
						if (::avance_base &amp;lt; 0.01)&lt;br /&gt;
						{&lt;br /&gt;
							::avance_base = 0.01;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_b != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::avance_base = ::avance_base + 0.1;&lt;br /&gt;
						&lt;br /&gt;
						if (::avance_base &amp;gt; 0.1)&lt;br /&gt;
						{&lt;br /&gt;
							::avance_base = 0.1;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::pad_izquierda_y &amp;gt; 0.2 || ::pad_izquierda_y &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						::base.linear.x = ::avance_base * ::pad_izquierda_y;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						::base.linear.x = 0.0;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_x != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::giro_base = ::giro_base - 0.01;&lt;br /&gt;
						&lt;br /&gt;
						if (::giro_base &amp;lt; 0.05)&lt;br /&gt;
						{&lt;br /&gt;
							::giro_base = 0.05;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_y != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::giro_base = ::giro_base + 0.01;&lt;br /&gt;
						&lt;br /&gt;
						if (::giro_base &amp;gt; 1)&lt;br /&gt;
						{&lt;br /&gt;
							::giro_base = 1;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::pad_izquierda_x &amp;gt; 0.2 || ::pad_izquierda_x &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						::base.angular.z = ::giro_base * ::pad_izquierda_x;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						::base.angular.z = 0.0;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		ros::spinOnce();&lt;br /&gt;
	&lt;br /&gt;
		loop_rate.sleep();&lt;br /&gt;
	}		  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will add the next code line to the file &amp;quot;CMakeLists.txt&amp;quot; of the created ''package'' where we indicate the name of the executable and the path of the file to compile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;add_executable(teleop_xbox360 src/teleop_xbox360.cpp)&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(teleop_xbox360&lt;br /&gt;
  ${catkin_LIBRARIES}&lt;br /&gt;
)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal, placed in the root folder of the our catkin work space, in order to compile and generate the executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roscd myrabot_teleop&lt;br /&gt;
make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will create a file named &amp;quot;teleop_xbox360.launch&amp;quot; within the folder &amp;quot;launch&amp;quot; of the created ''package'' with the content that is shown below in order to start all the necessary programs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find cervantes_epos_manager)/launch/cervantes_bringup.launch&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;joy&amp;quot; type=&amp;quot;joy_node&amp;quot; name=&amp;quot;joystick&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;node name=&amp;quot;teleop_xbox360&amp;quot; pkg=&amp;quot;cervantes_teleop&amp;quot; type=&amp;quot;teleop_xbox360&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will execute the next command in a terminal in order to start the teleoperator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch cervantes_teleop teleop_xbox360.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the next video we can see de teleoperation of CeRVaNTeS in the [http://gazebosim.org/ gazebo] simulator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;wF_gKr1KWfg#t=13&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=wF_gKr1KWfg#t=13 Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm and base control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Integration_of_CeRVaNTeS_in_moveIt!_(gazebo%2bmoveIt!)&amp;diff=4205</id>
		<title>Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Integration_of_CeRVaNTeS_in_moveIt!_(gazebo%2bmoveIt!)&amp;diff=4205"/>
				<updated>2014-09-29T10:59:38Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Previous steps=&lt;br /&gt;
&lt;br /&gt;
==Installation of moveIt!==&lt;br /&gt;
&lt;br /&gt;
=Configuration of CeRVaNTeS in moveIt!=&lt;br /&gt;
&lt;br /&gt;
=Execution=&lt;br /&gt;
&lt;br /&gt;
==Simple planning==&lt;br /&gt;
&lt;br /&gt;
[[file:CeRVaNTeS_rviz_moveit.png|thumb|500px|center|CeRVaNTeS in [http://wiki.ros.org/rviz rviz] with ''plugin'' of [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;myGdut2WdsE&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=myGdut2WdsE Watch in YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;9hV3UANRs2k&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=9hV3UANRs2k Watch in YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;bYtvNJHraVs&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=bYtvNJHraVs Watch in YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=CeRVaNTeS_model_for_simulation_(urdf%2bgazebo)&amp;diff=4204</id>
		<title>CeRVaNTeS model for simulation (urdf+gazebo)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=CeRVaNTeS_model_for_simulation_(urdf%2bgazebo)&amp;diff=4204"/>
				<updated>2014-09-29T10:59:11Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Components of CeRVaNTeS model=&lt;br /&gt;
&lt;br /&gt;
=Assembled of CeRVaNTeS model=&lt;br /&gt;
&lt;br /&gt;
==Display of the model in rviz==&lt;br /&gt;
&lt;br /&gt;
[[file:CeRVaNTeS_rviz.png|thumb|500px|center|CeRVaNTeS model in [http://wiki.ros.org/rviz rviz] and [http://wiki.ros.org/joint_state_publisher joint_state_publisher] interface]]&lt;br /&gt;
&lt;br /&gt;
=Load of the model in gazebo=&lt;br /&gt;
&lt;br /&gt;
[[file:CeRVaNTeS_gazebo.png|thumb|500px|center|CeRVaNTeS model in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_arm_model_for_simulation_(urdf%2bgazebo)&amp;diff=4203</id>
		<title>CeRVaNTeS' arm model for simulation (urdf+gazebo)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_arm_model_for_simulation_(urdf%2bgazebo)&amp;diff=4203"/>
				<updated>2014-09-29T10:58:38Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm and base control (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Creation of URL model=&lt;br /&gt;
&lt;br /&gt;
=Visual test of the model=&lt;br /&gt;
&lt;br /&gt;
[[file:CeRVaNTeS_arm_rviz.png|thumb|500px|center|Loaded model in [http://wiki.ros.org/rviz rviz] and the [http://en.wikipedia.org/wiki/Graphical_user_interface GUI] of [http://wiki.ros.org/joint_state_publisher joint_state_publisher]]]&lt;br /&gt;
&lt;br /&gt;
=Control of the joints for simulation=&lt;br /&gt;
&lt;br /&gt;
==Previous steps==&lt;br /&gt;
&lt;br /&gt;
==To add controllers to mobile joints==&lt;br /&gt;
&lt;br /&gt;
===Modification of the URDF===&lt;br /&gt;
&lt;br /&gt;
===Creation of the configuration files===&lt;br /&gt;
&lt;br /&gt;
==Loading the model in gazebo==&lt;br /&gt;
&lt;br /&gt;
[[file:CeRVaNTeS_arm_gazebo.png|thumb|500px|center|CeRVaNTeS's arm model in [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Teleoperaci%c3%b3n_de_CeRVaNTeS_con_controlador_inal%c3%a1mbrico_xbox360_(controlador_xbox360%2bjoy)&amp;diff=4202</id>
		<title>Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Teleoperaci%c3%b3n_de_CeRVaNTeS_con_controlador_inal%c3%a1mbrico_xbox360_(controlador_xbox360%2bjoy)&amp;diff=4202"/>
				<updated>2014-09-29T10:58:13Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Teleoperación de CeRVaNTeS=&lt;br /&gt;
&lt;br /&gt;
Para la realización de determinadas tareas es necesario hacer uso de algún sistema de teleoperación para controlar el robot. Lo más habitual es haciendo uso de una conexión [http://es.wikipedia.org/wiki/Secure_Shell ssh] con el PC del robot y usando el teclado de nuestro PC. Este método emplea una red [http://es.wikipedia.org/wiki/Wi-Fi wifi] de la cual depende la conexión entre los dos equipos, la cual puede fallar o ser inexistente. Por eso la mejor opción es emplear un dispositivo conectado al PC del robot provisto de su propia red inalámbrica. El dispositivo escogido por robustez y versatilidad ha sido el [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows controlador inalámbrico xbox360 de microsoft].&lt;br /&gt;
&lt;br /&gt;
=Controlador xbox360=&lt;br /&gt;
&lt;br /&gt;
==Descripción de botones y ejes==&lt;br /&gt;
&lt;br /&gt;
Este controlador está equipado con 6 ejes de control y 14 botones, que se reparten de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Palanca izquierda: 2 ejes y 1 botón (pulsación).&lt;br /&gt;
* Palanca derecha: 2 ejes y 1 botón (pulsación).&lt;br /&gt;
* Gatillo izquierdo: 1 eje.&lt;br /&gt;
* Gatillo derecho: 1 eje.&lt;br /&gt;
* Cruz: 4 botones.&lt;br /&gt;
* Botones lado derecho: 4 botones.&lt;br /&gt;
* Botón izquierdo: 1 botón.&lt;br /&gt;
* Botón derecho: 1 botón.&lt;br /&gt;
* Botón &amp;quot;back&amp;quot;: 1 botón.&lt;br /&gt;
* Botón &amp;quot;start&amp;quot;: 1 botón.&lt;br /&gt;
&lt;br /&gt;
En la siguiente imagen se muestra la función asignada a cada botón y eje del [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows controlador xbox360] para la teleoperación de CeRVaNTeS:&lt;br /&gt;
&lt;br /&gt;
[[file:xbox360_control-CeRVaNTeS.jpg|thumb|center|800px|Funcionalidad [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows controlador xbox360] para CeRVaNTeS.]]&lt;br /&gt;
&lt;br /&gt;
==Programa==&lt;br /&gt;
&lt;br /&gt;
Se encargará de la asignación de acciones a los diferentes botones y ejes del controlador. El programa se subscribe al ''topic'' &amp;quot;joy&amp;quot; donde se publica el estado de los botones del controlador y publica los ''topics'' &amp;quot;Base_Control&amp;quot; y &amp;quot;Group_Motor_Control&amp;quot; para el control de la base y el [[Control brazo CeRVaNTeS (maxon+epos2)|brazo]]. Comenzaremos creando un nuevo ''package'' en nuestro espacio de trabajo. Nos situaremos en nuestro espacio de trabajo catkin y ejecutaremos en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight enclose=div&amp;gt;catkin_create_pkg cervantes_teleop cervantes_epos_manager geometry_msgs sensor_msgs tf tf_conversions std_msgs moveit_core moveit_ros_perception moveit_ros_planning_interface ros_cpp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;teleop_xbox360.cpp&amp;quot; dentro del directorio &amp;quot;src&amp;quot; del ''package'' creado con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cpp enclose=div&amp;gt;&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;  &lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/GroupEPOSControl.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/EPOSControl.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/GroupMotorInfo.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/MotorInfo.h&amp;gt;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Pose.h&amp;quot;&lt;br /&gt;
  #include &amp;lt;tf/transform_listener.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;tf_conversions/tf_eigen.h&amp;gt;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;sensor_msgs/JointState.h&amp;quot;    &lt;br /&gt;
  #include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  // MoveIt!&lt;br /&gt;
  #include &amp;lt;moveit/robot_model_loader/robot_model_loader.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;moveit/robot_model/robot_model.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;moveit/robot_state/robot_state.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #define PI 3.14159265&lt;br /&gt;
&lt;br /&gt;
double avance = 0.005, giro = 0.05;&lt;br /&gt;
double avance_base = 0.05, giro_base = 0.1;&lt;br /&gt;
int start = 0;&lt;br /&gt;
int flanco = 0;&lt;br /&gt;
&lt;br /&gt;
geometry_msgs::Twist base;&lt;br /&gt;
&lt;br /&gt;
double pad_izquierda_x, pad_izquierda_y, gatillo_izquierda, pad_derecha_x, pad_derecha_y, gatillo_derecha;&lt;br /&gt;
int boton_a, boton_b, boton_izquierda, boton_x, boton_y, boton_derecha, boton_back, boton_start, boton_pad_izquierda, boton_pad_derecha, cruz_izquierda, cruz_derecha, cruz_arriba, cruz_abajo;&lt;br /&gt;
	 &lt;br /&gt;
 &lt;br /&gt;
  void xbox(const sensor_msgs::Joy&amp;amp; xbox_joystick)   &lt;br /&gt;
  {	&lt;br /&gt;
	&lt;br /&gt;
	::pad_izquierda_x = xbox_joystick.axes[0];&lt;br /&gt;
	::pad_izquierda_y = xbox_joystick.axes[1];&lt;br /&gt;
	::gatillo_izquierda = xbox_joystick.axes[2] -1;&lt;br /&gt;
	::pad_derecha_x = xbox_joystick.axes[3];&lt;br /&gt;
	::pad_derecha_y = xbox_joystick.axes[4];&lt;br /&gt;
	::gatillo_derecha = xbox_joystick.axes[5] -1;&lt;br /&gt;
	&lt;br /&gt;
	::boton_a = xbox_joystick.buttons[0];&lt;br /&gt;
	::boton_b = xbox_joystick.buttons[1];&lt;br /&gt;
	::boton_x = xbox_joystick.buttons[2];&lt;br /&gt;
	::boton_y = xbox_joystick.buttons[3];&lt;br /&gt;
	::boton_izquierda = xbox_joystick.buttons[4];&lt;br /&gt;
	::boton_derecha = xbox_joystick.buttons[5];&lt;br /&gt;
	::boton_back = xbox_joystick.buttons[6];&lt;br /&gt;
	::boton_start = xbox_joystick.buttons[7];&lt;br /&gt;
	::boton_pad_izquierda = xbox_joystick.buttons[9];&lt;br /&gt;
	::boton_pad_derecha = xbox_joystick.buttons[10];	&lt;br /&gt;
	::cruz_izquierda = xbox_joystick.buttons[11];&lt;br /&gt;
	::cruz_derecha = xbox_joystick.buttons[12];&lt;br /&gt;
	::cruz_arriba = xbox_joystick.buttons[13];&lt;br /&gt;
	::cruz_abajo = xbox_joystick.buttons[14];	&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;teleoperador_xbox360&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;  &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber joystick_sub_= n.subscribe(&amp;quot;joy&amp;quot;, 1, xbox); &lt;br /&gt;
  	&lt;br /&gt;
  	&lt;br /&gt;
	ros::Publisher move_pub_=n.advertise&amp;lt;cervantes_epos_manager::GroupEPOSControl&amp;gt;(&amp;quot;Group_Motor_Control&amp;quot;, 1);   &lt;br /&gt;
	&lt;br /&gt;
	ros::Publisher base_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;Base_Control&amp;quot;, 1); &lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	robot_model_loader::RobotModelLoader robot_model_loader(&amp;quot;robot_description&amp;quot;);&lt;br /&gt;
	robot_model::RobotModelPtr kinematic_model = robot_model_loader.getModel();&lt;br /&gt;
&lt;br /&gt;
	robot_state::RobotStatePtr kinematic_state(new robot_state::RobotState(kinematic_model));&lt;br /&gt;
&lt;br /&gt;
	const robot_state::JointModelGroup* joint_model_group = kinematic_model-&amp;gt;getJointModelGroup(&amp;quot;brazo&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	std::vector&amp;lt;double&amp;gt; joint_values;&lt;br /&gt;
	&lt;br /&gt;
	std::vector&amp;lt;std::string&amp;gt; joint_names;&lt;br /&gt;
	&lt;br /&gt;
	joint_names = joint_model_group-&amp;gt;getJointModelNames();&lt;br /&gt;
	&lt;br /&gt;
	Eigen::Affine3d end_effector_state, end_effector_state_i;&lt;br /&gt;
	&lt;br /&gt;
	int cont = 0;&lt;br /&gt;
		&lt;br /&gt;
        ros::Rate loop_rate(5);	&lt;br /&gt;
	&lt;br /&gt;
	while (ros::ok())&lt;br /&gt;
	{&lt;br /&gt;
	&lt;br /&gt;
		end_effector_state = kinematic_state-&amp;gt;getGlobalLinkTransform(&amp;quot;muneca_c_link&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		if (cont == 0)&lt;br /&gt;
		{			&lt;br /&gt;
			end_effector_state_i = end_effector_state;&lt;br /&gt;
			&lt;br /&gt;
			cont = 1;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			if (::boton_start != 0 &amp;amp;&amp;amp; ::flanco == 0)&lt;br /&gt;
			{&lt;br /&gt;
				flanco = 1;&lt;br /&gt;
			}&lt;br /&gt;
			else &lt;br /&gt;
			{&lt;br /&gt;
				if (::boton_start != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::flanco = 2;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::flanco = 0;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		&lt;br /&gt;
			if (::boton_start != 0 &amp;amp;&amp;amp; ::flanco == 1)&lt;br /&gt;
			{&lt;br /&gt;
				if (::start == 0)&lt;br /&gt;
				{&lt;br /&gt;
					::start = 1;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::start = 0;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			if (::start == 1)&lt;br /&gt;
			{&lt;br /&gt;
&lt;br /&gt;
				if (::pad_derecha_x &amp;gt; 0.2 || ::pad_derecha_x &amp;lt; -0.2 || pad_derecha_y &amp;gt; 0.2 || pad_derecha_y &amp;lt; -0.2 ||&lt;br /&gt;
					(::gatillo_izquierda &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_izquierda != -1) || &lt;br /&gt;
					(::gatillo_derecha &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_derecha != -1) || &lt;br /&gt;
					::cruz_izquierda !=  0 || ::cruz_derecha !=  0 || ::cruz_arriba != 0 || ::cruz_abajo != 0 || &lt;br /&gt;
					::boton_back != 0 || &lt;br /&gt;
					::boton_izquierda != 0 || ::boton_derecha != 0)&lt;br /&gt;
				{&lt;br /&gt;
				&lt;br /&gt;
					if (::boton_back != 0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state = end_effector_state_i;&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					if (::pad_derecha_x &amp;gt; 0.2 || ::pad_derecha_x &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(0, 0, ::pad_derecha_x * avance));&lt;br /&gt;
					}&lt;br /&gt;
		&lt;br /&gt;
					if (::pad_derecha_y &amp;gt; 0.2 || ::pad_derecha_y &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(0, -::pad_derecha_y * avance, 0));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::gatillo_izquierda &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_izquierda != -1)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(::gatillo_izquierda * (avance/2), 0, 0));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::gatillo_derecha &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_derecha != -1)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(-::gatillo_derecha * (avance/2), 0, 0));&lt;br /&gt;
 					} &lt;br /&gt;
					&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_arriba !=  0)&lt;br /&gt;
					{					&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(-giro, Eigen::Vector3d::UnitZ()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_abajo !=  0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(giro, Eigen::Vector3d::UnitZ()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
 					if (::cruz_derecha !=  0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(giro, Eigen::Vector3d::UnitY()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_izquierda !=  0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(-giro, Eigen::Vector3d::UnitY()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_derecha != 0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(giro, Eigen::Vector3d::UnitX()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_izquierda != 0)&lt;br /&gt;
					{   	  &lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(-giro, Eigen::Vector3d::UnitX()));&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 					bool found_ik = kinematic_state-&amp;gt;setFromIK(joint_model_group, end_effector_state, 5, 0.1);&lt;br /&gt;
		&lt;br /&gt;
					if (found_ik)&lt;br /&gt;
					{&lt;br /&gt;
						cervantes_epos_manager::GroupEPOSControl arm;&lt;br /&gt;
						std::vector&amp;lt;cervantes_epos_manager::EPOSControl&amp;gt; motor_group;&lt;br /&gt;
						cervantes_epos_manager::EPOSControl motor_control;	&lt;br /&gt;
						kinematic_state-&amp;gt;copyJointGroupPositions(joint_model_group, joint_values);&lt;br /&gt;
						&lt;br /&gt;
						for(int i = 0; i &amp;lt; joint_names.size(); i++)&lt;br /&gt;
						{&lt;br /&gt;
							if (joint_names[i] == &amp;quot;hombro_a&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 3;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;hombro_b&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 5;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;codo_a&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 4;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;codo_b&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 6;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;muneca_a&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 7;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(270*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;muneca_b&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 9;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(270*16);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;muneca_c&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 8;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(270*16);&lt;br /&gt;
							}&lt;br /&gt;
							&lt;br /&gt;
							motor_control.control_mode = 3;&lt;br /&gt;
							motor_group.push_back(motor_control);&lt;br /&gt;
				&lt;br /&gt;
						}&lt;br /&gt;
						&lt;br /&gt;
						arm.motor_group = motor_group;&lt;br /&gt;
						&lt;br /&gt;
						move_pub_.publish(arm);&lt;br /&gt;
						&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						ROS_INFO(&amp;quot;Did not find IK solution&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					if (::boton_a != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::avance_base = ::avance_base - 0.01;&lt;br /&gt;
						&lt;br /&gt;
						if (::avance_base &amp;lt; 0.01)&lt;br /&gt;
						{&lt;br /&gt;
							::avance_base = 0.01;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_b != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::avance_base = ::avance_base + 0.1;&lt;br /&gt;
						&lt;br /&gt;
						if (::avance_base &amp;gt; 0.1)&lt;br /&gt;
						{&lt;br /&gt;
							::avance_base = 0.1;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::pad_izquierda_y &amp;gt; 0.2 || ::pad_izquierda_y &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						::base.linear.x = ::avance_base * ::pad_izquierda_y;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						::base.linear.x = 0.0;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_x != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::giro_base = ::giro_base - 0.01;&lt;br /&gt;
						&lt;br /&gt;
						if (::giro_base &amp;lt; 0.05)&lt;br /&gt;
						{&lt;br /&gt;
							::giro_base = 0.05;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_y != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::giro_base = ::giro_base + 0.01;&lt;br /&gt;
						&lt;br /&gt;
						if (::giro_base &amp;gt; 1)&lt;br /&gt;
						{&lt;br /&gt;
							::giro_base = 1;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::pad_izquierda_x &amp;gt; 0.2 || ::pad_izquierda_x &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						::base.angular.z = ::giro_base * ::pad_izquierda_x;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						::base.angular.z = 0.0;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		ros::spinOnce();&lt;br /&gt;
	&lt;br /&gt;
		loop_rate.sleep();&lt;br /&gt;
	}		  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilarlo y generar el ejecutable se debe añadir las siguientes líneas de código al archivo &amp;quot;CMakeLists.txt&amp;quot; del ''package'' creado, donde indicamos el nombre para el ejecutable y la ruta y nombre del archivo a compilar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;add_executable(teleop_xbox360 src/teleop_xbox360.cpp)&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(teleop_xbox360&lt;br /&gt;
  ${catkin_LIBRARIES}&lt;br /&gt;
)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilar el programa hay que situarse en el directorio raiz de nuestro espacio de trabajo catkin. Simplemente con ejecutar el siguiente comando en un terminal se compilará y creará el ejecutable, siempre que no existan errores:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;catkin_make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;teleop_xbox360.launch&amp;quot; dentro del directorio &amp;quot;launch&amp;quot; del ''package'' creado con el siguiente contenido, para poder iniciar en una sola ejecución todos los programas necesarios:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find cervantes_epos_manager)/launch/cervantes_bringup.launch&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;joy&amp;quot; type=&amp;quot;joy_node&amp;quot; name=&amp;quot;joystick&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;teleop_xbox360&amp;quot; pkg=&amp;quot;cervantes_teleop&amp;quot; type=&amp;quot;teleop_xbox360&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para iniciar el teleoperador simplemente deberemos ejecutar en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch cervantes_teleop teleop_xbox360.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo puede verse el uso del teleoperador para CeRVaNTeS en el simulador [http://gazebosim.org/ gazebo]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;wF_gKr1KWfg#t=13&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=wF_gKr1KWfg#t=13 Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Teleoperaci%c3%b3n_de_CeRVaNTeS_con_controlador_inal%c3%a1mbrico_xbox360_(controlador_xbox360%2bjoy)&amp;diff=4201</id>
		<title>Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Teleoperaci%c3%b3n_de_CeRVaNTeS_con_controlador_inal%c3%a1mbrico_xbox360_(controlador_xbox360%2bjoy)&amp;diff=4201"/>
				<updated>2014-09-29T10:55:36Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Teleoperación de CeRVaNTeS=&lt;br /&gt;
&lt;br /&gt;
Para la realización de determinadas tareas es necesario hacer uso de algún sistema de teleoperación para controlar el robot. Lo más habitual es haciendo uso de una conexión [http://es.wikipedia.org/wiki/Secure_Shell ssh] con el PC del robot y usando el teclado de nuestro PC. Este método emplea una red [http://es.wikipedia.org/wiki/Wi-Fi wifi] de la cual depende la conexión entre los dos equipos, la cual puede fallar o ser inexistente. Por eso la mejor opción es emplear un dispositivo conectado al PC del robot provisto de su propia red inalámbrica. El dispositivo escogido por robustez y versatilidad ha sido el [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows controlador inalámbrico xbox360 de microsoft].&lt;br /&gt;
&lt;br /&gt;
=Controlador xbox360=&lt;br /&gt;
&lt;br /&gt;
==Descripción de botones y ejes==&lt;br /&gt;
&lt;br /&gt;
Este controlador está equipado con 6 ejes de control y 14 botones, que se reparten de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Palanca izquierda: 2 ejes y 1 botón (pulsación).&lt;br /&gt;
* Palanca derecha: 2 ejes y 1 botón (pulsación).&lt;br /&gt;
* Gatillo izquierdo: 1 eje.&lt;br /&gt;
* Gatillo derecho: 1 eje.&lt;br /&gt;
* Cruz: 4 botones.&lt;br /&gt;
* Botones lado derecho: 4 botones.&lt;br /&gt;
* Botón izquierdo: 1 botón.&lt;br /&gt;
* Botón derecho: 1 botón.&lt;br /&gt;
* Botón &amp;quot;back&amp;quot;: 1 botón.&lt;br /&gt;
* Botón &amp;quot;start&amp;quot;: 1 botón.&lt;br /&gt;
&lt;br /&gt;
En la siguiente imagen se muestra la función asignada a cada botón y eje del [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows controlador xbox360] para la teleoperación de CeRVaNTeS:&lt;br /&gt;
&lt;br /&gt;
[[file:xbox360_control-CeRVaNTeS.jpg|thumb|center|800px|Funcionalidad [http://www.microsoft.com/hardware/es-xl/p/xbox-360-wireless-controller-for-windows controlador xbox360] para CeRVaNTeS.]]&lt;br /&gt;
&lt;br /&gt;
==Programa==&lt;br /&gt;
&lt;br /&gt;
Se encargará de la asignación de acciones a los diferentes botones y ejes del controlador. El programa se subscribe al ''topic'' &amp;quot;joy&amp;quot; donde se publica el estado de los botones del controlador y publica los ''topics'' &amp;quot;Base_Control&amp;quot; y &amp;quot;Group_Motor_Control&amp;quot; para el control de la base y el [[Control brazo CeRVaNTeS (maxon+epos2)|brazo]]. Comenzaremos creando un nuevo ''package'' en nuestro espacio de trabajo. Nos situaremos en nuestro espacio de trabajo catkin y ejecutaremos en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight enclose=div&amp;gt;catkin_create_pkg cervantes_teleop cervantes_epos_manager geometry_msgs sensor_msgs tf tf_conversions std_msgs moveit_core moveit_ros_perception moveit_ros_planning_interface ros_cpp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;teleop_xbox360.cpp&amp;quot; dentro del directorio &amp;quot;src&amp;quot; del ''package'' creado con el siguiente contenido:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cpp enclose=div&amp;gt;&lt;br /&gt;
  #include &amp;quot;ros/ros.h&amp;quot;  &lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/GroupEPOSControl.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/EPOSControl.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/GroupMotorInfo.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;cervantes_epos_manager/MotorInfo.h&amp;gt;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Pose.h&amp;quot;&lt;br /&gt;
  #include &amp;lt;tf/transform_listener.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;tf_conversions/tf_eigen.h&amp;gt;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;geometry_msgs/Point.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;sensor_msgs/JointState.h&amp;quot;    &lt;br /&gt;
  #include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
  #include &amp;quot;math.h&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  // MoveIt!&lt;br /&gt;
  #include &amp;lt;moveit/robot_model_loader/robot_model_loader.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;moveit/robot_model/robot_model.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;moveit/robot_state/robot_state.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  #define PI 3.14159265&lt;br /&gt;
&lt;br /&gt;
double avance = 0.005, giro = 0.05;&lt;br /&gt;
double avance_base = 0.05, giro_base = 0.1;&lt;br /&gt;
int start = 0;&lt;br /&gt;
int flanco = 0;&lt;br /&gt;
&lt;br /&gt;
geometry_msgs::Twist base;&lt;br /&gt;
&lt;br /&gt;
double pad_izquierda_x, pad_izquierda_y, gatillo_izquierda, pad_derecha_x, pad_derecha_y, gatillo_derecha;&lt;br /&gt;
int boton_a, boton_b, boton_izquierda, boton_x, boton_y, boton_derecha, boton_back, boton_start, boton_pad_izquierda, boton_pad_derecha, cruz_izquierda, cruz_derecha, cruz_arriba, cruz_abajo;&lt;br /&gt;
	 &lt;br /&gt;
 &lt;br /&gt;
  void xbox(const sensor_msgs::Joy&amp;amp; xbox_joystick)   &lt;br /&gt;
  {	&lt;br /&gt;
	&lt;br /&gt;
	::pad_izquierda_x = xbox_joystick.axes[0];&lt;br /&gt;
	::pad_izquierda_y = xbox_joystick.axes[1];&lt;br /&gt;
	::gatillo_izquierda = xbox_joystick.axes[2] -1;&lt;br /&gt;
	::pad_derecha_x = xbox_joystick.axes[3];&lt;br /&gt;
	::pad_derecha_y = xbox_joystick.axes[4];&lt;br /&gt;
	::gatillo_derecha = xbox_joystick.axes[5] -1;&lt;br /&gt;
	&lt;br /&gt;
	::boton_a = xbox_joystick.buttons[0];&lt;br /&gt;
	::boton_b = xbox_joystick.buttons[1];&lt;br /&gt;
	::boton_x = xbox_joystick.buttons[2];&lt;br /&gt;
	::boton_y = xbox_joystick.buttons[3];&lt;br /&gt;
	::boton_izquierda = xbox_joystick.buttons[4];&lt;br /&gt;
	::boton_derecha = xbox_joystick.buttons[5];&lt;br /&gt;
	::boton_back = xbox_joystick.buttons[6];&lt;br /&gt;
	::boton_start = xbox_joystick.buttons[7];&lt;br /&gt;
	::boton_pad_izquierda = xbox_joystick.buttons[9];&lt;br /&gt;
	::boton_pad_derecha = xbox_joystick.buttons[10];	&lt;br /&gt;
	::cruz_izquierda = xbox_joystick.buttons[11];&lt;br /&gt;
	::cruz_derecha = xbox_joystick.buttons[12];&lt;br /&gt;
	::cruz_arriba = xbox_joystick.buttons[13];&lt;br /&gt;
	::cruz_abajo = xbox_joystick.buttons[14];	&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
 &lt;br /&gt;
	ros::init(argc, argv, &amp;quot;teleoperador_xbox360&amp;quot;);   &lt;br /&gt;
 &lt;br /&gt;
	ros::NodeHandle n;  &lt;br /&gt;
  	&lt;br /&gt;
  	ros::Subscriber joystick_sub_= n.subscribe(&amp;quot;joy&amp;quot;, 1, xbox); &lt;br /&gt;
  	&lt;br /&gt;
  	&lt;br /&gt;
	ros::Publisher move_pub_=n.advertise&amp;lt;cervantes_epos_manager::GroupEPOSControl&amp;gt;(&amp;quot;Group_Motor_Control&amp;quot;, 1);   &lt;br /&gt;
	&lt;br /&gt;
	ros::Publisher base_pub_=n.advertise&amp;lt;geometry_msgs::Twist&amp;gt;(&amp;quot;Base_Control&amp;quot;, 1); &lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	robot_model_loader::RobotModelLoader robot_model_loader(&amp;quot;robot_description&amp;quot;);&lt;br /&gt;
	robot_model::RobotModelPtr kinematic_model = robot_model_loader.getModel();&lt;br /&gt;
&lt;br /&gt;
	robot_state::RobotStatePtr kinematic_state(new robot_state::RobotState(kinematic_model));&lt;br /&gt;
&lt;br /&gt;
	const robot_state::JointModelGroup* joint_model_group = kinematic_model-&amp;gt;getJointModelGroup(&amp;quot;brazo&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	std::vector&amp;lt;double&amp;gt; joint_values;&lt;br /&gt;
	&lt;br /&gt;
	std::vector&amp;lt;std::string&amp;gt; joint_names;&lt;br /&gt;
	&lt;br /&gt;
	joint_names = joint_model_group-&amp;gt;getJointModelNames();&lt;br /&gt;
	&lt;br /&gt;
	Eigen::Affine3d end_effector_state, end_effector_state_i;&lt;br /&gt;
	&lt;br /&gt;
	int cont = 0;&lt;br /&gt;
		&lt;br /&gt;
        ros::Rate loop_rate(5);	&lt;br /&gt;
	&lt;br /&gt;
	while (ros::ok())&lt;br /&gt;
	{&lt;br /&gt;
	&lt;br /&gt;
		end_effector_state = kinematic_state-&amp;gt;getGlobalLinkTransform(&amp;quot;muneca_c_link&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		if (cont == 0)&lt;br /&gt;
		{			&lt;br /&gt;
			end_effector_state_i = end_effector_state;&lt;br /&gt;
			&lt;br /&gt;
			cont = 1;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			if (::boton_start != 0 &amp;amp;&amp;amp; ::flanco == 0)&lt;br /&gt;
			{&lt;br /&gt;
				flanco = 1;&lt;br /&gt;
			}&lt;br /&gt;
			else &lt;br /&gt;
			{&lt;br /&gt;
				if (::boton_start != 0)&lt;br /&gt;
				{&lt;br /&gt;
					::flanco = 2;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::flanco = 0;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		&lt;br /&gt;
			if (::boton_start != 0 &amp;amp;&amp;amp; ::flanco == 1)&lt;br /&gt;
			{&lt;br /&gt;
				if (::start == 0)&lt;br /&gt;
				{&lt;br /&gt;
					::start = 1;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					::start = 0;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			if (::start == 1)&lt;br /&gt;
			{&lt;br /&gt;
&lt;br /&gt;
				if (::pad_derecha_x &amp;gt; 0.2 || ::pad_derecha_x &amp;lt; -0.2 || pad_derecha_y &amp;gt; 0.2 || pad_derecha_y &amp;lt; -0.2 ||&lt;br /&gt;
					(::gatillo_izquierda &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_izquierda != -1) || &lt;br /&gt;
					(::gatillo_derecha &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_derecha != -1) || &lt;br /&gt;
					::cruz_izquierda !=  0 || ::cruz_derecha !=  0 || ::cruz_arriba != 0 || ::cruz_abajo != 0 || &lt;br /&gt;
					::boton_back != 0 || &lt;br /&gt;
					::boton_izquierda != 0 || ::boton_derecha != 0)&lt;br /&gt;
				{&lt;br /&gt;
				&lt;br /&gt;
					if (::boton_back != 0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state = end_effector_state_i;&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					if (::pad_derecha_x &amp;gt; 0.2 || ::pad_derecha_x &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(0, 0, ::pad_derecha_x * avance));&lt;br /&gt;
					}&lt;br /&gt;
		&lt;br /&gt;
					if (::pad_derecha_y &amp;gt; 0.2 || ::pad_derecha_y &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(0, -::pad_derecha_y * avance, 0));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::gatillo_izquierda &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_izquierda != -1)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(::gatillo_izquierda * (avance/2), 0, 0));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::gatillo_derecha &amp;lt; -0.2 &amp;amp;&amp;amp; ::gatillo_derecha != -1)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.translate(Eigen::Vector3d(-::gatillo_derecha * (avance/2), 0, 0));&lt;br /&gt;
 					} &lt;br /&gt;
					&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_arriba !=  0)&lt;br /&gt;
					{					&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(-giro, Eigen::Vector3d::UnitZ()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_abajo !=  0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(giro, Eigen::Vector3d::UnitZ()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
 					if (::cruz_derecha !=  0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(giro, Eigen::Vector3d::UnitY()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::cruz_izquierda !=  0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(-giro, Eigen::Vector3d::UnitY()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_derecha != 0)&lt;br /&gt;
					{&lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(giro, Eigen::Vector3d::UnitX()));&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_izquierda != 0)&lt;br /&gt;
					{   	  &lt;br /&gt;
						end_effector_state.rotate(Eigen::AngleAxisd(-giro, Eigen::Vector3d::UnitX()));&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 					bool found_ik = kinematic_state-&amp;gt;setFromIK(joint_model_group, end_effector_state, 5, 0.1);&lt;br /&gt;
		&lt;br /&gt;
					if (found_ik)&lt;br /&gt;
					{&lt;br /&gt;
						cervantes_epos_manager::GroupEPOSControl arm;&lt;br /&gt;
						std::vector&amp;lt;cervantes_epos_manager::EPOSControl&amp;gt; motor_group;&lt;br /&gt;
						cervantes_epos_manager::EPOSControl motor_control;	&lt;br /&gt;
						kinematic_state-&amp;gt;copyJointGroupPositions(joint_model_group, joint_values);&lt;br /&gt;
						&lt;br /&gt;
						for(int i = 0; i &amp;lt; joint_names.size(); i++)&lt;br /&gt;
						{&lt;br /&gt;
							if (joint_names[i] == &amp;quot;hombro_a&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 3;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;hombro_b&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 5;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;codo_a&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 4;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;codo_b&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 6;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(246*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;muneca_a&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 7;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(270*1024);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;muneca_b&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 9;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(270*16);&lt;br /&gt;
							}&lt;br /&gt;
							else if (joint_names[i] == &amp;quot;muneca_c&amp;quot;)&lt;br /&gt;
							{&lt;br /&gt;
								motor_control.node_id = 8;&lt;br /&gt;
								motor_control.setpoint = (joint_values[i]/(2*PI))*(270*16);&lt;br /&gt;
							}&lt;br /&gt;
							&lt;br /&gt;
							motor_control.control_mode = 3;&lt;br /&gt;
							motor_group.push_back(motor_control);&lt;br /&gt;
				&lt;br /&gt;
						}&lt;br /&gt;
						&lt;br /&gt;
						arm.motor_group = motor_group;&lt;br /&gt;
						&lt;br /&gt;
						move_pub_.publish(arm);&lt;br /&gt;
						&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						ROS_INFO(&amp;quot;Did not find IK solution&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					if (::boton_a != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::avance_base = ::avance_base - 0.01;&lt;br /&gt;
						&lt;br /&gt;
						if (::avance_base &amp;lt; 0.01)&lt;br /&gt;
						{&lt;br /&gt;
							::avance_base = 0.01;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_b != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::avance_base = ::avance_base + 0.1;&lt;br /&gt;
						&lt;br /&gt;
						if (::avance_base &amp;gt; 0.1)&lt;br /&gt;
						{&lt;br /&gt;
							::avance_base = 0.1;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::pad_izquierda_y &amp;gt; 0.2 || ::pad_izquierda_y &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						::base.linear.x = ::avance_base * ::pad_izquierda_y;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						::base.linear.x = 0.0;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_x != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::giro_base = ::giro_base - 0.01;&lt;br /&gt;
						&lt;br /&gt;
						if (::giro_base &amp;lt; 0.05)&lt;br /&gt;
						{&lt;br /&gt;
							::giro_base = 0.05;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::boton_y != 0)&lt;br /&gt;
					{&lt;br /&gt;
						::giro_base = ::giro_base + 0.01;&lt;br /&gt;
						&lt;br /&gt;
						if (::giro_base &amp;gt; 1)&lt;br /&gt;
						{&lt;br /&gt;
							::giro_base = 1;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					if (::pad_izquierda_x &amp;gt; 0.2 || ::pad_izquierda_x &amp;lt; -0.2)&lt;br /&gt;
					{&lt;br /&gt;
						::base.angular.z = ::giro_base * ::pad_izquierda_x;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						::base.angular.z = 0.0;&lt;br /&gt;
						base_pub_.publish(::base);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		ros::spinOnce();&lt;br /&gt;
	&lt;br /&gt;
		loop_rate.sleep();&lt;br /&gt;
	}		  &lt;br /&gt;
 &lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilarlo y generar el ejecutable se debe añadir las siguientes líneas de código al archivo &amp;quot;CMakeLists.txt&amp;quot; del ''package'' creado, donde indicamos el nombre para el ejecutable y la ruta y nombre del archivo a compilar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cmake&amp;gt;add_executable(teleop_xbox360 src/teleop_xbox360.cpp)&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(teleop_xbox360&lt;br /&gt;
  ${catkin_LIBRARIES}&lt;br /&gt;
)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilar el programa hay que situarse en el directorio raiz de nuestro espacio de trabajo catkin. Simplemente con ejecutar el siguiente comando en un terminal se compilará y creará el ejecutable, siempre que no existan errores:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;catkin_make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crearemos un archivo llamado &amp;quot;teleop_xbox360.launch&amp;quot; dentro del directorio &amp;quot;launch&amp;quot; del ''package'' creado con el siguiente contenido, para poder iniciar en una sola ejecución todos los programas necesarios:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;include file=&amp;quot;$(find cervantes_epos_manager)/launch/cervantes_bringup.launch&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;joy&amp;quot; type=&amp;quot;joy_node&amp;quot; name=&amp;quot;joystick&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;node name=&amp;quot;teleop_xbox360&amp;quot; pkg=&amp;quot;cervantes_teleop&amp;quot; type=&amp;quot;teleop_xbox360&amp;quot; output=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para iniciar el teleoperador simplemente deberemos ejecutar en un terminal el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;roslaunch cervantes_teleop teleop_xbox360.launch&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el siguiente vídeo puede verse el uso del teleoperador para CeRVaNTeS en el simulador [http://gazebosim.org/ gazebo]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;wF_gKr1KWfg#t=13&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=wF_gKr1KWfg#t=13 Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Integraci%c3%b3n_de_CeRVaNTeS_en_moveIt!_(gazebo%2bmoveIt!)&amp;diff=4200</id>
		<title>Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Integraci%c3%b3n_de_CeRVaNTeS_en_moveIt!_(gazebo%2bmoveIt!)&amp;diff=4200"/>
				<updated>2014-09-29T10:55:11Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Pasos previos=&lt;br /&gt;
&lt;br /&gt;
==Instalación de moveit==&lt;br /&gt;
&lt;br /&gt;
=Configuración de CeRVaNTeS en moveIt!=&lt;br /&gt;
&lt;br /&gt;
=Ejecución=&lt;br /&gt;
&lt;br /&gt;
==Planificación simple==&lt;br /&gt;
&lt;br /&gt;
[[file:CeRVaNTeS_rviz_moveit.png|thumb|500px|center|CeRVaNTeS en [http://wiki.ros.org/rviz rviz] con ''plugin'' de [http://moveit.ros.org/ moveIt!]]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;myGdut2WdsE&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=myGdut2WdsE Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;9hV3UANRs2k&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=9hV3UANRs2k Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;videoflash&amp;gt;bYtvNJHraVs&amp;lt;/videoflash&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.youtube.com/watch?v=bYtvNJHraVs Ver vídeo en YouTube]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Modelo_para_simulaci%c3%b3n_CeRVaNTeS_(urdf%2bgazebo)&amp;diff=4199</id>
		<title>Modelo para simulación CeRVaNTeS (urdf+gazebo)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Modelo_para_simulaci%c3%b3n_CeRVaNTeS_(urdf%2bgazebo)&amp;diff=4199"/>
				<updated>2014-09-29T10:54:34Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Componentes de modelo de CeRVaNTeS=&lt;br /&gt;
&lt;br /&gt;
==URDF base móvil y estructura==&lt;br /&gt;
&lt;br /&gt;
=Ensamblado del modelo de CeRVaNTeS=&lt;br /&gt;
&lt;br /&gt;
==Visualización del modelo en rviz==&lt;br /&gt;
&lt;br /&gt;
[[file:CeRVaNTeS_rviz.png|thumb|500px|center|Modelo CeRVaNTeS en [http://wiki.ros.org/rviz rviz] e interfaz [http://wiki.ros.org/joint_state_publisher joint_state_publisher]]]&lt;br /&gt;
&lt;br /&gt;
=Carga de modelo en gazebo=&lt;br /&gt;
&lt;br /&gt;
[[file:CeRVaNTeS_gazebo.png|thumb|500px|center|Modelo CeRVaNTeS en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=Modelo_para_simulaci%c3%b3n_brazo_CeRVaNTeS_(urdf%2bgazebo)&amp;diff=4198</id>
		<title>Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=Modelo_para_simulaci%c3%b3n_brazo_CeRVaNTeS_(urdf%2bgazebo)&amp;diff=4198"/>
				<updated>2014-09-29T10:53:55Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; volver a principal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Artículos realcionados &lt;br /&gt;
----&lt;br /&gt;
!Otros artículos &lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo y base CeRVaNTeS (maxon+epos2)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[Control brazo MYRAbot (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Detección y cálculo de posición de objetos (cámara web)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Modelo para simulación MYRAbot (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Órdenes y confirmación mediante voz (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]]&lt;br /&gt;
----&lt;br /&gt;
[[Fernando-TFM-ROS02|Programas de control para el robot Turtlebot sobre ROS ]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Creación del modelo URDF=&lt;br /&gt;
&lt;br /&gt;
=Prueba visual del modelo=&lt;br /&gt;
&lt;br /&gt;
[[file:CeRVaNTeS_arm_rviz.png|thumb|500px|center|Modelo cargado en [http://wiki.ros.org/rviz rviz] e interfaz [http://wiki.ros.org/joint_state_publisher joint_state_publisher]]]&lt;br /&gt;
&lt;br /&gt;
=Control de uniones para simulación=&lt;br /&gt;
&lt;br /&gt;
==Pasos previos==&lt;br /&gt;
&lt;br /&gt;
==Añadir controladores a uniones móviles==&lt;br /&gt;
&lt;br /&gt;
===Modificación del URDF===&lt;br /&gt;
&lt;br /&gt;
===Creación de los archivos de configuración===&lt;br /&gt;
&lt;br /&gt;
==Carga del modelo en gazebo==&lt;br /&gt;
&lt;br /&gt;
[[file:CeRVaNTeS_arm_gazebo.png|thumb|500px|center|Modelo brazo CeRVaNTeS en [http://wiki.ros.org/simulator_gazebo?distro=electric gazebo]]]&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; volver a principal]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_arm_and_base_control_(maxon%2bepos2)&amp;diff=4197</id>
		<title>CeRVaNTeS' arm and base control (maxon+epos2)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_arm_and_base_control_(maxon%2bepos2)&amp;diff=4197"/>
				<updated>2014-09-29T10:51:00Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Maxon motors arm and base=&lt;br /&gt;
&lt;br /&gt;
=ROS y Epos2=&lt;br /&gt;
&lt;br /&gt;
We have based on [https://code.google.com/p/wpi-rover/ wpi-rover] project to realize the driver for the communication between [http://wiki.ros.org/ ROS] and the [http://www.maxonmotor.es/maxon/view/content/index Maxon's] Epos2 controllers. This project consists of a [http://wiki.ros.org/ ROS] ''wrapper'' or ''package'' that uses the Epos2's [http://www.linux.com/ linux] libraries.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	<entry>
		<id>https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_arm_and_base_control_(maxon%2bepos2)&amp;diff=4196</id>
		<title>CeRVaNTeS' arm and base control (maxon+epos2)</title>
		<link rel="alternate" type="text/html" href="https://robotica.unileon.es/index.php?title=CeRVaNTeS%27_arm_and_base_control_(maxon%2bepos2)&amp;diff=4196"/>
				<updated>2014-09-29T10:50:43Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando: Created page with &amp;quot; &amp;lt; go back to main   ---- {| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot; !Related articles ---- !Other articles ---- |- | valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; | ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mobile manipulation | &amp;lt; go back to main]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;border: solid 0px white; width: 100%&amp;quot;&lt;br /&gt;
!Related articles&lt;br /&gt;
----&lt;br /&gt;
!Other articles&lt;br /&gt;
----&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
[[MYRAbot's arm control (bioloid+arduino)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Objects recognition and position calculation (webcam)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's arm model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot model for simulation (urdf+gazebo)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Voice control (sphinx+festival)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Maxon motors arm=&lt;br /&gt;
&lt;br /&gt;
=ROS y Epos2=&lt;br /&gt;
&lt;br /&gt;
We have based on [https://code.google.com/p/wpi-rover/ wpi-rover] project to realize the driver for the communication between [http://wiki.ros.org/ ROS] and the [http://www.maxonmotor.es/maxon/view/content/index Maxon's] Epos2 controllers. This project consists of a [http://wiki.ros.org/ ROS] ''wrapper'' or ''package'' that uses the Epos2's [http://www.linux.com/ linux] libraries.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Mobile manipulation | &amp;lt; go back to main]]&lt;/div&gt;</summary>
		<author><name>Fernando</name></author>	</entry>

	</feed>