How to send a message using Topic Publisher and Subscriber using Python
To ensure stability, I’ll guide you through ROS2 Foxy on Ubuntu 20.04 system. I’ll be using Docker images for installation, but the process is similar to a local Ubuntu setup.
Prerequisites:
Ubuntu 20.04 installed on your computer.
We will actually create and run a ROS2 package that sends and receives messages through Publisher and Subscriber.
In this course, you’ll cover the foundational concepts needed to start working with ROS 2, as well as more advanced topics, all while engaging in hands-on practice.
Neste tutorial, vamos aprender a criar serviços personalizados no ROS2 e desenvolver um pacote de controle de movimento para um robô. Vamos passar pelos passos de criação e configuração de serviços, desenvolvimento de um pacote de movimento, implementação do servidor e cliente de serviço, e a criação de arquivos de lançamento. Este tutorial é ideal para quem deseja aprimorar suas habilidades em ROS2 e programação robótica.
Abrindo o rosject
Clique no link abaixo para ter acesso ao rosject deste tutorial. Em seguida, clique no botão “RUN”.
Primeiro, vamos criar um pacote de interfaces personalizadas que conterá nosso serviço. Este pacote será responsável por definir e gerenciar a interface do serviço que iremos usar para controlar o robô.
Copie este bloco de comandos no primeiro terminal:
Esses comandos criam um novo pacote chamado custom_interfaces com as dependências rclcpp e std_msgs.
Definição do Serviço
Em seguida, vamos definir o serviço que será utilizado para controlar o robô. Para isso, crie uma pasta chamada srv dentro do pacote custom_interfaces e um arquivo Move.srv. Use os comandos:
cd ~/ros2_ws/src/custom_interfaces
mkdir srv
cd srv
touch Move.srv
Edite o arquivo Move.srv com o seguinte conteúdo:
string direction # Direção para girar (direita ou esquerda)
float64 velocity # Velocidade angular (em rad/s) ou linear (em m/s)
int32 time # Duração do giro (em segundos)
---
bool success # O comando foi bem-sucedido?
Esse arquivo define a estrutura do serviço. Ele recebe a direção, velocidade e tempo como entrada, e retorna um booleano indicando se a operação foi bem-sucedida.
Atualizando os Arquivos CMakeLists.txt e package.xml
Agora, precisamos configurar os arquivos CMakeLists.txt e package.xml para que o ROS2 possa construir e utilizar nosso serviço.
source ~/ros2_ws/install/setup.bash
ros2 run movement_pkg movement_client left 0.2 5
No segundo terminal você verá:
Enquanto no primeiro terminal aparecerá:
Isso indica que o serviço foi realizado corretamente.
Na janela do Gazebo, você pode ver o robô se movimentando pelo ambiente.
<figure7>
Outras opções, além de left, são right, forward, backward. Experimente mudar os parametros do comando anterior variando também a velocidade e a duraçao do movimento do robô (respectivamente segundo e terceiro parametros do comando).
Conclusão
Esperamos que este tutorial tenha sido útil e que você tenha aprendido como criar serviços personalizados no ROS2 e controlar o movimento de um robô. Se você gostou deste conteúdo, considere explorar mais recursos do ROS2 e experimentar novas possibilidades para expandir suas habilidades em robótica.
Vídeo no YouTube
Este foi o post de hoje. Lembre-se que nós temos uma versão deste post em vídeo no YouTube.
Se você gostou do conteúdo, por favor, considere se inscrever no nosso canal do YouTube. Estamos publicando novos conteúdos quase todos os dias.
Dans ce tutoriel, nous allons voir comment utiliser ROSLibjs avec ROS2 pour tirer parti de la puissance de ROS dans des applications web et JavaScript. Nous allons mettre en place un exemple simple d’une page HTML utilisant ROSLibjs pour communiquer avec un système ROS2. L’objectif du tutoriel sera d’utiliser un publisher et un subscriber depuis notre page web pour interagir avec un turtlebot3 simulé dans Gazebo.
Prérequis: Utiliser une installation ROS2 avec Gazebo
ROS2
Vous pouvez vous connecter au site TheConstruct pour acceder à des machines virtuelles préconfigurées avec une installation ROS. Ce tutoriel est realisé avec ROS Humble.
# pour installer tous les packages du turtlebot3# remplacez humble par votre distro ROS2cd~/ros2_wscolconbuildsourceinstall/setup.bashsudoapt-getinstallros-humble-turtlebot3*# n'oubliez pas d'exporter le modèle de Turtlebot3 que vous souhaitez utiliserexportTURTLEBOT3_MODEL=waffle_pi
Nous allons ensuite lancer la simulation du turtlebot3 dans gazebo. Le turtlebot3 va publier les topics que nous allons utiliser dans le tutoriel.
Partie 1: Concepts
rosbridge_suite (https://github.com/RobotWebTools/rosbridge_suite) avec le node rosbridge-server fournit un serveur WebSocket qui donne accès aux fonctionnalités de ROS pour des programmes non-ROS. WebSocket est un protocole de communication qui permet une communication bidirectionnelle entre les clients et les serveurs à travers une connexion unique et durable. Des clients roslib ont été développés dans differents languages de programmation (Python, Rust, Java, Javascript). rosbridge_server permet donc une intégration entre ROS avec un large éventail de technologies, notamment des applications Web, des appareils mobiles, des environnements de simulation. Dans ce tutoriel nous allons apprendre à utiliser roslibjs qui permet d’interagir avec l’ecosystème ROS en utilisant Javascript. Nous allons créer ensemble une interface web simple permettant d’interagir avec un robot simulé sur Gazebo.
Partie 2: Implémentation
Nous allons dans un premier temps créer une page web index.html dans le dossier webpage_ws. Cette page web html execute du javascript pour utiliser ROSlibjs et déclarer notre publisher et notre subscriber:
<!DOCTYPE html>
<htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>ROS2ROSLIBjsexample</title><linkrel="stylesheet"type="text/css"href="style.css"></head><body><h1>ROS2ROSLIBjsexample</h1><divclass="container"><!-- Inputs pour publier le message Twist sur le topic cmd_vel -->
<div><labelfor="linearSpeed">LinearSpeed:</label><inputtype="number"id="linearSpeed"step="0.1"value="0"><labelfor="angularSpeed">AngularSpeed:</label><inputtype="number"id="angularSpeed"step="0.1"value="0"><!-- Appelle la fonction submitInputsTwist qui va publier un Twist message -->
<buttononclick="submitInputsTwist()">PublishTwist</button></div><!-- Zone de texte pour afficher les messages reçu par le subscriber d'odom -->
<div><h2>ReceivedOdometry</h2><textareaid="odometryData"readonly></textarea></div><!-- Joystick pour controler le robot en publiant sur cmd_vel -->
<divid="joyDiv"style="width:200px;height:200px;margin-bottom:20px;"></div></div><!-- Pour importer roslibjs -->
<scriptsrc="https://s3.eu-west-1.amazonaws.com/rosject.io/js/roslib.min.js"></script><!-- La repository github du joystick https://github.com/bobboteck/JoyStick -->
<scriptsrc="https://github.com/bobboteck/JoyStick/releases/download/v2.0.0/joy.min.js"></script><!-- Javascript -->
<script>//Ondéclarenotreclientvarros=newROSLIB.Ros();varrosbridgeUrl='ws://localhost:9090';//Remplacerlocalhost:9090parl'url rosbridge_server URL (et ne pas ajouter:port)//ConnecteauROS2environmentros.on('connection',function(){console.log('Connected to ROS1 environment.');});//Gérerlescasdedéconnectionros.on('error',function(error){console.error('Error connecting to ROS1 environment:',error);});ros.on('close',function(){console.log('Connection to ROS1 environment closed.');});//Déclarelesvariablequipermettentd'interagir avec les topics ROSvartwistTopic=newROSLIB.Topic({ros:ros,name:'/cmd_vel',messageType:'geometry_msgs/Twist'});varodometryTopic=newROSLIB.Topic({ros:ros,name:'/odom',messageType:'nav_msgs/Odometry'});//SubscribeautopicodometdéfinitlafonctioncallbackodometryTopic.subscribe(function(message){console.log(message)//Changelavaleurdelatexteareaaveclemessagereçudepuisletopicdocument.getElementById('odometryData').value=JSON.stringify(message,null,2);});functionpublishTwist(linearSpeed,angularSpeed){//DeclareleTwistmessagepourpouvoirpublierlesvaleursenentréedelafonctionvartwist=newROSLIB.Message({linear:{x:linearSpeed,y:0,z:0},angular:{x:0,y:0,z:angularSpeed}});//PublieleTwistmessagesurletopiccmd_veltwistTopic.publish(twist);}//ConnecteauROS2environmentros.connect(rosbridgeUrl);//LafonctionappelléelorsquePublishTwistestcliquéfunctionsubmitInputsTwist(){//RécupèrelesvaleursdesinputspourlinearSpeedetangularSpeedvarlinearSpeed=parseFloat(document.getElementById('linearSpeed').value);varangularSpeed=parseFloat(document.getElementById('angularSpeed').value);publishTwist(linearSpeed,angularSpeed);}//Declarelejoystickpourpublierlesdonnéessurcmd_velvarJoy1=newJoyStick('joyDiv',{},function(stickData){//RécupèrelesvaleursdesaxesdujoysticksletangularSpeed=-stickData.x/50;letlinearSpeed=stickData.y/50;//DeclareleTwistmessagepourpouvoirlepubliervartwist=newROSLIB.Message({linear:{x:linearSpeed,y:0,z:0},angular:{x:0,y:0,z:angularSpeed}});//PublieleTwistmessagesurletopiccmd_veltwistTopic.publish(twist);});</script></body></html>
Pour résumer le code ci-dessus:
On écrit notre page HTML qui va servir d’interface utilisateur.
Dans notre Javascript, on crée le client websocket ROSLib et on crée les fonctions qui seront appelées pour differents évenements de la websocket (connection, error, close).
On déclare ensuite les variables qui vont nous permettre d’interagir avec les topics.
On subscribe au topic /odom et on modifie la valeur du textarea odometryData dans le callback.
On crée la fonction publishTwist qui est appelée lorsque le bouton Publish Twist est appelé, elle permet de publier les valeurs.
On déclare le joystick et on appelle la fonction publishTwist pour publier sur le topic cmd_vel les valeurs des axes du joysticks.
Vous pouvez également ajouter le fichier CSS style.css:
Nous allons voir dans la partie suivante comment l’ouvrir en utilisant notre environnement de développement.
Partie 3: Tester le système
Pour tester l’interface exemple du tutoriel, vous devez dans un premier temps lancer la simulation du turtlebot3 avec la commande suivante dans un premier terminal:
Les prochaines étapes sont seulement pour faire fonctionner l’exemple dans un rosject de theConstuct. Dans un nouveau terminal, vous devez lancer un server python pour hoster la page web via l’installation de theConstruct:
python3-mhttp.server7000
Ouvrez un terminal et lancez les commandes suivantes:
# pour obtenir l'url de la page web htmlwebpage_address# pour obtenir l'adresse de la websocket fournit par l'installation theConstructrosbridge_address
Vous devrez utiliser l’adresse websocket rosbridge_address dans la variable rosbridgeUrl du code.
Si vous effectuez le tutoriel sur votre machine locale, vous pouvez ouvrir directement votre page html avec votre navigateur et l’adresse de la websocket ws://0.0.0.0:9090 (port par defaut utilisé par le node rosbridge_server).
Vous pouvez maintenant ouvrir l’interface créée precedemment en ouvrant le ficher index.html dans votre navigateur. Vous devriez obtenir le résultat suivant:
Dans la textarea, vous pouvez voir l’odometry du robot mis à jour à chaque message reçu. Vous devriez pouvoir également pouvoir déplacer le turtlebot3 en utilisant les textes inputs ou le joystick pour publier sur le cmd_vel.
Feedback
Cet article vous a plu ? Avez-vous des questions sur ce qui est expliqué ? Quoi qu’il en soit, n’hésitez pas à laisser un commentaire dans la section des commentaires ci-dessous, afin que nous puissions interagir et apprendre les uns des autres.
Si vous souhaitez en savoir plus sur d’autres sujets liés à ROS, faites-le nous savoir dans l’espace commentaires et nous ferons une vidéo ou un article à ce sujet.
Topics: ROS Q&A | ros2
En este tutorial, aprenderás el proceso de portar un paquete de ROS 1, creado originalmente en SolidWorks, a un formato URDF compatible con ROS 2. Exploraremos los pasos esenciales para migrar tu diseño robótico al nuevo entorno, asegurando la compatibilidad y funcionalidad en la última versión de ROS. Sigue la guía detallada para una transición sin complicaciones y mantén tus proyectos robóticos al día con las últimas tecnologías.
Abriendo el rosject
Para poder seguir al pie de la letra este tutorial, necesitamos tener ROS 2 Humble instalado en nuestro sistema, e idealmente un workspace para crear los paquetes en él. Para facilitarnos el proceso, ya hemos preparado un rosject para esto: https://app.theconstructsim.com/l/5e643001/
Solo copiando el rosject (Abriendo el enlace anterior), tendremos un entorno previamente configurado.
Después de que el rosject se haya copiado correctamente en tu entorno, debemos presionar el botón Ejecuta para ejecutar e inicializar el entorno del rosject.
[Inserta imagen del Rosject]
Crear un paquete de ROS 2 con ament_python
Para poder crear nuestro paquete de ROS 2, necesitamos situarnos en el workspace, y para eso, necesitamos la terminal.
Abramos una terminal oprimiendo el botón de abrir una nueva terminal:
[Inserte imagen de la terminal]
Una vez dentro de la terminal vamos a movernos al ros2_ws/src y creamos nuestro paquete: cd ~/ros2_ws/src
ros2 pkg create lidar3d --build-type ament_python --dependencies rclpy
Una vez creado nuestro paquete ingresamos a él y copiamos el contenido de nuestro paquete generado por Solidworks: cd lidar3d
cp -r ../lidar3d/* .
Ahora vamos a abrir el editor de código para modificar nuestros archivos. Para abrir el editor de código oprimimos el botón de editor de código:
[Inserte imagen de vscode]
Nos situamos en ros2_ws/src/lidar3d/urdf y abrimos el archivo de urdf:
[Inserte imagen del URDF]
Primero vamos a añadir un nuevo objeto vacío de base_link con un joint al base_link generado por Solidworks ya que rviz 2 no soporta base_link con inercia y le cambiamos el nombre al base_link de Solidworks:
[Inserte imagen de vscode con urdf modificado]
Ahora debido a que modificamos el nombre del paquete, vamos a usar la función de sustituir palabra integrada con Vscode:
[inserte imagen de sustitución]
El siguiente paso es ir a ros2_ws/src/lidar3d/launch para crear un launch de Python compatible con ROS 2, para eso damos click derecho y Nuevo archivo y le ponemos de nombre display.launch.py
[inserte imagen del launch file]
Por ultimo antes de compilar, debemos decirle a nuestro paquete donde se encuentran los solidos URDF los meshes y los launch files, para eso nos vamos a ros2_ws/src/lidar3d y añadimos las respectivas instrucciones install para que encuentre nuestras carpetas:
[Inserte imagen del package modificado]
Ya que tenemos nuestro paquete configurado podemos compilar y ejecutar nuestro launch file para poder generar las configuraciones por defecto de rviz2
Para poder activar las configuraciones requeridas de rviz 2 vamos a modificar nuesto Fixed Frame y cambiamos map por base_link, ahora le damos a añadir y para poder depurar mejor nuestro objeto añadimos el arbol de TF con la opcion TF, y por último vamos a añadir el modelo de nuestro robot añadiendo RobotModel:
[Inserte imagen de rviz]
Como podemos observar, aun no se ve nuestro robot, para eso debemos en la sub-opción de Description Topic seleccionar el topico de robot_description
How to create node in Python to spawn new object in Gazebo Simulation
Overview:
ROS (Robot Operating System) is a de facto standard for Robotics. In order to program Robots, simulation of Real world systems is very important to test and debug the systems. For simulations of Robotics systems, Gazebo is used commonly in ROS. In this post we will learn how to add new objects in simulation scene without terminating the simulation entirely.
In general, if we want to add new object in simulation scene, we have to terminate all running nodes in simulation, edit the World file (description file for simulation in Gazebo). In order to add new objects, without terminating nodes, we can use Gazebo API in Python to spawn new objects in simulation dynamically.
In this course, you’ll cover the foundational concepts needed to start working with ROS 2, as well as more advanced topics, all while engaging in hands-on practice.