ROS (Mfumo wa Uendeshaji wa Roboti) unakuwa “mfumo” wa kawaida wa roboti za kutengeneza programu. Katika chapisho hili, hebu tujifunze jinsi ya kuunda kifurushi cha ROS2, muhimu kwa kutoa maagizo kwa roboti, kwa kutumia amri ya ros2.
Kutengeneza rosject
Ili kufuata mafunzo haya, tunahitaji kuwa na ROS2 iliyosakinishwa katika mfumo wetu, na kwa hakika ros2_ws (ROS2 Workspace). Ili kurahisisha maisha yako, tutaunda mpango wa kubofya kiungo hiki: https://app.theconstructsim.com/
Hii inakuleta kwenye ukurasa wa kutua wa kuunda, hapo tutaenda kwa myrosjects na kisha kuunda rosject mpya, hatua zimeangaziwa katika miraba ya bluu.
Baada ya kuunda rosject mpya, weka usambazaji ambao ungependa kutumia kwa kesi yetu Humble na jina la rosject na maelezo mafupi.
Baada ya kubonyeza kitufe cha Unda, unapaswa kuwa na rosject kwenye rosjects zangu Bonyeza na ubonyeze RUN.
Kuunda kifurushi cha ros2.
Ili kuunda kifurushi cha ROS2, tunahitaji kuwa na Nafasi ya Kazi ya ROS2, na kwa hiyo, tunahitaji terminal.
Wacha tufungue terminal kwa kubofya kitufe cha Fungua terminal mpya.
Mara tu ndani ya terminal tumia amri kuona vitu vilivyopo kwenye saraka ya sasa:
ls
Kisha nenda kwenye saraka ifuatayo ambapo tutaunda kifurushi:
Fungua kihariri cha msimbo kulia na uunde hati kwenye py_pubsub fille inayoitwa py_pubsub.py. Hii inafanywa kwa kubofya kulia kwenye py_pubsub na kubofya kuunda faili mpya
Nakili na ubandike yafuatayo na hati ya python ambayo ina mchapishaji na aliyejiandikisha kwenye hati yetu
Turtlebot 3 es uno de los robots compatibles con ros mas usados hoy en día en universidades y por personas del común para aprender el funcionamiento de ROS y el stack de Navegación. En este post, vamos a aprender como crear un nodo de ROS1, el cual nos va a permitir crear un teleop casero para entender como crear un suscriptor y publicador en el mismo código.
Abriendo el rosject
Para poder seguir al pie de la letra este tutorial, necesitamos tener ROS 1 Noetic 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.
Crear un paquete de ROS 1 con geometry_msgs
Para poder crear nuestro paquete de ROS 1, necesitamos situarnos en el workspace, y para eso, necesitamos la terminal.
Abramos una terminal oprimiendo el botón de abrir una nueva terminal:
Una vez dentro de la terminal vamos a movernos al catkin/src y creamos nuestro paquete: cd ~/catkin_ws/src
catkin_create_pkg turtlebot_publisher_subscriber geometry_msgs
Una vez creado nuestro paquete ingresamos a él y por convención creamos la carpeta scripts: cd turtlebot_publisher_suscriber
mkdir scripts
Ahora vamos a abrir el editor de código para crear nuestro nodo. Para abrir el editor de código oprimimos el botón de editor de código:
Nos situamos en catkin_es/src/turtlebot_publisher_susbriber/scripts y oprimimos clic derecho New File y le damos el nombre de turtlebot.py para crear nuestro código
Primero vamos a importar las librerías, inicializar nuestro nodo, y crear el listener con su respectivo callback:
Para entenderlo mejor vamos a desglosar el código:
El primer rectángulo nos permite observar que estamos usando el entorno de Python 3, e importamos la librería de rospy para crear los nodos y geometry_msgs.msg Twist que es el tipo de dato Twist ya que este es el que usa /cmd_vel para comunicarse.
En el segundo rectángulo estamos creando un mensaje de tipo Twist, creamos la función listener la cual se suscribe de manera anónima a al tópico cmd_vel que usa como tipo de dato Twist, y por último cuando recibe un mensaje hace un llamado al callback que usando un loginfo imprime en pantalla el contenido del mensaje, este mensaje es la velocidad angular y lineal del turtlebot 3.
Por último en el tercer rectángulo inicializamos el nodo llamado publisher_suscriber e informamos por terminal que el nodo se inicializó correctamente.
Ahora vamos a crear el nodo publicador:
Como podemos observar creamos la función talker que recibe un mensaje como parámetro, ahora nos suscribimos al tópico /cmd_vel y publicamos el mensaje
Ahora vamos a crear una función que use el teclado para mover al turtlebot:
Lo que hace la función keyInput, esta nos pide ingresar una tecla, si se oprime w cambiamos el valor lineal de x para mover el robot hacia adelante, si se oprime s cambia el valor lineal a negativo para moverse hacia atrás, si se oprime a cambia el valor angular de z para girar hacia la izquierda y d gira hacia la derecha.
Por último, vamos a hacer llamados continuos a estas funciones añadiendo un ciclo while al código inicial:
Acá lo que hacemos es crear un ciclo while para que esté constantemente solicitando una tecla, imprimiendo la velocidad del turtlebot 3, y cambiando la velocidad del turtlebot.
Para probar el código vamos a movernos a nuestro workspace, y compilamos el entorno: cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash
Y si no tuvimos ningún error podemos correr el código y revisar si funciona
Panorama
Uma dúvida recorrente de desenvolvedores ROS iniciantes é como combinar publisher e subscriber no mesmo arquivo. Neste exemplo, vamos utilizar um dos robôs mais famosos, TurtleBot3, para fazer uma demonstração virtual.
Abrindo o rosject
Para seguir este tutorial, será útil e conveniente usar um rosject (que a grosso modo é um projeto ROS configurado para rodar um exemplo).
Acesse o link: https://app.theconstructsim.com/l/5e2b6017
Clique no botão vermelho “RUN”:
Lançando a simulação exemplo:
Abra um terminal clicando no ícone indicado na figura:
Na janela do primeiro terminal, insira o comando:
roslaunch realrobotlab main.launch
Você será apresentado à uma janela do Gazebo como esta:
Você pode sempre revisitar a janela do Gazebo clicando em “Open Gazebo”:
Nesta janela, você tem a visualização da sua simulação com o TurtleBot3 presente.
Identificando os tópicos importantes: Num segundo terminal (clique no botao “+” para criar abas diferentes), insira o comando:
Esta é a listagem de todos os tópicos da simulação. Serão de especial importância para nós o tópico /scan, pois queremos ler o scanner do robô e o tópico /cmd_vel, pois queremos alterar a velocidade do robô.
No mesmo terminal, rode o comando:
rostopic type /scan
que apresentará:
sensor_msgs/LaserScan
esta informação é importante para compor o arquivo Python.
Abra a janela da IDE clicando no ícone indicado na figura:
Você pode encontrar o arquivo move_file.py na correta estrutura de pastas. Tome um minuto para entender onde o arquivo deve ser criado dentro do seu workspace para uma melhor organização geral.
A informação obtida anteriormente com respeito ao tópico /scan é utilizada em:
from sensor_msgs.msg import LaserScan
e
sub = rospy.Subscriber('/scan', LaserScan, callback)
Importante: aqui, você é capaz de diferenciar onde deve entrar com o nome do tópico e seu tipo no método subscriber.
Agora, tendo em mente o nosso publisher, o mesmo procedimento deve ser empregado. Rode o comando:
rostopic type /cmd_vel
que produzirá:
geometry_msgs/Twist
esta informação é utilizada em:
from geometry_msgs.msg import Twist
e
pub = rospy.Publisher('/cmd_vel', Twist)
A variável que nós criamos, chamada “move”, também deve ser do tipo “Twist”. Por isso temos:
move = Twist()
A função “callback” é chamada pelo subscriber e toda vez que isso acontece um determinado feixe do scanner será lido. Qual deles? Bem, isso depende do que você selecionar. Vejamos exemplos:
Rode o comando:
rosmsg show sensor_msgs/LaserScan
Reparou no uso do tipo descoberto anteriormente aqui também?
Você deve ver:
De fato, os valores que queremos ler estão em “ranges”. Para ter exemplos de leitura do scanner, você pode rodar:
rostopic echo /scan
Não se assuste com esse comando, sua tela ficará cheia de dados provenientes do scanner. Com o comando Ctrl+C você para de printar esses dados na tela. Então, pode verificar o que nos interessa, ou seja, as informacoes contidas em “ranges”. Cada posição desse array corresponde a um feixe do scanner (por exemplo, o 360 está na frente do robô).
Raciocínio semelhante pode ser aplicado ao publisher. Rode o comando:
rosmsg show geometry_msgs/Twist
Para obter:
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
Baseando-se nesses valores, nós sabemos onde ler e onde escrever as informações.
Aplicando uma lógica simples de movimentação Vamos imaginar que se o robô detecta um obstáculo à sua frente ele muda a direção. Caso contrário, continua em linha reta. Isso é feito muito facilmente lendo o valor do feixe de interesse e alterando as velocidades linear e angular do robô. Assim, o arquivo Python deve conter em sua função callback:
Imaginando que esse é seu primeiro pacote, navegue até o diretório do seu worspace:
roscd
cd..
Compile:
catkin_make
source devel/setup.bash
Para facilitar sua vida, já existe um arquivo de launch preparado neste rosject que você pode rodar inserindo:
roslaunch basic_project move_launcher.launch
Na janela do Gazebo, você deve ver o robô se comportando como esperado. Nada nos dá mais satisfação do que ver o robô fazendo o que deveria fazer.
Nós esperamos que este post seja útil para você!
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.
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.
Opening the rosject
In order to follow this tutorial, we need to have ROS2 installed in our system, and ideally a ros2_ws (ROS2 Workspace). To make your life easier, we have already prepared a rosject for that: https://app.theconstructsim.com/l/5e01d324/
Just by copying the rosject (clicking the link above), you will have a setup already prepared for you.
After the rosject has been successfully copied to your own area, you should see a Run button. Just click that button to launch the rosject ( see this example).
After pressing the Run button, you should have the rosject loaded. Now, let’s head to the next section to get some real practice.
In order to interact with ROS2, we need a terminal.
Let’s open a terminal by clicking the Open a new terminal button.
cd cpp_py_pkg/
touch src/cpp_node.cpp
touch include/cpp_py_pkg/cpp_header.hpp
In order to compile the package later, we need at least a main function in the C++ node. For this tutorial for simplicity, we can just add this minimal code to the cpp_node.cpp file:
#include “rclcpp/rclcpp.hpp”
// Include your header file to use it
#include “cpp_py_pkg/cpp_header.hpp”
int main(int argc, char **argv)
{
// Initiate ROS communications
rclcpp::init(argc, argv);
// Instantiate the node
auto node = std::make_shared<rclcpp::Node>(“my_node_name”);
// Make the node spin
rclcpp::spin(node);
// Shutdown ROS communications
rclcpp::shutdown();
return 0;
}
Add a Python node and module to import
For Python, we need to create additional folders first:
The CMakeLists.txt and package.xml will be shared by Python and C++, which is what we will edit in the next section to configure the package for both Python and C++.
Configure the package
package.xml
Add a buildtool_depend tag for ament_cmake_python:
# Install Python executables in the ros2_ws/install/cpp_py_pkg/lib/cpp_py_pkg/ folder
install(PROGRAMS
scripts/py_node.py
DESTINATION lib/${PROJECT_NAME}
)
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()
ament_package()
Compile package, then run C++ node and Python node
cd ~/ros2_ws/
colcon build –packages-select cpp_py_pkg
Source ROS2 environment and start C++ node in one terminal:
source ~/ros2_ws/install/setup.bash
ros2 run cpp_py_pkg cpp_executable
Source ROS2 environment and start Python node in another terminal:
source ~/ros2_ws/install/setup.bash
ros2 run cpp_py_pkg py_node.py
That’s it! If there are no errors when you run the nodes then it means that it was successful (remember that our nodes do not do anything except spin).
Congratulations. You now know how to use C++ and Python in the same ROS 2 package.
To learn more about ROS 2, have a look at the course below:
Le but de ce tutoriel est d’apprendre à créer et utiliser des bibliothèques dans les packages ROS2 Python. Lors du développement d’un projet, il est essentiel de garder son code structuré pour assurer un développement efficace. L’utilisation de bibliothèque (ou library) custom est indispensable pour cela car cela permet de regrouper les codes sources en fonction de leurs usages et donc de séparer des fonctionnalités distinctes. La création de bibliothèques est donc essentielle pour rendre votre code plus structuré, modulaire et réutilisable. Nous allons donc voir ensemble comment déclarer et faire appel une custom library dans les packages ROS2 Python.
Pré-requis
Pour lancer et tester le code, vous devez lancer la simulation du turtlebot3 sur gazebo. Si vous voulez effectuer le tutoriel sur votre installation local, vous devez avoir ROS2 installé (https://docs.ros.org/en/humble/Installation.html), avoir configuré un workspace (https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Creating-A-Workspace/Creating-A-Workspace.html) et avoir installé le turtlebot3.
# pour installer tous les packages du turtlebot3 # remplacez humble par votre distro ROS2 sudo apt-get install ros-humble-turtlebot3* # n'oubliez pas d'exporter le modèle de Turtlebot3 que vous souhaitez utiliser export TURTLEBOT3_MODEL=waffle_pi
Si vous effectuez ce tutoriel en utilisant un Rosject vous pouvez directement enter les commandes suivantes dans le terminal:
# Declare le model de turtlebot3 à simuler export TURTLEBOT3_MODEL=waffle_pi # Lance la simulation du turtlebot dans gazebo ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
Une fois la simulation du turtlebot3 lancée, celle-ci va publier sur le topic /odom que nous allons utiliser dans le code exemple.
Après avoir exécuté ces commandes, appuyez sur le bounton de l’interface gazebo et selectionnez Open Gazebo.
Vous devriez obtenir le résultat suivant.
Part 1: Créer un package qui va contenir le source code de la library
Nous allons commencer par créer le package python qui va servir de bibliothèque. Ouvrez un terminal et executez les commandes suivantes:
cd ~/ros2_ws/src ros2 pkg create --build-type ament_python custom_library
Maintenant que le package est initialisé, nous allons créer le fichier qui va contenir le source code de la library. Pour faire cela, ouvrez un terminal et executez les commandes suivantes:
cd ~/ros2_ws/src/custom_library/custom_library touch odom_toolbox.py
Affichez l’éditeur de code et ouvrez le fichier odom_toolbox.py. Ajouter ensuite le code suivant:
Ce code d’exemple déclare une class contenant une méthode permettant de soustraire terme à terme la position d’une odom avec une autre et de retourner le point obtenu.
Vous pouvez compiler le package pour tester que tout fonctionne.
cd ~/ros2_ws colcon build source install/setup.bash
Part 2: Créer un package qui va utiliser la library créée précédemment
Nous allons créer un package python qui va utiliser la bibliothèque créee dans la partie une. Ouvrez un terminal et executez les commandes suivantes:
cd ~/ros2_ws/src ros2 pkg create --build-type ament_python my_package
Une fois le package créer, nous allons créer un fichier main.py qui contiendra le node exemple.
cd ~/ros2_ws/src/my_package/my_package touch main.py
Collez ensuite le code ci-dessous dans le fichier main.py.
# main.py
import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Point
from nav_msgs.msg import Odometry
# importer la custom library
from custom_library.odom_toolbox import OdometryToolbox
class OdomToPointNode(Node):
def __init__(self):
super().__init__('odom_to_point_node')
# Initialiser le subscriber sur le topic odom du turtlebot3
Pour pouvoir utiliser votre library custom dans votre package, vous devez mettre à jour le setup.py du package.
# setup.py
from setuptools import setup
package_name = 'my_package'
setup(
name=package_name,
version='0.0.0',
packages=[package_name],
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
],
install_requires=[
'setuptools',
# ajouter votre library dans les install_requires
'custom_library'],
zip_safe=True,
maintainer='user',
maintainer_email='user@todo.todo',
description='TODO: Package description',
license='TODO: License declaration',
tests_require=['pytest'],
entry_points={
'console_scripts': [
# Ajouter le node dans les console_scripts
'odom_to_point_node = my_package.main:main',
],
},
)
Une fois que les fichiers suivants ont été modifiés, vous pouvez build le package.
cd ~/ros2_ws colcon build source install/setup.bash
Step 3: Tester le node
Pour lancer le node, lancez la simulation comme indiqué dans les prérequis. Vous devez ensuite exécuter les commandes suivantes dans un terminal:
ros2 run my_package odom_to_point_node
Maintenant que le code est en cours d’exécution, vous devriez avoir un print des coordonnées du robot en ayant pour origine la position du robot au moment du lancement le node.
Merci d’avoir suivi ce poste.
Ressources
• ROS Ignite Academy
• ROS2 Full course for beginner
• Rosject utilisé pour le poste
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