Hướng dẫn cách tạo một topic publisher trong ROS2 – Vietnamese ROS Tutorial

Hướng dẫn cách tạo một topic publisher trong ROS2 – Vietnamese ROS Tutorial

Xin chào các bạn! Trong bài viết này mình sẽ hướng dẫn các bạn cách tạo một topic publisher cơ bản trong ROS2 trên nền tảng The Construct.

Nguồn tham khảo

  1. Nền tảng học ROS trực tuyến The Construct
  2. Khóa học ROS2 cơ bản (Python) ROS2 Basics in 5 Days

Tạo một package chứa publisher

Đầu tiên chúng ta sẽ tạo một package có tên là publisher_pkg trong không gian làm việc ros2_ws bằng lệnh sau:

cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python publisher_pkg --dependencies rclpy std_msgs geometry_msgs

Tạo một file publisher

Tiếp theo, chúng ta sẽ tạo một file tên là simple_publisher.py trong thư mục publisher_pkg ở trong package publisher_pkg mà chúng ta vừa tạo. Các bạn lưu ý là file này phải nằm trong thư mục cùng tên nhưng nằm trong package vừa tạo nhé. Cụ thể là đường dẫn tới file simple_publisher.py~/ros2_ws/src/publisher_pkg/publisher_pkg/simple_publisher.py

Tiếp theo, các bạn hãy copy những dòng code sau vào file simple_publisher.py 

import rclpy
# import the ROS2 python libraries
from rclpy.node import Node
# import the Twist interface from the geometry_msgs package
from geometry_msgs.msg import Twist

class SimplePublisher(Node):

    def __init__(self):
        # Here you have the class constructor
        # call super() in the constructor to initialize the Node object
        # the parameter you pass is the node name
        super().__init__('simple_publisher')
        # create the publisher object
        # in this case, the publisher will publish on /cmd_vel Topic with a queue size of 10 messages.
        # use the Twist module for /cmd_vel Topic
        self.publisher_ = self.create_publisher(Twist, 'cmd_vel', 10)
        # define the timer period for 0.5 seconds
        timer_period = 0.5
        # create a timer sending two parameters:
        # - the duration between 2 callbacks (0.5 seconds)
        # - the timer function (timer_callback)
        self.timer = self.create_timer(timer_period, self.timer_callback)

    def timer_callback(self):
        # Here you have the callback method
        # create a Twist message
        msg = Twist()
        # define the linear x-axis velocity of /cmd_vel Topic parameter to 0.5
        msg.linear.x = 0.5
        # define the angular z-axis velocity of /cmd_vel Topic parameter to 0.5
        msg.angular.z = 0.5
        # Publish the message to the Topic
        self.publisher_.publish(msg)
        # Display the message on the console
        self.get_logger().info('Publishing: "%s"' % msg)

def main(args=None):
    # initialize the ROS communication
    rclpy.init(args=args)
    # declare the node constructor
    simple_publisher = SimplePublisher()
    # pause the program execution, waits for a request to kill the node (ctrl+c)
    rclpy.spin(simple_publisher)
    # Explicity destroys the node
    simple_publisher.destroy_node()
    # shutdown the ROS communication
    rclpy.shutdown()

if __name__ == '__main__':
    main()

File simple_publisher.py này chứa nội dung của một topic publisher cơ bản. Hiện tại thì các bạn chưa cần hiểu những dòng code này, mình sẽ giải thích ở phần sau. Chúng ta sẽ tiếp tục các bước tiếp theo để chạy thử code xem nó làm được gì trước nhé.

Tạo file launch

Đầu tiên, chúng ta sẽ tạo một thư mục launch ở trong package đang làm việc:

cd ~/ros2_ws/src/publisher_pkg
mkdir launch

Tiếp theo, ta sẽ tạo một file launch để chạy node publisher tên là publisher_pkg_launch_file.launch.py

cd ~/ros2_ws/src/publisher_pkg/launch
touch publisher_pkg_launch_file.launch.py
chmod +x publisher_pkg_launch_file.launch.py

