Mô phỏng nhiều robot với Nav2 trong ROS2 Humble & Gazebo (Phần 1) – ROS2 Vietnamese Tutorial

Mô phỏng nhiều robot với Nav2 trong ROS2 Humble & Gazebo (Phần 1) – ROS2 Vietnamese Tutorial

This tutorial is created by Robotics Ambassador Eric

Những điều bạn sẽ được biết trong blog này:

  1. Cách cài đặt các packages cần thiết để mô phỏng nhiều robots ở ROS2 Humble
  2. Cách tạo launch file để mô phỏng nhiều robot trên gazebo
  3. Mô phỏng robots trên Rviz và gazebo

Phần 2: https://www.theconstruct.ai/lam-sao-de-mo-phong-nhieu-robot-su-dung-nav2-trong-khong-gian-gazebo-voi-ros2-humble-phan-2-vietnamese-ros2-tutorial/

Danh sách nguồn tài liệu bổ trợ trong post này

  1. Sử dụng rosject: **https://app.theconstructsim.com/rosjects/750453**
  2. The Construct**: https://app.theconstructsim.com/**
  3. Khóa học về ROS2 →
    1. Introduction to Gazebo Sim with ROS2: https://app.theconstructsim.com/courses/introduction-to-gazebo-ignition-with-ros2-170/

Tổng quan

Khi làm việc với dự án yêu cầu bạn phải kết hợp nhiều robots với nhau để thực hiện một nhiệm vụ nào đó, vấn đề đầu tiên đặt ra là làm sao để có thể mô phỏng được nhiều robot trên một môi trường cụ thể. Do đó, blog này sẽ giúp bạn biết cách thực hiện điều đó. Đây sẽ là phần 1 của blog này với mong muốn sẽ giúp cho các bạn biết cách tạo một launch file để tích hợp nhiều robots và mô phỏng chúng trên Gazebo cùng với Rviz. Tiếp theo đó sẽ là phần 2 sẽ hướng dẫn các bạn sử dụng Nav2 package cùng với nhiều robot trong môi trường Gazebo.

Khởi động rosject

Như mọi lần rosject sẽ là công cụ hoàn hảo cho việc thực hiện project này, nơi các bạn dễ dàng truy cập và khởi tạo các project cùng với ROS ở các phiên bản khác nhau:

**https://app.theconstructsim.com/rosjects/750453**

Như hình bên dưới là một rosject hoàn chỉnh, bạn chỉ việc nhấn vào nút RUN để khởi động rosject.

Sau khi nhấn vào nút RUN bạn sẽ thấy rosject được chạy trên màn hình. Ở đây, rosject cung cấp cho bạn cả terminal để có thể nhập các câu lệnh:

https://flic.kr/p/2pGt7Ge

Bây giờ cùng nhau đến bước tiếp theo trong ví dụ này nhé.

Cài đặt các package cần thiết

Đầu tiên các bạn cần cài đặt các package cần thiết để có thể thực hiện project này, sau khi vào môi trường làm việc catkin là ros2_ws các bạn làm theo bằng cách thực hiện các câu lệnh sau đây:

cd ros2_ws/src

git clone https://github.com/Eric-nguyen1402/turtlebot3_multi_robot

source /opt/ros/humble/setup.bash

cd ..

sudo rosdep install --from-paths src --ignore-src -r -y

Sau bước này thì các bạn sẽ nhìn thấy thông báo cài đặt thành công như hình bên dưới.

https://flic.kr/p/2pGmTxi

Tiếp theo sử dụng câu lệnh sau để build môi trường catkin

colcon build --symlink-install

source ./install/setup.bash

https://flic.kr/p/2pGrq9K

Sau khi tải thành công các bạn sẽ nhìn thấy folder turtlebot3_multi_robot trong src. ở đây sẽ bao gồm các file cần thiết cho project này. Tiếp theo chúng ta sẽ đến mô phỏng và đi sâu vào làm sao để tạo được launch file.

https://flic.kr/p/2pGtH5J

Mô phỏng trên Gazebo cùng nhiều robots

