5. ROS Package và Workspace là gì?

Search for a command to run...

Bạn có thể cho mình xin số Zalo mình hỏi chút được không! cám ơn bạn nhiều!
Chào anh, cảm ơn anh về bài hướng dẫn rất chi tiết. Em gặp phải 1 lỗi khi làm theo hướng dẫn của anh. Sau khi tạo package my_cam thì mọi thứ đêù bình thường. Nhưng sau đó em không chạy được lệnh rosrun my_cam image_publisher py Sau khi tìm lỗi thì em phát hiện ra package my_ cam ko được ros xem là 1 package. [rospack] Error: package 'my_cam' not found
Anh có thể giúp em sửa lỗi này được không ạ. em xin cảm ơn
Em đã build workspace chưa? Nếu chưa em mở một terminal rồi cd tới ~/catkin_ws và chạy catkin build. Sau khi build xong nhớ chạy source devel/setup.bash.
Trong series này, mình sẽ giúp các bạn tìm hiểu và thực hành những khái niệm cơ bản của ROS (Robot Operating System) bằng cách tự tạo ra một con robot và cách điều khiển nó. Cùng bắt đầu nhé!
Trong phần này, mình sẽ giúp bạn hiểu các khái niệm cơ bản của ROS: Master, Node, Topic, Publisher, Subscriber và Service. Sau đó, bạn sẽ tự code những khái niệm này và hoàn thành package my_cam mà chúng ta đã tạo trong chương trước. Trước tiên , hãy...
As said in the previous post, I will not wait until the robot is complete and then make tutorials. This project log contains all the newest updates (ideas, changes, problems, etc.) that I encounter during this project from the start to the end. As al...

After the ROS 101 series, I am now planning to bring the mobile robot to life. Below are my rough idea and plan, but they will be updated regularly as the project grows. So stay tuned! The Idea The goal of this project is simple: to understand how al...

Trong chương cuối cùng của sê-ri ROS Cơ Bản này, chúng ta sẽ kết hợp mọi thứ đã học được cho đến nay để hoàn thành một nhiệm vụ cuối cùng: di chuyển robot bằng cử chỉ tay. Ý tưởng Ý tưởng để làm phần này thật ra rất đơn giản và cũng không có gì mới. ...

In this final chapter of the series ROS 101, we are going to combine everything we have learned so far to finish one last challenge: moving the robot with our hand signs. The idea The idea is pretty simple and there is actually nothing new. In the pr...

Hãy cùng tiếp tục chương trước bằng việc dùng Xacro để cải tiến mô tả robot (URDF) và thêm nhiều thuộc tính hơn để mô phỏng và điều khiển robot trong Gazebo. Code ở phần này nhìn có vẻ dài dòng (vì XML luôn yêu cầu các thẻ mở và đóng) nhưng thực ra r...

Phần mềm trong ROS được sắp xếp thành các packages - gói dữ liệu. Một package là một thư mục chứa các chương trình (executable files) và tệp hỗ trợ phục vụ cho một mục đích cụ thể. Ví dụ: bạn có thể có một package để đọc và xử lý hình ảnh từ camera. Sau khi build (biên dịch) package, bạn có thể gọi hoặc test chương trình của mình trong một terminal. Các ROS package được đặt trong một thư mục khác gọi là catkin workspace vì chúng được build bằng các công cụ catkin. Các khái niệm này sẽ được giải thích kỹ hơn ở bên dưới. Ngoài ra, mình sẽ giữ các thuật ngữ bằng tiếng Anh vì dịch ra cũng không được chuẩn nghĩa và sẽ tốt hơn nếu bạn nhớ chúng để khi đọc các tài liệu khác bằng tiếng Anh cũng không bị bỡ ngỡ.

Trong ví dụ ở hình bên trên, có 3 package tên: hand_gesture_recognition, my_cam và ros_mobile_robot được đặt trong thư mục src bên trong thư mục workspace có tên catkin_ws. Các thư mục khác: build, devel, và logs được tạo tự động sau khi các package này được build. Tóm lại, package và workspace trong ROS thực chất là các thư mục với một vài yêu cầu cụ thể mà mình sẽ đề cập bên dưới.
Theo trang web chính thức của ROS, "Cái tên catkin xuất phát từ cụm hoa hình đuôi được tìm thấy trên cây liễu -- ám chỉ đến Nhà để xe Willow nơi catkin được tạo ra." Nếu bạn muốn biết thêm về nó, hãy đọc bài này còn hiện tại, bạn chỉ cần nhớ rằng catkin là hệ thống build chính thức của ROS.
Một workspace như đã nói ở trên là một thư mục, vì vậy bạn khởi tạo nó đơn giản bằng cách tạo một thư mục mới. Bạn có thể nhấp chuột phải vào thư mục Home (nơi bạn có thể dễ dàng truy cập thư mục đó) và chọn New Folder hoặc sử dụng phím tắt Ctrl + Shift + N. Sau đó, bạn cũng cần tạo một thư mục src bên trong thư mục workspace. Vì đang dùng Linux, hãy làm việc này bằng cách chạy lệnh dưới đây trong một terminal:
mkdir -p ~/catkin_ws/src
mkdir = making directory (tạo thư mục mới), -p = parents và ~ là viết tắt của thư mục Home. Lệnh này sẽ tạo một thư mục có tên catkin_ws (bạn có thể đặt một tên khác nếu muốn) với một thư mục con có tên src. Khá tiện đúng không? Sau đó, thay đổi đường dẫn tới workspace trong terminal hiện tại bằng cách sử dụng lệnh cd (cd = change directory):
cd ~/catkin_ws
Mặc dù hiện tại không có gói nào trong workspace, bạn vẫn có thể build nó bằng cách sử dụng lệnh catkin_make hoặc catkin build. Mình thích catkin build hơn vì với catkin_make, nó luôn tự động build tất cả các package nên sẽ mất nhiều thời gian nếu có nhiều package trong workpsace. Với catkin build, có thể build từng package riêng lẻ nếu muốn. Nhớ chạy source ~/catkin_ws/build/setup.bash trước nếu bạn chưa chạy khi mở terminal hoặc chưa đặt lệnh này trong .bashrc.
catkin build
Sau khi build xong, terminal của bạn sẽ trông giống như ảnh bên dưới và ba thư mục build, devel, logs cũng được tạo.

