Skip to content
  • Home
  • About the Blog
  • About the Author
  • Sitemap

Abdur Rosyid's Blog

Just a few notes on mechanical engineering and robotics

Creating C++ Service in ROS2

July 8, 2021 by Abdur Rosyid

Step 1: Create the service (.srv) file, namely ServiceName.srv, inside an “srv” folder.

Step 2: Modify CMakeLists.txt.

Add the following:

find_package(builtin_interfaces REQUIRED)
find_package(rosidl_default_generators REQUIRED)

# and put below before ament_package():
rosidl_generate_interfaces(ros2_exercise_cpp
  "srv/ServiceName.srv"
  DEPENDENCIES builtin_interfaces
)

Step 3: Modify package.xml.

Add the following:

  builtin_interfaces
  rosidl_default_generators
  builtin_interfaces
  rosidl_default_runtime

  rosidl_interface_packages

Step 4: Write your service_server node in the “src” folder inside the package. The following is an example of a service_server node, taken from here: https://github.com/ros2/examples/tree/foxy/rclcpp/services/minimal_service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <inttypes.h>
#include <memory>
#include "example_interfaces/srv/add_two_ints.hpp"
#include "rclcpp/rclcpp.hpp"
 
using AddTwoInts = example_interfaces::srv::AddTwoInts;
rclcpp::Node::SharedPtr g_node = nullptr;
 
void handle_service(
  const std::shared_ptr<rmw_request_id_t> request_header,
  const std::shared_ptr<addtwoints::request> request,
  const std::shared_ptr<addtwoints::response> response)
{
  (void)request_header;
  RCLCPP_INFO(
    g_node-&gt;get_logger(),
    "request: %" PRId64 " + %" PRId64, request-&gt;a, request-&gt;b);
  response-&gt;sum = request-&gt;a + request-&gt;b;
}
 
int main(int argc, char ** argv)
{
  rclcpp::init(argc, argv);
  g_node = rclcpp::Node::make_shared("minimal_service");
  auto server = g_node-&gt;create_service<addtwoints>("add_two_ints", handle_service);
  rclcpp::spin(g_node);
  rclcpp::shutdown();
  g_node = nullptr;
  return 0;
}</addtwoints></addtwoints::response></addtwoints::request></rmw_request_id_t></memory></inttypes.h>

Step 5: Write your service_client node in the “src” folder inside the package. The following is an example of a service_client node, taken from here: https://github.com/ros2/examples/tree/foxy/rclcpp/services/minimal_client

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include
#include
#include
#include "example_interfaces/srv/add_two_ints.hpp"
#include "rclcpp/rclcpp.hpp"
 
using AddTwoInts = example_interfaces::srv::AddTwoInts;
 
int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);
  auto node = rclcpp::Node::make_shared("minimal_client");
  auto client = node-&gt;create_client("add_two_ints");
  while (!client-&gt;wait_for_service(std::chrono::seconds(1))) {
    if (!rclcpp::ok()) {
      RCLCPP_ERROR(node-&gt;get_logger(), "client interrupted while waiting for service to appear.");
      return 1;
    }
    RCLCPP_INFO(node-&gt;get_logger(), "waiting for service to appear...");
  }
  auto request = std::make_shared();
  request-&gt;a = 41;
  request-&gt;b = 1;
  auto result_future = client-&gt;async_send_request(request);
  if (rclcpp::spin_until_future_complete(node, result_future) !=
    rclcpp::FutureReturnCode::SUCCESS)
  {
    RCLCPP_ERROR(node-&gt;get_logger(), "service call failed :(");
    return 1;
  }
  auto result = result_future.get();
  RCLCPP_INFO(
    node-&gt;get_logger(), "result of %" PRId64 " + %" PRId64 " = %" PRId64,
    request-&gt;a, request-&gt;b, result-&gt;sum);
  rclcpp::shutdown();
  return 0;
}

Step 6: Build the package using “colcon build” command.

Post navigation

Previous Post:

Writing Python Subscriber in ROS2

Next Post:

Creating Python Service in ROS2

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Categories

  • STEM 101
  • Robotics
  • Kinematics
  • Dynamics
  • Control
  • Robot Operating System (ROS)
  • Robot Operating System (ROS2)
  • Software Development
  • Mechanics of Materials
  • Finite Element Analysis
  • Fluid Mechanics
  • Thermodynamics

Recent Posts

  • Pull Request on Github
  • Basics of Git and Github
  • Conda vs Docker
  • A Conda Cheat Sheet
  • Installing NVIDIA GPU Driver on Ubuntu

Archives

  • June 2025
  • July 2021
  • June 2021
  • March 2021
  • September 2020
  • April 2020
  • January 2015
  • April 2014
  • March 2014
  • March 2012
  • February 2012
  • June 2011
  • March 2008
© 2026 Abdur Rosyid's Blog | WordPress Theme by Superbthemes