Các bạn copy các dòng code sau vào trong file launch vừa mới tạo:

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='publisher_pkg',
            executable='simple_publisher',
            output='screen'),
])

Chỉnh sửa file setup.py

Tiếp theo, các bạn hãy chỉnh sửa file setup.py để thiết lập các file vừa tạo với hệ thống package:

from setuptools import setup
import os
from glob import glob

package_name = 'publisher_pkg'

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']),
        (os.path.join('share', package_name), glob('launch/*.launch.py'))
    ],
    install_requires=['setuptools'],
    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': [
            'simple_publisher = publisher_pkg.simple_publisher:main'
        ],
    },
)

Biên dịch package

Tiếp theo chúng ta sẽ biên dịch (compile) package bằng các lệnh sau:

cd ~/ros2_ws
colcon build --packages-select publisher_pkg
source ~/ros2_ws/install/setup.bash

Chạy publisher node trong Terminal

ros2 launch publisher_pkg publisher_pkg_launch_file.launch.py

Trên Terminal sẽ hiển thị các nội dung message mà node mình vừa tạo đang publish lên topic /cmd_vel. Đồng thời robot cũng bắt đầu di chuyển thành vòng tròn.

Để kiểm tra thông tin đang ở trên topic /cmd_vel, các bạn chạy lệnh :

ros2 topic echo /cmd_vel

Giải thích code tạo publisher

Quy trình hoạt động

def main(args=None):
 # initialize the ROS communication
 rclpy.init(args=args)
 # declare the node constructor
 simple_publisher = SimplePublisher()
 # pause the program execution, waits for a request to kill the node (ctrl+c)
 rclpy.spin(simple_publisher)
 # Explicity destroys the node
 simple_publisher.destroy_node()
 # shutdown the ROS communication
 rclpy.shutdown()

Đầu tiên hệ thống sẽ khởi tạo giao tiếp ROS2 bằng lệnh

rclpy.init(args=args)

Khai báo và khởi tạo node publisher

simple_publisher = SimplePublisher()

Tạm dừng việc thực thi chương trình, chờ yêu cầu hủy node (ctrl+c)

rclpy.spin(simple_publisher)

Hủy node

simple_publisher.destroy_node()

Tắt hệ thống giao tiếp ROS2

rclpy.shutdown()

Tạo Class publisher

Phần code này cũng tương tự như khi tạo một class trong python thông thường với hàm khởi tạo __init__ và các hàm chức năng khác. Trong đó quan trọng nhất là các lệnh sau để thực hiện các chức năng liên quan tới ROS:

Khởi tạo một node có tên là 'simple_publisher':

super().__init__('simple_publisher')

Tạo một publisher cho topic /cmd_vel sử dụng Twist message với kích thước hàng đợi là 10:

self.publisher_ = self.create_publisher(Twist, 'cmd_vel', 10)

Tạo một timer để kích hoạt hàm timer_callback sau mỗi time_period=0.5

self.timer = self.create_timer(timer_period, self.timer_callback)

Xuất bản nội dung của biến msg lên topic /cmd_vel

self.publisher_.publish(msg)

Vậy là trong bài viết này mình đã hướng dẫn các bạn cách tạo một topic publisher cơ bản và các bước chạy thử. Chúc các bạn thực hành thành công.

Video Tutorial

Cách tạo gói ROS2 vững chắc – Vietnamese ROS Tutorial

Cách tạo gói ROS2 vững chắc – Vietnamese ROS Tutorial

This tutorial is created by Rosbotics Ambassador 018 Tung

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

Những mục chúng ta sẽ học

  1. Cách tạo package trong ROS2
  2. Cách compile package trong ROS2

Các tài nguyên được sử dụng trong bài viết này

  1. Rosject: https://app.theconstructsim.com/l/5e2dd3a5/
  2. The Construct: https://app.theconstructsim.com/
  3. Khóa học ROS2: ROS2 Basics in 5 Days

 

Tạo package trong ROS2

Để hệ thống nhận diện được các câu lệnh của ROS2 thì chúng ta cần source file setup.bash của ROS2 trước.

Source file setup của ROS2 trên Terminal 1:
source /opt/ros/humble/setup.bash

Để tạo package ROS2, chúng ta cần có một không gian làm việc ROS2.

Cùng tạo một không gian làm việc ROS2 tên là ros2_ws bằng cách tạo folder ros2_ws và một thư mục nguồn src chứa code của các package bằng các lệnh sau:
mkdir ros_ws
cd ros_ws
mkdir src

Tạo một package tên là my_package ở trong thư mục src của không gian làm việc vừa tạo bằng trình tạo package tự động của ROS2:
cd ~/ros_ws/src
ros2 pkg create --build-type ament_python my_package --dependencies rclpy

Một câu lệnh tạo package có cú pháp như sau:
ros2 pkg create --build-type ament_python <package_name> --dependencies <package_dependency_1> <package_dependency_2>

Trong đó:

  • ros2: câu lệnh của ROS2
  • pkg: (package) thực hiện các hành động liên quan tới package
  • create: tạo một package mới
  • –build-type: truyền tham số về cách build package
  • ament_python: package sẽ được build dựa trên python
  • <package_name>: tên của package muốn tạo
  • –dependencies: truyền tham số tên các package mà package muốn tạo phụ thuộc
  • <package_dependency_1>: tên của package phụ thuộc

Compile package trong ROS2

Sau khi tạo xong package, bạn nên build package vừa tạo. Đây là cách nhanh nhất để xác định xem các package phụ thuộc mà bạn đã liệt kê có hoạt động hay không và kiểm tra xem dữ liệu đã nhập có sai sót gì không. Thực hiện các lệnh sau để build các package trong không gian làm việc ros_ws:
cd ~/ros_ws
colcon build

Để build từng package riêng lẻ thì ta dùng lệnh sau:

cd ~/ros_ws
colcon build --packages-select <package_name>

Sau mỗi lần build xong package, hãy tạo thói quen source file setup.bash từ thư mục install để ROS2 có thể tìm thấy các package trong không gian làm việc

source ~/ros_ws/install/setup.bash

Để xác nhận rằng package đã được tạo thành công và đã được tích hợp vào hệ thống ROS2, hãy liệt kê các package đã được khai báo với ROS2.
ros2 pkg list

Nếu package vừa tạo có tên trong danh sách thì chúng ta đã thành công.

Một cách nhanh hơn là ta có thể sử dụng lệnh grep trong Terminal để tìm nhanh tên package vừa tạo:

ros2 pkg list | grep my_package

Video Tutorial

Làm sao để chạy turtlebot3 và lưu rosbag trên ROS2 Humble – ROS Vietnamese Tutorial

Làm sao để chạy turtlebot3 và lưu rosbag trên ROS2 Humble – ROS Vietnamese Tutorial

This tutorial is created by Rosbotics Ambassador 016 Eric

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

Nhng điu bn sđưc biết trong blog này:

  1. Cách cài đt Turtlebot3 package ROS2 Humble
  2. Chy mt ví dvturtlebot3 vi Gazebo
  3. Cách lưu dliu ca topic sdng rosbag ROS2

Danh sách ngun tài liu btrtrong post này

 

 

  1. Sdng rosject: https://app.theconstructsim.com/l/5bda8c95/
  2. The Construct: https://app.theconstructsim.com/
  3. Khóa hc vROS2 → Introduction to Gazebo Sim with ROS2: https://app.theconstructsim.com/courses/introduction-to-gazebo-ignition-with- ros2-170/

Tng quan

Bưc chân vào thế gii ca Robotics, không thnào không nhc đến ROS(Robot Operating System), mt hđiu hành mnh mcho lp trình robots. trong post này, hãy cùng nhau hc cách làm sao đchy thmô hình turtlebot3 trên Gazebo và lưu các dliu thông qua rosbag trên ROS2 Humble.

