Cmake y package.xml
Fundamentos de ROS
En esta breve entrada del blog, hablaremos sobre Cmake y package.xml
Cmake es una herramienta para la generación de codigo. Ya….,pero… Para qué se usa en ROS??
Si echamos un ojo a cualquier paquete de ROS siempre vemos un archivo llamado CmakeLists.txt y otro archivo llmado package.xml.
Pues bien si te has preguntado para qué sirven estos archivos, esta es la entrada…. Ah, la propia Cmake tiene tutoriales, los podéis ver n el siguiente enlace
Cmake
A la hora de trabajar, ROS utiliza la plataforma Cmake. Cmake es una plataforma open-souce cuyo objetivo es controlar la compilación de nuestros paquetes y crear archivos de configuración.
Es decir, son unas instrucciones que nos van a permitir cargar paquetes, librerías, etc y compilar nuestro paquete de una manera determinada, de tal manera, que si alguien utiliza nuestro paquete, el ordenador sabrá cómo tratarlo.
En ROS está información aparecerá en el archivo CmakeLsists.txt, archivo que aparece tras la creación de nuestro paquete cuando utilizamos el comando catkin_create_pkg.
Así pues cada vez que hacemos catkin_make, lo que está sucediendo es que, se comprueba que tenemos todas las dependencias, se comprueban los archivos a ejecutar, o se comprueba que tenemos todas las librerías.
Como hemos comentado toda esta información se debe introducir en el archivo Cmakelists.txt

Estructura de un archivo CmakeLists.txt
- version
Con qué versión de Cmake vamos a trabajar.
ejemplo:
cmake_minimum_required(VERSION 2.8.3)
- nombre del proyecto
project(nombre)
- Dependencias de nuestro paquete
De qué otros paquetes depende nuestro paquete?
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
tf2_ros
…
)
- Catkin_package
Suministramos info para construir archivos CMake y archivos de configuración.
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES test
CATKIN_DEPENDS roscpp rospy tf2_ros …
# DEPENDS system_lib
)
- Librería en carpeta include
Si vamos a crear nuestra librería en carpeta include añadimos:
include_directories(include ${catkin_INCLUDE_DIRS}) #carpeta include
- Build Targets
Especificamos los archivos ejecutables y librerías:
add_executable(myProgram src/main.cpp src/some_file.cpp)
add_library (mi_libreria src/mi_librería.cpp) *
*Suponiendo que la librería la hemos creado nosotros y consta de un archivo mi_libreria.h y mi_librería.cpp
target_link_libraries ( myProgram mi_librería ${catkin_LIBRARIES} ) *
*Vinculamos la librería mi_librería a el programa ejecutable llamado myProgram, ${catkin_LIBRARIES} sirve para que el paquete reconozca ros/ros.h
Por último reseñar que es importante escribir el archivo en este orden. Además se rewcomienda ir abriendo otros proyectos de ROS e ir viendo el archivo CmakeLsists.txt de estos proyectos, de tal manera que vallamos perdiéndo el miedo a estos archivos.
Package.xml
El otro archivo que aprenderemos en este tutorial es el archivo package.xml.
Este archivo simplemente es el manifiesto de nuestro paquete, es decir , es un archivo que contiene metadatos para que nuestro paquete tenga una descripción correcta.
Este archivo viene en formato xml, y es muy sencillo de rellenar. Aparte de poner opcionalmente una descripción para otros usuarios, de poner el nombre de los creadores, etc.. en este archivo mientras vayamos creando nuestra aplicación en ROS iremos metiendo las dependencias usando el tag «<depend>«
<?xml version="1.0"?> <package format="2"> <name>mi_pkg</name> <version>0.0.0</version> <description>The mi_pkg package</description> <maintainer email="hualde@todo.todo">hualde</maintainer> <license>TODO</license> <buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend> <build_export_depend>roscpp</build_export_depend> <exec_depend>roscpp</exec_depend> <depend>moveit_ros_planning_interface</depend> <depend>nist_gear</depend> <depend>tf2_ros</depend> <depend>tf2_eigen</depend> <depend>tf2_geometry_msgs</depend> <export> </export> </package>
Aquí acaba el post del tutorial de ROS en español sobre el archivo CmakeLsist.txt y el archivo package.xml. Poco a poco vamos cogiendo los conceptos básicos de ROS, que si bien son fundamentales, posiblemente sean los más aburridos y sosos. Por eso, deseo que os haya gustado y que haya servido para aclarar estos conceptos. Sobre todo animaros a que sigáis practicando, pues ROS es difícil, pero si fuese fácil todo el mundo lo conocería y no tendría mérito el aprendizaje que estás realizando…. y créeme que sí lo tiene. Por cierto enlace al código de esta entrada en GitHub