ROS package cũng là một thư mục được đặt trong thư mục src của workspace. Tuy nhiên, có một số yêu cầu bắt buộc phải có trong một package (nguồn):
Tệp package.xml cung cấp các thông tin về package.
Tệp CMakeLists.txt dùng cho việc build.
Ngoài ra, mỗi package phải có thư mục riêng, nghĩa là không có package lồng nhau hoặc nhiều package chia sẻ cùng một thư mục.
Vậy tạo hai tệp package.xml và CMakeLists.txt như thế nào? Chúng chính xác là gì và tại sao chúng ta cần cả hai? Hãy tìm câu trả lời bằng cách thử tạo một package. May mắn là đã có lệnh catkin_create_pkg để làm việc này. Giả sử bạn muốn tạo một gói có tên my_cam để đọc hình ảnh từ webcam và publish những hình ảnh đó (định nghĩa về publish sẽ có trong chương tiếp theo). Mở terminal và hướng nó tới ~/catkin_ws/src:
cd ~/catkin_ws/src
, sau đó chạy
catkin_create_pkg my_cam rospy sensor_msgs
Thao tác này sẽ tạo một package (tức là thư mục) my_cam với hai thành phần phụ thuộc rospy và sensor_msgs (mình sẽ giải thích chúng là gì trong chương tiếp theo). Bên trong my_cam có 2 tệp package.xml và CMakeLists.txt và một thư mục src như bên dưới.

Mở file package.xml và bạn sẽ thấy tất cả thông tin về package như tên của người bảo trì, loại giấy phép và các thành phần phụ thuộc, v.v. Rất nhiều dòng là những comment (ví dụ: đây là một comment: <!-- The *depend tags are used to specify dependencies -->). Trong hình dưới đây, mình đã xóa tất cả các comment:

Đối với những bạn chưa từng làm việc với XML, đây là một ngôn ngữ đánh dấu (markup language) tương tự như [HTML](https://vi.wikipedia.org/ wiki/HTML) và nó mô tả các thành phần bằng thẻ (tag*)*. Chẳng hạn, dòng <name>my_cam</name> có nghĩa là tên package được định nghĩa là my_cam bằng cách sử dụng thẻ mở <name> và thẻ đóng </name>.
Tiếp theo, mở CMakeLists.txt. Nó cũng có rất nhiều comment (bắt đầu bằng #) chủ yếu là để hướng dẫn/gợi ý. Nếu bạn đã từng làm việc với C/C++, thì bạn đã biết rằng CMakeLists được sử dụng cho các chương trình như CMake (catkin cũng dùng CMake) để tìm và liên kết tất cả các thư viện cần thiết để build. Tại dòng find_package, bạn có thể thấy hai phụ thuộc rospy và sensor_msgs, mà chúng ta đã khai báo từ lệnh trên. Nếu bạn quên khai báo chúng, chỉ cần mở CMakeLists lên và chỉnh sửa.
find_package(catkin REQUIRED COMPONENTS
rospy
sensor_msgs
)
Bạn có thể nhận thấy cả package.xml và CMakeLists.txt có nhiều phần thông tin giống nhau như tên dự án, thự viện liên quan, v.v. Có một câu trả lời hay về sự khác biệt và lý do tại sao chúng ta cần cả hai. Bạn chỉ cần nhớ:
package.xml chứa những thông tin (tác giả, người bảo trì, url, mô tả và giấy phép) không nhất thiết cần thiết để build (hoặc chạy) một package, nhưng vẫn cần để ROS tìm kiếm các thông tin về package (vì thông tin trong CMakeLists không dễ dàng đọc nếu không có CMake). Ngoài ra nó cũng cần cho việc hiển thị thông tin của package trên ROS wiki.
CMakeLists.txt là build script được dùng cho các chương trình như CMake để tìm và liên kết tất cả các thư viện cần thiết để build package.
Nếu bạn thấy có quá nhiều khái niệm mới trong bài này mà bạn chưa thể nhớ hết được. Đừng nản, bạn sẽ quen với chúng sớm thôi. Hiện tại, chỉ cần nhớ rằng một ROS package luôn yêu cầu 2 tệp package.xml và CMakeLists.txt, cộng với một thư mục src là nơi bạn lưu code của mình.
Trong các phần tiếp theo, chúng ta sẽ tìm hiểu tất cả các khái niệm cốt lõi của ROS: Topic, Node, Publisher, Subscriber, v.v. và viết code để hoàn thành package my_cam.
ROS package là một thư mục chứa các tệp thực thi (executable file) và những tệp hỗ trợ để phục vụ một mục đích cụ thể.
ROS workspace là một thư mục nơi bạn sửa đổi, build và cài đặt các package bằng các công cụ catkin.
Một package phải có hai tệp package.xml & CMakeLists.txt. Sử dụng lệnh catkin_create_pkg để tạo 1 package.