Cách khai báo tọa độ cho robot để di chuyển trong không gian Gazebo và RViz
Cách tạo câu lệnh để điều khiển robot di chuyển với gói Nav2
Cách sử dụng Nav2 trên RViz để tạo đường đi cho robot
Phần 1: https://www.theconstruct.ai/lam-sao-de-mo-phong-nhieu-robot-su-dung-nav2-trong-khong-gian-gazebo-voi-ros2-humble-phan-1-ros2-vietnamese-tutorial/
Ở phần 1 của blog “Làm sao để mô phỏng nhiều robots trên Gazebo với Nav2” chúng ta đã tạo thành công gọi được robots trên môi trường Gazebo và Rviz. Tiếp theo, ở phần 2 chúng ta sẽ được làm quen với gói Navigation ROS2. Có thể mọi người đã quen với việc sử dụng Nav2 với một robot nhưng với nhiều robots thì sẽ sử dụng như thế nào. Vì vậy, blog này sẽ giới thiệu với các bạn 2 cách để điều khiển robot với câu lệnh và click chuột.
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:
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:
Bây giờ cùng nhau đến bước tiếp theo trong ví dụ này nhé.
Khởi động và chạy mô phỏng Gazebo
Sau khi thực hiện theo hướng như phần 1, sau đây các bạn chỉ cần chạy launch file vào môi trường Gazebo và Rviz bằng câu lệnh sau. Bên cạnh đó, cửa sổ RViz có thể bật tắt bằng cách sử dụng chế độ enable_rviz:
Ở đây các bạn cần chú ý cho mình chức năng enable_drive:=True . Khi các bạn chọn True đồng nghĩa với việc các bạn sẽ điều khiển tất cả các robots cùng một lúc ví dụ như hình ở dưới. Các robot sẽ tự động di chuyển đến đích theo vị trí các bạn chọn sẵn. Cho nên khi các bạn muốn điều khiển một robot nào trong số các robot có trong môi trường. Các bạn cần phải lựa chọn enable_drive:=False
Cách di chuyển robot với Nav2 Goal trên Rviz
Nếu các bạn đã quen thuộc với Rviz thì các bạn sẽ thấy rằng Rviz cũng cấp cho chúng ta rất nhiều công cụ bổ ích trong đó bao gồm cả Navigation. Lệnh khởi chạy (launch) cài đặt pose ban đầu bằng việc sử dụng topic /initialpose. Bên dưới thanh công cụ của Rviz các bạn sẽ thấy kí hiệu mũi tên màu xanh với tên gọi là Nav2 Goal.
Khi các bạn click vào nút này, các bạn có thể lựa chọn bất kỳ điểm nào trên môi trường RViz bao gồm cả hướng của điểm đến. Với lựa chọn này Nav2 package sẽ giúp bạn tạo ra đường đi phù hợp cho robot. Bạn cũng có thể thay thế Nav2 package bằng một thuật toán xây dựng đường đi cho robot như RRT*, A*,… phù hợp với project của bạn. Sau khi thành công chọn điểm, đường đi của robot sẽ xuất hiện như đường chỉ màu hồng ở hình bên dưới đây.
Cách tạo command line để di chuyển robot với Nav2
Bên cạnh đó, mình sẽ giới thiệu cho bạn một lựa chọn khác đó là thiết lập điểm xuất phát và điểm đến bằng câu lệnh thay vì chọn rviz. Với điểm khởi đầu bạn có thể khởi tạo bằng câu lệnh:
Những điều bạn cần lưu ý khi khởi tạo câu lệnh cho vị trí bắt đầu. Đầu tiên các bạn cần chọn robot nào để di chuyển, ở đây mình chọn robot 2 tương ứng với topic /tb2/initialpose sau đó là khai báo tọa độ của điểm với đầy đủ các thông tin như câu lệnh mình để trên.
Sau khi nhập câu lệnh thành công bạn sẽ thấy thông báo như hình bên dưới.
Tương tự như câu lệnh khởi tạo điểm xuất phát, điểm đến các bạn cũng cần khai báo đầy đủ thông tin và với cú pháp action send_goal . Một điều nữa bạn cần lưu ý là khi bạn chọn điểm kết thúc cho robot bạn cần phải cẩn thận tránh những điểm trùng với chướng ngại vật hoặc tọa độ mà robot không thể di chuyển tới được. Điều này là một trong những bất tiện khi các bạn sử dụng câu lệnh đòi hỏi bạn phải nắm rõ vị trí của robot. Nếu nhập sai bạn sẽ thấy thông báo như hình bên dưới.
Còn đây là khi bạn nhập đúng câu lệnh, lúc này bạn sẽ thấy robot di chuyển không chỉ trong Gazebo mà còn ở Rviz.
Đến đây là kết thúc phần 2 của blog này, với 2 phần tuy không dài nhưng các bạn cũng có thể biết được một số thông tin bổ ích với Navigation2. 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é.
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.
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:
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.
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()
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).
This tutorial is created by Robotics Ambassador Eric
Những điều bạn sẽ được biết trong blog này:
Cách cài đặt các packages cần thiết để mô phỏng nhiều robots ở ROS2 Humble
Cách tạo launch file để mô phỏng nhiều robot trên gazebo
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/
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:
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:
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:
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.
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
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.
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.
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:
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é.
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.
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
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
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.
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.
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
Đế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é.
ROS (Robot Operating System) se está convirtiendo en el “framework” estándar para programar robots. En este tutorial emplearemos los conceptos de tópicos y nodos para mover el robot “Turtlebot3” hacia múltiples posiciones deseadas. Hacemos uso de los mensajes del tópico /odom para conocer la posición estimada del robot y publicar en el tópico /cmd_vel para mover el robot a las posiciones deseadas. Todo esto es simulado en un mundo de Gazebo. Ten encuesta 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.theconstructsim.com/l/5fc977f5/.
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.
El Turtlebot3 se moverá por una serie de posiciones en un orden específico, es decir, se moverá de su posición inicial a la 1ra posición deseada, una vez alcanzada, se moverá a la 2da posición y así sucesivamente. Para lograr esto, necesitamos de una estrategia.
Tengamos en cuenta que el robot conocerá las posiciones que debe alcanzar y su posición actual estimada gracias al tópico /odom, del cual aprovecharemos la posición en X, posición Y, y la rotación en Z.
Con ello, para alcanzar cada posición el Turtlebot3 realizará 2 movimientos: Primero, girar hasta que quede mirando a la posición deseada; Segundo, avanzar de manera recta hasta llegar a la posición.
Adicionalmente, debemos tener en cuenta el robot no se moverá en una línea recta de manera perfecta, por lo que se requiere compensar esa desviación conforme avanza. Esto se puede realizar añadiendo una velocidad angular cuando la orientación cambie demasiado.
Creación del paquete
Primero creamos un paquete en python para realizar un nodo-publicador-subscriptor que mueva al Turtlebot3 de la forma deseada. Necesitamos añadir las dependencias necesarias. Para ello ejecutamos en un terminal lo siguiente:
Debido a que en el tópico /odom la orientación es expresada en cuaterniones, el método euler_from_quaternion es necesario para convertir la orientación del robot de cuaterniones a la notación roll-pitch-yaw. Esto nos permite obtener la rotación del robot alrededor del eje z (yaw).
def euler_from_quaternion(self, quaternion):
"""
Converts quaternion (w in last place) to euler roll, pitch, yaw
quaternion = [x, y, z, w]
Below should be replaced when porting for ROS2 Python tf_conversions is done.
"""
x = quaternion[0]
y = quaternion[1]
z = quaternion[2]
w = quaternion[3]
sinr_cosp = 2 * (w * x + y * z)
cosr_cosp = 1 - 2 * (x * x + y * y)
roll = np.arctan2(sinr_cosp, cosr_cosp)
sinp = 2 * (w * y - z * x)
pitch = np.arcsin(sinp)
siny_cosp = 2 * (w * z + x * y)
cosy_cosp = 1 - 2 * (y * y + z * z)
yaw = np.arctan2(siny_cosp, cosy_cosp)
return roll, pitch, yaw
Este es el método definido en el timer y contiene la estrategia de control explicada anteriormente. Se ejecuta cada 0.1s y actualiza la velocidad del robot de acuerdo con la posición estimada.
Finalmente simularemos el comportamiento en gazebo, para ello primero iniciamos la simulación del Turtlebot3, cuyo paquete ya esta en este rosject. Esta se puede obtener desde este link.
In order to install the cv_camera driver, the first thing you have to do is to connect to your real robot.
If you are reading this tutorial, then we assume you already know how to connect to your own robot using SSH.
After you have connected, you can install the cv_camera package either by directly compiling the https://github.com/OTL/cv_camera package or by using apt-get, which is what we are going to do.
Important things about the cv_camera package:
It publishes the images on the ~image_raw topic (sensor_msgs/Image)
It uses camera as the default value of the ~frame_id parameter.
Ok, let’s finally install the cv_camera package. The commands would be the following:
If it works, then create a launch file for the node and also a static transform publisher from base_link to camera_link, indicating the approximate distance to where you end up placing your camera. The file would look something like this:
After launching the launch file we just created, using roslaunch your_package_name_here your_launch_file.launch, you should be able to list the topics by using rostopic list. Among other topics, the output of rostopic list should show the following topic:
/cv_camera
If you now open RViz, you should be able to see the camera.
If you want a step-by-step walk-through of the instructions above, you can check out this video below.
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: