This tutorial is created by Robotics Ambassador 017 Jose
Rosbotics Ambassador Program (https://www.theconstruct.ai/robotics-ambassador/
Lo que vamos a aprender
- Crear una interfaz de servicio personalizada.
- Emplear la interfaz creada para comandar el Turtlebot3.
Lista de recursos usados en esta publicación
- Usa este rosject: https://app.theconstruct.ai/l/603ea5b0/
- The Construct: https://app.theconstructsim.com/
- Cursos ROS: ROS2 Basics in 5 Days (Python): https://app.theconstructsim.com/courses/132
Resumen
ROS (Robot Operating System) se está convirtiendo en el “framework” estándar para programar robots. En este tutorial emplearemos los conceptos de servicios para comandar el robot “Turtlebot3” haciendo uso de una interfaz de servicio personalizada que crearemos.Todo esto es simulado en un mundo de Gazebo. Ten en cuenta que se usará ROS2 Humble para este tutorial.
PASO 1: Abriendo el rosject
Para seguir este tutorial, necesitamos tener instalado ROS2 HUMBLE en nuestro sistema, y lo ideal sería tener un ros2_ws (Espacio de Trabajo ROS2). Para facilitarte la vida, ya hemos preparado un rosject para eso: https://app.theconstruct.ai/l/603ea5b0/.
Simplemente copiando el rosject (haciendo clic en el enlace de arriba), tendrás una configuración ya preparada para ti.
Después de haber copiado el rosject a tu propia área de trabajo, deberías ver el botón RUN. Haz clic en ese botón para lanzar el rosject (abajo tienes un ejemplo de rosject).
Tras pulsar el botón RUN, deberías tener cargado el rosject. Ahora, pasemos a la siguiente sección para ponernos manos a la obra.
PASO 2: Creación del paquete
El robot a usar es el Turtlebot3.
Primero crearemos el paquete con las dependencias necesarias. Tener en cuenta que, para crear una interfaz de servicio personalizada solo puede hacer con un paquete CMake. Para ello ejecutamos en un terminal lo siguiente:
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_cmake tutorial_interface_srv --dependencies rclcpp std_msgs
PASO 3: Creación de la interfaz
Luego crearemos dentro del paquete la carpeta srv que contendrá la interfaz de servicio. Dentro de este creamos el archivo Mover.srv
cd ~/ros2_ws/src/tutorial_interface_srv
mkdir srv
cd srv
touch Mover.srv
Dentro de este archivo colocamos el contenido de la interfaz que necesitamos, el cual se compone de la parte de petición (request) y respuesta (response), que se separan mediante 3 guiones (—). Toda esta estructura permite la comunicación entre cliente y servidor.
Dentro de el archivo recién creado colocar lo siguiente: Mover.srv
float64 angulo # Angulo a girar
float64 velocidad_lineal # Velocidad Lineal (en m/s)
int32 tiempo # Duración del movimiento (en segundos)
---
bool completado # Se logró?
PASO 4: Modificando CMakeLists.txt y package.xml
Una vez creado el archivo del servicio personalizado, necesitamos modificar los siguientes archivos para que nuestro paquete compile correctamente:
– CMakeLists.txt: Para convertir las interfaces definidas en código específico de un lenguaje (como C++ y Python) para que puedan utilizarse en esos lenguajes.
– package.xml: Añadimos las dependencias adicionales necesarias.
CMakeLists.txt
En CMakeLists.txt debemos tener lo siguiente:
find_package()
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces()
Aquí se colocará la interfaz de servicio que creamos dentro de la carpeta srv.
rosidl_generate_interfaces(${PROJECT_NAME}
"srv/Mover.srv"
)
Con lo cual CMakeList.txt deberia quedarnos mínimante con lo siguiente:
cmake_minimum_required(VERSION 3.8)
project(tutorial_interface_srv)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# comment the line when a copyright and license is added to all source files
set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# comment the line when this package is in a git repo and when
# a copyright and license is added to all source files
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
rosidl_generate_interfaces(${PROJECT_NAME}
"srv/Mover.srv"
)
ament_package()
package.xml
En package.xml debemos añadir:
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
Y deberia quearnos mínimamente con lo siguiente:
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>tutorial_interface_srv</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="user@todo.todo">user</maintainer>
<license>TODO: License declaration</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<depend>rclcpp</depend>
<depend>std_msgs</depend>
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
PASO 5: Compilación del paquete
Por último, compilamos el paquete para poder usar la interfaz de servicio creada.
cd ~/ros2_ws
colcon build --packages-select tutorial_interface_srv
source install/setup.bash
Es importante realizar el último paso, de lo contrario no se encontrará la interfaz de servicio que se generó. Para asegurarnos de que interfaz se generó correctamente usamos los siguiente:
ros2 interface show tutorial_interface_srv/srv/Mover
Esto nos debería mostrar el contenido de Mover.srv en la terminal:
PASO 6: Usando la interfaz
Para hacer uso de la interfaz, se creo un paquete (tutorial_servicios) que contiene un servidor y un cliente que se comunican mediante el mensaje Mover.srv que acabamos de generar.
El cliente hace una petición al servidor enviándole el ángulo que necesita girar, la velocidad lineal y el tiempo que debe moverse con esa velocidad. Una vez realizado el movimiento el servidor enviará un mensaje de confirmación al cliente como respuesta. Para ello, ejecutamos la simulación en Gazebo (la cual se puede obtener desde este link).
export TURTLEBOT3_MODEL=waffle
ros2 launch turtlebot3_gazebo empty_world.launch.py
Luego en otra terminal ejecutamos el servidor:
ros2 launch tutorial_servicios mover_server_launch_file.launch.py
Y en otra terminal ejecutamos el cliente:
ros2 launch tutorial_servicios mover_client_launch_file.launch.py
Y listo!! ya estamos haciendo uso de la interfaz de servicio recién generada.
0 Comments