Note: This tutorial assumes that you have completed the previous tutorials: using rosed.
(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

Tạo một ROS msg và srv

Description: Hướng dẫn làm thế nào để tạo và xây dựng tập tin msg và srv rosmsg, công cụ dòng lệnh rossrv và roscp.

Tutorial Level: BEGINNER

Next Tutorial: Viết một publisher và subscriber đơn giản (python) (c++)

Giới thiệu về msg và srv

  • msg: Tệp tin msg là các tập tin văn bản đơn giản mô tả các trường của một thông điệp ROS. Chúng được sử dụng để tạo mã nguồn cho các msg trong các ngôn ngữ khác nhau.

  • srv: tệp srv mô tả một dịch vụ. Nó bao gồm hai phần: một yêu cầu và một phản hồi.

Msg được lưu trữ trong thư mục msg của một gói, và các tập tin srv được lưu trữ trong thư mục srv.

Msgs chỉ là các tập tin văn bản đơn giản với một loại trường và tên trường cho mỗi dòng. Các loại trường bạn có thể sử dụng là:

  • int8, int16, int32, int64 (plus uint*)
  • float32, float64
  • string
  • time, duration
  • other msg files
  • variable-length array[] and fixed-length array[C]

Ngoài ra còn có một loại đặc biệt trong ROS: Tiêu đề (header), tiêu đề chứa thời điểm msg truyền đi (timestamp) và thông tin về hệ qui chiếu (coordinate frame information) thường được sử dụng trong ROS. Bạn sẽ thường xuyên thấy dòng đầu tiên trong một tập tin msg có Header header. Dưới đây là một ví dụ về một msg sử dụng Header, một chuỗi nguyên, và hai msgs khác:

  Header header
  string child_frame_id
  geometry_msgs/PoseWithCovariance pose
  geometry_msgs/TwistWithCovariance twist

Các tập tin srv giống như tập tin msg, ngoại trừ chúng chứa hai phần: một yêu cầu và một phản hồi. Hai phần được cách nhau bởi một dòng '---'. Dưới đây là ví dụ về tệp srv:

int64 A
int64 B
---
int64 Sum

Trong ví dụ trên, A và B là yêu cầu, và Sum là phản hồi.

Dùngmsg

Tạo một msg

Hãy định nghĩa một msg mới trong gói đã được tạo ra trong hướng dẫn trước.

$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg

string first_name
string last_name
uint8 age
uint32 score

uncommented:

  <build_depend>message_generation</build_depend>
  <run_depend>message_runtime</run_depend>

# Do not just add this to your CMakeLists.txt, modify the existing text to add message_generation before the closing parenthesis
find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)

Tìm đoạn code giống như sau:

# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

add_message_files(
  FILES
  Num.msg
)

# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )
  • Nó sẽ giống như sau:
  • generate_messages(
      DEPENDENCIES
      std_msgs
    )

generate_messages()

$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg

string first_name
string last_name
uint8 age
uint32 score

# rosbuild_genmsg()

Dùng rosmsg

Đó là tất cả những gì bạn cần làm để tạo ra một msg. Hãy chắc chắn rằng ROS có thể nhìn thấy nó bằng cách sử dụng lệnh show rosmsg. Sử dụng:

$ rosmsg show [message type]

Ví dụ:

$ rosmsg show beginner_tutorials/Num

Bạn sẽ thấy:

  • int64 num

Trong ví dụ trước, loại tin nhắn bao gồm hai phần:

  • beginner_tutorials -- Gói nơi thông điệp được định nghĩa

  • Num -- Tên của msg là Num.

Nếu bạn không thể nhớ gói nào chứa msg trong đó, bạn có thể bỏ tên gói. Thử:

$ rosmsg show Num

Bạn sẽ thấy:

  • [beginner_tutorials/Num]:
    int64 num

Dùng srv

Tạo một srv

Hãy sử dụng gói chúng ta vừa tạo ra để tạo ra một srv:

$ roscd beginner_tutorials
$ mkdir srv

Thay vì tạo một định nghĩa srv mới, chúng ta sẽ sao chép một định nghĩa hiện tại từ một gói khác. Đối với điều đó, roscp là một công cụ dòng lệnh hữu ích để sao chép các tệp từ một gói này sang gói khác. Sử dụng:

$ roscp [package_name] [file_to_copy_path] [copy_path]

Bây giờ chúng ta sao chép a service từ gói rospy_tutorials :

$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

Có thêm một bước nữa. Chúng ta cần đảm bảo rằng các tệp srv được chuyển thành mã nguồn cho C ++, Python và các ngôn ngữ khác.

Khi bạn đã làm xong, hãy mở package.xml, và đảm bảo rằng hai dòng này nằm trong đó uncommented:

  <build_depend>message_generation</build_depend>
  <run_depend>message_runtime</run_depend>

Như đã đề cập ở trước, chú ý tại thời điểm build, chúng ta cần "message_generation", trong khi đó tại runtime, chúng ta chỉ cần "message_runtime".

Trừ khi bạn đã có sẵn messages trong bước trước, thêm sự phụ thuộc "message_generation để sinh ra messages trong CMakeLists.txt`:

# Không nên chỉ thêm dòng này vào CMakeLists.txt, chỉnh sửa những dòng đã có sẵn
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
 message_generation
)

(Mặc dù tên message_generation nó có thể dùng cho cả hai msgsrv.)

Ngoài ra bạn cần thay đổi tương tự đối với package.xml cho các dịch vụ như đối với các messages, vì vậy hãy tìm ở trên để biết thêm các yêu cầu phụ thuộc.

Xóa bỏ # để uncomment những dòng sau:

# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

