Học liệu

Viết một Node Client đơn giản ( C++)

  • 12/01/2021
  • Học liệu

1. Chương trình

Tạo tệp src/add_two_ints_client.cpp trong gói beginner_tutorials và dán nội dung sau vào bên trong:

#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
#include <cstdlib>

int main(int argc, char **argv)
{
  ros::init(argc, argv, "add_two_ints_client");
  if (argc != 3)
  {
    ROS_INFO("usage: add_two_ints_client X Y");
    return 1;
  }

  ros::NodeHandle n;
  ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
  beginner_tutorials::AddTwoInts srv;
  srv.request.a = atoll(argv[1]);
  srv.request.b = atoll(argv[2]);
  if (client.call(srv))
  {
    ROS_INFO("Sum: %ld", (long int)srv.response.sum);
  }
  else
  {
    ROS_ERROR("Failed to call service add_two_ints");
    return 1;
  }

  return 0;
}

2. Giải thích

Bây giờ, chúng ta hãy chia nhỏ mã.

  ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");

Điều này tạo ra một ứng dụng khách cho dịch vụ add_two_ints . Đối tượng ros :: ServiceClient được sử dụng để gọi dịch vụ sau này.

  beginner_tutorials::AddTwoInts srv;
  srv.request.a = atoll(argv[1]);
  srv.request.b = atoll(argv[2]);

Ở đây chúng tôi khởi tạo một lớp dịch vụ được tạo tự động và gán các giá trị vào thành viên yêu cầu của nó. Một lớp dịch vụ chứa hai thành viên, yêu cầu và phản hồi . Nó cũng chứa hai định nghĩa lớp, Yêu cầu và Phản hồi .

  if (client.call(srv))

Điều này thực sự gọi là dịch vụ. Vì các cuộc gọi dịch vụ đang bị chặn, nó sẽ trở lại sau khi cuộc gọi hoàn tất. Nếu cuộc gọi dịch vụ thành công, call () sẽ trả về true và giá trị trong srv.response sẽ hợp lệ. Nếu cuộc gọi không thành công, call () sẽ trả về false và giá trị trong srv.response sẽ không hợp lệ.

3. Build node

Một lần nữa, hãy chỉnh sửa lại beginner_tutorials CMakeLists.txt tại ~ / catkin_ws / src / beginner_tutorials / CMakeLists.txt và thêm phần sau vào cuối:

add_executable(add_two_ints_server src/add_two_ints_server.cpp)
target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})
add_dependencies(add_two_ints_server beginner_tutorials_gencpp)

add_executable(add_two_ints_client src/add_two_ints_client.cpp)
target_link_libraries(add_two_ints_client ${catkin_LIBRARIES})
add_dependencies(add_two_ints_client beginner_tutorials_gencpp)

Điều này sẽ tạo ra hai tệp thực thi, add_two_ints_server và add_two_ints_client , theo mặc định sẽ đi vào thư mục gói của không gian devel của bạn , được đặt theo mặc định tại ~ / catkin_ws / devel / lib / <tên gói> . Bạn có thể gọi các tệp thi hành trực tiếp hoặc bạn có thể sử dụng rosrun để gọi chúng. Chúng không được đặt trong '<prefix> / bin' vì điều đó sẽ gây ô nhiễm PATH khi cài đặt gói của bạn vào hệ thống. Nếu bạn muốn tệp thực thi của mình ở trên PATH lúc cài đặt, bạn có thể thiết lập mục tiêu cài đặt, xem: catkin / CMakeLists.txt

Để biết mô tả chi tiết hơn về tệp CMakeLists.txt, hãy xem: catkin / CMakeLists.txt

Bây giờ chạy catkin_make :

# In your catkin workspace
cd ~/catkin_ws
catkin_make

Nếu bản dựng của bạn không thành công vì một số lý do: đảm bảo rằng bạn đã làm theo các hướng dẫn trong hướng dẫn trước: tạo AddTwoInts.srv .

4. Chạy các node

Các nút đang chạy yêu cầu bạn phải khởi động lõi ROS. Mở một trình bao mới và kiểu:

roscore

Nếu mọi việc suôn sẻ, bạn sẽ thấy một đầu ra giống như sau:

... logging to /u/takayama/.ros/logs/83871c9c-934b-11de-a451-
001d927076eb/roslaunch-ads-31831.log
... loading XML file 
[/wg/stor1a/rosbuild/shared_installation/ros/tools/roslaunch/roscore.xml]
Added core node of type [rosout/rosout] in namespace [/]
started roslaunch server http://ads:54367/

SUMMARY
======

NODES

changing ROS_MASTER_URI to [http://ads:11311/] for starting master locally
starting new master (master configured for auto start)
process[master]: started with pid [31874]
ROS_MASTER_URI=http://ads:11311/
setting /run_id to 83871c9c-934b-11de-a451-001d927076eb
+PARAM [/run_id] by /roslaunch
+PARAM [/roslaunch/uris/ads:54367] by /roslaunch
process[rosout-1]: started with pid [31889]
started core service [/rosout]
+SUB [/time] /rosout http://ads:33744/
+SERVICE [/rosout/get_loggers] /rosout http://ads:33744/
+SERVICE [/rosout/set_logger_level] /rosout http://ads:33744/
+PUB [/rosout_agg] /rosout http://ads:33744/
+SUB [/rosout] /rosout http://ads:33744/

Bây giờ mọi thứ được thiết lập để chạy máy chủ và máy khách.

Các tin khác