Khi đng rosject

Đcó ththc hin các bưc trong blog này, chúng ta cn có ROS2 đưc cài đt trên hthng, cũng như ros2 ROS2 Workspace. Đthun tin hơn, ti The Construct đã chun bmt rosject đcác bn ddàng truy cp và khi to các project:

https://app.theconstructsim.com/l/5bda8c95/

Chvi mt cú click chut vào link phía trên, các bn có thto mt rosject ca riêng bn, bn có thchnh sa các ni dung liên quan. Như hình bên dưi là mt rosject hoàn chnh, bn chvic nhn vào nút RUN đkhi đng rosject.

Sau khi nhn vào nút RUN bn sthy rosject đưc chy trên màn hình. đây, rosject cung cp cho bn cterminal đcó thnhp các câu lnh:

Bây gicùng nhau đến bưc tiếp theo trong ví dnày nhé.

 

Khi đng Turtlebot3 package

Bưc đu tiên, các bn có thkim tra trên ROS2 đã đưc cài đt turtlebot3 package hay chưa bng câu lnh như sau:

đây turtlebot3 package đã đưc cài đt sn nên trên terminal là danh sách các packages kèm theo turtlebot3. Ngoài ra, các bn có thcài đt thông qua câu lnh dưi đây:

sudo apt install
ros-humble-turtlebot3*


 

Mô phng trên Gazebo

Sau khi đã thành công kim tra hoc cài đt turtlebot3 trong ROS2, tiếp theo các bn smô phng robot trên môi trưng Gazebo.

Các bn cn lưu ý là nếu chúng ta chcó mt robot thì mình không cn setup_domain ID, vì ROS stđng cài mc đnh ROS_DOMAIN_ID=0. Trong trưng hp nếu bn có nhiu hơn mt robots thì khi đó bn skhi to tng ID riêng cho robot ca mình.

Đxây dng ROS2 workspace cho turtlebot3, đu tiên đi vào môi trưng catkin workspace có sn:

cd
ros2_ws/

Có 2 cách để kích hoạt môi trường hoạt động, nếu bạn dùng debian package thì sử dụng:

/source
/opt/ros/humble/setup.bash

Nếu bạn sử dụng package ở trong ros package bạn tạo thì chạy dòng lệnh sau:
source
install/setup.bash

Tiếp theo la chn và cài đt mu robot bn mun sdng. Bn có ththay đi mu robot bn mun sdng bng câu lnh bên dưi. đây chúng ta sdng robot burger:

export
TURTLEBOT3_MODEL=burger

Tiếp theo, bạn sử dụng câu lệnh bên dưới để sử dụng turtlebot3 trong môi trường Gazebo:

 

export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:`ros2 pkg
\ prefix turtlebot3_gazebo \
`/share/turtlebot3_gazebo/models/

 

Cui cùng, khi đng turtlebot3 package Gazebo thông qua câu lnh sau:

ros2 launch turtlebot3_gazebo
turtlebot3_house.launch.py

Ca sGazebo sxut hin như trên cùng vi robot burger. Chúc mng bn đã thành công khi đng turtlebot3 trên Gazebo.

 

Lưu dliu cùng vi Rosbag trên ROS2 Humble

Khoan đóng terminal Gazebo nhé. Vn còn nhiu điu hay mà trong blog này schia svi các bn. Khi làm vic vi robot, các bn sphi dùng nhiu dliu tnhiu topic ngoài ra còn đtruy xut dliu, trình bày trên biu đ,…vi các ng dng đó thì

Rosbag chính là cu tinh cho bn.

Đầu tiên, chúng ta mở một cửa sổ khác để kiểm tra các topic được public trên robot.
ros2 topic list

 

Như các bn có ththy trên đây là các topics ca turtlebot3 trên Gazebo. Chúng ta có thxem dliu ca topic bng tkhóa echo , đây mình ly ví dttopic /odom:
ros2 topic echo
/odom