Và thay thế tập tin Service*.srv bằng tập tin service mới:

add_service_files(
  FILES
  AddTwoInts.srv
)

Một lần nữa, mở CMakeLists.txt và bỏ # để uncomment những dòng sau:

# rosbuild_gensrv()

Bây giờ bạn đã sẵn sàng để tạo tệp nguồn từ service đã định nghĩa. Nếu bạn muốn làm điều đó ngay bây giờ, hãy bỏ qua phần tiếp theo đếnCommon step for msg and srv.

Dùngrossrv

Đó là tất cả những gì bạn cần làm để tạo ra một srv. Hãy chắc chắn rằng ROS có thể nhìn thấy nó bằng cách sử dụng lệnh hiển thị rossrv. Sử dụng:

$ rossrv show <service type>

Ví dụ:

$ rossrv show beginner_tutorials/AddTwoInts

Bạn sẽ thấy:

  • int64 a
    int64 b
    ---
    int64 sum

Tương tự như rosmsg, bạn có thể tìm các tệp dịch vụ như sau mà không nêu rõ tên gói:

$ rossrv show AddTwoInts
[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

[rospy_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

Ở đây, hai dịch vụ được hiển thị. Đầu tiên là gói bạn vừa tạo trong gói beginner_tutorials, và gói thứ hai là gói sẵn có từ gói rospy_tutorials.

Các bước thông dụng cho msg và srv

Trừ khi bạn đã làm trong bước trước, chỉnh sửa trong CMakeLists.txt. :

# generate_messages(
#   DEPENDENCIES
# #  std_msgs  # Or other packages containing msgs
# )

Uncomment những dòng này và thêm vào packages phụ thuộc chứa trong tập tin .msg mà những messages sẽ dùng (trong trường hợp này là std_msgs), nó sẽ trông giống như sau:

generate_messages(
  DEPENDENCIES
  std_msgs
)

Bây giờ chúng ta đã tạo xong messages mới cần tạo lại package như sau:

# In your catkin workspace
$ roscd beginner_tutorials
$ cd ../..
$ catkin_make install
$ cd -

Bây giờ chúng ta tạo một tin nhắn mới chạy lại make :

$ rosmake beginner_tutorials

Bất kỳ tệp tin .gms nào trong thư mục msg sẽ tạo ra mã để sử dụng trong tất cả các ngôn ngữ được hỗ trợ. Các tập tin tiêu đề tin nhắn C + + sẽ được tạo ra trong ~ / catkin_ws / devel / include / beginner_tutorials /. Tập lệnh Python sẽ được tạo ra trong ~ / catkin_ws / devel / lib / python2.7 / dist-packages / beginner_tutorials / msg.

Tập tin lisp xuất hiện trong ~ / catkin_ws / devel / share / common-lisp / ros / beginner_tutorials / msg /. Tương tự, bất kỳ tệp .srv nào trong thư mục srv sẽ tạo mã bằng các ngôn ngữ được hỗ trợ. Đối với C + +, điều này sẽ tạo ra các tập tin tiêu đề trong cùng một thư mục với các tập tin tiêu đề msg. Đối với Python và Lisp, sẽ có một thư mục 'srv' bên cạnh thư mục 'msg'.

Các chỉ định đầy đủ cho các định dạng tin nhắn có sẵn tại trang Ngôn ngữ Mô tả tin nhắn Message Description Language.

Nếu bạn đang xây dựng các node C ++ sử dụng các message mới của bạn, bạn cũng cần khai báo một sự phụ thuộc giữa node và message của bạn, như được mô tả trong catkin msg/srv build documentation.

Tìm sự trợ giúp

Chúng ta đã nhìn thấy một vài công cụ ROS. Có thể khó nhớ hết những thông số cần cho mỗi lệnh. May mắn thay, hầu hết các công cụ ROS cung cấp sự trợ giúp. Thử:

$ rosmsg -h
  • Bạn sẽ thấy một danh sách các lệnh con rosmsg khác nhau.
    Commands:
      rosmsg show     Show message description
      rosmsg list     List all messages
      rosmsg md5      Display message md5sum
      rosmsg package  List messages in a package
      rosmsg packages List packages that contain messages

Bạn cũng có thể nhận trợ giúp cho các lệnh phụ

$ rosmsg show -h
  • Điều này cho thấy các đối số cần thiết cho rosmsg show:
    Usage: rosmsg show [options] <message type>
    
    Options:
      -h, --help  show this help message and exit
      -r, --raw   show raw message text, including comments

Tóm lược

Chúng ta hãy liệt kê một số lệnh mà chúng ta đã sử dụng cho đến nay:

  • rospack = ros+pack(age) : cung cấp thông tin liên quan đến gói ROS
  • roscd = ros+cd : thay đổi thư mục đến gói ROS hoặc stack
  • rosls = ros+ls : danh sách tập tin trong gói ROS
  • roscp = ros+cp : sao chép tập tin từ/đến một gói ROS
  • rosmsg = ros+msg : cung cấp thông tin liên quan đến định nghĩa tin nhắn
  • rossrv = ros+srv :cung cấp thông tin liên quan đến định nhĩa trình phục vụ
  • catkin_make : tạo (compiles) một gói ROS
    • rosmake = ros+make : makes (compiles) a ROS package (if you're not using a catkin workspace)

Hướng dẫn kế tiếp

Bây giờ bạn đã tạo một ROS msg và srv mới, hãy xem xét việc viết một xuất bản chủ đề và đăng ký chủ đề đơn giản (python) (c++).

Wiki: vn/ROS/Tutorials/CreatingMsgAndSrv (last edited 2017-08-08 13:12:28 by HoangGiang88)