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

Tutorial Level:

Next Tutorial: Hiểu về trình phục vụ trong ROS và các thông số

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.

  • turtle_key.png

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:

rqt_graph_turtle_key.png

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.

rqt_graph_turtle_key2.png

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.

rqt_graph_echo.png

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

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

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.

  • turtle(rostopicpub).png

Đâ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 .

  • turtle(rostopicpub)2.png

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):

rqt_graph_pub.png

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

rqt_plot.png

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.

rqt_plot2.png

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.

Wiki: vn/ROS/Tutorials/UnderstandingTopics (last edited 2017-04-11 03:42:43 by HoangGiang88)