Note: This tutorial assumes that you have completed the previous tutorials: understanding ROS nodes. |
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ìm hiểu về ROS Topics
Description: Hướng dẫn giới thiệu về ROS topics cũng như dùng công cụ dòng lệnh rostopic và rqt_plot .Tutorial Level:
Next Tutorial: Hiểu về trình phục vụ trong ROS và các thông số
Contents
Thiết đặt
roscore
Hãy chắc là roscore đang chạy, trong một terminal mới:
$ roscore
Nếu roscore đã gọi và còn đang chạy, bạn có thể nhận được thông báo lỗi:
roscore cannot run as another roscore/master is already running. Please kill other roscore/master processes before relaunching
Chỉ có duy nhất một roscore chạy trên máy.
turtlesim
Trong hướng dẫn này chúng ta sẽ dùng turtlesim. Chạy trong một terminal mới:
$ rosrun turtlesim turtlesim_node
turtle keyboard teleoperation
Chúng ta cũng cần một cái gì đó để lái con rùa chạy quanh. Vui lòng chạy trong một terminal mới:
$ rosrun turtlesim turtle_teleop_key
[ INFO] 1254264546.878445000: Started node [/teleop_turtle], pid [5528], bound on [aqy], xmlrpc port [43918], tcpros port [55936], logging to [~/ros/ros/log/teleop_turtle_5528.log], using [real] time Reading from keyboard --------------------------- Use arrow keys to move the turtle.
Bây giờ bạn có thể sử dụng các phím mũi tên của bàn phím để lái con rùa chạy xung quanh. Nếu bạn không thể lái con rùa chọn cửa sổ terminal của turtle_teleop_key để đảm bảo rằng các phím bạn gõ được ghi lại.
Bây giờ bạn có thể lái rùa của bạn chạy xung quanh, hãy xem những gì xảy ra đằng sau.
Chủ đề ROS
Các turtlesim_node và nút turtle_teleop_key đang giao tiếp với nhau qua một chủ đề ROS. Turtle_teleop_key đang công bố chủ đề nhấn phím, trong khi turtlesim đăng ký cùng một chủ đề để nhận sự kiện nhấn phím. Hãy sử dụng rqt_graph để hiển thị các nút và chủ đề hiện đang chạy.
Lưu ý: Nếu bạn đang sử dụng phiên bản electric hoặc cũ hơn, rqt không có sẵn. Sử dụng rxgraph thay thế.
Dùng rqt_graph
Rqt_graph tạo ra một biểu đồ động về những gì đang xảy ra trong hệ thống. Rqt_graph là một phần của gói rqt. Một khi bạn đã cài đặt xong, hãy chạy:
$ sudo apt-get install ros-<distro>-rqt $ sudo apt-get install ros-<distro>-rqt-common-plugins
Thay thế <distro> với tên của phiên bản ROS bạn dùng (indigo, jade, kinetic)
Trong một terminal mới:
$ rosrun rqt_graph rqt_graph
Bạn sẽ thấy giống như sau:
Nếu bạn đặt con trỏ chuột của bạn trên / turtle1 / cỏommand_velocity nó sẽ làm nổi bật các nút ROS (ở đây màu xanh và màu xanh lá cây) và các chủ đề (ở đây màu đỏ). Như bạn thấy, turtlesim_node và các nút turtle_teleop_key đang truyền đạt về chủ đề có tên / turtle1 / command_velocity.
Hướng dẫn rostopic
Công cụ rostopic cho phép bạn lấy thông tin về các chủ đề ROS. Bạn có thể sử dụng tùy chọn trợ giúp để lấy các lệnh khác trong rostopic
$ rostopic -h
rostopic bw display bandwidth used by topic rostopic echo print messages to screen rostopic hz display publishing rate of topic rostopic list print information about active topics rostopic pub publish data to topic rostopic type print topic type
Hoặc nhấn phím tab sau khi lệnh rostopic in các lệnh có thể có:
$ rostopic bw echo find hz info list pub type
Chúng ta hãy sử dụng một số các lệnh con (sub-commands) của chủ đề để kiểm tra turtlesim.
Dùng rostopic echo
rostopic echo cho thấy dữ liệu xuất bản trên một chủ đề.
Dùng:
rostopic echo [topic]
Chúng ta hãy nhìn vào lệnh dữ liệu vận tốc xuất bản bởi nút turtle_teleop_key.ơn Đối với ROS Hydro và mới hơn, dữ liệu này được xuất bản trên chủ đề / turtle1 / cmd_vel. Trong một thiết bị đầu cuối mới, chạy:
$ rostopic echo /turtle1/cmd_vel
Đối với ROS Groovy và cũ hơn, dữ liệu này xuất bản trên /turtle1/command_velocity topic. Trong một terminal mới, chạy:
$ rostopic echo /turtle1/command_velocity
Bạn có lẽ sẽ không thấy bất cứ điều gì xảy ra vì không có dữ liệu đang được xuất bản về chủ đề. Hãy làm cho turtle_teleop_key xuất bản dữ liệu bằng cách nhấn các phím mũi tên. Hãy nhớ nếu con rùa không di chuyển, bạn cần phải chọn lại terminal turtle_teleop_key. Đối với ROS Hydro và mới hơn, bạn sẽ thấy những điều sau khi nhấn phím lên:
linear: x: 2.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0 --- linear: x: 2.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0 ---
Đối với ROS Groovy cũ hơn, bạn sẽ thấy như sau khi nhấn phím:
--- linear: 2.0 angular: 0.0 --- linear: 2.0 angular: 0.0 --- linear: 2.0 angular: 0.0 --- linear: 2.0 angular: 0.0 --- linear: 2.0 angular: 0.0
Bây giờ chúng ta hãy nhìn lại rqt_graph. Nhấn nút làm mới ở phía trên bên trái để hiển thị nút mới. Như bạn có thể nhìn thấy echo rostopic, hiển thị ở đây màu đỏ, bây giờ cũng đã đăng ký chủ đề turtle1 / command_velocity.
Dùng rostopic list
Rostopic list trả về một danh sách tất cả các chủ đề hiện đang đăng ký và xuất bản.
Chúng ta hãy tìm ra các đối số cần trong danh sách lệnh. Trong một thiết bị đầu cuối mới chạy:
$ rostopic list -h
Usage: rostopic list [/topic] Options: -h, --help show this help message and exit -b BAGFILE, --bag=BAGFILE list topics in .bag file -v, --verbose list full details about each topic -p list only publishers -s list only subscribers
Cho rostopic list dùng lựa chọn verbose:
$ rostopic list -v
Điều này sẽ hiển thị một danh sách đầy đủ các chủ đề để xuất bản lên và đăng ký và loại của topic.
Published topics: * /turtle1/color_sensor [turtlesim/Color] 1 publisher * /turtle1/command_velocity [turtlesim/Velocity] 1 publisher * /rosout [roslib/Log] 2 publishers * /rosout_agg [roslib/Log] 1 publisher * /turtle1/pose [turtlesim/Pose] 1 publisher Subscribed topics: * /turtle1/command_velocity [turtlesim/Velocity] 1 subscriber * /rosout [roslib/Log] 1 subscriber
ROS Messages
Giao tiếp giữa các chủ đề xảy ra bằng cách gửi các thông điệp ROS giữa các nút. Đối với nút xuất bản (turtle_teleop_key) và nút đăng ký (turtlesim_node) để giao tiếp, nút xuất bản và nút nhận phải gửi và nhận cùng một loại tin nhắn. Điều này có nghĩa là loại chủ đề được xác định bởi loại thông báo được xuất bản trên đó. Loại tin nhắn gửi trên một chủ đề có thể được xác định bằng cách sử dụng loại rostopic.
Dùngrostopic type
rostopic type trả lại loại tin nhắn của một chủ đề xuất bản ra.
Dùng:
rostopic type [topic]
Đối với ROS Hydro và sau đó,
- Thử:
$ rostopic type /turtle1/cmd_vel
- Bạn có thể thấy:
geometry_msgs/Twist
Có thể xem chi tiết của tin nhắn dùng rosmsg:
$ rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linear float64 x float64 y float64 z geometry_msgs/Vector3 angular float64 x float64 y float64 z
- Bạn có thể thấy:
Cho ROS Groovy và phiên bản cũ hơn,
- Try:
$ rostopic type /turtle1/command_velocity
- Bạn sẽ thấy:
turtlesim/Velocity
Chúng ta có thể xem chi tiết của message dùng rosmsg:
$ rosmsg show turtlesim/Velocity
float32 linear float32 angular
- Bạn sẽ thấy:
Now that we know what type of message turtlesim expects, we can publish commands to our turtle.
Bây giờ chúng ta biết loại tin nhắn turtlesim mong muốn, chúng ta có thể xuất lệnh cho rùa di chuyển.
rostopic continued
Bây giờ chúng ta đã học được về các tin nhắn ROS, chúng ta hãy sử dụng rostopic với các tin nhắn.
Dùng rostopic pub
rostopic pub xuất bản dữ liệu về chủ đề hiện đang được xuất bản.
Dùng:
rostopic pub [topic] [msg_type] [args]
Đối với ROS Hydro và bản mới hơn, ví dụ:
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
Đối với ROS Groovy và bản cũ hơn, ví dụ:
$ rostopic pub -1 /turtle1/command_velocity turtlesim/Velocity -- 2.0 1.8
Lệnh trước đó sẽ gửi một tin nhắn duy nhất tới rùa để nó vận hành với vận tốc tuyến tính là 2,0 và vận tốc góc là 1,8.
Đây là một ví dụ khá phức tạp, vì vậy hãy nhìn vào mỗi đối số một cách chi tiết.
Đối với ROS Hydro và bản mới hơn,
- Lệnh này sẽ xuất bản tin nhắn đến một chủ đề nhất định:
rostopic pub
- Tùy chọn này (dấu gạch ngang-một) rostopic chỉ xuất bản chỉ một tin nhắn:
-1
- Đây là tên của chủ đề cần xuất bản:
/turtle1/cmd_vel
- Đây là loại tin nhắn để sử dụng khi xuất bản chủ đề:
geometry_msgs/Twist
- Tùy chọn này (double-dash) cho parser tùy chọn không một đối số nào trong các đối số sau đây là một lựa chọn. Điều này được yêu cầu trong trường hợp đối số của bạn có dấu gạch đầu - như số âm.
--
Như đã lưu ý trước, một geometry_msgs/Twist msg có hai vectơ gồm ba phần tử kiểu dấu chấm động: mỗi đường thẳng và góc cạnh. Trong trường hợp này, '[2.0, 0.0, 0.0]' trở thành giá trị tuyến tính với x = 2.0, y = 0.0, và z = 0.0, và '[0.0, 0.0, 1.8]' là giá trị góc với x = 0.0, Y = 0.0, và z = 1.8. Những đối số này thực sự có trong cú pháp YAML, được mô tả nhiều hơn trong YAML command line documentation.
'[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
Cho ROS Groovy và trước đó,
- Lệnh này sẽ gưởi thôngông báo đến một chủ đề nhất định:
rostopic pub
- Lựa chọn này (dash-one) sẽ gưởi chỉ một tin nhắn sau đó sẽ thoát:
-1
- Đây là tên của chủ đề để xuất bản:
/turtle1/command_velocity
- Đây là loại tin nhắn để sử dụng khi xuất bản cho chủ đề:
turtlesim/Velocity
- Tùy chọn này (double-dash) cho parser tùy chọn không một đối số nào trong các đối số sau đây là một lựa chọn. Điều này được yêu cầu trong trường hợp đối số của bạn có dấu gạch đầu - như số âm.
--
Như đã nói trước, một turtlesim/Velocity msg có hai phần tử kiểu dấu chấm động: tuyến tính và góc. Trong trường hợp này, 2.0 trở thành giá trị tuyến tính, và 1.8 là giá trị góc. Những đối số này thực sự có trong cú pháp YAML, được mô tả nhiều hơn trong YAML command line documentation.
2.0 1.8
Bạn có thể nhận thấy con rùa đã ngừng di chuyển; Điều này là do rùa cần một dòng lệnh ổn định ở 1 Hz để tiếp tục di chuyển. Chúng ta có thể xuất bản một dòng lệnh ổn định bằng lệnh rostopic pub -r:
Cho bản ROS Hydro và về sau,
$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
Cho bản ROS Groovy và trước đó,
$ rostopic pub /turtle1/command_velocity turtlesim/Velocity -r 1 -- 2.0 -1.8
Điều này sẽ xuất lệnh vận tốc ở tốc độ 1 Hz .
Chúng ta cũng có thể nhìn vào những gì đang xảy ra trong rqt_graph, nút pub rostopic (màu đỏ) đang giao tiếp với nút echo rostopic (ở đây là màu xanh lá cây):
Như bạn thấy rùa đang chạy trong một vòng tròn liên tục. Trong một thiết bị đầu cuối mới, chúng ta có thể sử dụng echo rostopic để xem dữ liệu được xuất bản bởi turtlesim: Sử dụng rostopic hz Rostopic hz báo cáo tầng số dữ liệu được xuất bản. Sử dụng:
rostopic hz [topic]
Hãy xem turtlesim_node đang xuất bản nhanh như thế nào /turtle1/pose:
$ rostopic hz /turtle1/pose
Bạn sẽ thấy:
subscribed to [/turtle1/pose] average rate: 59.354 min: 0.005s max: 0.027s std dev: 0.00284s window: 58 average rate: 59.459 min: 0.005s max: 0.027s std dev: 0.00271s window: 118 average rate: 59.539 min: 0.004s max: 0.030s std dev: 0.00339s window: 177 average rate: 59.492 min: 0.004s max: 0.030s std dev: 0.00380s window: 237 average rate: 59.463 min: 0.004s max: 0.030s std dev: 0.00380s window: 290
Bây giờ chúng ta có thể nói rằng turtlesim đang xuất bản dữ liệu về con rùa với tốc độ 60 Hz. Ta cũng có thể sử dụng rostopic type kết hợp với rosmsg show để có được thông tin sâu hơn về một chủ đề:
Cho ROS Hydro và sau đó,
$ rostopic type /turtle1/cmd_vel | rosmsg show
Cho ROS Groovy và trước đó,
$ rostopic type /turtle1/command_velocity | rosmsg show
Bây giờ chúng ta đã kiểm tra các chủ đề bằng cách sử dụng rostopic chúng ta hãy sử dụng một công cụ khác để xem dữ liệu được xuất bản bởi turtlesim:
rqt_plot
Lưu ý: Nếu bạn đang sử dụng bản electric hoặc cũ hơn, rqt không có sẵn. Sử dụng rxplot thay thế. Rqt_plot hiển thị một thanh cuộn thời gian theo dữ liệu được xuất bản trên các chủ đề. Ở đây chúng ta sẽ sử dụng rqt_plot để vẽ dữ liệu đang được xuất bản trên chủ đề / turtle1 / pose. Đầu tiên, bắt đầu rqt_plot bằng cách gõ
$ rosrun rqt_plot rqt_plot
Trong một thiết bị đầu cuối mới. Trong cửa sổ mới sẽ xuất hiện, một hộp văn bản ở góc trên bên trái cho bạn thêm bất kỳ chủ đề nào vào đồ thị. Gõ / turtle1 / pose / x sẽ làm nổi bật nút cộng, bị vô hiệu hóa trước đó. Nhấn và lặp lại quy trình tương tự với chủ đề / turtle1 / pose / y. Bây giờ bạn sẽ thấy vị trí x-y của con rùa được vẽ trên đồ thị.
Nhấn nút trừ sẽ hiển thị menu cho phép bạn ẩn chủ đề đã được chỉ định khỏi đồ thi. Ẩn cả hai chủ đề bạn vừa thêm vào và thêm / turtle1 / pose / theta sẽ được hiển thị trong hình tiếp theo.
Sử dụng Ctrl-C để đóng các thiết bị đầu cuối rostopic nhưng giữ turtlesim chạy. Bây giờ bạn đã hiểu các chủ đề ROS hoạt động như thế nào, hãy xem các dịch vụ và các tham số hoạt động ra sao services and parameters work.
Video Hướng
The following video presents a small tutorial using turtlesim on ROS nodes and ROS topics.
Video dưới đây trình bày một hướng dẫn nhỏ sử dụng rùa mô hình trên các nút ROS và các chủ đề ROS.