点击(此处)折叠或打开
-
ros2 pkg create --build-type ament_cmake cpp_srvcli --dependencies rclcpp example_interfaces
-
-
--dependencies 会自动把必要的依赖加入到 package.xml 和 CMakeLists.txt 中.
-
-
example_interfaces 这个依赖包存在一个 .srv 文件. 我们需要这个包的 .srv 文件.
-
-
cat example_interfaces/srv/AddTwoInts.srv
-
int64 a
-
int64 b
-
---
- int64 sum
点击(此处)折叠或打开 -- add_two_ints_server.cpp
-
#include "rclcpp/rclcpp.hpp"
-
#include "example_interfaces/srv/add_two_ints.hpp"
-
-
#include <memory>
-
-
void add(const std::shared_ptr<example_interfaces::srv::AddTwoInts::Request> request,
-
std::shared_ptr<example_interfaces::srv::AddTwoInts::Response> response)
-
{
-
response->sum = request->a + request->b;
-
RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Incoming request\na: %ld" " b: %ld",
-
request->a, request->b);
-
RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "sending back response: [%ld]", (long int)response->sum);
-
}
-
-
int main(int argc, char **argv)
-
{
-
rclcpp::init(argc, argv);
-
-
std::shared_ptr<rclcpp::Node> node = rclcpp::Node::make_shared("add_two_ints_server");
-
-
rclcpp::Service<example_interfaces::srv::AddTwoInts>::SharedPtr service =
-
node->create_service<example_interfaces::srv::AddTwoInts>("add_two_ints", &add);
-
-
RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Ready to add two ints.");
-
-
rclcpp::spin(node);
-
rclcpp::shutdown();
- }
点击(此处)折叠或打开
-
修改 CMakeLists.txt 增加
-
-
add_executable(server src/add_two_ints_server.cpp)
- ament_target_dependencies(server rclcpp example_interfaces)
- add_executable(client src/add_two_ints_client.cpp)
-
ament_target_dependencies(client rclcpp example_interfaces)
-
-
install(TARGETS
-
server
- client
- DESTINATION lib/${PROJECT_NAME})
点击(此处)折叠或打开 -- add_two_ints_client.cpp
-
#include "rclcpp/rclcpp.hpp"
-
#include "example_interfaces/srv/add_two_ints.hpp"
-
-
#include <chrono>
-
#include <cstdlib>
-
#include <memory>
-
-
using namespace std::chrono_literals;
-
-
int main(int argc, char **argv)
-
{
-
rclcpp::init(argc, argv);
-
-
if (argc != 3) {
-
RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "usage: add_two_ints_client X Y");
-
return 1;
-
}
-
-
std::shared_ptr<rclcpp::Node> node = rclcpp::Node::make_shared("add_two_ints_client");
-
rclcpp::Client<example_interfaces::srv::AddTwoInts>::SharedPtr client =
-
node->create_client<example_interfaces::srv::AddTwoInts>("add_two_ints");
-
-
auto request = std::make_shared<example_interfaces::srv::AddTwoInts::Request>();
-
request->a = atoll(argv[1]);
-
request->b = atoll(argv[2]);
-
-
while (!client->wait_for_service(1s)) {
-
if (!rclcpp::ok()) {
-
RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Interrupted while waiting for the service. Exiting.");
-
return 0;
-
}
-
RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "service not available, waiting again...");
-
}
-
-
auto result = client->async_send_request(request);
-
// Wait for the result.
-
if (rclcpp::spin_until_future_complete(node, result) ==
-
rclcpp::FutureReturnCode::SUCCESS)
-
{
-
RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Sum: %ld", result.get()->sum);
-
} else {
-
RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Failed to call service add_two_ints");
-
}
-
-
rclcpp::shutdown();
-
return 0;
- }
点击(此处)折叠或打开
-
rosdep install -i --from-path src --rosdistro foxy -y
-
colcon build --packages-select cpp_srvcli
-
. install/setup.bash
-
-
ros2 run cpp_srvcli server
- ros2 run cpp_srvcli client 2 3
Python 部分
点击(此处)折叠或打开
-
ros2 pkg create --build-type ament_python py_srvcli --dependencies rclpy example_interfaces
-
修改 package.xml 和 setup.py 的 maintainer, maintainer_email, description, license 部分
-
-
##################### service_member_function.py 代码 #####################
-
from example_interfaces.srv import AddTwoInts
-
import rclpy
-
from rclpy.node import Node
-
-
class MinimalService(Node):
-
-
def __init__(self):
-
super().__init__('minimal_service')
-
self.srv = self.create_service(AddTwoInts, 'add_two_ints', self.add_two_ints_callback)
-
-
def add_two_ints_callback(self, request, response):
-
response.sum = request.a + request.b
-
self.get_logger().info('Incoming request\na: %d b: %d' % (request.a, request.b))
-
-
return response
-
-
-
def main(args=None):
-
rclpy.init(args=args)
-
-
minimal_service = MinimalService()
-
-
rclpy.spin(minimal_service)
-
-
rclpy.shutdown()
-
-
-
if __name__ == '__main__':
-
main()
-
-
##################### client_member_function.py 代码 #####################
-
import sys
-
-
from example_interfaces.srv import AddTwoInts
-
import rclpy
-
from rclpy.node import Node
-
-
-
class MinimalClientAsync(Node):
-
-
def __init__(self):
-
super().__init__('minimal_client_async')
-
self.cli = self.create_client(AddTwoInts, 'add_two_ints')
-
while not self.cli.wait_for_service(timeout_sec=1.0):
-
self.get_logger().info('service not available, waiting again...')
-
self.req = AddTwoInts.Request()
-
-
def send_request(self):
-
self.req.a = int(sys.argv[1])
-
self.req.b = int(sys.argv[2])
-
self.future = self.cli.call_async(self.req)
-
-
-
def main(args=None):
-
rclpy.init(args=args)
-
-
minimal_client = MinimalClientAsync()
-
minimal_client.send_request()
-
-
while rclpy.ok():
-
rclpy.spin_once(minimal_client)
-
if minimal_client.future.done():
-
try:
-
response = minimal_client.future.result()
-
except Exception as e:
-
minimal_client.get_logger().info(
-
'Service call failed %r' % (e,))
-
else:
-
minimal_client.get_logger().info(
-
'Result of add_two_ints: for %d + %d = %d' %
-
(minimal_client.req.a, minimal_client.req.b, response.sum))
-
break
-
-
minimal_client.destroy_node()
-
rclpy.shutdown()
-
-
-
if __name__ == '__main__':
-
main()
-
-
-
修改 setup.py
-
entry_points={
-
'console_scripts': [
-
'service = py_srvcli.service_member_function:main',
-
'client = py_srvcli.client_member_function:main',
-
],
-
},
-
-
编译执行
-
rosdep install -i --from-path src --rosdistro foxy -y
-
colcon build --packages-select py_srvcli
-
. install/setup.bash
-
ros2 run py_srvcli service
- ros2 run py_srvcli client 2 3