Công dng ca rosbag chvi mt câu lnh slưu các ni dung liên quan đến topic

bn mun record.

ros2 bag record
/topic_name

Vi câu lnh trên, rosbag stđng đưc lưu ngay trên đưng dn mà bn sdng rosbag. Ngoài ra, bn có thlưu nhiu topics và thay đi tên cũng như nơi lưu bag file. Dưi đây, mình có ví dlưu 2 topics là /turtle1/cmd_vel và /turtle1/pose vi tên file là

turtlebot. Ký t cho phép bn la chn tên ca bag file.
ros2 bag record -o turtlebot /turtle1/cmd_vel
/turtle1/pose

Sau khi lưu bag file bn có thkim tra bag file đã lưu bng câu lnh:
ros2 bag info
file_name

Cám ơn các bn đã theo dõi blog đến đây. Hy vng blog này sgiúp ích cho các bn trong quá trình hc và tìm hiu vROS cũng như Robotics. Cùng đón chnhiu blog bích như thế này trên The Construct nhé!

 

 

 

 

Video Tutorial

Hướng dẫn các câu lệnh cơ bản với topic trong ROS2 – ROS Vietnamese Tutorial

Hướng dẫn các câu lệnh cơ bản với topic trong ROS2 – ROS Vietnamese Tutorial

This tutorial is created by RA 018 Tung

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

Chào các bạn. Trong bài viết này, mình sẽ hướng dẫn các bạn sử dụng các câu lệnh cơ bản với topic trong ROS2 sử dụng nền tảng The Construct.

Nguồn tham khảo:

  1. Nền tảng học ROS trực tuyến The Construct
  2. Khóa học ROS2 (Python): ROS2 Basics in 5 Days

Liệt kê các topic đang hoạt động

Để liệt kê tất cả các topic đang hoạt động, ta sử dụng câu lệnh sau:

ros2 topic list

Để tìm kiếm một topic cụ thể, chúng ta sử dụng thêm lệnh grep như khi sử dụng Terminal bình thường:

ros2 topic list | grep cmd_vel

Xem thông tin chi tiết về một topic

Để xem thông tin chi tiết về một topic nào đó, các bạn có thể sử dụng lệnh info. Ví dụ mình sẽ sử dụng lệnh info để xem thông tin của topic cmd_vel vừa được liệt kê ở trong phần trước:

ros2 topic info /cmd_vel

Thông tin về topic sẽ được hiển thị trên Terminal bao gồm các trường như sau:

  • Type: kiểu dữ liệu của topic
  • Publisher count: số lượng publisher đang hoạt động được kết nối tới topic
  • Subscription count: số lượng subscriber đang hoạt động được kết nối tới topic

Tương tự như vậy, các bạn có thể xem thông tin về bất cứ topic nào mà mình quan tâm. Ví dụ như topic /scan là dữ liệu mà lidar trên robot quét, topic /camera/image_raw là dữ liệu hình ảnh mà camera nhận được:

ros2 topic info /scan
ros2 topic info /camera/image_raw

Các bạn cũng có thể xem trực tiếp dữ liệu nào đang được lưu truyền trên topic bằng lệnh echo. Mình sẽ lấy ví dụ về topic cmd_vel ở trên:

ros2 topic echo /cmd_vel

Không có gì xuất hiện, các bạn có thấy gì kì lạ không?

Các bạn không thao tác nhầm ở đâu đâu. Terminal không xuất hiện gì cả vì hiện tại đang không có dữ liệu nào lưu hành trên topic này. Các bạn sẽ được hướng dẫn cách gửi dữ liệu lên topic trong phần dưới đây.

Xuất bản (Publish) dữ liệu lên một topic

Như các bạn thấy thì hiện tại topic /cmd_vel đang không có dữ liệu nào cả. Vì vậy, chúng ta sẽ tiếp tục tìm hiểu cách gửi dữ liệu, hay là publish dữ liệu lên một topic.

