Note: This tutorial assumes that you have completed the previous tutorials: understanding ROS topics.
(!) 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 trình phục vụ và các tham số trong ROS

Description: Hướng dẫn này giới thiệu các dịch vụ ROS, và các tham số cũng như sử dụng các công cụ dòng lệnh rosservice và rosparam.

Tutorial Level: BEGINNER

Next Tutorial: Dùng rqt_console và roslaunch

Giả sử turtlesim_node của bạn vẫn đang chạy từ hướng dẫn trước, hãy xem các dịch vụ mà turtlesim cung cấp:

ROS Services

Dịch vụ là một cách khác mà các nút có thể giao tiếp với nhau. Dịch vụ cho phép các nút gửi yêu cầu và nhận được phản hồi.

Dùng rosservice

Rosservice có thể dễ dàng gắn kết client/service framework của ROS với các dịch vụ. Rosservice có nhiều lệnh có thể được sử dụng cho các chủ đề, như hình dưới đây: Sử dụng:

rosservice list         print information about active services
rosservice call         call the service with the provided args
rosservice type         print service type
rosservice find         find services by service type
rosservice uri          print service ROSRPC uri

rosservice list

$ rosservice list

Lệnh danh sách chỉ ra rằng nút turtlesim cung cấp chín dịch vụ: reset, clear, spawn, kill, turtle1/set_pen, /turtle1/teleport_absolute, /turtle1/teleport_relative, turtlesim/get_loggers, and turtlesim/set_logger_level. Ngoài ra còn có hai dịch vụ liên quan đến nút rosout: / rosout / get_loggers và / rosout / set_logger_level.

  • /clear
    /kill
    /reset
    /rosout/get_loggers
    /rosout/set_logger_level
    /spawn
    /teleop_turtle/get_loggers
    /teleop_turtle/set_logger_level
    /turtle1/set_pen
    /turtle1/teleport_absolute
    /turtle1/teleport_relative
    /turtlesim/get_loggers
    /turtlesim/set_logger_level

Xem xét kỹ hơn clear service dùng rosservice type:

rosservice type

Dùng:

rosservice type [service]

Hãy xem loại của clear service:

$ rosservice type /clear
  • std_srvs/Empty

Dịch vụ này rỗng , có nghĩa là khi cuộc gọi dịch vụ được thực hiện, nó sẽ không có đối số (nghĩa là nó không gửi dữ liệu khi đưa ra yêu cầu và không nhận dữ liệu khi nhận phản hồi). Hãy gọi dịch vụ này bằng cách sử dụng cuộc gọi rosservice: Cuộc gọi rosservice Sử dụng:

rosservice call [service] [args]

Ở đây chúng ta sẽ gọi mà không có đối số vì dịch vụ là loại rỗng:

$ rosservice call /clear

Điều này làm những gì chúng ta mong đợi, nó sẽ xóa sạch nền của turtlesim_node.

  • turtlesim.png

Chúng ta hãy nhìn vào trường hợp dịch vụ có các đối số bằng cách xem thông tin của service spawn:

$ rosservice type /spawn| rossrv show
  • float32 x
    float32 y
    float32 theta
    string name
    ---
    string name

Dịch vụ này cho phép chúng ta tạo ra một turtle mới ở một vị trí và hướng xác định. Trường tên là tùy chọn, vì vậy đừng đặt tên cho turtle mới và để cho nó tự đặt một tên.

$ rosservice call /spawn 2 2 0.2 ""

Dịch vụ sẽ trả về tên của turtle đã đặt:

  • name: turtle2

Bây giờ turtlesim sẽ trông giống như sau:

  • turtle(service).png

Dùngrosparam

rosparam cho phép bạn lưu trữ và tùy chỉnh dữ liệu trên ROS Parameter Server. Thông số Server có thể lưu số nguyên, floats, boolean, dictionaries và danh sách. Rosparam sử dụng ngôn ngữ YAML cho cú pháp. Trong các trường hợp đơn giản, YAML trông rất tự nhiên: 1 là số nguyên, 1.0 là float, một là kiểu chuỗi, true là một boolean, [1, 2, 3] là một danh sách các số nguyên, và {a: b, c: D} là một từ điển. Rosparam có nhiều lệnh có thể được sử dụng trên các tham số, như hình dưới đây::

Dùng:

rosparam set            set parameter
rosparam get            get parameter
rosparam load           load parameters from file
rosparam dump           dump parameters to file
rosparam delete         delete parameter
rosparam list           list parameter names

Hãy xem những thông số hiện có trên serrver:

rosparam list

$ rosparam list

Ở đây ta thấy nút turtlesim có ba thông số server cho màu nền (background color):

  • /background_b
    /background_g
    /background_r
    /roslaunch/uris/aqy:51932
    /run_id

Thay đổi gía tri của một thông số dùng rosparam set:

rosparam set và rosparam get

Dùng:

rosparam set [param_name]
rosparam get [param_name]

Điều này sẽ thay đổi màu nền sang màu đỏ (background):

$ rosparam set /background_r 150

Gía trị thông số sẽ thay đổi, bây giờ ta sẽ gọi clear service để thông số thay đổi có tác dụng:

$ rosservice call /clear

Bây giờ turtlesim sẽ trông giống như sau:

  • turtle(param).png

Bây giờ hãy xem gía trị của những thông số trên server. Xem gía trị của green background channel:

$ rosparam get /background_g
  • 86

Chúng ta có thể dùng rosparam get / to hiển thị toàn bộ nội dung của Parameter Server.

$ rosparam get /
  • background_b: 255
    background_g: 86
    background_r: 150
    roslaunch:
      uris: {'aqy:51932': 'http://aqy:51932/'}
    run_id: e07ea71e-98df-11de-8875-001b21201aa8

Bạn cần lưu thông tin này trong một tập tin để có thể tải lại dùng bất cứ khi nào. Dùng rosparam:

rosparam dump và rosparam load

Dùng:

rosparam dump [file_name] [namespace]
rosparam load [file_name] [namespace]

Tất cả các thông số sẽ ghi trong tập tin params.yaml

$ rosparam dump params.yaml

Bạn có thể tải lại tập tin yaml vào một namespaces mới, ví dụ. copy:

$ rosparam load params.yaml copy
$ rosparam get /copy/background_b
  • 255

Bây giờ bạn đã hiểu cách hoạt động của ROS services và các thông số, thử dùng rqt_console and roslaunch

Wiki: vn/ROS/Tutorials/UnderstandingServicesParams (last edited 2017-04-12 07:53:49 by HoangGiang88)