Thông thường khi làm việc với turtlebot3 các bạn luôn phải chọn mô hình robot và truy xuất môi trường cũng như đường dẫn đến package. Tuy nhiên, trong blog này thay vì phải command mỗi lần chạy chương trình. Mình sẽ hướng dẫn các bạn cách khai báo trong launch file để chương trình tự động thực hiện cài đặt.

https://flic.kr/p/2pGtH6f

Sau đó để sử dụng môi trường gazebo và robot, bạn cần truy xuất môi trường gazebo và chạy ros launch package:

ros2 launch turtlebot3_multi_robot gazebo_multi_nav2_world.launch.py enable_drive:=True

Vì chúng ta sẽ mô phỏng không chỉ một mà nhiều robot cùng một lúc nên khi thực hiện câu lệnh chương trình cần một lúc để xử lý được yêu cầu nên các bạn kiên nhẫn nhé.

https://flic.kr/p/2pGmTxy

Mô phỏng trên RViz cùng nhiều robots

Khi thực hiện ros launch ở trên, 4 cửa sổ Rviz tương ứng với mỗi robot cũng sẽ xuất hiện đồng thời như hifnh dưới. Mỗi cửa sổ đại diện cho một robot.

https://flic.kr/p/2pGst9h

Bên cạnh đó, nếu các bạn kiểm tra ros topic thì các bạn sẽ thấy đầy đủ đồng thời tất cả topic của robot được khai báo (tb1, tb2, tb3, tb4). Từ đây chúng ta có thể áp dụng vào nhiều project sử dụng nhiều robots cùng lúc.

source ~/ros2_ws/install/setup.bash

ros2 topic list

https://flic.kr/p/2pGmTyf
https://flic.kr/p/2pGtH7h
https://flic.kr/p/2pGt7Hw
https://flic.kr/p/2pGtH7C

Cách tạo launch file để mô phỏng nhiều robots cùng lúc

Sau đây, mình sẽ giải thích các phần trong launch file để các bạn tùy ý có thể thay đổi và thực hiện project cho riêng mình.

1. Khởi tạo Gazebo server và client ¶

Để có thể chạy mô phỏng trên Gazebo chúng ta cần khai báo và khởi tạo Gazebo server và client như sau