Để publish dữ liệu lên một topic, chúng ta cần biết kiểu dữ liệu của topic đó trước. Sử dụng lệnh sau để xem lại kiểu dữ liệu mà topic /cmd_vel sử dụng:

ros2 topic info /cmd_vel

Theo kết quả hiển thị trên Terminal, kiểu dữ liệu của /cmd_velgeometry_msgs/msg/Twist. Chúng ta cùng xem một message loại này thì gồm những thành phần gì bằng lệnh:

ros2 interface show geometry_msgs/msg/Twist

Một message geometry_msgs/msg/Twist bao gồm hai vector 3 chiều là linear (tốc độ dài) và angular (tốc độ góc) trong không gian ba chiều. Các bạn lưu ý là mỗi tọa độ của vector là một số thực (float64) nhé.

OK. Bây giờ các bạn đã có đủ thông tin để publish các message tới topic /cmd_vel. Chúng ta cùng publish một message lên topic /cmd_vel để turtlebot di chuyển trong không gian mô phỏng nhé. Ta sử dụng câu lệnh sau:

ros2 topic pub /cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.1, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.0}}"

Trong đó:

  • ros2: cú pháp của ROS2
  • topic: câu lệnh liên quan tới topic
  • pub: câu lệnh publish message lên topic
  • /cmd_vel: tên topic
  • geometry_msgs/msg/Twist: tên của interface/loại message
  • Phần còn lại: nột dung message muốn publish

Sau khi lệnh trên được chạy, các bạn sẽ thấy Terminal thông báo đang publish các message lên topic /cmd_vel, đồng thời turtlebot cũng bắt đầu di chuyển thành vòng tròn.

Kiểm tra topic hoạt động

Để kiểm tra xem topic có đang hoạt động ổn định hay không, chúng ta cùng thực hiện lại các lệnh tương tự như phần đầu của bài viết và so sánh.

Đầu tiên là xem thông tin về topic bằng lệnh:

ros2 topic info /cmd_vel

Terminal hiển thị hiện tại đã có thêm một publisher, vậy là chúng ta đã publish dữ liệu lên topic thành công.

Tiếp theo, chúng ta sẽ kiểm tra dữ liệu nào đang được lưu truyền trên topic bằng lệnh:

ros2 topic echo /cmd_vel

Trên Terminal sẽ xuất hiện các message đang được lưu hành trên topic.

OK xong. Vậy là qua bài viết này các bạn đã làm quen với các câu lệnh cơ bản để làm việc với topic trong ROS2. Chúc các bạn thực hành thành công.

Video Tutorial

 


Tạo bản đồ cùng với ROS2 Nav2 sử dụng SLAM – ROS Vietnamese Tutorial

Tạo bản đồ cùng với ROS2 Nav2 sử dụng SLAM – ROS Vietnamese Tutorial

This tutorial is created by Rosbotics Ambassador 016 Eric

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


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

  1. Cách cài đặt Turtlebot3, cartographer, gazebo package ở ROS2 Humble
  2. Chạy một ví dụ về gazebo cùng turtlebot3
  3. Cách tạo map từ Cartographer và nav2 package

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/
    2. ROS2 Navigation: https://app.theconstructsim.com/courses/148

Tổng quan

Khi làm việc với robots trong các môi trường khác nhau thì bản đồ (map) là một trong những thông tin hữu ích giúp đỡ cho robot có thể định vị tọa độ, cũng như xây dựng phương hướng di chuyển để né tránh chướng ngại vật. Cho nên, trong bài blog sẽ chia sẽ cách để các bạn tạo ra map bằng việc kết hợp các package có sẵn trong ROS2 như turtlebot3, navigation. Bên cạnh đó mình cũng giới thiệu Cartographer một công cụ rất hữu ích sử dụng thuật toán SLAM được ROS tích hợp. Đây là package sẽ hỗ trợ các bạn rất nhiều trong các dự án liên quan tới robot. Tuy nhiên, blog này không đào sâu vào thuật toán SLAM mà chỉ giới thiệu tới các bạn cách cài đặt và một ví dụ về catographer.

