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

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

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ỡ.

catkin_workspace.jpg

Trong ví dụ ở hình bên trên, có 3 package tên: hand_gesture_recognition, my_camros_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,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.

Tạo một catkin workspace

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.

build_catkin_ws.jpg

Tạo một ROS package

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.xmlCMakeLists.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 rospysensor_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.xmlCMakeLists.txt và một thư mục src như bên dưới.

catkin_create_pkg_example.jpg

Bên trong package.xmlCMakeLists.txt

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:

ros_package_xml.jpg

Đố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](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 rospysensor_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
)

Sự khác biệt giữa package.xmlCMakeLists.txt

Bạn có thể nhận thấy cả package.xmlCMakeLists.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.xmlCMakeLists.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.

Tóm tắt

  • 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.

Trích dẫn

  1. Ảnh bìa: http://wiki.ros.org/groovy

Did you find this article valuable?

Support Robodev Blog by becoming a sponsor. Any amount is appreciated!