gzserver_cmd = IncludeLaunchDescription(

    `PythonLaunchDescriptionSource(`

        `os.path.join(get_package_share_directory("gazebo_ros"), "launch", "gzserver.launch.py")`

    `),`

    `launch_arguments={"world": world}.items(),`

`)`
 
`gzclient_cmd = IncludeLaunchDescription(`

    `PythonLaunchDescriptionSource(`

        `os.path.join(get_package_share_directory("gazebo_ros"), "launch", "gzclient.launch.py")`

    `),`

`)`

Triển khai robots dưới dạng lưới

Khi mô phỏng trên gazebo, chúng ta cần biết vị trí cần bố trí robot hay nói cách khác chúng ta cần khởi tạo tọa độ cho robot trên môi trường gazebo. Để làm việc đó, cách tiếp cận đơn giản là sử dụng hàng và cột để xác định vị trí theo dạng lưới. Với mỗi vị trí trên lưới, nó sẽ tạo ra một tên và không gian duy nhất cho từng robot. Sau đó, tạo và cấu hình nút robot_state_publisher và spawn_entity.py để xuất hiện robot trong gazebo.

for i in range(COLS):

`for j in range(ROWS):`

    `name = "turtlebot" + str(i) + "_" + str(j)`

    `...`

    `turtlebot_state_publisher = Node(`

        `...`

    `)`

    `spawn_turtlebot3_burger = Node(`

        `...`

    `)`

    `...`

Cách sắp xếp tuần tự với trình xử lý sự kiện (Event Handlers)

Chúng ta sửu dụng phương pháp tuần tự để robot xuất hiện, đảm bảo rằng mỗi robot được hoàn toàn trang bị trước khi đến với robot tiếp theo. Điều này được thực hiện thông qua hai chức năng RegisterEventHandler và OnProcessExit để chờ quá trình trước đó được hoàn thành.

if last_action is None:

`ld.add_action(turtlebot_state_publisher)`

`ld.add_action(spawn_turtlebot3_burger)`

else:

`spawn_turtlebot3_event = RegisterEventHandler(`

    `...`

`)`

`ld.add_action(spawn_turtlebot3_event)`

Bật chế độ chuyển động

Sau khi các robots được hoàn toàn khởi tạo, chúng ta có thể bắt đầu đùng các nút để điều khiển robot dựa trên enable_drive, cho phép điều khiển chuyển động của robots trong môi trường mô phỏng

drive_turtlebot3_burger = Node(

            `package="turtlebot3_gazebo",`

            `executable="turtlebot3_drive",`

            `namespace=namespace,`

            `output="screen",`

            `condition=IfCondition(enable_drive),`

        `)`

Đến đây là kết thúc phần 1 của blog này, các bạn có thể theo doxi phần 2 để kết hợp nhiều robots cùng với Nav2 package. Hy vọng qua blog này các bạn đã có thêm một số kiến thức cũng như công cụ hỗ trợ cho các dự án liên quan tới robotics sử dụng ROS. Bên cạnh đó, các bạn có thể theo dõi các blog khác cũng như các khóa học liên quan trên The Construct nhé.

 

Video Tutorial

Desbravando espaços com o BB8 e ROS em C++ via Actions personalizadas – ROS Portuguese Tutorial

Desbravando espaços com o BB8 e ROS em C++ via Actions personalizadas – ROS Portuguese Tutorial

This tutorial is created by Robotics Ambassador Anderson

Robotics Ambassador Program https://www.theconstruct.ai/robotics-ambassador/

 

O que nós vamos aprender:

  1. Configurar e criar um pacote em ROS para um robô BB-8.
  2. Criar e configurar mensagens de Action para controlar o movimento do robô.
  3. Escrever um servidor de ações em C++ para processar os comandos recebidos.
  4. Compilar e lançar a simulação do robô BB-8 no Gazebo.
  5. Enviar comandos para o robô BB-8 via terminal e receber feedback de sua posição no espaço tridimensional.

Lista de recursos usados neste post:

  1. Use este rosject: https://app.theconstruct.ai/l/60394ad6/
  2. The Construct: https://app.theconstructsim.com/
  3. ROS Courses: ROS Basics in 5 Days (C++) https://app.theconstructsim.com/courses/56

Panorama

Bem-vindo! Neste tutorial, iremos mergulhar nos recursos de Actions no ROS, com foco no ROS 1 Noetic e em um dos robôs mais encantadores disponíveis na plataforma: o BB-8 do universo de Star Wars. Vamos explorar como usar Actions para enviar comandos personalizados que permitem ao BB-8 executar ações específicas, como caminhar, girar e parar, em resposta a objetivos definidos. Ao longo do processo, você aprenderá a criar mensagens customizadas para interagir com o BB-8 de maneira controlada e divertida.

Abrindo o rosject

Para acompanhar este tutorial utilize o rosject acessando o link fornecido e clique no botão vermelho

https://app.theconstruct.ai/l/60394ad6/

Criando o pacote

Abra um terminal e cole os comandos abaixo para criar o pacote e os arquivos necessários para a simulação.

roscd; cd ..; cd src/bb8; catkin_create_pkg bb8_action_pkg roscpp actionlib actionlib_msgs geometry_msgs std_msgs
cd bb8_service_pkg; mkdir action;
cd action; touch CustomActionMsg.action; cd ..;
cd src; touch bb8_service_server.cpp; chmod +x *.cpp

Novos arquivos aparecerão na árvore de pastas em sua IDE.

Configurando as mensagens de Action
Mensagens de Action são compostas pelos elementos goal, result e feedback. No caso da nossa aplicação, trataremos cada um dos elementos como uma string diferente. Salve o arquivo CustomActionMsg.action incluindo o seguinte conteúdo:

string goal
---
string result
---
string feedback

Preparando para compilar

Para atualizar seu CMakeList.txt, é crucial copiar o seguinte conteúdo e colá-lo no arquivo, substituindo o que estiver presente.

cmake_minimum_required(VERSION 3.0.2)
project(bb8_action_pkg)
find_package(catkin REQUIRED COMPONENTS
actionlib
actionlib_msgs
geometry_msgs
roscpp
std_msgs
)
add_action_files(
FILES
CustomActionMsg.action
)
generate_messages(
DEPENDENCIES
geometry_msgs# std_msgs
actionlib_msgs
)
catkin_package(
CATKIN_DEPENDS actionlib actionlib_msgs roscpp
)
include_directories(
${catkin_INCLUDE_DIRS}
)
add_executable(bb8_action_server src/bb8_action_server.cpp)
add_dependencies(bb8_action_server ${bb8_action_server_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(bb8_action_server
${catkin_LIBRARIES}
)
add_dependencies(bb8_action_server bb8_action_pkg_generate_messages_cpp)

Escrevendo o servidor de ações

Agora, vamos para a etapa em que os comandos são enviados ao servidor do ações. No diretório ‘src’, abra o arquivo bb8_action_server.cpp e adicione o seguinte código.
#include "geometry_msgs/Twist.h"
#include "nav_msgs/Odometry.h"
#include <actionlib/server/simple_action_server.h>
#include <bb8_action_pkg/CustomActionMsgAction.h>
#include <ros/ros.h>
class MoveAction {
protected:
ros::NodeHandle nh_;
actionlib::SimpleActionServer<bb8_action_pkg::CustomActionMsgAction> as_;
std::string action_name_;
bb8_action_pkg::CustomActionMsgFeedback feedback_;
bb8_action_pkg::CustomActionMsgResult result_;
ros::Publisher pub;
ros::Subscriber sub;
geometry_msgs::Twist mov;
nav_msgs::Odometry odom;
ros::Rate *rate_;
public:
MoveAction(std::string name)
: as_(nh_, name, boost::bind(&MoveAction::Callback, this, _1), false),
action_name_(name) {
as_.start();
rate_ = new ros::Rate(1);
pub = nh_.advertise<geometry_msgs::Twist>("cmd_vel", 1000);
sub = nh_.subscribe("/odom", 1000, &MoveAction::odomCallback, this);
}
void Callback(const bb8_action_pkg::CustomActionMsgGoalConstPtr &goal) {
ROS_INFO("Goal received: %s", goal->goal.c_str());
while (ros::ok() && !as_.isPreemptRequested()) {
if (goal->goal == "walk") {
mov.linear.x = 0.5;
mov.angular.z = 0;
pub.publish(mov);
} else if (goal->goal == "turn") {
mov.linear.x = 0;
mov.angular.z = 1;
pub.publish(mov);
usleep(2000000);
} else if (goal->goal == "stop") {
mov.linear.x = 0;
mov.angular.z = 0;
pub.publish(mov);
}
feedback_.feedback =
"Received position: x=" + std::to_string(odom.pose.pose.position.x) +
", y=" + std::to_string(odom.pose.pose.position.y) +
", z=" + std::to_string(odom.pose.pose.position.z);
as_.publishFeedback(feedback_);
rate_->sleep();
}
if (as_.isPreemptRequested()) {
ROS_INFO("Goal preempted.");
as_.setPreempted();
} else {
ROS_INFO("Goal succeeded.");
result_.result = "Action completed.";
as_.setSucceeded(result_);
}
}
void preemptCallback() {
ROS_INFO("Goal preempted.");
as_.setPreempted();
}
void odomCallback(const nav_msgs::Odometry::ConstPtr &msg) { odom = *msg; }
};
int main(int argc, char **argv) {
ros::init(argc, argv, "node_action");
MoveAction server("action_custom_msg_as");
ros::spin();
return 0;
}

Compilando o pacote e lançando a simulação

Em um terminal, inicie o Gazebo usando o comando apropriado para visualizar o robô BB-8 pronto para operação. Isso abrirá a janela do Gazebo.

roslaunch bb_8_gazebo main.launch

No segundo terminal, execute o seguinte comando para compilar apenas o pacote que criamos. Isso economiza tempo, já que compilará apenas um pacote em vez de todos os existentes.

cd ~/catkin_ws/; catkin_make --only-pkg-with-deps bb8_action_pkg; source devel/setup.bash

Se tudo foi feito corretamente, o prompt não acusará nenhum erro:

Rodando o servidor de serviços

No terminal 3, execute o comando para iniciar o servidor de ações:

rosrun bb8_action_pkg bb8_action_server

Não se preocupe com este terminal, abra um novo para prosseguir com os passos deste tutorial.

Invocando o feedback da ação

Abra um quarto terminal para receber feedback do robô com informações sobre sua localização no espaço tridimensional. Essas atualizações são recebidas a cada dois segundos, permitindo que você saiba a posição do robô mesmo que ele não esteja visível.

rostopic echo action_custom_msg_as/feedback

Não se preocupe se nada aparecer inicialmente, pois o servidor ainda não está em execução, então não haverá feedback disponível ainda. Isso é normal.

Chamando a ação criada

No quinto terminal, execute o seguinte comando:

rostopic pub action_custom_msg_as/goal bb8_action_pkg/CustomActionMsgActionGoal

Após digitar o comando, não pressione ‘Enter’. Em vez disso, pressione ‘Tab’ duas vezes para autocompletar com os elementos necessários. Em seguida, você poderá selecionar o goal desejado, como ‘turn’, ‘walk’ ou ‘stop’.”

O robô deve se mover de acordo.

Visualizando o feedback

De volta ao terminal 4 temos:

As informações de odometria sempre indicarão onde seu robô está localizado, mesmo que a visualização seja obstruída por um Star Destroyer. Aliás, este método é excelente para explorar e localizar aquela entrada secreta em uma colossal nave inimiga.

Esperamos que este tutorial seja útil e que você se divirta trabalhando com o BB-8, um robô incrível tanto em termos gráficos quanto funcionais.

 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.

Continue avançando no seu aprendizado de ROS.

How to dynamically spawn objects in Gazebo Simulation using Python – English ROS Tutorial

How to dynamically spawn objects in Gazebo Simulation using Python – English ROS Tutorial

What are we going to Learn?

  1. How to create ROS2 Package
  2. How to compile ROS2 workspace
  3. 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.

If you want to learn ROS 2 Python in a practical, hands-on way, check out the course ROS 2 Basics in 5 Days: https://app.theconstruct.ai/courses/132

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:

To follow along the post, we need to have ROS2 installed in our system. To make things easier, we have created ROSJect to follow along: https://app.theconstructsim.com/rosjects/741580

Just open the ROSJect in your browser

Click on “FORK”

Next, Click on “RUN”

Open the new Web Shell

 

Go to the ROS2 Workspace

cd ros2_ws

Then, source the workspace

source install/setup.bash

In one web shell, run Gazebo

gazebo –verbose -s libgazebo_ros_factory.so

In another web shell, run the ROS2 Node

ros2 run robot_spawner_pkg spawn_turtlebot the_robot_name robot_namespace 0.0 0.0 0.1

Congratulations. You have now learned how to spawn objects in Gazebo Simulation using Python.

To learn more about ROS 2, have a look at the course below:

We hope this tutorial was really helpful to you.

This tutorial is created by Robotics Ambassador Muhammad.

Video Tutorial

گیزبو سمولیشن میں روبوٹ میں ورچوئل ڈیپتھ کیمرہ کیسے شامل کریں۔ – Udru ROS Tutorial

گیزبو سمولیشن میں روبوٹ میں ورچوئل ڈیپتھ کیمرہ کیسے شامل کریں۔ – Udru ROS Tutorial

This tutorial is created by Rosbotics Ambassador 020 Muhammad

Rosbotics Ambassador Program https://www.theconstruct.ai/rosbotics-ambassador/)


کمپیوٹر ویژن روبوٹکس میں ایک اہم حصہ ہے اور روبوٹکس میں کمپیوٹر ویژن الگورتھم کو لاگو کرنے اور جانچنے کے لیے ہمیں اپنے روبوٹ میں ویژن سینسرز (RGB اور RGB-D کیمروں) کو ضم کرنے کی ضرورت ہے۔ اس پوسٹ میں ہم مصنوعی ماحول کو دیکھنے کے لیے Gazebo Simulation میں اپنے روبوٹ میں مصنوعی RGB-D کیمرہ شامل کرنا سیکھیں گے۔

اس پوسٹ میں استعمال ہونے والے وسائل کی فہرست

کیا آپ روبوٹکس میں مہارت حاصل کرنا چاہتے ہیں؟ روبوٹکس ڈویلپر ماسٹر کلاس: https://www.theconstruct.ai/robotics-developer/

جائزہ:

سمولیشن روبوٹک سسٹمز ٹیسٹنگ میں ایک مربوط حصہ ہے، روبوٹکس سسٹمز کے تمام پہلوؤں کو صحیح طریقے سے جانچنے کے لیے، تمام اجزاء کو سمولیشن میں شامل کیا جانا چاہیے (بشمول سینسر، ایکچویٹرز وغیرہ)۔ Gazebo، روبوٹکس میں بڑے پیمانے پر استعمال ہونے والا سمولیشن سافٹ ویئر ہونے کے ناطے، اس میں بنائے گئے زیادہ تر سینسرز کے لیے تعاون حاصل ہے۔

ROS Inside!

ROS Inside

Before anything else, if you want to use the logo above on your own robot or computer, feel free to download it, print it, and attach it to your robot. It is really free. Find it in the link below:

ROS Inside Logo

Opening the ROSJect:

پوسٹ میں فراہم کردہ لنکس کا استعمال شروع کرنے سے ہی سب کچھ کرنے کی سفارش کی جاتی ہے۔ وہاں نقلی چلانے کے لیے، پہلے سے ہی ایک ROSJect تیار ہے جسے آپ ہر چیز کو دوبارہ پیش کرنے کے لیے استعمال کر سکتے ہیں، ROSJect کو صرف حوالہ کے طور پر استعمال کریں: https://app.theconstructsim.com/l/5ef573e3/

ROSJect کھولنے کے بعد، ٹرمینل چلائیں۔

کمانڈ کا استعمال کرتے ہوئے اپنے ROS ورک اسپیس پر جائیں:

cd catkin_ws

اور پھر بھاگو

catkin_make

کام کی جگہ کو دوبارہ بنانے کے لیے۔

اب، آپ نے کام کی جگہ کو کامیابی کے ساتھ بنایا ہے، تبدیلیوں کو مؤثر بنانے کے لیے آپ کو اس کا ذریعہ بنانا ہوگا۔

source devel/setup.bash

انحصار انسٹال کرنا:

اب ہمیں تخروپن کو چلانے کے لیے کچھ انحصار انسٹال کرنے کی ضرورت ہے۔ ٹرمینل کھولیں اور ٹائپ کریں:

sudo apt update

مندرجہ بالا کمانڈ پر عمل کرنے کے بعد، ایک اور کمانڈ چلائیں

sudo apt install ros-noetic-turtlebot3 ros-noetic-turtlebot3-simulations -y

نقلی چل رہا ہے۔

ٹرمینل کھولیں اور چلائیں:

roslaunch my_robot_gazebo my_robot_world.launch

ایک گیزبو سمولیشن ونڈو کھلی ہے جس میں آپ کے روبوٹ کو بنایا گیا ہے۔

آپ شائع ہونے والے عنوانات کو دیکھنے کے لیے دوسرا ٹرمینل بھی کھول سکتے ہیں۔

 

کمانڈ ٹائپ کریں۔

rostopic list

اس میں ان تمام موضوعات کی فہرست دی جائے گی جو فی الحال شائع ہو رہے ہیں۔

رنگین تصویری موضوع کو تصور کرنا

نقلی کیمرہ فیڈ دیکھنے کے لیے کمانڈ چلائیں۔

rosrun image_view image_view image:=/mobile_robot/color/image_raw

RViz میں پوائنٹ کلاؤڈ ڈیٹا کا تصور کرنا

ہم RViz میں پوائنٹ کلاؤڈ ڈیٹا کو بھی دیکھ سکتے ہیں۔ ٹرمینل چلائیں اور ٹائپ کریں:

rosrun rviz rviz

یہ RViz کے ساتھ نئے گرافیکل ٹولز ونڈو کو کھولے گا۔ “شامل کریں” پر کلک کریں اور “پوائنٹ کلاؤڈ 2” فیلڈ شامل کریں۔

اس کے بعد، اس موضوع کو منتخب کریں جس پر پوائنٹ کلاؤڈ ڈیٹا شائع کیا گیا ہے جیسا کہ ذیل کی تصویر میں دکھایا گیا ہے۔

آپ پوائنٹ کلاؤڈ ڈیٹا کو دیکھ سکیں گے جو روبوٹ میں کیمرہ فریم کے میدان میں ہے، مندرجہ ذیل ہے۔

حتمی خیالات:

اب جب کہ ہمارے پاس گیزبو ماحول میں اپنے روبوٹ سمولیشن میں کیمرہ فیڈ موجود ہے، ہم اسے مختلف کاموں کو انجام دینے کے لیے استعمال کر سکتے ہیں جیسے کہ کمپیوٹر وژن، آبجیکٹ کا پتہ لگانے، سیمنٹک سیگمنٹیشن، اور لوکلائزیشن وغیرہ۔ یہ بھی نوٹ کریں کہ RViz میں پوائنٹ کلاؤڈ ڈیٹا غلط ہے۔ واقفیت. اس کو حل کرنے کے لیے ہمیں بیس لنک سے کیمرہ لنک میں کچھ سٹیٹک ٹرانسفارمز شامل کرنے ہوں گے (ہم آنے والی پوسٹس میں دیکھیں گے)۔


Video Tutorial

How to spawn a Gazebo robot using XML launch files

How to spawn a Gazebo robot using XML launch files

What we are going to learn

  1. How to start Gazebo
  2. How to spawn a robot to Gazebo
  3. How to run the Robot State Publisher node
  4. How to start Rviz configured

List of resources used in this post

  1. Use the rosject: https://app.theconstructsim.com/l/56476c77/
  2. The Construct: https://app.theconstructsim.com/
  3. ROS2 Courses –▸
    1. ROS2 Basics in 5 Days Humble (Python): https://app.theconstructsim.com/Course/132
    2. ROS2 Basics in 5 Days Humble (C++): https://app.theconstructsim.com/Course/133

Overview

While many examples demonstrate how to spawn Gazebo robots using Python launch files, in this post, we will be learning how to achieve the same result using XML launch files. Let’s get started!

ROS Inside!

ROS Inside

ROS Inside

Before anything else, if you want to use the logo above on your own robot or computer, feel free to download it and attach it to your robot. It is really free. Find it in the link below:

ROS Inside logo

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 with a simulation for that: https://app.theconstructsim.com/l/56476c77/.

You can download the rosject on your own computer if you want to work locally, but just by copying the rosject (clicking the link), 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 (below you have a rosject example).

Learn ROS2 Parameters - Run rosject

How to spawn a Gazebo robot using XML launch files – Run rosject (example of the RUN button)

 

After pressing the Run button, you should have the rosject loaded. Now, let’s head to the next section to get some real practice.

Compiling the workspace

As you may already know, instead of using a real robot, we are going to use a simulation. In order to spawn that simulated robot, we need to have our workspace compiled, and for that, we need a terminal.

Let’s open a terminal by clicking the Open a new terminal button.

 

Open a new Terminal

Open a new Terminal

 

Once inside the first terminal, let’s run the commands below, to compile the workspace

cd ~/ros2_ws
colcon build
source install/setup.bash
There may be some warning messages when running “colcon build”. Let’s just ignore those messages for now.
If everything went well, you should have a message saying that 3 packages were compiled:

How to spawn a Gazebo robot using XML launch files - ros2_ws compiled

How to spawn a Gazebo robot using XML launch files – ros2_ws compiled

Starting the Gazebo simulator

Now that our workspace is compiled, let’s run a gazebo simulation and RViz using normal python launch files.

For that, run the following command in the terminal:

ros2 launch minimal_diff_drive_robot gazebo_and_rviz.launch.py
Again, you may see some error messages. As long as the simulation appears, you can just ignore those error messages.
Now, in a second terminal, let’s also launch the Robot State Publisher, so that we can properly see the robot in RViz (Robot Visualization tool).

 

ros2 run joint_state_publisher joint_state_publisher
Now you should be able to see both Gazebo simulator and RViz, similar to what we can see in the image below:

How to spawn a Gazebo robot using XML launch files - Gazebo and RViz launched

How to spawn a Gazebo robot using XML launch files – Gazebo and RViz launched

In case you want to know, the content of the file used to spawn the robot can be seen with:

cat ~/ros2_ws/src/minimal_diff_drive_robot/launch/gazebo_and_rviz.launch.py

 

Moving the robot around

To make sure everything is working as expected so far, you can also run a new command to move the robot around using the keyboard. For that, open a third terminal, and run the following command:

ros2 run teleop_twist_keyboard teleop_twist_keyboard

Now, to move the robot around just press the keys “i“, “k“, or other keys presented in the terminal where you launched the teleop_twist_keyboard command.

The XML file for launching spawning the robot

As we mentioned earlier, the code for the python launch file can be found seen with:

cat ~/ros2_ws/src/minimal_diff_drive_robot/launch/gazebo_and_rviz.launch.py

 

and for the XML file? The XML file is in the exact same folder, but the file has an XML extension. The content of the file can be seen with:

cat ~/ros2_ws/src/minimal_diff_drive_robot/launch/gazebo_and_rviz.launch.xml
The command above outputs the following:
<?xml version="1.0"?>

<launch>
  <arg name="model" default="$(find-pkg-share minimal_diff_drive_robot)/urdf/minimal_diff_drive_robot.urdf" />

  <arg name="start_gazebo" default="true" />
  <arg name="start_rviz" default="true" />

  <!-- Start Gazebo -->
  <group if="$(var start_gazebo)">
    <include file="$(find-pkg-share gazebo_ros)/launch/gazebo.launch.py">
      <!--arg name="paused" value="true"/>
      <arg name="use_sim_time" value="true"/>
      <arg name="gui" value="true"/>
      <arg name="recording" value="false"/>
      <arg name="debug" value="false"/>
      <arg name="verbose" value="true"/-->
    </include>

    <!-- Spawn robot in Gazebo -->
    <node name="spawn_robot_urdf" pkg="gazebo_ros" exec="spawn_entity.py"
      args="-file $(var model) -x 0.0 -y 0.0 -z 0.0 -entity my_robot" output="screen" />
  </group>

  <!-- TF description -->
  <node name="robot_state_publisher" pkg="robot_state_publisher" exec="robot_state_publisher" output="screen">
    <param name="robot_description" value="$(command 'cat $(var model)')"/>
    <param name="use_sim_time" value="true" />
  </node>

  <!-- Show in Rviz   -->
  <group if="$(var start_rviz)">
    <node name="rviz" pkg="rviz2" exec="rviz2" args="-d $(find-pkg-share minimal_diff_drive_robot)/config/robot.rviz">
      <param name="use_sim_time" value="true" />
    </node>
  </group>

</launch>

If we check carefully the output above, we can see that we start launching the Gazebo simulator, and in the same <group> we spawn the robot in Gazebo by calling spawn_entity.py

Then we launch the Robot State Publisher to be able to see the robot in RViz, and finally, we launch RViz itself.

When launching RViz, we tell it to use a file named config/robot.rviz, as we can see at:

$(find-pkg-share minimal_diff_drive_robot)/config/robot.rviz
That “command” translates to the following path:
cat ~/ros2_ws/src/minimal_diff_drive_robot/config/robot.rviz
Feel free to check the content of that file, be it through the Code Editor, or in the terminal by checking what the cat command outputs.

Spawning the robot in Gazebo using XML launch files

Similar to what we did with Python, you can just run the following command to spawn the robot using XML file.

Please, remember to kill the previous programs by pressing CTRL+C in the terminals where you launched the commands previously.

Assuming that now all previous programs are terminated, let’s spawn gazebo using XML in the first terminal:

ros2 launch minimal_diff_drive_robot gazebo_and_rviz.launch.xml
Now, in the second terminal, let’s launch the Joint State Publisher to be able to correctly see the robot wheels in RViz:
ros2 run joint_state_publisher joint_state_publisher

And on the third terminal, you can start the command to move the robot around:

ros2 run teleop_twist_keyboard teleop_twist_keyboard

And that is basically it

Congratulations. Now you know how to spawn a robot in Gazebo using Python and also using XML launch files.

We hope this post was really helpful to you. If you want a live version of this post with more details, please check the video in the next section.

Youtube video

So this is the post for today. Remember that we have the live version of this post on YouTube. If you liked the content, please consider subscribing to our youtube channel. We are publishing new content ~every day.

Keep pushing your ROS Learning.

Related Courses & Training

If you want to learn more about ROS and ROS2, we recommend the following courses:

Get ROS2 Industrial Ready- Hands-On Training by The Construct cover.png

Get ROS2 Industrial Ready- Hands-On Training by The Construct cover.png

Pin It on Pinterest