Làm sao để mô phỏng nhiều robot sử dụng Nav2 trong không gian Gazebo với ROS2 Humble (Phần 2) – Vietnamese ROS2 Tutorial
This tutorial is created by Robotics Ambassador Eric
Robotics Ambassador: theconstruct.ai/robotics-ambassador/
Những điều bạn sẽ được biết trong blog này:
- 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/
Danh sách nguồn tài liệu bổ trợ trong post này
- Sử dụng rosject: **https://app.theconstructsim.com/rosjects/750453**
- The Construct**: https://app.theconstructsim.com/**
- Khóa học về ROS2 →
- Introduction to Gazebo Sim with ROS2: https://app.theconstructsim.com/courses/introduction-to-gazebo-ignition-with-ros2-170/
- ROS2 Navigation: https://app.theconstruct.ai/courses/148
Tổng quan
Ở 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:
**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:
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:
ros2 launch turtlebot3_multi_robot gazebo_multi_nav2_world.launch.py enable_drive:=True
Ở đâ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:
ros2 topic pub -1 --qos-reliability reliable /tb2/initialpose geometry_msgs/PoseWithCovarianceStamped "{header: {frame_id: map}, pose: {pose: {position: {x: -1.5, y: 0.5, z: 0.0}, orientation: {x: 0.0, y: 0.0, z: 1.01, w: 1.0}}, }}"
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.
Sau đó điểm đến sử dụng câu lệnh:
ros2 action send_goal /tb2/navigate_to_pose nav2_msgs/action/NavigateToPose "pose: {header: {frame_id: map}, pose: {position: {x: -3.0, y: 1.5, z: 0.0}, orientation:{x: 0.0, y: 0.0, z: 0, w: 1.0000000}}}"
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é.