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++)
Contents
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
<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 msg và srv.)
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++).