Khởi động rosject

The Construct đã tạo ra một công cụ rất hữu ích là rosject, 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.

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

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/2puiHBB

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, ở đây chúng ta sử dụng turtlebot3 và ros2 navigation, cartographer, gazebo:

sudo apt install ros-humble-turtlebot3-gazebo

sudo apt install ros-humble-turtlebot3-cartographer

sudo apt install ros-humble-nav2-map-server

sudo apt install ros-humble-navigation2 ros-humble-nav2-bringup

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

Sau khi cài đặt thành công các package phía trên. Cuối cùng là cài đặt package liên quan đến turtlebot3. Các bạn có thể cài đặt thông qua câu lệnh dưới đây:

sudo apt install ros-humble-turtlebot3*

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

Mô phỏng trên Gazebo cùng robot

Sau khi đã thành công kiểm tra hoặc cài đặt turtlebot3 trong ROS2, tiếp theo các bạn sẽ mô phỏng robot trên môi trường Gazebo.

Tiếp theo, sau khi đã cài đặt đầy đủ các package cần thiết. Bước tiếp theo bạn cần chọn model robot cho project của bạn. mình sử dụng waffle trong project này:

export TURTLEBOT3_MODEL=waffle

Sau đó để sử dụng môi trường gazebo và robot, bạn thực hiện câu lệnh:

ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

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

Cửa sổ Gazebo sẽ xuất hiện như trên cùng với robot waffle.

Khởi động Rviz cùng với cartographer

Như bạn thấy môi trường và robot đã có, tiếp theo bắt đầu với SLAM bằng việc sử dụng cartographer package. Ở cửa sổ thứ 2, các bạn thực hiện câu lệnh này, tuy nhiên khi mở cửa sổ mới đồng nghĩa với việc môi trường làm việc ko thể nhớ loại robot nào bạn đang dùng nên bạn cần export mỗi lần mở cửa sổ mới nhé:

export TURTLEBOT3_MODEL=waffle

ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True

Ở đây mình có thêm vào use_sim_time vì dùng thời gian thực của gazebo nếu như chúng ta làm việc với robot thực thì các bạn ko cần sử dụng use_sim_time. Ở đây sau khi thực hiện câu lệnh, RVIZ sẽ xuất hiện với môi trường grid map, ở đây là mô phỏng 2D từ gazebo qua, bạn có thể tùy chỉnh các lựa chọn ở mục bên trái của RVIZ để có được trải nghiệm tốt hơn về mô phỏng.

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

Tạo và lưu bản đồ cùng nav2_map_server

Như các bạn đã biết, để có một bản đồ hoàn chỉnh hay còn gọi là môi trường đã biết trước, robot cần nhận biết hết các sự kiện trong môi trường. Cho nên trong project này, mình sẽ điều khiển robot di chuyển bằng cách sử dụng teleop_keyboard để robot có thể sử dụng cảm biến nhận diện môi trường xung quanh. Đầu tiên, các bạn cần đồng nhất mẫu robot mà bạn đang sử dụng trong môi trường gazebo cũng như Rviz. Tiếp theo là sử dụng turtlebot3_teleop package để di chuyển robot. Dưới đây là các câu lệnh để thực hiện:

export TURTLEBOT3_MODEL=waffle

ros2 run turtlebot3_teleop teleop_keyboard

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

Ở đây, với mong muốn từng khu vực hay chướng ngại vật sẽ được thể hiện rõ trên map nên các bạn cố gắng di chuyển robot đến những khu vực đó.

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

Như các bạn đã thấy, mình đã di chuyển robot để có thể quét hết toàn bộ bản đồ của môi trường. Bản đồ sẽ thể hiện rõ như hình trên. Các bạn mở cho mình một cửa sổ khác và lưu map lại nhé, bằng việc sử dụng câu lệnh sau:

ros2 run nav2_map_server map_saver_cli -f turtlebot_map

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

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


Pin It on Pinterest